diff --git a/doc/Configure.raw.xml b/doc/Configure.raw.xml new file mode 100644 index 000000000..6d735e19b --- /dev/null +++ b/doc/Configure.raw.xml @@ -0,0 +1,231 @@ + + +
+ + FreedomBox/Manual/Configure + + + 3 + 2016-12-31 04:11:43 + JamesValleroy + mention how domain name is used + + + 2 + 2016-12-31 04:07:26 + JamesValleroy + fix outline + + + 1 + 2016-08-21 16:35:55 + Drahtseil + Created Configure + + + +
+ Configure + Configure covers a couple of general topics: + + + Hostname + + + Hostname is the local name by which other devices on the local network can reach your FreedomBox. Default 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), Certificates (Let's Encrypt), and Monkeysphere. + + + + + Language + + + Language for the web administration interface Plinth + + + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/Coquelicot.raw.xml b/doc/Coquelicot.raw.xml new file mode 100644 index 000000000..b6e630664 --- /dev/null +++ b/doc/Coquelicot.raw.xml @@ -0,0 +1,261 @@ + + +
+ + FreedomBox/Manual/Coquelicot + + + 5 + 2018-03-05 09:15:01 + JosephNuthalapati + coquelicot: Fix broken links + + + 4 + 2018-02-26 17:14:51 + JamesValleroy + included in 0.24 + + + 3 + 2018-02-12 23:48:10 + JamesValleroy + bump version + + + 2 + 2018-02-12 23:47:14 + JamesValleroy + replace fancy quote characters with plain quote characters + + + 1 + 2018-02-10 03:14:55 + JosephNuthalapati + Create new page for Coquelicot + + + +
+ File Sharing (Coquelicot) +
+ About Coquelicot + Coquelicot is a "one-click" file sharing web application with a focus on protecting users' privacy. + 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. +
+ 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. +
+
+ 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
+
diff --git a/doc/DateTime.raw.xml b/doc/DateTime.raw.xml new file mode 100644 index 000000000..8d011c978 --- /dev/null +++ b/doc/DateTime.raw.xml @@ -0,0 +1,210 @@ + + +
+ + FreedomBox/Manual/DateTime + + + 2 + 2017-03-31 20:20:57 + Drahtseil + Screenshot DateTime + + + 1 + 2016-08-21 09:26:45 + Drahtseil + Created Date & Time + + + +
+ Date & Time + This 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 + + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/Deluge.raw.xml b/doc/Deluge.raw.xml new file mode 100644 index 000000000..76f6de394 --- /dev/null +++ b/doc/Deluge.raw.xml @@ -0,0 +1,308 @@ + + +
+ + FreedomBox/Manual/Deluge + + + 11 + 2016-12-31 01:32:15 + JamesValleroy + add initial setup directions + + + 10 + 2016-12-30 19:20:00 + JamesValleroy + reword + + + 9 + 2016-12-30 19:14:16 + JamesValleroy + add intro paragraph + + + 8 + 2016-12-30 19:00:50 + JamesValleroy + no space in "BitTorrent" + + + 7 + 2016-12-26 18:07:46 + JamesValleroy + add screenshot + + + 6 + 2016-09-01 19:05:24 + Drahtseil + adapted title to Plinth wording + + + 5 + 2016-04-10 07:26:48 + PhilippeBaret + Added bottom navigation link + + + 4 + 2015-12-15 20:41:02 + PhilippeBaret + Correction + + + 3 + 2015-12-15 20:40:16 + PhilippeBaret + Correction + + + 2 + 2015-12-15 18:16:28 + PhilippeBaret + Added Deluge definition + + + 1 + 2015-12-15 16:59:01 + PhilippeBaret + Created 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. +
+
+ Screenshot + + + + + + + Deluge Web UI + + + +
+
+ Initial Setup + After 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Diagnostics.raw.xml b/doc/Diagnostics.raw.xml new file mode 100644 index 000000000..f3af6c92d --- /dev/null +++ b/doc/Diagnostics.raw.xml @@ -0,0 +1,194 @@ + + +
+ + FreedomBox/Manual/Diagnostics + + + 1 + 2016-08-21 09:43:52 + Drahtseil + Created Diagnostics + + + +
+ Diagnostics + The 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/DynamicDNS.raw.xml b/doc/DynamicDNS.raw.xml new file mode 100644 index 000000000..65bebb355 --- /dev/null +++ b/doc/DynamicDNS.raw.xml @@ -0,0 +1,398 @@ + + +
+ + FreedomBox/Manual/DynamicDNS + + + 14 + 2018-03-11 03:11:04 + JosephNuthalapati + Fix oversized image + + + 13 + 2017-03-31 20:35:42 + Drahtseil + updated screenshot + + + 12 + 2016-09-09 15:40:08 + SunilMohanAdapa + Minor indentation fix with screenshot + + + 11 + 2016-09-01 19:18:48 + Drahtseil + adapted title to Plinth wording + + + 10 + 2016-08-15 18:46:51 + Drahtseil + Screenshot GNU-DIP + + + 9 + 2016-04-14 14:22:41 + PhilippeBaret + Added accurate How to create a DNS name with GnuDIP + + + 8 + 2016-04-10 07:15:47 + PhilippeBaret + Added bottom navigation link + + + 7 + 2016-01-11 06:28:36 + PhilippeBaret + Correction + + + 6 + 2015-12-15 18:48:25 + PhilippeBaret + Added definition title to Dynamic DNS page + + + 5 + 2015-09-13 15:02:37 + SunilMohanAdapa + Demote headings one level for inclusion into manual + + + 4 + 2015-09-13 13:14:41 + SunilMohanAdapa + Move DynamicDNS page to manual + + + 3 + 2015-08-13 13:03:13 + SunilMohanAdapa + Add more introduction and re-organize. + + + 2 + 2015-08-09 21:38:52 + DanielSteglich + + + 1 + 2015-08-09 21:23:48 + DanielSteglich + + + +
+ Dynamic DNS Client +
+ What is Dynamic DNS? + In order to reach a server on the Internet, the server needs to have permanent address also know 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 URL + There are two main mechanism to notify the Dynamic DNS server of your new IP address; using the GnuDIP protocol and using the Update URL mechanism. + 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 protocol + + + Register 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 URL + This 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 Works + + + Make 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 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 immediatly) + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Firewall.raw.xml b/doc/Firewall.raw.xml new file mode 100644 index 000000000..088b9dcc3 --- /dev/null +++ b/doc/Firewall.raw.xml @@ -0,0 +1,2208 @@ + + +
+ + FreedomBox/Manual/Firewall + + + 25 + 2018-03-11 03:12:12 + JosephNuthalapati + Fix oversized image + + + 24 + 2017-03-31 20:25:36 + Drahtseil + Screenshot Firewall + + + 23 + 2017-01-08 02:18:51 + JamesValleroy + add minetest + + + 22 + 2017-01-08 02:17:46 + JamesValleroy + fix table spacing + + + 21 + 2017-01-08 02:16:47 + JamesValleroy + add repro + + + 20 + 2017-01-08 02:10:57 + JamesValleroy + add mumble + + + 19 + 2017-01-08 02:08:58 + JamesValleroy + add quassel + + + 18 + 2017-01-08 01:55:02 + JamesValleroy + reorder to match Plinth Firewall page + + + 17 + 2017-01-07 21:07:25 + JamesValleroy + update managed by plinth + + + 16 + 2017-01-07 20:54:21 + JamesValleroy + update statuses shown in plinth + + + 15 + 2017-01-07 20:51:16 + JamesValleroy + updated services enabled by default + + + 14 + 2017-01-07 20:49:50 + JamesValleroy + fix table spacing + + + 13 + 2017-01-07 20:47:32 + JamesValleroy + jwchat replaced with jsxc + + + 12 + 2017-01-07 20:45:27 + JamesValleroy + remove owncloud from ports list + + + 11 + 2016-01-13 23:19:49 + JamesValleroy + port -> service + + + 10 + 2015-12-15 00:51:46 + JamesValleroy + few corrections + + + 9 + 2015-09-16 11:06:29 + SunilMohanAdapa + Update an oudated link + + + 8 + 2015-09-16 08:18:17 + SunilMohanAdapa + Remove unnecessary automatic links + + + 7 + 2015-09-13 15:06:40 + SunilMohanAdapa + Modify structure for inclusion into manual + + + 6 + 2015-09-12 11:19:31 + SunilMohanAdapa + Move the firewall page to Manual paths + + + 5 + 2015-09-12 09:37:40 + SunilMohanAdapa + Move networking related information to Networks page, cleanup + + + 4 + 2015-02-13 04:53:16 + SunilMohanAdapa + Include FreedomBox portal in footer + + + 3 + 2014-05-08 08:02:39 + SunilMohanAdapa + Add section on internet connection sharing and minor corrections + + + 2 + 2014-05-08 07:49:29 + PaulWise + link to the plinth source + + + 1 + 2014-05-08 07:36:15 + SunilMohanAdapa + New page documenting firewall operation and default port status + + + +
+ Firewall + Firewall 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 Plinth web interface of FreedomBox 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. +
+ 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. + 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 + The following table attempts to document the ports, services and their default statuses in FreedomBox. If you find this page outdated, see the Plinth source for lib/freedombox/first-run.d/90_firewall and Firewall status page in Plinth UI. + + + + + + + + + + + + + Service + + + + + Port + + + + + External + + + + + Enabled by default + + + + + Status shown in Plinth + + + + + Managed by Plinth + + + + + + Minetest + + + 30000/udp + + + + + + + + + {*} + + + + + + + + + + + + {X} + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + + + + + XMPP Client + + + 5222/tcp + + + + + + + + + {*} + + + + + + + + + + + + {X} + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + + + + + XMPP Server + + + 5269/tcp + + + + + + + + + {*} + + + + + + + + + + + + {X} + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + + + + + XMPP Bosh + + + 5280/tcp + + + + + + + + + {*} + + + + + + + + + + + + {X} + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + + + + + NTP + + + 123/udp + + + + + + + + + {o} + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + + + + + 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/tdp + + + + + + + + + {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 operation + See FirewallD documentation for more information on the basic concepts and comprehensive documentation. +
+ Enable/disable firewall + To disable firewall + + or with systemd + + To re-enable firewall + + or with systemd + +
+
+ Modifying services/ports + You 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: + + To add a service to a zone: + --add-service= +firewall-cmd --permanent --zone= --add-service=]]> + Example: + + To add a port to a zone: + / +firewall-cmd --permanent --zone=internal --add-port=/]]> + Example: + +
+
+ Modifying the zone of interfaces + You can manually change the assignment of zones of each interfaces after they have been autuomatically assigned by the first boot process. + To see current assignment of interfaces to zones: + + To remove an interface from a zone: + --remove-interface= +firewall-cmd --permanent --zone= --remove-interface=]]> + Example: + + To add an interface to a zone: + --add-interface= +firewall-cmd --permanent --zone= --add-interface=]]> + Example: + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
+
diff --git a/doc/Ikiwiki.raw.xml b/doc/Ikiwiki.raw.xml new file mode 100644 index 000000000..d163b8aee --- /dev/null +++ b/doc/Ikiwiki.raw.xml @@ -0,0 +1,324 @@ + + +
+ + FreedomBox/Manual/Ikiwiki + + + 9 + 2016-12-26 19:18:01 + JamesValleroy + add screenshots + + + 8 + 2016-09-01 19:15:54 + Drahtseil + adapted title to Plinth wording + + + 7 + 2016-05-26 17:19:45 + JamesValleroy + new section on adding users as wiki admins + + + 6 + 2016-04-13 01:10:28 + PhilippeBaret + Added blog to quick start entry in Ikiwiki Manual + + + 5 + 2016-04-13 01:00:22 + PhilippeBaret + Added a "Quick Start" entry in Ikiwiki manual + + + 4 + 2016-04-10 07:21:53 + PhilippeBaret + Added bottom navigation link + + + 3 + 2015-12-15 19:54:35 + PhilippeBaret + Added Ikiwiki definition + + + 2 + 2015-11-29 19:13:55 + PhilippeBaret + added ## BEGIN_INCLUDE + + + 1 + 2015-09-13 17:06:14 + JamesValleroy + add 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 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. + + + + + + + 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 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". + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/LetsEncrypt.raw.xml b/doc/LetsEncrypt.raw.xml new file mode 100644 index 000000000..6a99c7e9a --- /dev/null +++ b/doc/LetsEncrypt.raw.xml @@ -0,0 +1,321 @@ + + +
+ + FreedomBox/Manual/LetsEncrypt + + + 8 + 2018-03-11 03:16:47 + JosephNuthalapati + + + 7 + 2017-01-19 00:18:41 + JamesValleroy + replace quote character + + + 6 + 2017-01-07 19:48:45 + JamesValleroy + add port forwarding info + + + 5 + 2017-01-07 18:21:14 + JamesValleroy + clarify step + + + 4 + 2016-08-21 19:00:07 + Drahtseil + + + 3 + 2016-08-21 18:59:20 + Drahtseil + Screencast of the setting up + + + 2 + 2016-08-21 17:57:07 + Drahtseil + screenshots + + + 1 + 2016-08-21 17:43:20 + Drahtseil + Created Let's Encypt + + + +
+ Certificates (Let's Encrypt) + A digital certficate 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 Certificates + The 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 setup + + + If 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 +
+
+ Using + The 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Makefile b/doc/Makefile index 7b0760536..220ff38c3 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -15,10 +15,9 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - MANUAL_URL="https://wiki.debian.org/FreedomBox/Manual?action=show&mimetype=text%2Fdocbook" -OUTPUTS=freedombox-manual.pdf freedombox-manual.html freedombox-manual.part.html plinth.1 +OUTPUTS=freedombox-manual.pdf plinth.1 manual-pages # In order to debug various problems with the documents especially # intermediate LaTeX state, run make as follows: @@ -51,28 +50,39 @@ all: $(OUTPUTS) fetch: wget --quiet -O - $(MANUAL_URL) | \ xmllint --format --output freedombox-manual.raw.xml - - xsltproc --output freedombox-manual.xml fixes.xslt freedombox-manual.raw.xml xsltproc fetch-images.xslt freedombox-manual.raw.xml | sort -u | \ awk '{print "wget --quiet -O images/" $$1 " " $$2}' | sh - rm -f freedombox-manual.raw.xml + ./fetch-manual-pages +.PHONY: manual-pages +manual-pages-list:=$(shell cat manual-pages.list) freedombox-manual +manual-pages-part-html:=$(patsubst %, %.part.html, $(manual-pages-list)) +manual-pages-html:=$(patsubst %, %.html, $(manual-pages-list)) +manual-pages-xml:=$(patsubst %, %.xml, $(manual-pages-list)) + +manual-pages: $(manual-pages-part-html) %.pdf: %.xml xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf $< - %.part.html: %.html perl -pe 'BEGIN {undef $$/} s/.*]*>(.*)<\/body\s*>.*/$$1/si' $< > $@ +freedombox-manual.xml: freedombox-manual.raw.xml fixes.xslt + xsltproc --output $@ fixes.xslt $< + +%.xml: %.raw.xml manual-page-fixes.xslt + xsltproc --output $@ manual-page-fixes.xslt $< + ./post-processor remove-footer $@ + ./post-processor fix-wiki-urls $@ %.html: %.xml docbook2html --nochunks $< - %.1: %.xml xmlto man $< - .PHONY: clean clean: + rm -f $(manual-pages-html) $(manual-pages-part-html) $(manual-pages-xml) rm -f $(OUTPUTS) diff --git a/doc/MatrixSynapse.raw.xml b/doc/MatrixSynapse.raw.xml new file mode 100644 index 000000000..77ae36ae7 --- /dev/null +++ b/doc/MatrixSynapse.raw.xml @@ -0,0 +1,235 @@ + + +
+ + FreedomBox/Manual/MatrixSynapse + + + 6 + 2018-03-02 12:06:08 + JosephNuthalapati + + + 5 + 2018-03-02 10:44:12 + JosephNuthalapati + Naming was inconsistent + + + 4 + 2017-06-27 05:13:41 + JosephNuthalapati + + + 3 + 2017-03-24 06:42:49 + SunilMohanAdapa + Update for explaining more features etc. + + + 2 + 2017-03-23 06:36:05 + rahulde + + + 1 + 2017-03-23 06:33:43 + rahulde + + + +
+ Chat Server (Matrix Synapse) +
+ What is the 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. Each instance of a Matrix server federates with other instances such that all your contacts need not hold accounts on your server. See more detailed info about Matrix. + Note: The Matrix Synapse is available in FreedomBox starting with Plinth version 0.14. +
+
+ How to access the Matrix? + We recommend the Riot client to access the Matrix server. You can download Riot for desktops. Mobile applications for Android and iOS are available from app stores. +
+
+ Setting up your FreedomBox for Matrix + To 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. All the registered users will have their Matrix IDs as @username:domain. Currently, you will not be able to change the domain once is it configured. +
+
+ Federating with other Matrix instances + You 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/MediaWiki.raw.xml b/doc/MediaWiki.raw.xml new file mode 100644 index 000000000..94236a399 --- /dev/null +++ b/doc/MediaWiki.raw.xml @@ -0,0 +1,251 @@ + + +
+ + FreedomBox/Manual/MediaWiki + + + 3 + 2018-01-31 06:02:30 + SunilMohanAdapa + Add footer and category + + + 2 + 2018-01-17 10:26:45 + JosephNuthalapati + Fix headings + + + 1 + 2018-01-13 04:01:22 + JosephNuthalapati + New wiki entry for MediaWiki on FreedomBox + + + +
+ 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 page in the Plinth UI. +
+
+ 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 + MediWiki's new Visual Editor gives a WYSIWYG user interface to creating wiki pages. Unfortunately, it is not yet available in the current version of MediaWiki on Debian. + 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
+
diff --git a/doc/Minetest.raw.xml b/doc/Minetest.raw.xml new file mode 100644 index 000000000..824d6a09e --- /dev/null +++ b/doc/Minetest.raw.xml @@ -0,0 +1,214 @@ + + +
+ + FreedomBox/Manual/Minetest + + + 3 + 2017-01-02 13:29:19 + JamesValleroy + fix list + + + 2 + 2017-01-02 13:26:03 + JamesValleroy + add port forwarding info + + + 1 + 2016-09-04 10:20:44 + Drahtseil + stub 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 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 + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Monkeysphere.raw.xml b/doc/Monkeysphere.raw.xml new file mode 100644 index 000000000..6bfe5d3eb --- /dev/null +++ b/doc/Monkeysphere.raw.xml @@ -0,0 +1,194 @@ + + +
+ + FreedomBox/Manual/Monkeysphere + + + 1 + 2016-09-04 10:12:10 + Drahtseil + stub created + + + +
+ Monkeysphere + With 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/Mumble.raw.xml b/doc/Mumble.raw.xml new file mode 100644 index 000000000..ad715b969 --- /dev/null +++ b/doc/Mumble.raw.xml @@ -0,0 +1,241 @@ + + +
+ + FreedomBox/Manual/Mumble + + + 6 + 2017-01-02 13:28:53 + JamesValleroy + add port forwarding info + + + 5 + 2016-12-31 04:04:56 + JamesValleroy + add basic usage info + + + 4 + 2016-09-01 19:14:55 + Drahtseil + adapted title to Plinth wording + + + 3 + 2016-04-10 07:20:42 + PhilippeBaret + Added bottom navigation link + + + 2 + 2015-12-15 20:51:58 + PhilippeBaret + + + 1 + 2015-12-15 20:06:18 + PhilippeBaret + Added 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 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: + + + TCP 64738 + + + UDP 64738 + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/NameServices.raw.xml b/doc/NameServices.raw.xml new file mode 100644 index 000000000..4420e560c --- /dev/null +++ b/doc/NameServices.raw.xml @@ -0,0 +1,204 @@ + + +
+ + FreedomBox/Manual/NameServices + + + 3 + 2016-12-31 04:18:51 + JamesValleroy + reword + + + 2 + 2016-08-21 17:16:56 + Drahtseil + + + 1 + 2016-08-21 17:16:41 + Drahtseil + Created NameServices + + + +
+ Name Services + Name Services provides an overview of ways the box can be reached from the public Internet: domain name, Tor hidden 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/Networks.raw.xml b/doc/Networks.raw.xml new file mode 100644 index 000000000..da0ce8533 --- /dev/null +++ b/doc/Networks.raw.xml @@ -0,0 +1,611 @@ + + +
+ + FreedomBox/Manual/Networks + + + 8 + 2017-03-31 20:04:48 + Drahtseil + Screenshot Network Single + + + 7 + 2017-03-02 16:26:27 + AaronFerrucci + Corrected a few typos + + + 6 + 2016-09-02 05:31:28 + SunilMohanAdapa + Add information about configuring BATMAN-Adv Mesh network + + + 5 + 2016-03-06 20:43:34 + PhilippeBaret + Text correction + + + 4 + 2015-09-13 15:04:43 + SunilMohanAdapa + Demote headings one level for inclusion into manual + + + 3 + 2015-09-12 11:23:58 + SunilMohanAdapa + Update link to renamed Firewall page + + + 2 + 2015-09-12 10:04:19 + SunilMohanAdapa + Add information about Internet connection sharing + + + 1 + 2015-09-12 09:24:59 + SunilMohanAdapa + New page for FreedomBox manual on networking + + + +
+ Networks + This 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 setup + In 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 interface + When 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 interface + When 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 configuration + All 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 Sharing + Although 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. +
+
+ Customization + The 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 connections + If 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-Fi + By 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. +
+
+ Adding a new network device + When 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 network + FreedomBox 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 network + To 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 Name + + + + + Example Value + + + + + Explanation + + + + + + + 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 Name + + + + + Example Value + + + + + Explanation + + + + + + + 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 network + To 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 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. + 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/OpenVPN.raw.xml b/doc/OpenVPN.raw.xml new file mode 100644 index 000000000..a1c94c168 --- /dev/null +++ b/doc/OpenVPN.raw.xml @@ -0,0 +1,291 @@ + + +
+ + FreedomBox/Manual/OpenVPN + + + 8 + 2016-12-31 04:01:13 + JamesValleroy + clarify install vs setup + + + 7 + 2016-09-09 15:37:55 + SunilMohanAdapa + Minor indentation fix with screenshot + + + 6 + 2016-09-01 19:14:03 + Drahtseil + adapted title to Plinth wording + + + 5 + 2016-08-14 19:39:09 + JanCostermans + added screenshot and setting up sections + + + 4 + 2016-04-10 07:16:50 + PhilippeBaret + Added bottom navigation link + + + 3 + 2015-12-16 00:32:58 + PhilippeBaret + Text finishing + + + 2 + 2015-12-16 00:28:34 + PhilippeBaret + Added definition for OpenVPN + + + 1 + 2015-12-15 23:58:42 + PhilippeBaret + Added 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. +
+
+ 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. + + + + + + + plinth_openvpn.png + + + + + + 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. + + + The ovpn file contains all the information a vpn client needs to connect to the server. + + + If you are behind a modem, you may have to change the ip address (if not, you can skip this step). Open the ovpn file in any text editor. The second line shows the IP address or hostname the client will try to connect to. This should be your WAN IP address or your hostname. This line also contains the port number, 1194 being the default. You may have to open this port on your modem and enable port forwarding. + + + + + + Install an OpenVPN client for your system + + + Open the ovpn file with the OpenVPN client. + + + Try to ping the FreedomBox or other devices on the local network. + + +
+
+ External Links + + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/PageKite.raw.xml b/doc/PageKite.raw.xml new file mode 100644 index 000000000..18b126521 --- /dev/null +++ b/doc/PageKite.raw.xml @@ -0,0 +1,290 @@ + + +
+ + FreedomBox/Manual/PageKite + + + 12 + 2017-01-07 20:37:22 + JamesValleroy + add info on getting certificate + + + 11 + 2017-01-07 20:21:47 + JamesValleroy + add instructions + + + 10 + 2017-01-07 20:14:44 + JamesValleroy + clarify how pagekite works + + + 9 + 2016-09-01 19:19:45 + Drahtseil + adapted title to Plinth wording + + + 8 + 2016-04-10 07:13:20 + PhilippeBaret + Added navigation link + + + 7 + 2015-12-15 20:50:09 + PhilippeBaret + Correction + + + 6 + 2015-12-15 19:28:57 + PhilippeBaret + Added more definition + + + 5 + 2015-12-15 19:19:27 + PhilippeBaret + Added pagekite extended definition + + + 4 + 2015-09-13 14:58:24 + SunilMohanAdapa + Add headings for inclusion into manual + + + 3 + 2015-09-13 13:18:15 + SunilMohanAdapa + Move PageKite page to manual + + + 2 + 2015-02-13 05:01:10 + SunilMohanAdapa + Include FreedomBox portal in footer + + + 1 + 2012-09-14 07:37:02 + planetlarg + + + +
+ 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 PageKite + + + Create 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. + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Power.raw.xml b/doc/Power.raw.xml new file mode 100644 index 000000000..d3a654764 --- /dev/null +++ b/doc/Power.raw.xml @@ -0,0 +1,199 @@ + + +
+ + FreedomBox/Manual/Power + + + 2 + 2017-01-07 20:38:36 + JamesValleroy + note confirmation + + + 1 + 2016-08-21 09:29:59 + Drahtseil + Created Power + + + +
+ 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/Privoxy.raw.xml b/doc/Privoxy.raw.xml new file mode 100644 index 000000000..64068d25d --- /dev/null +++ b/doc/Privoxy.raw.xml @@ -0,0 +1,317 @@ + + +
+ + FreedomBox/Manual/Privoxy + + + 10 + 2018-03-11 03:09:16 + JosephNuthalapati + Fix oversized images + + + 9 + 2016-09-09 15:39:20 + SunilMohanAdapa + Minor indentation fix with screenshots + + + 8 + 2016-09-09 15:31:16 + SunilMohanAdapa + Promote the visibility of the screencast + + + 7 + 2016-08-09 19:09:55 + Drahtseil + configuration for advanced users + + + 6 + 2016-08-06 20:02:42 + Drahtseil + Screencast of the setting up + + + 5 + 2016-08-06 17:57:33 + Drahtseil + screenshots + + + 4 + 2016-08-01 19:38:35 + Drahtseil + Very basic restructuring as preparation for more work to be done. + + + 3 + 2016-04-10 07:24:20 + PhilippeBaret + Added bottom navigation link + + + 2 + 2015-12-15 20:54:14 + PhilippeBaret + Added link to Privoxy FAQ + + + 1 + 2015-12-15 20:22:00 + PhilippeBaret + Added Privoxy page and definition + + + +
+ Web Proxy (Privoxy) + A web proxy acts as a filter for incoming and outgoing internet 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. + + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Quassel.raw.xml b/doc/Quassel.raw.xml new file mode 100644 index 000000000..4e85957b8 --- /dev/null +++ b/doc/Quassel.raw.xml @@ -0,0 +1,313 @@ + + +
+ + FreedomBox/Manual/Quassel + + + 3 + 2018-03-11 03:00:04 + JosephNuthalapati + Fix oversized image + + + 2 + 2016-08-18 17:30:28 + Drahtseil + wording, screen-shots + + + 1 + 2016-08-17 20:09:38 + Drahtseil + page 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 running 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 Plinth + + + 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 + + + + + Configure in your router port forwarding for port 4242 + + + on my device, this setting can be found in the section Network > NAT & Port rules > Port Forwarding + + + + + + + Quassel_PortForwarding.png + + + + + + + +
+
+ Clients + Clients to connect to Quassel from your desktop and mobile devices are available. + In a Debian system, you can e.g. use quassel-client + + + With the first start you create a user-ID you want to use in your IRC channel + + + Configure the network connection, e.g. server irc.debian.org/freedombox + + + Communication takes place in a channel, e.g. freedombox + + + Add a core + + + Chose an account name + + + Computer name is the DNS name to access your FreedomBox + + + Port: 4242 + + + User and password + + + + + For 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Radicale.raw.xml b/doc/Radicale.raw.xml new file mode 100644 index 000000000..9942558bc --- /dev/null +++ b/doc/Radicale.raw.xml @@ -0,0 +1,559 @@ + + +
+ + FreedomBox/Manual/Radicale + + + 31 + 2018-01-03 08:54:14 + JosephNuthalapati + Update broken link - radicale clients + + + 30 + 2017-08-06 23:06:11 + JohannesKeyser + updated dead link to radicale client page, and added warning about misleading URL info + + + 29 + 2016-12-31 02:28:01 + JamesValleroy + style changes + + + 28 + 2016-09-09 15:36:28 + SunilMohanAdapa + Minor indentation fix with screenshot + + + 27 + 2016-09-09 14:43:07 + SunilMohanAdapa + Minor fix to adjust screenshot + + + 26 + 2016-09-01 19:11:38 + Drahtseil + adapted title to Plinth wording + + + 25 + 2016-08-31 17:26:23 + Drahtseil + updated screenshot + + + 24 + 2016-08-31 17:24:42 + Drahtseil + Access rights + + + 23 + 2016-08-01 16:32:28 + Drahtseil + + + 22 + 2016-08-01 16:28:29 + Drahtseil + screenshots + + + 21 + 2016-08-01 16:18:30 + Drahtseil + Evolution tutorial to use Calendar instead of Contacts (just happen to have that screenshot) + + + 20 + 2016-07-31 18:21:39 + Drahtseil + Android, advanced user, screenshots still to follow + + + 19 + 2016-07-31 16:54:46 + Drahtseil + + + 18 + 2016-05-18 12:40:51 + SunilMohanAdapa + Reduce item nesting to < 4 due to problems in generating FreedomBox Manual + + + 17 + 2016-04-27 03:35:17 + StacyCockrum + formatting + + + 16 + 2016-04-27 03:24:18 + StacyCockrum + Editing and added instructions for Evolution Calendar. + + + 15 + 2016-04-26 06:11:34 + PhilippeBaret + Editing + + + 14 + 2016-04-25 11:43:17 + StacyCockrum + + + 13 + 2016-04-25 11:36:30 + StacyCockrum + I'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 e + + + 12 + 2016-04-16 01:38:12 + PhilippeBaret + Added Why Radical app content + + + 11 + 2016-04-16 01:36:07 + PhilippeBaret + Correction + + + 10 + 2016-04-15 14:58:18 + StacyCockrum + 2nd 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? + + + 9 + 2016-04-15 14:53:50 + StacyCockrum + Struggled 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? + + + 8 + 2016-04-11 09:04:25 + PhilippeBaret + Correction + + + 7 + 2016-04-11 09:02:38 + PhilippeBaret + Correction proper terms: CalDAV and CardDAV + + + 6 + 2016-04-11 09:01:11 + PhilippeBaret + Added Why running Radicale section + + + 5 + 2016-04-11 08:53:27 + PhilippeBaret + Correction + + + 4 + 2016-04-11 08:48:16 + PhilippeBaret + Added how to setup Radical server and clients in FreedomBox Manual + + + 3 + 2016-04-10 07:12:39 + PhilippeBaret + Added manual link + + + 2 + 2016-04-10 07:09:27 + PhilippeBaret + Added Radicale definition on FreedomBox manual + + + 1 + 2016-04-10 06:40:28 + PhilippeBaret + Added 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 Plinth + + + select Applications + + + go to Calendar and Addressbook (Radicale) 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 does not have a user interface. An external supported client application is needed. + 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/contact-file-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. + + + + + + + Android + + + There are various Apps that allow the integration of the *radicale* server. This example uses DAVdroid, 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. + + + Install DAVdroid + + + Create an account in DAVdroid with the same settings as described for Evolution + + + Click the newly created account and synchronize. + + + The settings, such as periodicity of synchronization, can be adjusted. + + + A contact or calendar file, that was created before appears. + + + Enable it. + + + It may take some minutes before e.g. the calendar is visible in your calendar app. + + + + +
+
+ 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 FreedbomBox + + +
+
+ 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
+
diff --git a/doc/Repro.raw.xml b/doc/Repro.raw.xml new file mode 100644 index 000000000..4600afb62 --- /dev/null +++ b/doc/Repro.raw.xml @@ -0,0 +1,283 @@ + + +
+ + FreedomBox/Manual/Repro + + + 6 + 2017-01-02 13:43:51 + JamesValleroy + add port forwarding info + + + 5 + 2016-12-31 03:57:09 + JamesValleroy + add basic info + + + 4 + 2016-12-26 18:56:31 + JamesValleroy + add screenshots + + + 3 + 2016-05-27 17:24:23 + JamesValleroy + add footer + + + 2 + 2016-05-27 17:21:48 + JamesValleroy + Renamed from 'FreedomBox/Manual/repro'. + + + 1 + 2016-05-15 19:03:02 + JamesValleroy + start page + + + +
+ SIP Server (repro) + 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 server + + + Configure 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 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 repro: + + + TCP 5060 + + + TCP 5061 + + + UDP 5060 + + + UDP 5061 + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Roundcube.raw.xml b/doc/Roundcube.raw.xml new file mode 100644 index 000000000..80562cc96 --- /dev/null +++ b/doc/Roundcube.raw.xml @@ -0,0 +1,230 @@ + + +
+ + FreedomBox/Manual/Roundcube + + + 6 + 2016-12-31 03:41:20 + JamesValleroy + add link + + + 5 + 2016-09-01 19:12:35 + Drahtseil + adapted title to Plinth wording + + + 4 + 2016-04-10 07:25:23 + PhilippeBaret + Added bottom navigation link + + + 3 + 2015-12-15 19:04:22 + PhilippeBaret + Text finishing + + + 2 + 2015-12-15 19:03:29 + PhilippeBaret + Added ## END_INCLUDE + + + 1 + 2015-12-15 19:02:17 + PhilippeBaret + Added 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 Roundcube + After Roundcube is installed, it can be accessed at https://<your freedombox>/roundcube. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Searx.raw.xml b/doc/Searx.raw.xml new file mode 100644 index 000000000..41938f18c --- /dev/null +++ b/doc/Searx.raw.xml @@ -0,0 +1,276 @@ + + +
+ + FreedomBox/Manual/Searx + + + 6 + 2018-03-08 15:08:44 + JosephNuthalapati + Add screenshot. Remove last 20 seconds from screencast to reduce size. + + + 5 + 2018-03-08 14:23:24 + JosephNuthalapati + Add query param to make the video play within the browser + + + 4 + 2018-03-07 20:43:27 + Drahtseil + + + 3 + 2018-03-07 20:37:05 + Drahtseil + Screencast of the installation and first steps + + + 2 + 2018-02-26 17:15:26 + JamesValleroy + included in 0.24 + + + 1 + 2018-02-22 12:12:50 + JosephNuthalapati + searx: Initial draft + + + +
+ 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 +
+
+ 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 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. + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/SecureShell.raw.xml b/doc/SecureShell.raw.xml new file mode 100644 index 000000000..6e5f79edd --- /dev/null +++ b/doc/SecureShell.raw.xml @@ -0,0 +1,322 @@ + + +
+ + FreedomBox/Manual/SecureShell + + + 11 + 2018-01-30 07:55:33 + SunilMohanAdapa + Update GitHub links with Salsa + + + 10 + 2017-03-06 23:17:08 + JamesValleroy + add note + + + 9 + 2016-10-13 21:49:06 + David Jones + Added infromation about connecting to the FBX using ssh over Tor + + + 8 + 2016-10-13 21:09:31 + David Jones + Added information about admin account for first log in to Plinth + + + 7 + 2016-09-05 09:42:36 + ElVirolo + Removing my previous contribution, as info already present in original version. + + + 6 + 2016-09-05 09:39:05 + ElVirolo + + + 5 + 2016-09-05 09:26:15 + ElVirolo + Added "Users created via Plinth" paragraph + + + 4 + 2015-12-21 19:42:10 + JamesValleroy + update default account + + + 3 + 2015-12-21 19:33:56 + JamesValleroy + fix outline level + + + 2 + 2015-12-15 19:31:18 + PhilippeBaret + Added definition title + + + 1 + 2015-09-16 16:22:37 + SunilMohanAdapa + New 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 Account + When creating an account in Plinth 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 Account + + + Note: If you can access Plinth, then you don't need to do this. You can use the user account created in Plinth 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 +
+ Local + 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 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 hidden 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 hidden service address for your FreedomBox. +
+
+
+ Becoming Superuser + After 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 Password + To change the password of a user managed by Plinth, use the change password page. However, the fbx default user is not managed by Plinth and its password cannot be changed in the web interface. + 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Security.raw.xml b/doc/Security.raw.xml new file mode 100644 index 000000000..f23d800e7 --- /dev/null +++ b/doc/Security.raw.xml @@ -0,0 +1,210 @@ + + +
+ + FreedomBox/Manual/Security + + + 2 + 2016-08-31 17:40:56 + Drahtseil + Screenshot + + + 1 + 2016-08-31 17:37:33 + Drahtseil + creation + + + +
+ Security + When this option is enabled, only users in the "admin" group will be able to log in to console or via SSH. Console users may be able to access some services without further authorization. + You can define the group of the users in the Users section. + + + + + + + Security.png + + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/ServiceDiscovery.raw.xml b/doc/ServiceDiscovery.raw.xml new file mode 100644 index 000000000..ad249fcd4 --- /dev/null +++ b/doc/ServiceDiscovery.raw.xml @@ -0,0 +1,201 @@ + + +
+ + FreedomBox/Manual/ServiceDiscovery + + + 2 + 2017-01-02 13:17:40 + JamesValleroy + mention .local address + + + 1 + 2016-08-21 09:48:13 + Drahtseil + Created Service Discovery + + + +
+ Service Discovery + Service 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/Shadowsocks.raw.xml b/doc/Shadowsocks.raw.xml new file mode 100644 index 000000000..e250c676f --- /dev/null +++ b/doc/Shadowsocks.raw.xml @@ -0,0 +1,218 @@ + + +
+ + FreedomBox/Manual/Shadowsocks + + + 1 + 2018-01-04 19:59:57 + David 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 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 + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Snapshots.raw.xml b/doc/Snapshots.raw.xml new file mode 100644 index 000000000..2cfbe73a3 --- /dev/null +++ b/doc/Snapshots.raw.xml @@ -0,0 +1,214 @@ + + +
+ + FreedomBox/Manual/Snapshots + + + 2 + 2018-03-10 15:11:41 + JosephNuthalapati + Fix oversized image + + + 1 + 2017-11-14 02:24:01 + JamesValleroy + new page for snapshots module + + + +
+ Snapshots + Snapshots 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 + + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/Storage.raw.xml b/doc/Storage.raw.xml new file mode 100644 index 000000000..c734b4bbf --- /dev/null +++ b/doc/Storage.raw.xml @@ -0,0 +1,240 @@ + + +
+ + FreedomBox/Manual/Storage + + + 7 + 2018-03-05 12:17:19 + JosephNuthalapati + Renamed from 'FreedomBox/Manual/Disks'. + + + 6 + 2018-03-05 12:16:41 + JosephNuthalapati + Renaming Disks to Storage + + + 5 + 2017-04-09 13:45:57 + JamesValleroy + update note about issue + + + 4 + 2017-03-31 20:16:25 + Drahtseil + update screenshot with "expand partition" + + + 3 + 2017-02-10 22:33:01 + JamesValleroy + add warning about non-functional feature + + + 2 + 2016-08-31 17:10:11 + Drahtseil + screenshot + + + 1 + 2016-08-31 17:09:10 + Drahtseil + Disks creation + + + +
+ Storage + Storage shows free space of mounted partitions. + If there is some free space left after the root partition, the option to expand the root partition is also available. + + + + + + + Disks.png + + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/Syncthing.raw.xml b/doc/Syncthing.raw.xml new file mode 100644 index 000000000..45352fcf4 --- /dev/null +++ b/doc/Syncthing.raw.xml @@ -0,0 +1,261 @@ + + +
+ + FreedomBox/Manual/Syncthing + + + 10 + 2018-03-10 04:32:57 + JosephNuthalapati + Fix oversized image + + + 9 + 2017-10-22 14:57:58 + Drahtseil + + + 8 + 2017-10-22 14:57:09 + Drahtseil + Syncthing GUI image + + + 7 + 2017-10-22 14:54:54 + Drahtseil + Some rewording etc. + + + 6 + 2017-10-21 14:59:53 + Drahtseil + Titel same as in Plinth GUI; standard footer; some basic restructuring before I will update the docu more in detail + + + 5 + 2017-04-04 10:39:36 + JosephNuthalapati + + + 4 + 2017-03-23 10:54:49 + JosephNuthalapati + Rewrote the section on Syncthing's role in FreedomBox + + + 3 + 2017-03-23 05:12:13 + SunilMohanAdapa + Minor formatting + + + 2 + 2017-03-23 05:11:43 + SunilMohanAdapa + Add note about availability of Syncthing + + + 1 + 2017-03-23 02:11:00 + JosephNuthalapati + Created 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. + Note: Syncthing is available in FreedomBox starting with Plinth 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
diff --git a/doc/TinyTinyRSS.raw.xml b/doc/TinyTinyRSS.raw.xml new file mode 100644 index 000000000..b56c7579f --- /dev/null +++ b/doc/TinyTinyRSS.raw.xml @@ -0,0 +1,398 @@ + + +
+ + FreedomBox/Manual/TinyTinyRSS + + + 10 + 2018-03-11 03:05:29 + JosephNuthalapati + Fix oversized images + + + 9 + 2017-10-18 13:51:27 + JosephNuthalapati + Remove link to source code as this wiki seems to have banned anything that starts with git.tt + + + 8 + 2017-10-18 13:47:46 + JosephNuthalapati + Add importing OPML feeds and link to source code of TT-RSS Android App + + + 7 + 2017-10-18 12:58:46 + JosephNuthalapati + Add documentation for automatic detection of RSS feeds and the Unsubscribe option + + + 6 + 2017-10-18 12:37:03 + JosephNuthalapati + Add screenshots for subscribing to a new RSS feed + + + 5 + 2017-10-16 12:11:52 + SunilMohanAdapa + Minor styling + + + 4 + 2017-10-16 12:08:36 + SunilMohanAdapa + Add information about mobile application + + + 3 + 2016-12-31 03:49:54 + JamesValleroy + add screenshot + + + 2 + 2016-12-31 03:44:56 + JamesValleroy + add user info + + + 1 + 2016-09-04 10:18:59 + Drahtseil + stub 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 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. + + + + + + + Tiny Tiny RSS + + + +
+ Adding a new feed + 1. 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 reader + In 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 App + The 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 + + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Tor.raw.xml b/doc/Tor.raw.xml new file mode 100644 index 000000000..8bd75b6bd --- /dev/null +++ b/doc/Tor.raw.xml @@ -0,0 +1,297 @@ + + +
+ + FreedomBox/Manual/Tor + + + 13 + 2017-01-07 16:00:24 + JamesValleroy + add image + + + 12 + 2017-01-07 15:21:27 + JamesValleroy + plural + + + 11 + 2016-12-31 02:19:46 + JamesValleroy + mention ssh + + + 10 + 2016-12-31 02:19:03 + JamesValleroy + add relay info + + + 9 + 2016-12-23 18:31:29 + JamesValleroy + undo outline level change + + + 8 + 2016-12-23 18:30:06 + JamesValleroy + move down outline level + + + 7 + 2016-04-10 07:14:17 + PhilippeBaret + Added bottom navigation link + + + 6 + 2015-12-15 16:54:58 + PhilippeBaret + Text finishing + + + 5 + 2015-12-15 16:40:11 + PhilippeBaret + + + 4 + 2015-12-15 16:34:38 + PhilippeBaret + Added Tor definition + + + 3 + 2015-09-13 14:54:59 + SunilMohanAdapa + Demote headings one level for inclusion into manual + + + 2 + 2015-09-13 14:53:54 + SunilMohanAdapa + Add FreedomBox category and portal + + + 1 + 2015-09-12 15:55:05 + JamesValleroy + create 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 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 Hidden Service to access your FreedomBox + Tor Hidden Service provides a way to access your FreedomBox, even if it's behind a router or firewall. + To enable Tor Hidden 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 Hidden 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 Hidden 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 Hidden Service configured on the FreedomBox. +
+
+ 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. +
+
+ Using Tor SOCKS port (advanced) + 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. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Transmission.raw.xml b/doc/Transmission.raw.xml new file mode 100644 index 000000000..90ceb4a9a --- /dev/null +++ b/doc/Transmission.raw.xml @@ -0,0 +1,269 @@ + + +
+ + FreedomBox/Manual/Transmission + + + 9 + 2016-12-31 02:07:57 + JamesValleroy + add login info + + + 8 + 2016-12-30 19:20:51 + JamesValleroy + reword + + + 7 + 2016-12-30 19:13:09 + JamesValleroy + add intro paragraph + + + 6 + 2016-12-30 18:59:46 + JamesValleroy + no space in "BitTorrent" + + + 5 + 2016-12-26 18:00:44 + JamesValleroy + add screenshot + + + 4 + 2016-09-01 19:04:35 + Drahtseil + adapted title to Plinth wording + + + 3 + 2016-04-10 07:27:22 + PhilippeBaret + Added bottom navigation link + + + 2 + 2015-12-15 20:42:02 + PhilippeBaret + + + 1 + 2015-12-15 18:23:33 + PhilippeBaret + Added 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". +
+
+ Screenshot + + + + + + + Transmission Web Interface + + + +
+
+ Using Transmission + After installing Transmission, it can be accessed at https://<your freedombox>/transmission. When you try to access this page, you will be required to login with a username and password. The default for both is "transmission". You can change the username and password using the configuration form in Plinth. +
+
+ Known Issues + + + The initial password is shown in the Plinth configuration form in a hashed format. This prevents it from being read or copied. However, after the password is changed, it is shown directly, without hashing. + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Upgrades.raw.xml b/doc/Upgrades.raw.xml new file mode 100644 index 000000000..aecf5d4be --- /dev/null +++ b/doc/Upgrades.raw.xml @@ -0,0 +1,238 @@ + + +
+ + FreedomBox/Manual/Upgrades + + + 5 + 2017-03-31 20:11:01 + Drahtseil + Screenshot automatic upgrades + + + 4 + 2016-09-01 19:20:27 + Drahtseil + adapted title to Plinth wording + + + 3 + 2016-01-16 07:41:43 + StacyCockrum + + + 2 + 2016-01-16 07:35:56 + StacyCockrum + + + 1 + 2015-09-16 15:01:05 + SunilMohanAdapa + Add upgrades manual page + + + +
+ Software Upgrades + FreedomBox can automatically install security upgrades. On the Upgrades page of the Settings section in Plinth you can turn on automatic upgrades. For FreedomBox versions above 0.5, 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. + Upgrades 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 upgrades happen. Alternatively, you can perform manual upgrades as described below. + + + + + + + upgrades.png + + + +
+ Manual Upgrades + In the Plinth web interface, you can initiate a manual upgrade process from Upgrades page of the Settings section. Note that once the upgrades start, it may take a long time to complete and Plinth may seem to wait for the page to load. + Under some circumstances, automatic upgrades may fail and require you perform a manual upgrade action. Even upgrades initiated from Plinth may not finish properly. This may be because the upgrade process requires you to make a decision. In these cases, manual upgrade on the terminal may be the only option. + In addition, while the upgrade task is running any application installations will wait until the upgrade task is finished. Depending on the hardware, the upgrade task may take a little time, therefore, giving the impression that the application installation stalled. + To perform manual upgrades on the terminal, login into FreedomBox on a terminal or using a remote secure shell (see Secure Shell section). Then run the following commands: + + This will ask you if it is alright to install/upgrade (or remove) some packages and use (or release) some disk space. Say yes after review. In some cases, during the upgrades process you will be asked questions about modified configuration files, answering with a default Keep current configuration is usually safe. + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/Users.raw.xml b/doc/Users.raw.xml new file mode 100644 index 000000000..19a904e3c --- /dev/null +++ b/doc/Users.raw.xml @@ -0,0 +1,233 @@ + + +
+ + FreedomBox/Manual/Users + + + 4 + 2017-01-14 20:13:01 + JamesValleroy + add known issue + + + 3 + 2016-12-31 04:15:09 + JamesValleroy + reword + + + 2 + 2016-09-01 19:21:25 + Drahtseil + adapted title to Plinth wording + + + 1 + 2016-08-21 16:48:45 + Drahtseil + Created Users + + + +
+ Users and Groups + You 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 + + + 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). + These characteristics 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 Issues + + + Currently, Plinth does not distinguish between users and administrators. Every user added through Plinth will have full access to the Plinth interface. + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/ejabberd.raw.xml b/doc/ejabberd.raw.xml new file mode 100644 index 000000000..7b0dabd03 --- /dev/null +++ b/doc/ejabberd.raw.xml @@ -0,0 +1,294 @@ + + +
+ + FreedomBox/Manual/ejabberd + + + 10 + 2018-03-02 13:01:38 + JosephNuthalapati + Consistent naming conventions + + + 9 + 2017-01-07 17:42:27 + JamesValleroy + add note about service restart + + + 8 + 2017-01-02 13:48:30 + JamesValleroy + add port forwarding info + + + 7 + 2016-12-31 03:11:19 + JamesValleroy + clarify + + + 6 + 2016-12-31 03:10:19 + JamesValleroy + mention web client + + + 5 + 2016-12-31 02:35:52 + JamesValleroy + add security info + + + 4 + 2016-09-04 10:31:37 + Drahtseil + added links + + + 3 + 2016-04-10 07:18:35 + PhilippeBaret + Added bottom navigation link + + + 2 + 2015-12-15 18:37:29 + PhilippeBaret + Added definition to Chat server page + + + 1 + 2015-09-20 23:52:11 + JamesValleroy + add xmpp page + + + +
+ Chat Server (XMPP) +
+ 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 Name + For 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 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. +
+
+ Using the web client + After 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 client + XMPP clients are available for various desktop and mobile platforms. +
+
+ 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 XMPP: + + + TCP 5222 (client-to-server) + + + TCP 5269 (server-to-server) + + + + + + + + + + + + + + + + + + Information + + + + + + + Support + + + + + Work Space + + + + + + Reports + + + + + Promote + + + + + + + Overview + + + + + Hardware + + + + + + + + + + Live Help + + + + + Where To Start + + + + + Translate + + + + + Calls + + + + + Talks + + + + + + + Features + + + + + Vision + + + + + + + + + + Q&A + + + + + Design + + + + + To Do + + + + + Metrics + + + + + Press + + + + + + + Download + + + + + Manual + + + + + + + + + + Use cases + + + + + Code + + + + + Contributors + + + + + Releases + + + + + Blog + + + + + + + + + +
+
+
diff --git a/doc/fetch-manual-pages b/doc/fetch-manual-pages new file mode 100755 index 000000000..ebb5471be --- /dev/null +++ b/doc/fetch-manual-pages @@ -0,0 +1,65 @@ +#!/usr/bin/python3 +# +# This file is part of FreedomBox. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import re +import urllib.request +from subprocess import PIPE, Popen + +MANUAL_PAGE_URL = "https://wiki.debian.org/FreedomBox/Manual/{}?action=show&mimetype=text%2Fdocbook" + +MANUAL_INDEX_RAW_URL = "https://wiki.debian.org/FreedomBox/Manual?action=raw" + +manual_pages = [] + +to_remove = ['QuickStart', 'GettingHelp', 'Developer'] + + +def write_manual_pages(): + pattern = 'FreedomBox/Manual/\w+' + lst = list(urllib.request.urlopen(MANUAL_INDEX_RAW_URL)) + global manual_pages + manual_pages = list(l[0].split('/')[-1] for l in filter( + None, map(lambda x: re.findall(pattern, x.decode()), lst))) + for entry in to_remove: + if entry in manual_pages: + manual_pages.remove(entry) + with open('manual-pages.list', 'w') as lst_file: + lst_file.write('\n'.join(manual_pages)) + + +def fetch_manual_pages_in_docbook_format(): + for page in manual_pages: + url = MANUAL_PAGE_URL.format(page) + p1 = Popen(['wget', '--quiet', '-O', '-', url], stdout=PIPE) + p2 = Popen(['xmllint', '--format', '-'], stdin=p1.stdout, stdout=PIPE) + p1.stdout.close() + with open('{}.raw.xml'.format(page), 'w') as docbook: + p3 = Popen( + ['egrep', '-v', 'linkend|Category|Commons|HELP|Back to'], + stdin=p2.stdout, stdout=docbook) + p2.stdout.close() + p3.communicate() + + +def main(): + write_manual_pages() + fetch_manual_pages_in_docbook_format() + + +if __name__ == '__main__': + main() diff --git a/doc/freedombox-manual.xml b/doc/freedombox-manual.raw.xml similarity index 82% rename from doc/freedombox-manual.xml rename to doc/freedombox-manual.raw.xml index b102b1dd7..ea44ba159 100644 --- a/doc/freedombox-manual.xml +++ b/doc/freedombox-manual.raw.xml @@ -2,8 +2,390 @@
- FreedomBox Manual - + FreedomBox/Manual + + + 64 + 2018-03-05 12:22:59 + JosephNuthalapati + Renamed Disks to Storage + + + 63 + 2018-03-05 03:57:14 + SunilMohanAdapa + Update link to XMPP to ejabberd + + + 62 + 2018-03-02 12:03:07 + JosephNuthalapati + Rename Matrix to MatrixSynapse + + + 61 + 2018-02-22 12:14:31 + JosephNuthalapati + Include Searx manual entry + + + 60 + 2018-02-10 03:19:17 + JosephNuthalapati + Add Coquelicot and sort Apps section in alphabetical order + + + 59 + 2018-01-17 10:27:42 + JosephNuthalapati + Include MediaWiki manual entry + + + 58 + 2018-01-04 20:04:28 + David Jones + + + 57 + 2017-11-14 02:27:58 + JamesValleroy + include Snapshots page + + + 56 + 2017-10-21 14:53:00 + Drahtseil + Adding Syncthing + + + 55 + 2017-06-06 04:07:40 + SunilMohanAdapa + Include pcDuino3 and RaspberryPi3 + + + 54 + 2017-03-23 06:34:36 + rahulde + + + 53 + 2017-01-21 17:18:07 + JamesValleroy + drop shaarli + + + 52 + 2017-01-18 23:32:13 + JamesValleroy + move release notes down + + + 51 + 2017-01-18 15:25:21 + JamesValleroy + Drop planned apps -- no reason to include them in manual yet + + + 50 + 2017-01-02 13:54:14 + JamesValleroy + include LetsEncrypt page + + + 49 + 2016-12-23 18:52:10 + JamesValleroy + Drop ownCloud page from manual. It has not been available in Debian for some time now. + + + 48 + 2016-12-23 18:32:35 + JamesValleroy + move available apps / planned apps to top level + + + 47 + 2016-12-23 18:27:34 + JamesValleroy + move not available apps to separate section + + + 46 + 2016-12-23 17:49:13 + JamesValleroy + Drop Advanced page from manual. The plugserver repo has not been updated in a long time, and would conflict with our current setup. + + + 45 + 2016-12-23 14:58:06 + JamesValleroy + remove links to old manuals (deleted pages) + + + 44 + 2016-09-04 10:16:09 + Drahtseil + + + 43 + 2016-08-31 17:50:53 + Drahtseil + added security, reordered alphabetically apps and system; dynamic DNS + pagekite -> system; kept secureshell, unhosted, gnusocial + + + 42 + 2016-08-31 17:13:30 + Drahtseil + added Disks + + + 41 + 2016-08-21 17:19:00 + Drahtseil + added NameServices + + + 40 + 2016-08-21 09:50:21 + Drahtseil + added Service Discovery + + + 39 + 2016-08-21 09:44:45 + Drahtseil + added Diagnostics, typo in Power + + + 38 + 2016-08-21 09:30:28 + Drahtseil + added Power + + + 37 + 2016-08-17 20:11:37 + Drahtseil + added include Quassel + + + 36 + 2016-05-27 17:24:54 + JamesValleroy + add repro page + + + 35 + 2016-04-10 07:04:38 + PhilippeBaret + Cleaned Radicale feature link made for page creation + + + 34 + 2016-04-10 06:35:00 + PhilippeBaret + Created manual page "Radicale" [FreedomBox/Manual/Radicale] + + + 33 + 2016-04-10 06:31:49 + PhilippeBaret + Added to FreedomBox manuel new page to do = Radicale + + + 32 + 2016-02-15 12:50:14 + JamesValleroy + use BEGIN_INCLUDE for Debian page + + + 31 + 2016-01-20 16:40:56 + PhilippeBaret + Added GnuSocial Include in the Manual tree + + + 30 + 2015-12-16 00:31:47 + PhilippeBaret + Added OpenVPN page to Apps manual + + + 29 + 2015-11-29 20:55:54 + PhilippeBaret + Added ## BEGIN_INCLUDE + + + 28 + 2015-11-29 20:54:55 + PhilippeBaret + Added ## BEGIN_INCLUDE for [QuickStart] + + + 27 + 2015-11-29 20:20:46 + PhilippeBaret + Fixing include for manual + + + 26 + 2015-11-29 19:27:21 + PhilippeBaret + Text finishing + + + 25 + 2015-11-29 19:20:25 + PhilippeBaret + Fixing TOC [hardware content] + + + 24 + 2015-11-29 19:11:48 + PhilippeBaret + Bug fixing + + + 23 + 2015-11-29 19:10:45 + PhilippeBaret + Added from="## BEGIN_INCLUDE" [fbx/download] + + + 22 + 2015-11-21 16:42:45 + SunilMohanAdapa + Add A20 OLinuXino Lime2/MICRO pages + + + 21 + 2015-11-08 23:03:14 + PhilippeBaret + Added Use page content [Other resources] + [Tell People] + + + 20 + 2015-11-08 22:49:24 + PhilippeBaret + <<TableOfContents(1)>> >> <<TableOfContents(2)>> + + + 19 + 2015-11-08 22:48:14 + PhilippeBaret + TableOfContents(3) >> TableOfContents(1) + + + 18 + 2015-11-08 22:10:12 + PhilippeBaret + Added Introduction page + + + 17 + 2015-11-06 15:23:56 + SunilMohanAdapa + Add APU as supported hardware + + + 16 + 2015-10-23 20:16:08 + MarkusSabadello + adding Unhosted to Apps + + + 15 + 2015-10-04 11:17:00 + SunilMohanAdapa + Include Download page + + + 14 + 2015-09-16 16:38:33 + SunilMohanAdapa + Don't include TOC from developer guide + + + 13 + 2015-09-16 16:24:02 + SunilMohanAdapa + Include the secure shell page + + + 12 + 2015-09-16 12:35:53 + SunilMohanAdapa + Relocate and rename developer section + + + 11 + 2015-09-16 12:18:57 + SunilMohanAdapa + Add hacking section + + + 10 + 2015-09-16 12:01:25 + SunilMohanAdapa + Add contributing section + + + 9 + 2015-09-16 08:29:07 + SunilMohanAdapa + Add USBWiFi page + + + 8 + 2015-09-14 03:41:12 + SunilMohanAdapa + Temporarily remove portal link to avoid Dockbook export issue + + + 7 + 2015-09-14 03:27:32 + SunilMohanAdapa + Remove Dreamplug TOC + + + 6 + 2015-09-13 16:03:28 + SunilMohanAdapa + Add release notes + + + 5 + 2015-09-13 15:26:24 + SunilMohanAdapa + Minor fix to title + + + 4 + 2015-09-13 15:20:46 + SunilMohanAdapa + Move getting help to the top of the manual + + + 3 + 2015-09-13 15:01:14 + SunilMohanAdapa + Don't bottom parts of each page + + + 2 + 2015-09-13 14:45:33 + SunilMohanAdapa + Add FreedomBox category and portal + + + 1 + 2015-09-13 14:43:38 + SunilMohanAdapa + Initial page for FreedomBox aggregated manual + +
FreedomBox: take your online privacy back @@ -15,27 +397,27 @@ - FreedomBox applications + FreedomBox applications - Machines that support FreedomBox + Machines that support FreedomBox - Download and Install + Download and Install - Manual + Manual - Live Help from the community + Live Help from the community @@ -56,7 +438,7 @@ - + freedombox-frontpage-2018-02-26.png @@ -67,7 +449,7 @@
Screencast introduction - Plinth_Introduction.webm + Plinth_Introduction.webm (36 MB, 13 Min.)
@@ -84,7 +466,7 @@ What you need to get started - A supported device (including any device that can run Debian). We will call that the FreedomBox in the rest of this manual. + A supported device (including any device that can run Debian). We will call that the FreedomBox in the rest of this manual. A power cable for your device. @@ -93,13 +475,13 @@ An ethernet cable. - A microSD card (or equivalent storage media for your device), prepared according to the instructions on the Download page. + A microSD card (or equivalent storage media for your device), prepared according to the instructions on the Download page.
How to get started - + Plug one end of your ethernet cord into your FreedomBox's ethernet port, and plug the other end into your router. @@ -123,21 +505,21 @@ If none of these methods are available, then you will need to figure out the IP address of your FreedomBox. You can use the "nmap" program from your computer to find its IP address: - nmap -p 80 --open -sV 192.168.0.0/24 (replace the ip/netmask with the one the router uses) + In most cases you can look at your current ip adress, and change the last digits with zero to find your home network, like so: XXX.XXX.XXX.0/24 Your FreedomBox will show up as an IP address with an open tcp port 80 using Apache httpd service on Debian, such as the example below which would make it accessible at : - Nmap scan report for 192.168.0.165 + + 80/tcp open http Apache httpd 2.4.17 ((Debian))]]> If nmap does not find anything with the above command, you can try replacing 192.168.0.0/24 with 10.42.0.255/24. - nmap -n -sP 10.42.0.255/24 + The scan report will show something similar to the following: - Nmap scan report for 10.42.0.1 + - In this example, the FreedomBox is accessible at . (10.42.0.1 is my laptop.) + Host is up (0.00044s latency).]]> + In this example, the FreedomBox is accessible at . (10.42.0.1 is my laptop.) @@ -148,7 +530,7 @@ - + Self-signed certificate warning @@ -160,7 +542,7 @@ - + Add Security Exception @@ -177,7 +559,7 @@ - + Welcome @@ -191,13 +573,13 @@ The next page asks you to provide a user name and password. Fill in the form, and then click "Create Account." - Note: The user that you create here has Admin privileges and can also log in using ssh. You might not want to use the user account you will want to use in daily usage, to prevent security issues. You can later add more users. + Note: The user that you create here has Admin privileges and can also log in using ssh. You might not want to use the user account you will want to use in daily usage, to prevent security issues. You can later add more users. - + Account @@ -214,7 +596,7 @@ - + Complete @@ -225,7 +607,7 @@ - Now you can try any of the Apps that are available on FreedomBox. + Now you can try any of the Apps that are available on FreedomBox.
Finding your way around @@ -236,7 +618,7 @@ - + Front page @@ -250,7 +632,7 @@ - + Apps @@ -264,7 +646,7 @@ - + Help @@ -278,7 +660,7 @@ - + System @@ -292,7 +674,7 @@ - + User @@ -328,17 +710,17 @@
Download and Install - Welcome to the FreedomBox download page. You may either install FreedomBox on one of the supported inexpensive hardware devices, on any Linux Debian operating system, or deploy it on a virtual machine. - Installing on a machine running a Debian system is easy because FreedomBox is available as a package. We do recommend to install FreedomBox on a supported single board computer (SBC). The board will be dedicated for FreedomBox use from home, this will prevent a lot of risks, such as accidental misconfiguration by the user. In case of trouble deciding which hardware is best for you or during the installation, please use the support page or read the Questions and Answers page based on posts on the Freedombox-discuss mailing list archives. + Welcome to the FreedomBox download page. You may either install FreedomBox on one of the supported inexpensive hardware devices, on any Linux Debian operating system, or deploy it on a virtual machine. + Installing on a machine running a Debian system is easy because FreedomBox is available as a package. We do recommend to install FreedomBox on a supported single board computer (SBC). The board will be dedicated for FreedomBox use from home, this will prevent a lot of risks, such as accidental misconfiguration by the user. In case of trouble deciding which hardware is best for you or during the installation, please use the support page or read the Questions and Answers page based on posts on the Freedombox-discuss mailing list archives.
Downloading on Debian - If you are installing on an existing Debian installation, you don't need to download these images. Instead read the instructions on setting up FreedomBox on Debian. + If you are installing on an existing Debian installation, you don't need to download these images. Instead read the instructions on setting up FreedomBox on Debian.
Downloading for SBC or Virtual Machine
Prepare your device - Read the hardware specific instructions on how to prepare your device at the Hardware section. On the web is a lot of documentation about setting your device up and flashing USB or SD Cards to boot your hardware. + Read the hardware specific instructions on how to prepare your device at the Hardware section. On the web is a lot of documentation about setting your device up and flashing USB or SD Cards to boot your hardware.
Downloading Images @@ -358,45 +740,45 @@ First open a terminal and import the public keys of the FreedomBox developers who built the images: - $ gpg --recv-keys BCBEBD57A11F70B23782BC5736C361440C9BC971 + +$ gpg --recv-keys 7D6ADB750F91085589484BE677C0C75E7B650808]]> Next, verify the fingerprint of the public keys: - $ gpg --fingerprint BCBEBD57A11F70B23782BC5736C361440C9BC971 + sub 4096R/4C1D4B57 2011-11-12 $ gpg --fingerprint 7D6ADB750F91085589484BE677C0C75E7B650808 pub 4096R/7B650808 2015-06-07 [expires: 2020-06-05] Key fingerprint = 7D6A DB75 0F91 0855 8948 4BE6 77C0 C75E 7B65 0808 -uid James Valleroy <jvalleroy@mailbox.org> -uid James Valleroy <jvalleroy@freedombox.org> +uid James Valleroy +uid James Valleroy sub 4096R/25D22BF4 2015-06-07 [expires: 2020-06-05] sub 4096R/DDA11207 2015-07-03 [expires: 2020-07-01] -sub 2048R/2A624357 2015-12-22 +sub 2048R/2A624357 2015-12-22]]> Finally, verify your downloaded image with its signature file .sig. For example: - $ gpg --verify freedombox-unstable-free_2015-12-13_cubietruck-armhf.img.xz.sig freedombox-unstable-free_2015-12-13_cubietruck-armhf.img.xz + " gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. -Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 +Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971]]>
Installation - After the download you can use the image to boot your chosen hardware (including virtual machines). You'll need to copy the image to the memory card or USB stick as follows: - + After the download you can use the image to boot your chosen hardware (including virtual machines). You'll need to copy the image to the memory card or USB stick as follows: + Figure out which device your card actually is. - + Unplug your card. @@ -405,7 +787,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 Plug your card in. You will see messages such as following: - [33299.023096] usb 4-6: new high-speed USB device number 12 using ehci-pci + +[33300.483566] sd 13:0:0:1: [sdg] Attached SCSI removable disk]]> In the above case, the disk that is newly inserted is available as /dev/sdg. Very carefully note this and use it in the copying step below. @@ -433,19 +815,19 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 Decompress the downloaded image using tar: - $ xz -d freedombox-unstable-free_2015-12-13_cubietruck-armhf.img.xz + The above command is an example for the cubietruck image built on 2015-12-13. Your downloaded file name will be different. Copy the image to your card. Double check to make sure you don't write to your computer's main storage (such as /dev/sda). Also make sure that you don't run this step as root to avoid potentially overriding data on your hard drive due to a mistake in identifying the device or errors while typing the command. USB disks and SD cards inserted into the system should typically be write accessible to normal users. If you don't have permission to write to your SD card as a user, you may need to run this command as root. In this case triple check everything before you run the command. Another safety precaution is to unplug all external disks except the SD card before running the command. For example, if your SD card is /dev/sdg as noted in the first step above, then to copy the image, run: - $ dd bs=1M if=freedombox-unstable-free_2015-12-13_cubietruck-armhf.img of=/dev/sdg conv=fdatasync + An alternative to copy to SD card command - $ cat freedombox-unstable-free_2015-12-13_cubietruck-armhf.img > /dev/sdg ; sync + /dev/sdg ; sync]]> On MS Windows you will need a tool like etcher. @@ -455,10 +837,10 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971When picking a device, use the drive-letter destination, like /dev/sdg, not a numbered destination, like /dev/sdg1. The device without a number refers to the entire device, while the device with a number refers to a specific partition. We want to use the whole device. Downloaded images contain complete information about how many partitions there should be, their sizes and types. You don't have to format your SD card or create partitions. All the data on the SD card will be wiped off during the write process. - Use the image by inserting the SD card or USB disk into the target device and booting from it. Your device should also be prepared (see the Hardware section). + Use the image by inserting the SD card or USB disk into the target device and booting from it. Your device should also be prepared (see the Hardware section). - Read (the rest of) the Manual for instructions on how to use applications in FreedomBox. + Read (the rest of) the Manual for instructions on how to use applications in FreedomBox.
@@ -484,7 +866,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 - + Tor Browser - Plinth @@ -507,7 +889,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971BitTorrent (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. + 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".
@@ -515,7 +897,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 - + Transmission Web Interface @@ -540,7 +922,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971BitTorrent (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. + 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.
@@ -548,7 +930,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 - + Deluge Web UI @@ -562,7 +944,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 - + Deluge Login @@ -574,7 +956,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 - + Deluge Connection Manager (Offline) @@ -585,7 +967,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 - + Deluge Connection Manager (Online) @@ -621,7 +1003,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 Within Plinth - + select Applications @@ -652,7 +1034,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 - + Radicale-Plinth.png @@ -668,7 +1050,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 Calendar - + Create a new calendar @@ -694,7 +1076,7 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 - + Radicale-Evolution-Docu.png @@ -756,12 +1138,12 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 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] + +permission: rw]]> [friends_calendar] is just an identifier, can be any name. @@ -784,9 +1166,9 @@ permission: rw edit file /etc/radicale/config and make the following changes in section [rights) - [rights] + +file = /etc/radicale/rights]]> @@ -807,7 +1189,7 @@ file = /etc/radicale/rights 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. @@ -818,14 +1200,14 @@ file = /etc/radicale/rights
Setting the Domain Name - For 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. + For 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. + Please note that Pagekite does not support the XMPP protocol at this time.
Registering XMPP users through SSO @@ -856,7 +1238,7 @@ file = /etc/radicale/rights Chat Server (Matrix Synapse)
What is the 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. Each instance of a Matrix server federates with other instances such that all your contacts need not hold accounts on your server. See more detailed info about 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. Each instance of a Matrix server federates with other instances such that all your contacts need not hold accounts on your server. See more detailed info about Matrix. Note: The Matrix Synapse is available in FreedomBox starting with Plinth version 0.14.
@@ -865,7 +1247,7 @@ file = /etc/radicale/rights
Setting up your FreedomBox for Matrix - To 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. All the registered users will have their Matrix IDs as @username:domain. Currently, you will not be able to change the domain once is it configured. + To 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. All the registered users will have their Matrix IDs as @username:domain. Currently, you will not be able to change the domain once is it configured.
Federating with other Matrix instances @@ -894,12 +1276,12 @@ file = /etc/radicale/rights
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 + 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. @@ -909,7 +1291,7 @@ file = /etc/radicale/rights 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. @@ -927,7 +1309,7 @@ file = /etc/radicale/rights
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. + 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.
@@ -941,7 +1323,7 @@ file = /etc/radicale/rights - + Syncthing web interface @@ -963,7 +1345,7 @@ file = /etc/radicale/rights Within Plinth - + select Applications @@ -975,7 +1357,7 @@ file = /etc/radicale/rights - + Quassel Installation @@ -996,7 +1378,7 @@ file = /etc/radicale/rights - + Quassel_PortForwarding.png @@ -1012,7 +1394,7 @@ file = /etc/radicale/rights Clients Clients to connect to Quassel from your desktop and mobile devices are available. In a Debian system, you can e.g. use quassel-client - + With the first start you create a user-ID you want to use in your IRC channel @@ -1024,7 +1406,7 @@ file = /etc/radicale/rights Add a core - + Chose an account name @@ -1049,7 +1431,7 @@ file = /etc/radicale/rights - + Quasseldroid.png @@ -1073,7 +1455,7 @@ file = /etc/radicale/rights - + Tiny Tiny RSS @@ -1086,7 +1468,7 @@ file = /etc/radicale/rights - + Selecting feeds @@ -1097,7 +1479,7 @@ file = /etc/radicale/rights - + Subscribe to feed @@ -1108,7 +1490,7 @@ file = /etc/radicale/rights - + Subscription dialog box @@ -1122,7 +1504,7 @@ file = /etc/radicale/rights - + WikiNews feed added @@ -1133,7 +1515,7 @@ file = /etc/radicale/rights - + Unsubscribe from a feed @@ -1149,7 +1531,7 @@ file = /etc/radicale/rights - + OPML feeds page @@ -1157,7 +1539,7 @@ file = /etc/radicale/rights To import your Subscriptions.opml file into TT-RSS, - + Click Browse and select the file from your file system @@ -1177,7 +1559,7 @@ file = /etc/radicale/rights - + Tiny Tiny RSS @@ -1185,7 +1567,7 @@ file = /etc/radicale/rights - + Tiny Tiny RSS @@ -1193,7 +1575,7 @@ file = /etc/radicale/rights - + Tiny Tiny RSS @@ -1201,7 +1583,7 @@ file = /etc/radicale/rights - + Tiny Tiny RSS @@ -1209,7 +1591,7 @@ file = /etc/radicale/rights - + Tiny Tiny RSS @@ -1223,7 +1605,7 @@ file = /etc/radicale/rights 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 server - + Configure the domain at /repro/domains.html on the FreedomBox. @@ -1231,7 +1613,7 @@ file = /etc/radicale/rights - + Repro Domains @@ -1248,7 +1630,7 @@ file = /etc/radicale/rights - + Repro Users @@ -1286,29 +1668,29 @@ file = /etc/radicale/rights 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. + 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: + 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 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. + 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. + 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. + 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
@@ -1320,7 +1702,7 @@ file = /etc/radicale/rights
Setting up - + In Plinth apps menu, select Virtual Private Network (OpenVPN) and click Install. @@ -1329,7 +1711,7 @@ file = /etc/radicale/rights - + plinth_openvpn.png @@ -1350,10 +1732,10 @@ file = /etc/radicale/rights If you are behind a modem, you may have to change the ip address (if not, you can skip this step). Open the ovpn file in any text editor. The second line shows the IP address or hostname the client will try to connect to. This should be your WAN IP address or your hostname. This line also contains the port number, 1194 being the default. You may have to open this port on your modem and enable port forwarding. - client + - +proto udp]]> + Install an OpenVPN client for your system @@ -1401,17 +1783,17 @@ proto udp 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. + Watch the screencast on how to setup and use Privoxy in FreedomBox.
Setting up - + In Plinth install Web Proxy (Privoxy) - + Privoxy Installation @@ -1424,7 +1806,7 @@ proto udp - + Privoxy Browser Settings @@ -1442,7 +1824,7 @@ proto udp
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. @@ -1481,7 +1863,7 @@ proto udp - + Searx Screenshot @@ -1491,7 +1873,7 @@ proto udp
Screencast - Searx installation and first steps (14 MB) + Searx installation and first steps (14 MB)
Why use Searx? @@ -1530,7 +1912,7 @@ proto udp Wiki (MediaWiki)
About MediaWiki - MediaWiki is the software that powers the Wikimedia suite of wikis. + MediaWiki is the software that powers the Wikimedia suite of wikis. Read more about MediaWiki on Wikipedia Available since: version 0.20.0
@@ -1539,11 +1921,11 @@ proto udp 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 page in the Plinth UI. + 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 page in the Plinth UI.
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. + 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 @@ -1607,7 +1989,7 @@ proto udp - + ikiwiki: Create @@ -1621,7 +2003,7 @@ proto udp - + ikiwiki: Manage @@ -1638,7 +2020,7 @@ proto udp
Adding FreedomBox users as wiki admins - + Login to the wiki, using the admin account that was specified when the wiki was created. @@ -1669,7 +2051,7 @@ proto udp
Configure Configure covers a couple of general topics: - + Hostname @@ -1682,7 +2064,7 @@ proto udp 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), Certificates (Let's Encrypt), and Monkeysphere. + 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), Certificates (Let's Encrypt), and Monkeysphere. @@ -1703,7 +2085,7 @@ proto udp - + DateTime.png @@ -1732,7 +2114,7 @@ proto udp
Using the GnuDIP protocol - + Register an account with any Dynamic DNS service provider. A free service provided by the FreedomBox community is available at . @@ -1744,7 +2126,7 @@ proto udp - + Dynamic DNS Settings @@ -1760,7 +2142,7 @@ proto udp
Using an Update URL This 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. @@ -1783,7 +2165,7 @@ proto udp
Checking If It Works - + Make sure that external services you have enabled such as /jwchat, /roundcube and /ikiwiki are available on your domain address. @@ -1800,7 +2182,7 @@ proto udp to delete or to replace the old text - + Access to GnuIP login page (answer Yes to all pop ups) @@ -1856,7 +2238,7 @@ proto udp - + Firewall @@ -1868,7 +2250,7 @@ proto udp 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. 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. + For details on how network interfaces are configured by default, see the Networks section.
Ports/Services @@ -1925,7 +2307,7 @@ proto udp - + {*} @@ -1937,7 +2319,7 @@ proto udp - + {X} @@ -1949,7 +2331,7 @@ proto udp - + (./) @@ -1961,7 +2343,7 @@ proto udp - + (./) @@ -1981,7 +2363,7 @@ proto udp - + {*} @@ -1993,7 +2375,7 @@ proto udp - + {X} @@ -2005,7 +2387,7 @@ proto udp - + (./) @@ -2017,7 +2399,7 @@ proto udp - + (./) @@ -2037,7 +2419,7 @@ proto udp - + {*} @@ -2049,7 +2431,7 @@ proto udp - + {X} @@ -2061,7 +2443,7 @@ proto udp - + (./) @@ -2073,7 +2455,7 @@ proto udp - + (./) @@ -2093,7 +2475,7 @@ proto udp - + {*} @@ -2105,7 +2487,7 @@ proto udp - + {X} @@ -2117,7 +2499,7 @@ proto udp - + (./) @@ -2129,7 +2511,7 @@ proto udp - + (./) @@ -2149,7 +2531,7 @@ proto udp - + {o} @@ -2161,7 +2543,7 @@ proto udp - + (./) @@ -2173,7 +2555,7 @@ proto udp - + (./) @@ -2185,7 +2567,7 @@ proto udp - + (./) @@ -2205,7 +2587,7 @@ proto udp - + {*} @@ -2217,7 +2599,7 @@ proto udp - + (./) @@ -2229,7 +2611,7 @@ proto udp - + (./) @@ -2241,7 +2623,7 @@ proto udp - + {X} @@ -2261,7 +2643,7 @@ proto udp - + {*} @@ -2273,7 +2655,7 @@ proto udp - + {X} @@ -2285,7 +2667,7 @@ proto udp - + (./) @@ -2297,7 +2679,7 @@ proto udp - + (./) @@ -2317,7 +2699,7 @@ proto udp - + {*} @@ -2329,7 +2711,7 @@ proto udp - + {X} @@ -2341,7 +2723,7 @@ proto udp - + (./) @@ -2353,7 +2735,7 @@ proto udp - + (./) @@ -2373,7 +2755,7 @@ proto udp - + {*} @@ -2385,7 +2767,7 @@ proto udp - + {X} @@ -2397,7 +2779,7 @@ proto udp - + (./) @@ -2409,7 +2791,7 @@ proto udp - + (./) @@ -2429,7 +2811,7 @@ proto udp - + {*} @@ -2441,7 +2823,7 @@ proto udp - + {X} @@ -2453,7 +2835,7 @@ proto udp - + (./) @@ -2465,7 +2847,7 @@ proto udp - + (./) @@ -2485,7 +2867,7 @@ proto udp - + {*} @@ -2497,7 +2879,7 @@ proto udp - + {X} @@ -2509,7 +2891,7 @@ proto udp - + (./) @@ -2521,7 +2903,7 @@ proto udp - + (./) @@ -2541,7 +2923,7 @@ proto udp - + {*} @@ -2553,7 +2935,7 @@ proto udp - + {X} @@ -2565,7 +2947,7 @@ proto udp - + (./) @@ -2577,7 +2959,7 @@ proto udp - + (./) @@ -2597,7 +2979,7 @@ proto udp - + {*} @@ -2609,7 +2991,7 @@ proto udp - + (./) @@ -2621,7 +3003,7 @@ proto udp - + (./) @@ -2633,7 +3015,7 @@ proto udp - + {X} @@ -2653,7 +3035,7 @@ proto udp - + {o} @@ -2665,7 +3047,7 @@ proto udp - + (./) @@ -2677,7 +3059,7 @@ proto udp - + (./) @@ -2689,7 +3071,7 @@ proto udp - + (./) @@ -2709,7 +3091,7 @@ proto udp - + {o} @@ -2721,7 +3103,7 @@ proto udp - + {X} @@ -2733,7 +3115,7 @@ proto udp - + (./) @@ -2745,7 +3127,7 @@ proto udp - + (./) @@ -2765,7 +3147,7 @@ proto udp - + {*} @@ -2777,7 +3159,7 @@ proto udp - + {X} @@ -2789,7 +3171,7 @@ proto udp - + (./) @@ -2801,7 +3183,7 @@ proto udp - + (./) @@ -2821,7 +3203,7 @@ proto udp - + {*} @@ -2833,7 +3215,7 @@ proto udp - + {X} @@ -2845,7 +3227,7 @@ proto udp - + (./) @@ -2857,7 +3239,7 @@ proto udp - + (./) @@ -2877,7 +3259,7 @@ proto udp - + {*} @@ -2889,7 +3271,7 @@ proto udp - + {X} @@ -2901,7 +3283,7 @@ proto udp - + (./) @@ -2913,7 +3295,7 @@ proto udp - + (./) @@ -2933,7 +3315,7 @@ proto udp - + {*} @@ -2945,7 +3327,7 @@ proto udp - + {X} @@ -2957,7 +3339,7 @@ proto udp - + (./) @@ -2969,7 +3351,7 @@ proto udp - + (./) @@ -2989,7 +3371,7 @@ proto udp - + {o} @@ -3001,7 +3383,7 @@ proto udp - + {X} @@ -3013,7 +3395,7 @@ proto udp - + (./) @@ -3025,7 +3407,7 @@ proto udp - + (./) @@ -3045,7 +3427,7 @@ proto udp - + {*} @@ -3057,7 +3439,7 @@ proto udp - + {X} @@ -3069,7 +3451,7 @@ proto udp - + {X} @@ -3081,7 +3463,7 @@ proto udp - + {X} @@ -3101,7 +3483,7 @@ proto udp - + {*} @@ -3113,7 +3495,7 @@ proto udp - + {X} @@ -3125,7 +3507,7 @@ proto udp - + {X} @@ -3137,7 +3519,7 @@ proto udp - + {X} @@ -3157,7 +3539,7 @@ proto udp - + {o} @@ -3169,7 +3551,7 @@ proto udp - + {X} @@ -3181,7 +3563,7 @@ proto udp - + {X} @@ -3193,7 +3575,7 @@ proto udp - + {X} @@ -3213,7 +3595,7 @@ proto udp - + {o} @@ -3225,7 +3607,7 @@ proto udp - + {X} @@ -3237,7 +3619,7 @@ proto udp - + {X} @@ -3249,7 +3631,7 @@ proto udp - + {X} @@ -3269,7 +3651,7 @@ proto udp - + {o} @@ -3281,7 +3663,7 @@ proto udp - + (./) @@ -3293,7 +3675,7 @@ proto udp - + {X} @@ -3305,7 +3687,7 @@ proto udp - + {X} @@ -3325,7 +3707,7 @@ proto udp - + {o} @@ -3337,7 +3719,7 @@ proto udp - + {X} @@ -3349,7 +3731,7 @@ proto udp - + {X} @@ -3361,7 +3743,7 @@ proto udp - + {X} @@ -3381,7 +3763,7 @@ proto udp - + {o} @@ -3393,7 +3775,7 @@ proto udp - + {X} @@ -3405,7 +3787,7 @@ proto udp - + {X} @@ -3417,7 +3799,7 @@ proto udp - + {X} @@ -3437,7 +3819,7 @@ proto udp - + {o} @@ -3449,7 +3831,7 @@ proto udp - + {X} @@ -3461,7 +3843,7 @@ proto udp - + {X} @@ -3473,7 +3855,7 @@ proto udp - + {X} @@ -3493,7 +3875,7 @@ proto udp - + {o} @@ -3505,7 +3887,7 @@ proto udp - + {X} @@ -3517,7 +3899,7 @@ proto udp - + {X} @@ -3529,7 +3911,7 @@ proto udp - + {X} @@ -3549,7 +3931,7 @@ proto udp - + {o} @@ -3561,7 +3943,7 @@ proto udp - + {X} @@ -3573,7 +3955,7 @@ proto udp - + {X} @@ -3585,7 +3967,7 @@ proto udp - + {X} @@ -3605,7 +3987,7 @@ proto udp - + {o} @@ -3617,7 +3999,7 @@ proto udp - + {X} @@ -3629,7 +4011,7 @@ proto udp - + {X} @@ -3641,7 +4023,7 @@ proto udp - + {X} @@ -3660,67 +4042,67 @@ proto udp
Enable/disable firewall To disable firewall - service firewalld stop + or with systemd - systemctl stop firewalld + To re-enable firewall - service firewalld start + or with systemd - systemctl start firewalld +
Modifying services/ports You can manually add or remove a service from a zone. To see list of services enabled: - firewall-cmd --zone=<zone> --list-services + --list-services]]> Example: - firewall-cmd --zone=internal --list-services + To see list of ports enabled: - firewall-cmd --zone=<zone> --list-ports + --list-ports]]> Example: - firewall-cmd --zone=internal --list-ports + To remove a service from a zone: - firewall-cmd --zone=<zone> --remove-service=<service> -firewall-cmd --permanent --zone=<zone> --remove-service=<interface> + --remove-service= +firewall-cmd --permanent --zone= --remove-service=]]> Example: - firewall-cmd --zone=internal --remove-service=xmpp-bosh -firewall-cmd --permanent --zone=internal --remove-service=xmpp-bosh + To remove a port from a zone: - firewall-cmd --zone=internal --remove-port=<port>/<protocol> -firewall-cmd --permanent --zone=internal --remove-port=<port>/<protocol> + / +firewall-cmd --permanent --zone=internal --remove-port=/]]> Example: - firewall-cmd --zone=internal --remove-port=5353/udp -firewall-cmd --permanent --zone=internal --remove-port=5353/udp + To add a service to a zone: - firewall-cmd --zone=<zone> --add-service=<service> -firewall-cmd --permanent --zone=<zone> --add-service=<interface> + --add-service= +firewall-cmd --permanent --zone= --add-service=]]> Example: - firewall-cmd --zone=internal --add-service=xmpp-bosh -firewall-cmd --permanent --zone=internal --add-service=xmpp-bosh + To add a port to a zone: - firewall-cmd --zone=internal --add-port=<port>/<protocol> -firewall-cmd --permanent --zone=internal --add-port=<port>/<protocol> + / +firewall-cmd --permanent --zone=internal --add-port=/]]> Example: - firewall-cmd --zone=internal --add-port=5353/udp -firewall-cmd --permanent --zone=internal --add-port=5353/udp +
Modifying the zone of interfaces You can manually change the assignment of zones of each interfaces after they have been autuomatically assigned by the first boot process. To see current assignment of interfaces to zones: - firewall-cmd --list-all-zones + To remove an interface from a zone: - firewall-cmd --zone=<zone> --remove-interface=<interface> -firewall-cmd --permanent --zone=<zone> --remove-interface=<interface> + --remove-interface= +firewall-cmd --permanent --zone= --remove-interface=]]> Example: - firewall-cmd --zone=external --remove-interface=eth0 -firewall-cmd --permanent --zone=external --remove-interface=eth0 + To add an interface to a zone: - firewall-cmd --zone=<zone> --add-interface=<interface> -firewall-cmd --permanent --zone=<zone> --add-interface=<interface> + --add-interface= +firewall-cmd --permanent --zone= --add-interface=]]> Example: - firewall-cmd --zone=internal --add-interface=eth0 -firewall-cmd --permanent --zone=internal --add-interface=eth0 +
@@ -3734,7 +4116,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0
How to setup - + If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports: @@ -3750,7 +4132,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0 Make the domain name known: - In Configure insert your domain name, e.g. MyWebName.com Let's Encrypt + In Configure insert your domain name, e.g. MyWebName.com Let's Encrypt @@ -3758,11 +4140,11 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0 Verify the domain name was accepted - Check that it is enabled in Name Services + Check that it is enabled in Name Services - + Let's Encrypt Name Services @@ -3780,7 +4162,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0 - + Let's Encrypt @@ -3797,7 +4179,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0 - + Let's Encrypt Certificate @@ -3808,7 +4190,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0 - Screencast: Let's Encrypt + Screencast: Let's Encrypt
Using @@ -3827,7 +4209,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0
Networks - This 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. + This 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 setup In 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. @@ -3838,7 +4220,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0 - + network_single.png @@ -3904,7 +4286,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0
Joining a mesh network To 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: @@ -4163,7 +4545,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0
Creating a mesh network To 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. @@ -4180,29 +4562,29 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0 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. On the command line interface: For text based user interface for configuring network connections: - nmtui + To see the list of available network devices: - nmcli device + To see the list of configured connections: - nmcli connection + To see the current status of a connection: - nmcli connection show '<connection_name>' + ']]> To see the current firewall zone assigned to a network interface: - nmcli connection show '<connection_name>' | grep zone + ' | grep zone]]> or - firewall-cmd --zone=internal --list-all -firewall-cmd --zone=external --list-all + To create a new network connection: - nmcli con add con-name "<connection_name>" ifname "<interface>" type ethernet -nmcli con modify "<connection_name>" connection.autoconnect TRUE -nmcli con modify "<connection_name>" connection.zone internal + " ifname "" type ethernet +nmcli con modify "" connection.autoconnect TRUE +nmcli con modify "" connection.zone internal]]> To change the firewall zone for a connection: - nmcli con modify "<connection_name>" connection.zone "<internal|external>" + " 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. + To see the current status of the firewall and manually operate it, see the Firewall section.
@@ -4218,7 +4600,7 @@ nmcli con modify "<connection_name>" connection.zone internal
Using PageKite - + Create an account on a PageKite relay service. @@ -4240,7 +4622,7 @@ nmcli con modify "<connection_name>" connection.zone internal - On the Certificates (Let's Encrypt) page, you can obtain a Let's Encrypt certificate for your kite name. + On the Certificates (Let's Encrypt) page, you can obtain a Let's Encrypt certificate for your kite name.
@@ -4278,34 +4660,34 @@ nmcli con modify "<connection_name>" connection.zone internal
Local To login via SSH, to your FreedomBox: - $ ssh fbx@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. + + 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 Tor - If in Plinth you have enabled hidden services via Tor, you can access your FreedomBox using ssh over Tor. On a GNU/Linux computer, install netcat-openbsd. - $ sudo apt-get install netcat-openbsd + If in Plinth you have enabled hidden 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. - $ nano ~/.ssh/config + Add the following: - Host *.onion + + 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: - $ ssh USERNAME@ADDRESS.onion - Replace USERNAME with, e.g., an admin username, and ADDRESS with the hidden service address for your FreedomBox. + Now to connect to the FreedomBox, open a terminal and type: + + Replace USERNAME with, e.g., an admin username, and ADDRESS with the hidden service address for your FreedomBox.
Becoming Superuser After logging in, if you want to become the superuser for performing administrative activities: - $ sudo su + 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. @@ -4315,18 +4697,18 @@ nmcli con modify "<connection_name>" connection.zone internal Changing Password To change the password of a user managed by Plinth, use the change password page. However, the fbx default user is not managed by Plinth and its password cannot be changed in the web interface. 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: - $ passwd + This will ask you for your current password before giving you the opportunity to set a new one.
Security When this option is enabled, only users in the "admin" group will be able to log in to console or via SSH. Console users may be able to access some services without further authorization. - You can define the group of the users in the Users section. + You can define the group of the users in the Users section. - + Security.png @@ -4351,7 +4733,7 @@ nmcli con modify "<connection_name>" connection.zone internal - + Snapshots @@ -4366,7 +4748,7 @@ nmcli con modify "<connection_name>" connection.zone internal - + Disks.png @@ -4381,7 +4763,7 @@ nmcli con modify "<connection_name>" connection.zone internal - + upgrades.png @@ -4393,11 +4775,11 @@ nmcli con modify "<connection_name>" connection.zone internal In the Plinth web interface, you can initiate a manual upgrade process from Upgrades page of the Settings section. Note that once the upgrades start, it may take a long time to complete and Plinth may seem to wait for the page to load. Under some circumstances, automatic upgrades may fail and require you perform a manual upgrade action. Even upgrades initiated from Plinth may not finish properly. This may be because the upgrade process requires you to make a decision. In these cases, manual upgrade on the terminal may be the only option. In addition, while the upgrade task is running any application installations will wait until the upgrade task is finished. Depending on the hardware, the upgrade task may take a little time, therefore, giving the impression that the application installation stalled. - To perform manual upgrades on the terminal, login into FreedomBox on a terminal or using a remote secure shell (see Secure Shell section). Then run the following commands: - $ sudo su - + To perform manual upgrades on the terminal, login into FreedomBox on a terminal or using a remote secure shell (see Secure Shell section). Then run the following commands: + +# apt-get dist-upgrade]]> This will ask you if it is alright to install/upgrade (or remove) some packages and use (or release) some disk space. Say yes after review. In some cases, during the upgrades process you will be asked questions about modified configuration files, answering with a default Keep current configuration is usually safe.
@@ -4431,7 +4813,7 @@ Password:
Hardware FreedomBox is designed to be the software for a consumer electronics device that is easy to setup, maintain and use. The project does not aim to create a custom hardware device ourselves, but instead we plan to support/customize existing hardware. - In addition to supporting various single board computers and other devices, FreedomBox also supports being installed in a virtual machine. Also, any Debian machine can be turned into a FreedomBox by installing the freedombox-setup package. See the manual for more details. + In addition to supporting various single board computers and other devices, FreedomBox also supports being installed in a virtual machine. Also, any Debian machine can be turned into a FreedomBox by installing the freedombox-setup package. See the manual for more details.
Supported Hardware
@@ -4445,10 +4827,10 @@ Password: - + - + FreedomBox Danube Edition @@ -4457,16 +4839,16 @@ Password: - FreedomBox - Danube Edition + FreedomBox - Danube Edition (based on Cubietruck) - + - + Cubieboard 2 @@ -4475,15 +4857,15 @@ Password: - Cubieboard2 + Cubieboard2 - + - + BeagleBone Black @@ -4492,17 +4874,17 @@ Password: - BeagleBone Black + BeagleBone Black - + - + A20 OLinuXino Lime2 @@ -4511,15 +4893,15 @@ Password: - A20 OLinuXino Lime2 + A20 OLinuXino Lime2 - + - + A20 OLinuXino MICRO @@ -4528,15 +4910,15 @@ Password: - A20 OLinuXino MICRO + A20 OLinuXino MICRO - + - + PC Engines APU @@ -4545,17 +4927,17 @@ Password: - PC Engines APU + PC Engines APU - + - + pcDuino3 @@ -4564,15 +4946,15 @@ Password: - pcDuino3 + pcDuino3 - + - + Debian @@ -4581,15 +4963,15 @@ Password: - Debian + Debian - + - + VirtualBox @@ -4598,7 +4980,7 @@ Password: - VirtualBox + VirtualBox @@ -4663,7 +5045,7 @@ Password: - OSHW + OSHW @@ -4691,7 +5073,7 @@ Password: - + (./) @@ -4706,7 +5088,7 @@ Password: - + {X} @@ -4738,7 +5120,7 @@ Password: - + (./) @@ -4753,7 +5135,7 @@ Password: - + {X} @@ -4791,7 +5173,7 @@ Password: - + (./) @@ -4820,7 +5202,7 @@ Password: - + (./) @@ -4832,7 +5214,7 @@ Password: - + (./) @@ -4847,7 +5229,7 @@ Password: - + {X} @@ -4876,7 +5258,7 @@ Password: - + (./) @@ -4888,7 +5270,7 @@ Password: - + (./) @@ -4903,7 +5285,7 @@ Password: - + {X} @@ -4932,7 +5314,7 @@ Password: - + (./) @@ -4944,7 +5326,7 @@ Password: - + (./) @@ -4959,7 +5341,7 @@ Password: - + {X} @@ -4988,7 +5370,7 @@ Password: - + (./) @@ -5000,7 +5382,7 @@ Password: - + (./) @@ -5015,7 +5397,7 @@ Password: - + (./) @@ -5044,7 +5426,7 @@ Password: - + (./) @@ -5056,7 +5438,7 @@ Password: - + (./) @@ -5071,7 +5453,7 @@ Password: - + (./) @@ -5100,7 +5482,7 @@ Password: - + (./) @@ -5112,7 +5494,7 @@ Password: - + (./) @@ -5127,7 +5509,7 @@ Password: - + (./) @@ -5156,7 +5538,7 @@ Password: - + (./) @@ -5168,7 +5550,7 @@ Password: - + (./) @@ -5183,7 +5565,7 @@ Password: - + {X} @@ -5209,10 +5591,10 @@ Password: - + - + DreamPlug @@ -5221,15 +5603,15 @@ Password: - DreamPlug + DreamPlug - + - + Raspberry Pi @@ -5238,15 +5620,15 @@ Password: - Raspberry Pi + Raspberry Pi - + - + Raspberry Pi 2 @@ -5255,17 +5637,17 @@ Password: - Raspberry Pi 2 + Raspberry Pi 2 - + - + Raspberry Pi 3 @@ -5274,7 +5656,7 @@ Password: - Raspberry Pi 3 + Raspberry Pi 3 @@ -5294,11 +5676,11 @@ Password: Targeted Hardware
List of Targeted Hardware - Although the project may focus on supporting specific devices, we are looking to support as much hardware as possible given that it is suitable for FreedomBox's needs. Take a look at the list of targeted hardware for more information. + Although the project may focus on supporting specific devices, we are looking to support as much hardware as possible given that it is suitable for FreedomBox's needs. Take a look at the list of targeted hardware for more information.
Adding Hardware Support - If you are a developer, consider adding hardware support for your device by modifying Freedom Maker and FreedomBox Setup. If you have access to one of these targeted hardware devices and would like to work with us to make it run FreedomBox, please contact us! + If you are a developer, consider adding hardware support for your device by modifying Freedom Maker and FreedomBox Setup. If you have access to one of these targeted hardware devices and would like to work with us to make it run FreedomBox, please contact us!
@@ -5308,7 +5690,7 @@ Password: - + FreedomBox Danube Edition @@ -5319,16 +5701,16 @@ Password:
Cubietruck / Cubieboard3 - Cubietruck (Cubieboard3) is a single board computer with very good performance compared to many other boards. FreedomBox images are built for this device. To use this board as FreedomBox, a separate USB WiFi device that does not require non-free firmware is recommended. + Cubietruck (Cubieboard3) is a single board computer with very good performance compared to many other boards. FreedomBox images are built for this device. To use this board as FreedomBox, a separate USB WiFi device that does not require non-free firmware is recommended.
Download - FreedomBox SD card images are provided for this hardware. These SD card images are meant for use with the on-board SD card slot and do not work when used with a separate SD card reader connected via USB. - An alternative to downloading these images is to install Debian on the Cubietruck and then install FreedomBox on it. + FreedomBox SD card images are provided for this hardware. These SD card images are meant for use with the on-board SD card slot and do not work when used with a separate SD card reader connected via USB. + An alternative to downloading these images is to install Debian on the Cubietruck and then install FreedomBox on it.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. + FreedomBox images for this hardware can be built using Freedom Maker.
Availability @@ -5397,7 +5779,7 @@ Password: Known Issues - The on-board WiFi does not work with free software. A separate USB WiFi device is recommended. + The on-board WiFi does not work with free software. A separate USB WiFi device is recommended.
@@ -5407,23 +5789,23 @@ Password: - + Beagle Bone Black - Beagle Bone Black (Revision C.1) is an Open Source Hardware (OSHW) single board computer. This means that the designer is actively helping people using the platform for their own designs, and supports them in adding hardware functionality and production advice. This is a part of freedom that is often overlooked, but very much aligned with the FreedomBox goals. FreedomBox images are built and tested for this device. To use this device as a FreedomBox, a separate USB WiFi device that does not require non-free firmware is recommended. + Beagle Bone Black (Revision C.1) is an Open Source Hardware (OSHW) single board computer. This means that the designer is actively helping people using the platform for their own designs, and supports them in adding hardware functionality and production advice. This is a part of freedom that is often overlooked, but very much aligned with the FreedomBox goals. FreedomBox images are built and tested for this device. To use this device as a FreedomBox, a separate USB WiFi device that does not require non-free firmware is recommended.
Download - FreedomBox SD card images are available for this device. Follow the instructions on the download page to create a FreedomBox SD card and boot the device. + FreedomBox SD card images are available for this device. Follow the instructions on the download page to create a FreedomBox SD card and boot the device. Note: This image is for BeagleBone Black (Revision C.1) only. It will not work on the BeagleBone Green, and also not on the Revisions A&B. If you have such a device and would like to help getting FreedomBox to run on it, contact us! - An alternative to downloading these images is to install Debian on the BeagleBone and then install FreedomBox on it. + An alternative to downloading these images is to install Debian on the BeagleBone and then install FreedomBox on it.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. + FreedomBox images for this hardware can be built using Freedom Maker.
Availability @@ -5465,7 +5847,7 @@ Password: Ethernet: 10/100, RJ45 - WiFi: None, use a USB WiFi device + WiFi: None, use a USB WiFi device SATA: None @@ -5496,14 +5878,14 @@ Password: - + A20 OLinuXino Lime2 - Olimex's A20 OLinuXino Lime2 is a fully Open Source Hardware (OSHW) single board computer. This means that the designer is actively helping people using the platform for their own designs, and supports them in adding hardware functionality and production advice. This is a part of freedom that is often overlooked, but very much aligned with the FreedomBox goals. It uses the Allwinner A20 Dual Core ARM processor. FreedomBox images are built and tested for this device starting with version 0.7. To use this device as a FreedomBox, a separate USB WiFi device that does not require non-free firmware is recommended. + Olimex's A20 OLinuXino Lime2 is a fully Open Source Hardware (OSHW) single board computer. This means that the designer is actively helping people using the platform for their own designs, and supports them in adding hardware functionality and production advice. This is a part of freedom that is often overlooked, but very much aligned with the FreedomBox goals. It uses the Allwinner A20 Dual Core ARM processor. FreedomBox images are built and tested for this device starting with version 0.7. To use this device as a FreedomBox, a separate USB WiFi device that does not require non-free firmware is recommended.
Similar Hardware The following similar hardware will also work well with FreedomBox. @@ -5515,12 +5897,12 @@ Password:
Download - FreedomBox SD card images are available for this device. Follow the instructions on the download page to create a FreedomBox SD card and boot the device. These SD card images are meant for use with the on-board SD card slot and won't work when used with a separate SD card reader connected via USB. - An alternative to downloading these images is to install Debian on the device and then install FreedomBox on it. + FreedomBox SD card images are available for this device. Follow the instructions on the download page to create a FreedomBox SD card and boot the device. These SD card images are meant for use with the on-board SD card slot and won't work when used with a separate SD card reader connected via USB. + An alternative to downloading these images is to install Debian on the device and then install FreedomBox on it.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. + FreedomBox images for this hardware can be built using Freedom Maker.
Availability @@ -5560,7 +5942,7 @@ Password: Ethernet: 10/100/1000, RJ45 - WiFi: None, use a USB WiFi device + WiFi: None, use a USB WiFi device SATA: 1x port @@ -5598,14 +5980,14 @@ Password: - + A20 OLinuXino MICRO - Olimex's A20 OLinuXino MICRO is a fully Open Source Hardware (OSHW) single board computer. This means that the designer is actively helping people using the platform for their own designs, and supports them in adding hardware functionality and production advice. This is a part of freedom that is often overlooked, but very much aligned with the FreedomBox goals. It uses the Allwinner A20 Dual Core ARM processor. FreedomBox images are built and tested for this device starting with version 0.7. To use this device as a FreedomBox, a separate USB WiFi device that does not require non-free firmware is recommended. + Olimex's A20 OLinuXino MICRO is a fully Open Source Hardware (OSHW) single board computer. This means that the designer is actively helping people using the platform for their own designs, and supports them in adding hardware functionality and production advice. This is a part of freedom that is often overlooked, but very much aligned with the FreedomBox goals. It uses the Allwinner A20 Dual Core ARM processor. FreedomBox images are built and tested for this device starting with version 0.7. To use this device as a FreedomBox, a separate USB WiFi device that does not require non-free firmware is recommended.
Similar Hardware The following similar hardware will also work well with FreedomBox. @@ -5617,12 +5999,12 @@ Password:
Download - FreedomBox SD card images are available for this device. Follow the instructions on the download page to create a FreedomBox SD card and boot the device. These SD card images are meant for use with the on-board SD card slot and won't work when used with a separate SD card reader connected via USB. - An alternative to downloading these images is to install Debian on the device and then install FreedomBox on it. + FreedomBox SD card images are available for this device. Follow the instructions on the download page to create a FreedomBox SD card and boot the device. These SD card images are meant for use with the on-board SD card slot and won't work when used with a separate SD card reader connected via USB. + An alternative to downloading these images is to install Debian on the device and then install FreedomBox on it.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. + FreedomBox images for this hardware can be built using Freedom Maker.
Availability @@ -5662,7 +6044,7 @@ Password: Ethernet: 10/100, RJ45 - WiFi: None, use a USB WiFi device + WiFi: None, use a USB WiFi device SATA: 1x port @@ -5700,14 +6082,14 @@ Password: - + PC Engines APU 1D - PC Engines APU 1D is a single board computer with 3 Gigabit ethernet ports, a powerful AMD APU and Coreboot firmware. FreedomBox images built for AMD64 machines are tested to work well for it. For using this board as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. + PC Engines APU 1D is a single board computer with 3 Gigabit ethernet ports, a powerful AMD APU and Coreboot firmware. FreedomBox images built for AMD64 machines are tested to work well for it. For using this board as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended.
Similar Hardware Although untested, the following similar hardware is also likely to work well with FreedomBox. @@ -5826,8 +6208,8 @@ Password:
Download - FreedomBox disk images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card, USB disk, SSD or hard drive and boot into FreedomBox. Pick the image meant for all amd64 machines. - An alternative to downloading these images is to install Debian on the APU and then install FreedomBox on it. + FreedomBox disk images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card, USB disk, SSD or hard drive and boot into FreedomBox. Pick the image meant for all amd64 machines. + An alternative to downloading these images is to install Debian on the APU and then install FreedomBox on it.
Networking @@ -5835,7 +6217,7 @@ Password:
Build Image - FreedomBox images for this hardware, which is for all amd64 machines, can be built using Freedom Maker. + FreedomBox images for this hardware, which is for all amd64 machines, can be built using Freedom Maker.
Availability @@ -5877,7 +6259,7 @@ Password: Ethernet: 3 Gigabit Ethernet ports - WiFi: None, use a USB WiFi device + WiFi: None, use a USB WiFi device SATA: 1 m-SATA and 1 SATA @@ -5911,14 +6293,14 @@ Password: - + LinkSprite pcDuino3S - LinkSprite pcDuino3S is a single board computer running on Allwinner A20 and sold with a good case. FreedomBox images are built and tested for this device for images built after June 2017. For using this board as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. + LinkSprite pcDuino3S is a single board computer running on Allwinner A20 and sold with a good case. FreedomBox images are built and tested for this device for images built after June 2017. For using this board as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. Note: The FreedomBox logo is simply a sticker on top of device brought from store.
Similar Hardware @@ -5938,12 +6320,12 @@ Password:
Download - FreedomBox disk images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card, USB disk, SSD or hard drive and boot into FreedomBox. Pick the image meant for pcduino3. - An alternative to downloading these images is to install Debian on the APU and then install FreedomBox on it. + FreedomBox disk images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card, USB disk, SSD or hard drive and boot into FreedomBox. Pick the image meant for pcduino3. + An alternative to downloading these images is to install Debian on the APU and then install FreedomBox on it.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. + FreedomBox images for this hardware can be built using Freedom Maker.
Availability @@ -5985,7 +6367,7 @@ Password: Ethernet: 10/100 Mbps - WiFi: Built-in WiFi requires non-free firmware, use a USB WiFi device instead + WiFi: Built-in WiFi requires non-free firmware, use a USB WiFi device instead SATA: 1 SATA host socket @@ -6019,17 +6401,17 @@ Password: - + VirtualBox - 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. + You don't own one of the supported hardware devices. You don't use Debian GNU/Linux as your operating system. @@ -6038,16 +6420,16 @@ Password: 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). - 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). + 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).
Download - Follow the instructions on the download page to download and verify a VirtualBox image. The latest images are available on freedombox.org. + Follow the instructions on the download page to download and verify a VirtualBox image. The latest images are available on freedombox.org.
Creating a Virtual Machine - + Decompress the downloaded VDI image (tool for Windows, Mac). @@ -6058,14 +6440,14 @@ Password: - + VirtualBox Name and OS dialog - + In the Hard disk dialog choose Use an existing virtual hard disk file and select the .vdi file you extracted in step 1. @@ -6073,14 +6455,14 @@ Password: - + VirtualBox Hard disk dialog - + When created, go to the virtual machine's Settings -> [Network] -> [Adapter 1]->[Attached to:] and choose the network type your want the machine to use according to the explanation in Network Configuration below. The recommended type is the Bridged adapter option, but be aware that this exposes the FreedomBox's services to your entire local network. @@ -6088,7 +6470,7 @@ Password: - + VirtualBox recommended network setting @@ -6099,11 +6481,11 @@ Password:
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 (aka. Plinth) in a browser. - + FreedomBox console after booting successfully @@ -6114,7 +6496,7 @@ Password: - + FreedomBox welcomes you to the first boot @@ -6125,22 +6507,22 @@ Password:
Using - See the FreedomBox usage page for more details. + 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. After logging in, you can become root with the command sudo su.
Build Image - If you wish to build your own images instead of downloading available images, it can be done using Freedom Maker. + If you wish to build your own images instead of downloading available images, it can be done using Freedom Maker.
Tips & Troubleshooting
Network Configuration VirtualBox provides many types of networking options. Each has its advantages and disadvantages. For more information about how various networking types work in VirtualBox, see VirtualBox's networking documentation. - For a simple setup, it is recommended that you use a single network interface in your guest machine. This will make the first boot script automatically configure that interface as an internal network with automatic network configuration. Inside the guest machine, the networking is configured automatically and all the services are made available on this network interface. For more information on how networks are configured by default in FreedomBox, see Networks section. + For a simple setup, it is recommended that you use a single network interface in your guest machine. This will make the first boot script automatically configure that interface as an internal network with automatic network configuration. Inside the guest machine, the networking is configured automatically and all the services are made available on this network interface. For more information on how networks are configured by default in FreedomBox, see Networks section. What remains is to make those services available to the host machine or to other machines in the network. You must then choose one of the following types of networking for the network interface on your guest machine. To set a particular type of network for the guest's network adapter, go to the guest VM's settings then the network options and then select the adapter you wish to configure. There, set the network type from the available list of networks. - + First and the recommended option is to use the Bridged type of network. This option exposes the guest machine to the same network that host network is connected to. The guest obtains network configuration information from a router or DHCP server on the network. The guest will appear as just another machine in the network. A major advantage of this of setup is that the host and all other machines in the network will be able to access the services provided by guest without requiring any further setup. The only drawback of this approach is that if the host is not connected to any network, the guest's network will remain unconfigured making it inaccessible even from the host. @@ -6150,7 +6532,7 @@ Password: The third option is to use the NAT type of network. This the networking type that VirtualBox assigns to a freshly created virtual machine. This option works even when host is not connected to any network. The guest is automatically configured and is able to access the internet and local networks that host is able to connect to. However, the services provided by the guest require port forwarding configuration setup to be available outside. To configure this go to VM settings -> [Network] -> [Adapter] -> [Port Forwarding]. Map a port such as 2222 from host to guest port 22 and you will be able to ssh into FreedomBox from host machine as follows: - ssh -p 2222 fbx@localhost + Map 4443 on host to 443 on the guest. This make FreedomBox HTTPS service available on host using the URL You will need to add a mapping for each such services from host to guest. @@ -6207,7 +6589,7 @@ Password: - + (./) @@ -6219,7 +6601,7 @@ Password: - + (./) @@ -6231,7 +6613,7 @@ Password: - + (./) @@ -6243,7 +6625,7 @@ Password: - + {X} @@ -6255,7 +6637,7 @@ Password: - + (./) @@ -6274,7 +6656,7 @@ Password: - + {X} @@ -6286,7 +6668,7 @@ Password: - + (./) @@ -6298,7 +6680,7 @@ Password: - + (./) @@ -6310,7 +6692,7 @@ Password: - + (./) @@ -6322,7 +6704,7 @@ Password: - + {X} @@ -6341,7 +6723,7 @@ Password: - + (./) @@ -6353,7 +6735,7 @@ Password: - + (./) @@ -6365,7 +6747,7 @@ Password: - + {X} @@ -6377,7 +6759,7 @@ Password: - + (./) @@ -6389,7 +6771,7 @@ Password: - + (./) @@ -6408,7 +6790,7 @@ Password: - + {X} @@ -6420,7 +6802,7 @@ Password: - + (./) @@ -6432,7 +6814,7 @@ Password: - + (./) @@ -6444,7 +6826,7 @@ Password: - + (./) @@ -6456,7 +6838,7 @@ Password: - + (./) @@ -6474,35 +6856,35 @@ Password: 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. - See also QuickStart for instructions on how to scan your network to discover the IP of the VM. + See also QuickStart for instructions on how to scan your network to discover the IP of the VM.
Networking Problems with macchanger The package macchanger can cause network problems with VirtualBox. If you have a valid IP address on your guest's host network adapter (like 192.168.56.101) but are not able to ping or access the host (like 192.168.56.1), try uninstalling macchanger: - $ dpkg --ignore-depends=freedombox-setup --remove macchanger + You might have to manually remove the script /etc/network/if-prep-up/macchanger. If Debian complains about unmet dependencies when you use a package manager (apt-get, aptitude, dpkg), try to remove 'macchanger' from the dependencies of 'freedombox-setup' in the file /var/lib/dpkg/status.
Mounting Images Locally If you want to mount images locally, use the following to copy built images off the VirtualBox: - $ mkdir /tmp/vbox-img1 /tmp/vbox-root1 + +# $ sudo umount /tmp/vbox-img1 # corruption here.]]>
Fixing the time after suspend and resume The virtual machine loses the correct time/date after suspending and resuming. One way to fix this is to create a cron-job that restarts the time service ntp. You can add a crontab entry as root to restart ntp every 15 minutes by typing 'crontab -e' and adding this line: - */15 * * * * /etc/init.d/ntp restart + Do not restart this service too often as this increases the load of publicly and freely available NTP servers.
Debian - FreedomBox is a pure blend of Debian. This means that all the work on FreedomBox is available in Debian as packages. It also means that any machine running Debian can be turned into a FreedomBox. + FreedomBox is a pure blend of Debian. This means that all the work on FreedomBox is available in Debian as packages. It also means that any machine running Debian can be turned into a FreedomBox. This page describes the process of installing FreedomBox on a Debian system. Currently, FreedomBox works in Debian Stable (Stretch), Testing (Buster), and Unstable (Sid). @@ -6512,59 +6894,59 @@ $ sudo umount /tmp/vbox-root1
Installing on Debian - + Check the Troubleshooting section below, for any tips or work-arounds that might help during the install. - Install Debian Stable (Stretch), Testing (Buster), or Unstable (Sid) on your hardware. + Install Debian Stable (Stretch), Testing (Buster), or Unstable (Sid) on your hardware. Update your package list. - $ sudo apt-get update + Install freedombox-setup package. - $ sudo DEBIAN_FRONTEND=noninteractive apt-get install freedombox-setup + The "DEBIAN_FRONTEND=noninteractive" will avoid several configuration prompts that would otherwise appear during the install. - Note: If you are using Debian Buster or later, then the steps below (running setup script and rebooting) do not apply. You can jump to using FreedomBox. + Note: If you are using Debian Buster or later, then the steps below (running setup script and rebooting) do not apply. You can jump to using FreedomBox. Run FreedomBox setup program. This installs further packages and sets up basic configuration. - $ sudo /usr/lib/freedombox/setup | tee freedombox-setup.log + You may have to clear your existing network configuration. See Troubleshooting note #2 below. Reboot the system. This is necessary to trigger the first-run script. - $ sudo reboot + After the system boots up, wait for it to reboot again. The first-run scripts sets up a few things and initiates a reboot. - After the second reboot you can start using FreedomBox. + After the second reboot you can start using FreedomBox.
Troubleshooting - + There is a bug in policykit-1 package that causes errors and hangs during installation of freedombox-setup package. A workaround is to first install policykit-1 package and then reboot. After that, follow the above procedure setup procedure. - $ sudo apt-get update + +$ sudo reboot]]> Freedombox does not support network device configuration via /etc/network/interfaces, and it will not manage any non-loopback interfaces mentioned there. (See bug #797614.) Future versions of freedombox-setup will clear this file automatically; for now, edit it manually and ensure that it contains only the following: - auto lo -iface lo inet loopback + If you have already completed the setup process without doing this step, you will need to clear out the /etc/network/interfaces file keeping only the above lines. Then perform a reboot. After this network connections configured by the setup step above will configure your network. Network interfaces will then be in the internal or external firewall zone. This is essential for the FreedomBox's web interface to be reachable from other machines in the network. You can tweak network manager connections with the nmtui command if you wish. @@ -6575,19 +6957,19 @@ iface lo inet loopback - + DreamPlug - DreamPlug is the hardware for which FreedomBox has been originally targeted. FreedomBox images are built and tested for it. For using this device as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. + DreamPlug is the hardware for which FreedomBox has been originally targeted. FreedomBox images are built and tested for it. For using this device as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. You can find more support and discussion for DreamPlug on the official forum.
Download - FreedomBox SD card images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card and boot into FreedomBox. See also instructions for using an internal micro-SD with DreamPlug. - An alternative to downloading these images is to install Debian on DreamPlug and then install FreedomBox on it. + FreedomBox SD card images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card and boot into FreedomBox. See also instructions for using an internal micro-SD with DreamPlug. + An alternative to downloading these images is to install Debian on DreamPlug and then install FreedomBox on it.
Networking @@ -6595,15 +6977,15 @@ iface lo inet loopback
Firmware - Note that the factory firmware configurations may vary between revisions of the hardware, and render some images incompatible. See the DreamPlug firmware page for information on what images are compatible and how to update your DreamPlug firmware. + Note that the factory firmware configurations may vary between revisions of the hardware, and render some images incompatible. See the DreamPlug firmware page for information on what images are compatible and how to update your DreamPlug firmware.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. + FreedomBox images for this hardware can be built using Freedom Maker.
Testing - Instructions on how to test this hardware are available. + Instructions on how to test this hardware are available.
Availability @@ -6668,7 +7050,7 @@ iface lo inet loopback Known Issues - WiFi does not work with free software. A separate USB WiFi device is recommended. + WiFi does not work with free software. A separate USB WiFi device is recommended.
@@ -6678,22 +7060,22 @@ iface lo inet loopback - + Raspberry Pi (Model B+) - Raspberry Pi (Model B+) is a popular single board computer developed with the intention of promoting teaching of basic computer science in schools. FreedomBox images are built and tested for it. For using this board as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. + Raspberry Pi (Model B+) is a popular single board computer developed with the intention of promoting teaching of basic computer science in schools. FreedomBox images are built and tested for it. For using this board as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. Note: The Debian architecture used for this device is armel. This means floating point computations are done in software and most operations are slower than what Raspberry Pi is capable of.
Download - FreedomBox SD card images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card and boot into FreedomBox. + FreedomBox SD card images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card and boot into FreedomBox.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. + FreedomBox images for this hardware can be built using Freedom Maker.
Availability @@ -6730,7 +7112,7 @@ iface lo inet loopback Ethernet: 10/100, RJ45 - WiFi: None, use a USB WiFi device + WiFi: None, use a USB WiFi device SATA: None @@ -6765,22 +7147,22 @@ iface lo inet loopback - + Raspberry Pi 2 - Raspberry Pi 2 (Model B ) is a popular single board computer developed with the intention of promoting teaching of basic computer science in schools. It is a successor to Raspberry Pi Model B+ with much faster processor and more RAM. FreedomBox images are built and tested for it. For using this board as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. + Raspberry Pi 2 (Model B ) is a popular single board computer developed with the intention of promoting teaching of basic computer science in schools. It is a successor to Raspberry Pi Model B+ with much faster processor and more RAM. FreedomBox images are built and tested for it. For using this board as FreedomBox, a USB WiFi device that does not require non-free firmware is recommended. Note: For FreedomBox release 0.5, the Debian architecture used for this device is armel. This means floating point computations are done in software and most operations are slower than what Raspberry Pi 2 is capable of. Starting with FreedomBox release 0.6 separate armhf images with full hardware floating point support are available.
Download - FreedomBox SD card images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card and boot into FreedomBox. + FreedomBox SD card images for this hardware are available. Follow the instructions on the download page to create a FreedomBox SD card and boot into FreedomBox.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. + FreedomBox images for this hardware can be built using Freedom Maker.
Availability @@ -6817,7 +7199,7 @@ iface lo inet loopback Ethernet: 10/100, RJ45 - WiFi: None, use a USB WiFi device + WiFi: None, use a USB WiFi device SATA: None @@ -6852,21 +7234,21 @@ iface lo inet loopback - + Raspberry Pi 3 - Raspberry Pi 3 (Model B ) is a popular single board computer developed with the intention of promoting teaching of basic computer science in schools. It is a successor to Raspberry Pi 2 Model B with a 64-bit processor and on-board Wi-Fi. FreedomBox images built for Raspberry Pi 2 are tested to work well with it. For using this board as FreedomBox, a USB WiFi device, that does not require non-free firmware, is recommended instead of the on-board Wi-Fi. + Raspberry Pi 3 (Model B ) is a popular single board computer developed with the intention of promoting teaching of basic computer science in schools. It is a successor to Raspberry Pi 2 Model B with a 64-bit processor and on-board Wi-Fi. FreedomBox images built for Raspberry Pi 2 are tested to work well with it. For using this board as FreedomBox, a USB WiFi device, that does not require non-free firmware, is recommended instead of the on-board Wi-Fi.
Download - FreedomBox SD card images for this hardware are available. Download the image meant for Raspberry Pi 2 and that image will work for this board. Follow the instructions on the download page to create a FreedomBox SD card and boot into FreedomBox. + FreedomBox SD card images for this hardware are available. Download the image meant for Raspberry Pi 2 and that image will work for this board. Follow the instructions on the download page to create a FreedomBox SD card and boot into FreedomBox.
Build Image - FreedomBox images for this hardware can be built using Freedom Maker. Use the target 'raspberry2' to build the image for this board. + FreedomBox images for this hardware can be built using Freedom Maker. Use the target 'raspberry2' to build the image for this board.
Availability @@ -6903,7 +7285,7 @@ iface lo inet loopback Ethernet: 10/100, RJ45 - WiFi: 802.11n but requires non-free firmware, instead use a USB WiFi device + WiFi: 802.11n but requires non-free firmware, instead use a USB WiFi device SATA: None @@ -6944,17 +7326,17 @@ iface lo inet loopback
Firmware Installation The free firmware for these devices is not packaged in Debian yet. You can manually download and install the firmware as follows: - sudo su [enter password] + +wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]]>
Resources - Debian Wiki on WiFi drivers + Debian Wiki on WiFi drivers @@ -7866,7 +8248,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< Tor Bridges: All boxes now act as non-exit Tor bridges, routing traffic for the Tor network. - Firewall: firewall is on by default and is automatically managed. + Firewall: firewall is on by default and is automatically managed. Add BeagleBone support. We now have images for BeagleBone, RaspberryPi, VirtualBox i386/amd64, and DreamPlug. @@ -7901,7 +8283,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< Version 0.2 (2014-03-16) - Support for Raspberry Pi and VirtualBox (x86) in addition to the DreamPlug. + Support for Raspberry Pi and VirtualBox (x86) in addition to the DreamPlug. New Services: @@ -7950,7 +8332,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< Full hardware support in Debian - Support for DreamPlug. + Support for DreamPlug. Basic software tools selected as common working environment: @@ -7979,10 +8361,10 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw<
Quick Links - Progess calls + Progess calls - TODO page + TODO page Donation page @@ -7990,38 +8372,38 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw<
Welcome to newcomers - As a newcomer, you are more than welcome to introduce yourself to all users and doers on the "FreedomBox-discuss" mailing list or on the #freedombox IRC channel. In addition to make useful contacts, you can start reporting bugs and translate (see below) the wiki website and the FreedomBox web interface. + As a newcomer, you are more than welcome to introduce yourself to all users and doers on the "FreedomBox-discuss" mailing list or on the #freedombox IRC channel. In addition to make useful contacts, you can start reporting bugs and translate (see below) the wiki website and the FreedomBox web interface.
Development priorities Upcoming priorities are discussed on an regular basis. You find the progress of the web interface Plinth with its priorities here:Project Progress. We want to enjoy soon a version 1.0. - Please check next progess 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. + Please check next progess 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.
Contributions needed
Add an Application - If you are a developer and wish to see an application available in FreedomBox, you can contribute by adding the application to FreedomBox. See the FreedomBox Developer Manual. + If you are a developer and wish to see an application available in FreedomBox, you can contribute by adding the application to FreedomBox. See the FreedomBox Developer Manual.
Bugs - List of bugs listed on Debian universal system. Also see the Packages overview for FreedomBox packaging team for status of various packages that we use. + List of bugs listed on Debian universal system. Also see the Packages overview for FreedomBox packaging team for status of various packages that we use.
Code - 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. + 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 Setup: a Debian package for setting up the FreedomBox. + FreedomBox Setup: a Debian package for setting up the FreedomBox. - Plinth: a web interface to administer the functions of FreedomBox. + Plinth: 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. + Freedom Maker: a script to build FreedomBox disk images for use on various hardware devices or virtual machines. - You can pickup a task from one of the TODO lists. The individual page project pages contain information availabily of the code, how to build and TODO lists. + You can pickup a task from one of the TODO lists. The individual page project pages contain information availabily of the code, how to build and TODO lists.
Design @@ -8033,7 +8415,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< UI experience for the Plinth web interface - Web design for freedomboxfoundation.org and FreedomBox wiki pages + Web design for freedomboxfoundation.org and FreedomBox wiki pages Logo and branding (we currently have an identity manual and logos) @@ -8043,7 +8425,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< - User experience design + User experience design @@ -8054,7 +8436,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< - Design portal + Design portal @@ -8067,7 +8449,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 Plinth 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. + 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 mailing list.
@@ -8080,32 +8462,32 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< When an application is made available on FreedomBox, not all of its functionality is tested in the real world by developer doing the work. Deploying the application and testing it will help ensure high quality applications in FreedomBox. - See the quality assurance page for a basic list of test cases to check for and information on reporting bugs. + See the quality assurance page for a basic list of test cases to check for and information on reporting bugs.
Localization All text visible to users of FreedomBox needs to be localized to various languages. This translation work includes: - Plinth web interface for FreedomBox + Plinth web interface for FreedomBox FreedomBox documentation - FreedomBox website and wiki + FreedomBox website and wiki Individual applications that FreedomBox exposes to users. - The primary user interface (Plinth) was internationalized in the 0.7 release. You can contribute to the localization effort using the web-based tool at Weblate or directly to the source tree via Salsa. + The primary user interface (Plinth) was internationalized in the 0.7 release. You can contribute to the localization effort using the web-based tool at Weblate or directly to the source tree via Salsa. If you wish to see FreedomBox available for one of your languages, please start a discussion on the FreedomBox discuss mailing list or on the #freedombox IRC channel to avoid double translations. - For more information, please visit the FreedomBox translation landing page. + For more information, please visit the FreedomBox translation landing page.
Spread the Word - Speak to your family, friends, local community or at global conferences about the importance of FreedomBox. To be a successful project we need many more participants, be it users or contributors. Write about your efforts at the talks page and on the wiki. + Speak to your family, friends, local community or at global conferences about the importance of FreedomBox. To be a successful project we need many more participants, be it users or contributors. Write about your efforts at the talks page and on the wiki.
@@ -8160,7 +8542,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw<
Creating the project structure Create a directory structure as follows with empty files. We will fill them up in a step-by-step manner. - +- <plinth_root>/ + / | +- plinth/ | | @@ -8196,38 +8578,38 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< | +- modules-enabled/ | - +- ttrss + +- ttrss]]> The __init__.py indicates that the directory in which it is present is a Python module. For now, it is an empty file. Plinth's setup script setup.py will automatically install the plinth/modules/ttrss directory (along with other files described later) to an appropriate location. If you are creating an application that stays independent and outside of Plinth source tree, then your setup.py script will need to install it a proper location on the system. The plinth/modules/ directory is a Python3 namespace package. So, you can install it with the plinth/modules/ directory structure into any Python path and still be discovered as plinth.modules.*.
Tell Plinth that we exist The first thing to do is tell Plinth that our application exists. This is done by writing a small file with the Python import path to our application and placing it in data/etc/plinth/modules-enabled/. Let us create this file ttrss: - plinth.modules.ttrss + This file is automatically installed to /etc/plinth/modules-enabled/ by Plinth's installation script setup.py. If we are writing a module that resides independently outside the Plinth's source code, the setup script will need to copy it to the target location. Further, it is not necessary for the application to be part of the plinth.modules namespace. It can, for example, be plinth_ttrss.
Writing the URLs For a user to visit our application in Plinth, we need to provide a URL. When the user visits this URL, a view is executed and a page is displayed. In urls.py write the following: - from django.conf.urls import url + +]]]> This routes the /apps/ttrss/ URL to a view called index defined in plinth/modules/ttrss/views.py. This is no different than how routing URLs are written in Django. See Django URL dispatcher for more information.
Adding a menu item We have added a URL to be handled by our application but this does not yet show up to be a link in Plinth web interface. Let us add a link in the applications list. In __init__.py add the following: - from plinth import cfg + + 'ttrss:index', 850)]]> As soon as Plinth starts, it will load all the enabled modules into memory. After this, it gives a chance to each of the modules to initialize itself by calling the init() method if there is such a method available as <app>.init(). Here we have implemented this method and added our menu item to the applications menu as part of the initialization process. We wish to add our menu item to the list of applications which is why we have retrieved the applications menu which is available under the main menu. After this we add our own menu item to this menu. There are several parameters during this process that are important: @@ -8252,7 +8634,7 @@ def init():
Specifying module dependencies Specifying a simple list of applications to be loaded before our application provided to Plinth is sufficient. Add this in __init__.py. - depends = ['plinth.modules.apps'] + Plinth will now make sure that the apps module is loaded before our module is loaded. Application initialization is also ensured to happen in this order. We can safely use any features of this module knowing that they have been initialized. @@ -8264,13 +8646,13 @@ def init():
Writing the enable/disable form We wish to provide a user interface to the user to enable and disable the application. Complex modules may require more options but this is sufficient for our application. Add the following forms.py. - from django import forms + + required=False)]]> This creates a Django form that shows a single option to enable/disable the application. It also shows its current state. This is how a regular Django form is built. See Django Forms documentation for more information. @@ -8282,7 +8664,7 @@ class TtrssForm(forms.Form):
Writing a view In views.py, let us add a view that can handle the URL we have provided above. - from .forms import TtrssForm + + 'form': form})]]> This view works with the form we created in the previous step. It shows the current status of the service in form. This status is retrieved with the help of get_status() helper method. When the form is posted, again this view is called and it verifies whether the form's input values are correct. If so, it will apply the actions necessary for changed form values using the _apply_changes() method.
Getting the current status of the application The view in the previous setup requires the status of the application to be retrieved using the get_status() method. Let us implement that method in views.py. - from plinth.modules import ttrss + + return {'enabled': ttrss.is_enabled()}]]> This method retrieves the various statuses of the application for display in the view. Currently, we only need to show whether the application is enabled or disabled. So, we retrieve that using a helper method defined in __init__.py. - from plinth import action_utils + + return action_utils.webserver_is_enabled('50-tt-rss')]]> This method uses one of the several action utilities provided by Plinth. This method checks whether a webserver configuration named 50-tt-rss is enabled.
Displaying the application page The view that we have written above requires a template file known as ttrss.html to work. This template file controls how the web page for our application is displayed. Let us create this template file in templates/ttrss.html. - {% extends "base.html" %} + News Feed Reader (Tiny Tiny RSS) -<p>Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, +

Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, designed to allow you to read news from any location, while feeling - as close to a real desktop application as possible.</p> + as close to a real desktop application as possible.

-<h3>Configuration</h3> +

Configuration

-<form class="form" method="post"> +
{% csrf_token %} {{ form|bootstrap }} - <input type="submit" class="btn btn-primary" value="Update setup"/> -</form> + +
-{% endblock %}
+{% endblock %}]]>
This template extends an existing template known as base.html. This template is available in Plinth core to provide all the basic layout, styling, menus, JavaScript and CSS libraries. We will override the content area of the base template and keep the rest. Yet again, there is nothing special about the way this template is written. This is a regular Django template. See Django Template documentation. For styling and UI components, Plinth uses the Twitter Bootstrap project. See Bootstrap documentation for reference. @@ -8354,7 +8736,7 @@ def is_enabled():
Applying the changes from the form The view we have created displays the form and processes the form after the user submits it. It used a helper method called _apply_changes() to actually get the work done. Let us implement that method in views.py. - from django.contrib import messages + + messages.info(request, 'Setting unchanged')]]> We check to make sure that we don't try to disable the application when it is already disabled or try to enable the application when it is already enabled. Although Plinth's operations are idempotent, meaning that running them twice will not be problematic, we still wish avoid unnecessary operations for the sake of speed. We are actually perform the operation using Plinth actions. We will implement the action to be performed a bit later. After we perform the operation, we will show a message on the response page showing that the action was successful or that nothing happened. We use the Django messaging framework to accomplish this. See Django messaging framework for more information. @@ -8378,19 +8760,19 @@ def _apply_changes(request, old_status, new_status):
Installing packages required for the application Plinth takes care of installing all the Debian packages required for our application to work. All we need to do is specify the list of the Debian packages required using a decorator on our view as follows: - from plinth import package + + ...]]> The first time this application's view is accessed, Plinth shows a package installation page and allows the user to install the required packages. After the package installation is completed, the user is shown the application's configuration page. If there are configuration tasks to be performed immediately before or after the package installation, Plinth provides hooks for it. The before_install= and on_install= parameters to the @package.required decorator take a callback methods that are called before installation of packages and after installation of packages respectively. See the reference section of this manual or the plinth.package module for details. Other modules in Plinth that use this feature provided example usage.
Writing actions The actual work of performing the configuration change is carried out by a Plinth action. Actions are independent scripts that run with higher privileges required to perform a task. They are placed in a separate directory and invoked as scripts via sudo. For our application we need to write an action that can enable and disable the web configuration. We will do this by creating a file actions/ttrss. - import argparse + + main()]]> This is a simple Python3 program that parses command line arguments. While Python3 is preferred, it can be written in other languages also. It uses a helper utility provided by Plinth to actually enable and disable Apache2 web server configuration. This script is automatically installed to /usr/share/plinth/actions by Plinth's installation script setup.py. Only from here will there is a possibility of running the script under sudo. If you are writing an application that resides indenpendently of Plinth's source code, your setup.py script will need to take care of copying the file to the target location.
@@ -8434,22 +8816,22 @@ if __name__ == '__main__': Creating diagnostics Plinth provides a simple API for showing diagnostics results. The application has to implement a method for actually running the diagnostics and return the results as a list. Plinth then takes care of calling the diagnostics method and displaying the list in a formatted manner. To implement the diagnostics method, method called diagnose() has to be available as <app>.diagnose(). It must return a list in which each item is the result of a test performed. The item itself is a two-tuple containing the display name of the test followed by the result as passed, failed or error. - def diagnose(): + + return results]]> There are several helpers available to implement some of the common diagnostic tests. For our application we wish to implement a test to check whether the /ttrss URL is accessible. Since this is a commonly performed test, there is a helper method available and we have used it in the above code. The {host} tag replaced with various IP addresses, hostnames and domain names by the helper to produce different kinds of URLs and they are all tested. Results for all tests are returned which we then pass on to Plinth. The user can trigger the diagnostics test by going to System -> Diagnostics page. This runs diagnostics for all the applications. If we want users to be able to run diagnostics specifically for this application, we can include a button for it in our template immediately after the application description. - {% include "diagnostics_button.html" with module="ttrss" enabled=True %} +
Logging Sometimes we may feel the need to write some debug messages to the console and Plinth log file. Doing this in Plinth is just like doing this any other Python application. - import logging + + logger.exception('Encountered an exception - %s', exception)]]> For more information see Python logging framework documentation.
Adding a License Plinth is licensed under the GNU Affero General Public License Version 3 or later. FreedomBox UI applications, which run as modules under Plinth, also need to be under the same license or under a compatible license. The license of our application needs to clear for our application to be accepted by users and other developers. Let us add license headers to our application. - # + +# along with this program. If not, see . +#]]> The above header needs to be present in every file of the application. It is suitable for Python files. However, in template files, we need to modify it slightly. - {% extends "base.html" %} + . # {% endcomment %} -... +...]]>
Internationalization Every string message that is visible to the user must be localized to user's native language. For this to happen, our application needs to be internationalized. This requires marking the user visible messages for translation. Plinth applications use the Django's localization methods to make that happen. - from django.utils.translation import ugettext as _ + + 'form': form})]]> Notice that the page's title is wrapped in the _() method call. Let us do that for the menu item of the application too. - from django.utils.translation import ugettext_lazy as _ + + 'ttrss:index', 600)]]> Notice that in this case, we have used the ugettext_lazy and in the first case we have used the regular ugettext. This is because in the second case the gettext lookup is made once and reused for every user looking at the interface. These users may each have a different language set for their interface. Lookup made for one language should not be used for other users. The _lazy method provided by Django makes sure that the return value is an object that will actually be converted to string at the final moment when the string is being displayed. In the first case, the looked is made and string is returned immediately. All of this is the usual way internationalization is done in Django. See Django internationalization and localization documentation for more information.
@@ -8533,9 +8915,9 @@ def init(): Coding standards For readability and easy collaboration it is important to follow common coding standards. Plinth uses the Python coding standards and uses the pylint and flake8 tools to check if the there are any violations. Run these tools on our application and fix any errors and warnings. Better yet, integrate these tools into your favorite IDE for on-the-fly checking. For the most part, the code we have written so far, is already compliant with the coding standards. This includes variable/method naming, indentation, document strings, comments, etc. One thing we have to add are the module documentation strings. Let us add those. In __init__.py add the top: - """ + +"""]]>
@@ -8551,8 +8933,8 @@ FreedomBox app to configure Tiny Tiny RSS.
<application>.diagnose() Optional. Called when the user invokes system-wide diagnostics by visiting System -> Diagnositcs. This method must return an array of diagnostic results. Each diagnostic result must be a two-tuple with first element as a string that is shown to the user as name of the test and second element is the result of the test. It must be one of passed, failed, error. Example return value: - [('Check http://localhost/app is reachable', 'passed'), - ('Check configuration is sane', 'passed')] +
<appliation>.depends @@ -8641,13 +9023,13 @@ FreedomBox app to configure Tiny Tiny RSS. Using - Plinth comes installed with all FreedomBox images. You can download FreedomBox images and run on any of the supported hardware. Then, you can access Plinth by visiting the URL . + Plinth comes installed with all FreedomBox images. You can download FreedomBox images and run on any of the supported hardware. Then, you can access Plinth by visiting the URL . If you are on a Debian box, you may install Plinth from Debian package archive. Currently, only Stretch (testing) and Sid (unstable) are supported. To install Plinth run: - $ sudo apt-get install plinth + You can also get Plinth from its Git repository and install from source. @@ -8657,40 +9039,40 @@ FreedomBox app to configure Tiny Tiny RSS.
Screenshots - + - + About Page - + - + Enabling Tor Hidden Services - + - + Setting up Email Client - + - + Newsfeed from anywhere @@ -8720,7 +9102,7 @@ FreedomBox app to configure Tiny Tiny RSS. We are looking for help to improve Plinth. You can contribute to Plinth by not just by coding but also by translating, documenting, designing, packaging and providing support. - Instructions on how to contribute code are available. + Instructions on how to contribute code are available. The primary Git repository is hosted at FreedomBox Salsa Page. @@ -8753,17 +9135,17 @@ FreedomBox app to configure Tiny Tiny RSS.
FreedomBox Setup - FreedomBox Setup is a Debian package for setting up the FreedomBox. If you download and use pre-built images you don't have to worry about this package. + FreedomBox Setup is a Debian package for setting up the FreedomBox. If you download and use pre-built images you don't have to worry about this package. FreedomBox Setup is responsible for setting up basic networking, web server, user accounts, installing essential packages etc. It performs first part of the setup during the image build process. Later, when the image is booted for the first time on actual hardware (or on a virtual machine), it does the remaining setup and then reboots the machine. It also comes with a diagnostic script to check if the FreedomBox Setup is running as expected. FreedomBox Setup is Free Software licensed under GNU General Public License version 3 or (at your option) a later version.
Using - FreedomBox Setup comes installed with all FreedomBox images. You can download FreedomBox images and run on any of the supported hardware. + FreedomBox Setup comes installed with all FreedomBox images. You can download FreedomBox images and run on any of the supported hardware. - If you are on a Debian box, you may install FreedomBox Setup from Debian package archive. This essentially turns your Debian installation into a FreedomBox! Currently, only Sid (unstable) is supported. To install FreedomBox Setup, see instructions on setting up FreedomBox on a Debian machine. + If you are on a Debian box, you may install FreedomBox Setup from Debian package archive. This essentially turns your Debian installation into a FreedomBox! Currently, only Sid (unstable) is supported. To install FreedomBox Setup, see instructions on setting up FreedomBox on a Debian machine. You can also get FreedomBox Setup from its Git repository and build Debian package from source. @@ -8791,7 +9173,7 @@ FreedomBox app to configure Tiny Tiny RSS. We are looking for help to improve FreedomBox Setup. - Instructions on how to contribute code are available. + Instructions on how to contribute code are available. FreedomBox Setup is part of the FreedomBox Salsa Project. @@ -8887,7 +9269,7 @@ FreedomBox app to configure Tiny Tiny RSS. AMD64 (x86-64) Machines, X86 Machines and other virtual machines (using raw disk images) - It relies on the vmdebootstrap project actually create images. If a hardware platform is capable of running Debian, it should not be too much effort adopt Freedom Maker to create FreedomBox images for the platform. + It relies on the vmdebootstrap project actually create images. If a hardware platform is capable of running Debian, it should not be too much effort adopt Freedom Maker to create FreedomBox images for the platform. Freedom Maker is Free Software licensed under GNU General Public License version 3 or (at your option) a later version.
Building FreedomBox Images @@ -8918,7 +9300,7 @@ FreedomBox app to configure Tiny Tiny RSS. We are looking for help to improve Freedom Maker. - Instructions on how to contribute code are available. + Instructions on how to contribute code are available. Freedom Maker is hosted at FreedomBox Salsa Project. The primary Git repository is hosted there. @@ -8944,21 +9326,21 @@ FreedomBox app to configure Tiny Tiny RSS. - FreedomBox in the Press + FreedomBox in the Press - Conferences + Conferences - Talks and presentations + Talks and presentations - Available Material Slides and other raw material + Available Material Slides and other raw material diff --git a/doc/manual-page-fixes.xslt b/doc/manual-page-fixes.xslt new file mode 100644 index 000000000..b84df4632 --- /dev/null +++ b/doc/manual-page-fixes.xslt @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pt + + + + + + + images/ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/manual-pages.list b/doc/manual-pages.list new file mode 100644 index 000000000..e558c3e23 --- /dev/null +++ b/doc/manual-pages.list @@ -0,0 +1,38 @@ +Tor +Transmission +Deluge +Minetest +Radicale +ejabberd +MatrixSynapse +Roundcube +Coquelicot +Syncthing +Quassel +TinyTinyRSS +Repro +Shadowsocks +OpenVPN +Mumble +Privoxy +Searx +MediaWiki +Ikiwiki +Configure +DateTime +Diagnostics +DynamicDNS +Firewall +LetsEncrypt +Monkeysphere +NameServices +Networks +Power +PageKite +SecureShell +Security +ServiceDiscovery +Snapshots +Storage +Upgrades +Users \ No newline at end of file diff --git a/doc/post-processor b/doc/post-processor new file mode 100755 index 000000000..5258cda69 --- /dev/null +++ b/doc/post-processor @@ -0,0 +1,93 @@ +#!/usr/bin/python3 +# +# This file is part of FreedomBox. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import argparse +import xml.etree.ElementTree as etree + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparser = subparsers.add_parser( + 'remove-footer', help='Remove footer from the XML document') + subparser.add_argument('filename', help='Name of the XML file') + + subparser = subparsers.add_parser('fix-wiki-urls', + help='Fix wrongly formatted wiki urls') + subparser.add_argument('filename', help='Name of the XML file') + + subparsers.required = True + return parser.parse_args() + + +def subcommand_fix_wiki_urls(arguments): + file_name = arguments.filename + page_name = file_name.split('.')[0] + + with open(file_name, 'r') as xml_file: + lines = xml_file.readlines() + + pattern = 'FreedomBox/Manual/{0}/FreedomBox'.format(page_name) + lines = list(map(lambda s: s.replace(pattern, 'FreedomBox'), lines)) + + with open(file_name, 'w') as xml_file: + xml_file.writelines(lines) + + +def subcommand_remove_footer(arguments): + filename = arguments.filename + tree = etree.parse(filename) + root = tree.getroot() + informaltables = [] + + def recurse(elem): + for child in elem: + if child.tag == 'informaltable': + informaltables.append((elem, child)) + else: + recurse(child) + + recurse(root) + + if informaltables: + parent, child = informaltables[-1] + parent.remove(child) + + processed_xml = etree.tostring(root, encoding='utf-8').decode() + + with open(filename, 'r') as xml_file: + header = xml_file.readlines()[:2] + + with open(filename, 'w') as xml_file: + xml_file.writelines(header) + xml_file.write(processed_xml) + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/plinth/modules/avahi/__init__.py b/plinth/modules/avahi/__init__.py index 9f4cee64d..50de614fd 100644 --- a/plinth/modules/avahi/__init__.py +++ b/plinth/modules/avahi/__init__.py @@ -20,9 +20,8 @@ FreedomBox app for service discovery. from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import cfg from plinth import service as service_module +from plinth import actions, cfg from plinth.menu import main_menu from plinth.utils import format_lazy from plinth.views import ServiceView @@ -52,6 +51,8 @@ description = [ service = None +manual_page = 'ServiceDiscovery' + def init(): """Intialize the service discovery module.""" @@ -59,8 +60,8 @@ def init(): menu.add_urlname(name, 'glyphicon-lamp', 'avahi:index') global service # pylint: disable=W0603 - service = service_module.Service( - managed_services[0], name, ports=['mdns'], is_external=False) + service = service_module.Service(managed_services[0], name, ports=['mdns'], + is_external=False) def setup(helper, old_version=False): @@ -76,3 +77,4 @@ def setup(helper, old_version=False): class AvahiServiceView(ServiceView): service_id = managed_services[0] description = description + manual_page = manual_page diff --git a/plinth/modules/config/__init__.py b/plinth/modules/config/__init__.py index 0522e74be..4a0ff041f 100644 --- a/plinth/modules/config/__init__.py +++ b/plinth/modules/config/__init__.py @@ -34,6 +34,8 @@ is_essential = True depends = ['firewall', 'names'] +manual_page = 'Configure' + def get_domainname(): """Return the domainname""" diff --git a/plinth/modules/config/templates/config.html b/plinth/modules/config/templates/config.html index 20e594dbe..39fb5bd65 100644 --- a/plinth/modules/config/templates/config.html +++ b/plinth/modules/config/templates/config.html @@ -20,9 +20,22 @@ {% load bootstrap %} {% load i18n %} +{% load static %} {% block content %} + {% block pagetitle %} +

{{ title }}

+ {% endblock %} + + {% if manual_page %} +

+ + {% trans 'Learn more...' %} + +

+ {% endif %} +
{% csrf_token %} diff --git a/plinth/modules/config/views.py b/plinth/modules/config/views.py index 40fb9abab..11fddb775 100644 --- a/plinth/modules/config/views.py +++ b/plinth/modules/config/views.py @@ -22,7 +22,6 @@ import logging from django.contrib import messages from django.template.response import TemplateResponse -from django.utils import translation from django.utils.translation import ugettext as _ from plinth import actions @@ -51,10 +50,12 @@ def index(request): else: form = ConfigurationForm(initial=status, prefix='configuration') - return TemplateResponse(request, 'config.html', { - 'title': _('General Configuration'), - 'form': form - }) + return TemplateResponse( + request, 'config.html', { + 'title': _('General Configuration'), + 'form': form, + 'manual_page': config.manual_page + }) def get_status(request): diff --git a/plinth/modules/coquelicot/__init__.py b/plinth/modules/coquelicot/__init__.py index d08ca0a61..ae05a4748 100644 --- a/plinth/modules/coquelicot/__init__.py +++ b/plinth/modules/coquelicot/__init__.py @@ -50,6 +50,8 @@ description = [ service = None +manual_page = 'Coquelicot' + def init(): """Intialize the module.""" diff --git a/plinth/modules/coquelicot/views.py b/plinth/modules/coquelicot/views.py index afbc5382e..9fdb9e737 100644 --- a/plinth/modules/coquelicot/views.py +++ b/plinth/modules/coquelicot/views.py @@ -24,7 +24,7 @@ from django.utils.translation import ugettext as _ from plinth import actions, views from plinth.errors import ActionError from plinth.modules.coquelicot import (clients, description, - get_current_max_file_size) + get_current_max_file_size, manual_page) from .forms import CoquelicotForm @@ -37,6 +37,7 @@ class CoquelicotServiceView(views.ServiceView): service_id = 'coquelicot' form_class = CoquelicotForm show_status_block = True + manual_page = manual_page def get_initial(self): """Return the status of the service to fill in the form.""" diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py index 1157ba4fb..860ba3316 100644 --- a/plinth/modules/datetime/__init__.py +++ b/plinth/modules/datetime/__init__.py @@ -18,13 +18,13 @@ FreedomBox app to configure system date and time. """ -from django.utils.translation import ugettext_lazy as _ import subprocess +from django.utils.translation import ugettext_lazy as _ + from plinth import service as service_module from plinth.menu import main_menu - version = 1 is_essential = True @@ -40,6 +40,8 @@ description = [ 'in synchronization with servers on the Internet.') ] +manual_page = 'DateTime' + service = None @@ -51,8 +53,8 @@ def init(): global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - managed_services[0], name, ports=['ntp'], is_external=False) + service = service_module.Service(managed_services[0], name, + ports=['ntp'], is_external=False) def setup(helper, old_version=None): @@ -60,8 +62,8 @@ def setup(helper, old_version=None): helper.install(managed_packages) global service if service is None: - service = service_module.Service( - managed_services[0], name, ports=['ntp'], is_external=False) + service = service_module.Service(managed_services[0], name, + ports=['ntp'], is_external=False) helper.call('post', service.notify_enabled, None, True) diff --git a/plinth/modules/datetime/views.py b/plinth/modules/datetime/views.py index 316657807..e00093d43 100644 --- a/plinth/modules/datetime/views.py +++ b/plinth/modules/datetime/views.py @@ -18,15 +18,17 @@ FreedomBox app for configuring date and time. """ -from django.contrib import messages -from django.utils.translation import ugettext as _ import logging -from .forms import DateTimeForm +from django.contrib import messages +from django.utils.translation import ugettext as _ + from plinth import actions from plinth.modules import datetime from plinth.views import ServiceView +from .forms import DateTimeForm + logger = logging.getLogger(__name__) @@ -35,11 +37,14 @@ class DateTimeServiceView(ServiceView): form_class = DateTimeForm service_id = datetime.managed_services[0] diagnostics_module_name = "datetime" + manual_page = datetime.manual_page def get_initial(self): - return {'is_enabled': self.service.is_enabled(), - 'is_running': self.service.is_running(), - 'time_zone': self.get_current_time_zone()} + return { + 'is_enabled': self.service.is_enabled(), + 'is_running': self.service.is_running(), + 'time_zone': self.get_current_time_zone() + } def get_current_time_zone(self): """Get current time zone.""" @@ -53,12 +58,12 @@ class DateTimeServiceView(ServiceView): if old_status['time_zone'] != new_status['time_zone'] and \ new_status['time_zone'] != 'none': try: - actions.superuser_run( - 'timezone-change', [new_status['time_zone']]) + actions.superuser_run('timezone-change', + [new_status['time_zone']]) except Exception as exception: - messages.error( - self.request, _('Error setting time zone: {exception}') - .format(exception=exception)) + messages.error(self.request, + _('Error setting time zone: {exception}') + .format(exception=exception)) else: messages.success(self.request, _('Time zone set')) diff --git a/plinth/modules/deluge/__init__.py b/plinth/modules/deluge/__init__.py index 1b09a285c..e3d6e2973 100644 --- a/plinth/modules/deluge/__init__.py +++ b/plinth/modules/deluge/__init__.py @@ -20,14 +20,12 @@ FreedomBox app to configure a Deluge web client. from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, frontpage from plinth.menu import main_menu from plinth.modules.users import register_group -from .manifest import clients +from .manifest import clients version = 2 @@ -43,7 +41,6 @@ short_description = _('BitTorrent Web Client') description = [ _('Deluge is a BitTorrent client that features a Web UI.'), - _('When enabled, the Deluge web client will be available from ' '/deluge path on the web server. The ' 'default password is \'deluge\', but you should log in and change ' @@ -56,21 +53,23 @@ reserved_usernames = ['debian-deluged'] clients = clients +manual_page = 'Deluge' + def init(): """Initialize the Deluge module.""" menu = main_menu.get('apps') - menu.add_urlname(name, 'glyphicon-magnet', - 'deluge:index', short_description) + menu.add_urlname(name, 'glyphicon-magnet', 'deluge:index', + short_description) register_group(group) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - managed_services[0], name, ports=['http', 'https'], - is_external=True, is_enabled=is_enabled, enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'http', 'https' + ], is_external=True, is_enabled=is_enabled, enable=enable, + disable=disable) if is_enabled(): add_shortcut() @@ -82,10 +81,10 @@ def setup(helper, old_version=None): helper.call('post', actions.superuser_run, 'deluge', ['enable']) global service if service is None: - service = service_module.Service( - managed_services[0], name, ports=['http', 'https'], - is_external=True, is_enabled=is_enabled, enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'http', 'https' + ], is_external=True, is_enabled=is_enabled, enable=enable, + disable=disable) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) @@ -97,8 +96,8 @@ def add_shortcut(): def is_enabled(): """Return whether the module is enabled.""" - return (action_utils.webserver_is_enabled('deluge-plinth') and - action_utils.service_is_enabled('deluge-web')) + return (action_utils.webserver_is_enabled('deluge-plinth') + and action_utils.service_is_enabled('deluge-web')) def enable(): @@ -119,7 +118,8 @@ def diagnose(): results.append(action_utils.diagnose_port_listening(8112, 'tcp4')) results.append(action_utils.diagnose_port_listening(8112, 'tcp6')) - results.extend(action_utils.diagnose_url_on_all( - 'https://{host}/deluge', check_certificate=False)) + results.extend( + action_utils.diagnose_url_on_all('https://{host}/deluge', + check_certificate=False)) return results diff --git a/plinth/modules/deluge/urls.py b/plinth/modules/deluge/urls.py index 94bd58bad..e5b8b3123 100644 --- a/plinth/modules/deluge/urls.py +++ b/plinth/modules/deluge/urls.py @@ -26,9 +26,7 @@ from plinth.views import ServiceView urlpatterns = [ url(r'^apps/deluge/$', ServiceView.as_view( - description=deluge.description, - diagnostics_module_name="deluge", - clients=deluge.clients, - service_id=deluge.managed_services[0]), - name='index'), + description=deluge.description, diagnostics_module_name="deluge", + clients=deluge.clients, service_id=deluge.managed_services[0], + manual_page=deluge.manual_page), name='index'), ] diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index 5f2f3c81c..e6f301ed6 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -23,7 +23,6 @@ from django.utils.translation import ugettext_lazy as _ from plinth import action_utils from plinth.menu import main_menu - version = 1 is_essential = True @@ -36,6 +35,8 @@ description = [ 'expected.') ] +manual_page = 'Diagnostics' + def init(): """Initialize the module""" @@ -48,7 +49,8 @@ def diagnose(): results = [] results.append(action_utils.diagnose_port_listening(8000, 'tcp4')) results.append(action_utils.diagnose_port_listening(8000, 'tcp6')) - results.extend(action_utils.diagnose_url_on_all( - 'http://{host}/plinth/', check_certificate=False)) + results.extend( + action_utils.diagnose_url_on_all('http://{host}/plinth/', + check_certificate=False)) return results diff --git a/plinth/modules/diagnostics/diagnostics.py b/plinth/modules/diagnostics/diagnostics.py index 5f8408ffe..c5480933b 100644 --- a/plinth/modules/diagnostics/diagnostics.py +++ b/plinth/modules/diagnostics/diagnostics.py @@ -19,17 +19,17 @@ FreedomBox app for running diagnostics. """ import collections -from django.http import Http404 -from django.template.response import TemplateResponse -from django.views.decorators.http import require_POST -from django.utils.translation import ugettext_lazy as _ import logging import threading +from django.http import Http404 +from django.template.response import TemplateResponse +from django.utils.translation import ugettext_lazy as _ +from django.views.decorators.http import require_POST + from plinth import module_loader from plinth.modules import diagnostics - logger = logging.Logger(__name__) current_results = {} @@ -42,11 +42,14 @@ def index(request): if request.method == 'POST' and not _running_task: _start_task() - return TemplateResponse(request, 'diagnostics.html', - {'title': diagnostics.name, - 'description': diagnostics.description, - 'is_running': _running_task is not None, - 'results': current_results}) + return TemplateResponse( + request, 'diagnostics.html', { + 'title': diagnostics.name, + 'description': diagnostics.description, + 'is_running': _running_task is not None, + 'manual_page': diagnostics.manual_page, + 'results': current_results + }) @require_POST @@ -61,10 +64,12 @@ def module(request, module_name): if hasattr(module, 'diagnose'): results = module.diagnose() - return TemplateResponse(request, 'diagnostics_module.html', - {'title': _('Diagnostic Test'), - 'module_name': module_name, - 'results': results}) + return TemplateResponse( + request, 'diagnostics_module.html', { + 'title': _('Diagnostic Test'), + 'module_name': module_name, + 'results': results + }) def _start_task(): @@ -92,9 +97,11 @@ def _run_on_all_modules_wrapper(): def run_on_all_modules(): """Run diagnostics on all modules and store the result.""" global current_results - current_results = {'modules': [], - 'results': collections.OrderedDict(), - 'progress_percentage': 0} + current_results = { + 'modules': [], + 'results': collections.OrderedDict(), + 'progress_percentage': 0 + } modules = [] for module_name, module in module_loader.loaded_modules.items(): diff --git a/plinth/modules/dynamicdns/__init__.py b/plinth/modules/dynamicdns/__init__.py index 21c68c1e7..de58b4d36 100644 --- a/plinth/modules/dynamicdns/__init__.py +++ b/plinth/modules/dynamicdns/__init__.py @@ -38,9 +38,7 @@ description = [ _('If your Internet provider changes your IP address periodically ' '(i.e. every 24h), it may be hard for others to find you on the ' 'Internet. This will prevent others from finding services which are ' - 'provided by this {box_name}.'), - box_name=_(cfg.box_name)), - + 'provided by this {box_name}.'), box_name=_(cfg.box_name)), _('The solution is to assign a DNS name to your IP address and ' 'update the DNS name every time your IP is changed by your ' 'Internet provider. Dynamic DNS allows you to push your current ' @@ -53,18 +51,21 @@ description = [ reserved_usernames = ['ez-ipupd'] +manual_page = 'DynamicDNS' + + def init(): """Initialize the module.""" menu = main_menu.get('system') menu.add_urlname(name, 'glyphicon-refresh', 'dynamicdns:index') current_status = dynamicdns.get_status() if current_status['enabled']: - services = dynamicdns.get_enabled_services(current_status['dynamicdns_domain']) + services = dynamicdns.get_enabled_services( + current_status['dynamicdns_domain']) domain_added.send_robust( sender='dynamicdns', domain_type='dynamicdnsservice', name=current_status['dynamicdns_domain'], - description=_('Dynamic DNS Service'), - services=services) + description=_('Dynamic DNS Service'), services=services) def setup(helper, old_version=None): diff --git a/plinth/modules/dynamicdns/dynamicdns.py b/plinth/modules/dynamicdns/dynamicdns.py index 0a1f9486b..131fa041b 100644 --- a/plinth/modules/dynamicdns/dynamicdns.py +++ b/plinth/modules/dynamicdns/dynamicdns.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ Forms and views for the dynamicsdns module. """ @@ -24,14 +23,13 @@ import logging from django import forms from django.contrib import messages from django.core import validators -from django.urls import reverse_lazy -from django.utils.translation import ugettext as _, ugettext_lazy from django.template.response import TemplateResponse +from django.urls import reverse_lazy +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy -from plinth import actions -from plinth import cfg -from plinth.modules import dynamicdns -from plinth.modules import firewall +from plinth import actions, cfg +from plinth.modules import dynamicdns, firewall from plinth.modules.names import SERVICES from plinth.signals import domain_added, domain_removed from plinth.utils import format_lazy @@ -39,24 +37,32 @@ from plinth.utils import format_lazy logger = logging.getLogger(__name__) EMPTYSTRING = 'none' -subsubmenu = [{'url': reverse_lazy('dynamicdns:index'), - 'text': ugettext_lazy('About')}, - {'url': reverse_lazy('dynamicdns:configure'), - 'text': ugettext_lazy('Configure')}, - {'url': reverse_lazy('dynamicdns:statuspage'), - 'text': ugettext_lazy('Status')}] +subsubmenu = [{ + 'url': reverse_lazy('dynamicdns:index'), + 'text': ugettext_lazy('About') +}, { + 'url': reverse_lazy('dynamicdns:configure'), + 'text': ugettext_lazy('Configure') +}, { + 'url': reverse_lazy('dynamicdns:statuspage'), + 'text': ugettext_lazy('Status') +}] def index(request): """Serve Dynamic DNS page.""" - return TemplateResponse(request, 'dynamicdns.html', - {'title': dynamicdns.name, - 'description': dynamicdns.description, - 'subsubmenu': subsubmenu}) + return TemplateResponse( + request, 'dynamicdns.html', { + 'title': dynamicdns.name, + 'description': dynamicdns.description, + 'manual_page': dynamicdns.manual_page, + 'subsubmenu': subsubmenu + }) class TrimmedCharField(forms.CharField): """Trim the contents of a CharField.""" + def clean(self, value): """Clean and validate the field value""" if value: @@ -103,29 +109,25 @@ class ConfigureForm(forms.Form): help_user = \ ugettext_lazy('The username that was used when the account was ' 'created.') - """ToDo: sync this list with the html template file""" - provider_choices = ( - ('GnuDIP', 'GnuDIP'), - ('noip', 'noip.com'), - ('selfhost', 'selfhost.bz'), - ('freedns', 'freedns.afraid.org'), - ('other', 'other update URL')) + provider_choices = (('GnuDIP', 'GnuDIP'), ('noip', 'noip.com'), + ('selfhost', 'selfhost.bz'), ('freedns', + 'freedns.afraid.org'), + ('other', 'other update URL')) - enabled = forms.BooleanField(label=ugettext_lazy('Enable Dynamic DNS'), - required=False) + enabled = forms.BooleanField( + label=ugettext_lazy('Enable Dynamic DNS'), required=False) - service_type = forms.ChoiceField(label=ugettext_lazy('Service Type'), - help_text=help_services, - choices=provider_choices) + service_type = forms.ChoiceField( + label=ugettext_lazy('Service Type'), help_text=help_services, + choices=provider_choices) dynamicdns_server = TrimmedCharField( - label=ugettext_lazy('GnuDIP Server Address'), - required=False, - help_text=help_server, - validators=[ + label=ugettext_lazy('GnuDIP Server Address'), required=False, + help_text=help_server, validators=[ validators.RegexValidator(r'^[\w-]{1,63}(\.[\w-]{1,63})*$', - ugettext_lazy('Invalid server name'))]) + ugettext_lazy('Invalid server name')) + ]) dynamicdns_update_url = TrimmedCharField( label=ugettext_lazy('Update URL'), required=False, @@ -140,12 +142,11 @@ class ConfigureForm(forms.Form): help_text=help_http_auth, required=False) dynamicdns_domain = TrimmedCharField( - label=ugettext_lazy('Domain Name'), - help_text=help_domain, - required=False, - validators=[ + label=ugettext_lazy('Domain Name'), help_text=help_domain, + required=False, validators=[ validators.RegexValidator(r'^[\w-]{1,63}(\.[\w-]{1,63})*$', - ugettext_lazy('Invalid domain name'))]) + ugettext_lazy('Invalid domain name')) + ]) dynamicdns_user = TrimmedCharField( label=ugettext_lazy('Username'), required=False, help_text=help_user) @@ -154,15 +155,13 @@ class ConfigureForm(forms.Form): label=ugettext_lazy('Password'), widget=forms.PasswordInput(), required=False, help_text=help_secret) - showpw = forms.BooleanField(label=ugettext_lazy('Show password'), - required=False) + showpw = forms.BooleanField( + label=ugettext_lazy('Show password'), required=False) dynamicdns_ipurl = TrimmedCharField( - label=ugettext_lazy('URL to look up public IP'), - required=False, + label=ugettext_lazy('URL to look up public IP'), required=False, help_text=help_ip_url, - validators=[ - validators.URLValidator(schemes=['http', 'https', 'ftp'])]) + validators=[validators.URLValidator(schemes=['http', 'https', 'ftp'])]) def clean(self): cleaned_data = super(ConfigureForm, self).clean() @@ -215,10 +214,12 @@ def configure(request): else: form = ConfigureForm(initial=status) - return TemplateResponse(request, 'dynamicdns_configure.html', - {'title': _('Configure Dynamic DNS'), - 'form': form, - 'subsubmenu': subsubmenu}) + return TemplateResponse( + request, 'dynamicdns_configure.html', { + 'title': _('Configure Dynamic DNS'), + 'form': form, + 'subsubmenu': subsubmenu + }) def statuspage(request): @@ -236,13 +237,15 @@ def statuspage(request): if nat_unchecked: logger.info('Did not check if behind a NAT') - return TemplateResponse(request, 'dynamicdns_status.html', - {'title': _('Dynamic DNS Status'), - 'no_nat': no_nat, - 'nat_unchecked': nat_unchecked, - 'timer': timer, - 'last_update': last_update, - 'subsubmenu': subsubmenu}) + return TemplateResponse( + request, 'dynamicdns_status.html', { + 'title': _('Dynamic DNS Status'), + 'no_nat': no_nat, + 'nat_unchecked': nat_unchecked, + 'timer': timer, + 'last_update': last_update, + 'subsubmenu': subsubmenu + }) def get_status(): @@ -353,20 +356,19 @@ def _apply_changes(request, old_status, new_status): if new_status['use_http_basic_auth']: use_http_basic_auth = "enabled" - _run(['configure', '-s', new_status['dynamicdns_server'], - '-d', new_status['dynamicdns_domain'], - '-u', new_status['dynamicdns_user'], - '-p', - '-I', new_status['dynamicdns_ipurl'], - '-U', new_status['dynamicdns_update_url'], - '-c', disable_ssl_check, - '-b', use_http_basic_auth], - input=new_status['dynamicdns_secret'].encode()) + _run([ + 'configure', '-s', new_status['dynamicdns_server'], '-d', + new_status['dynamicdns_domain'], '-u', + new_status['dynamicdns_user'], '-p', '-I', + new_status['dynamicdns_ipurl'], '-U', + new_status['dynamicdns_update_url'], '-c', disable_ssl_check, '-b', + use_http_basic_auth + ], input=new_status['dynamicdns_secret'].encode()) if old_status['enabled']: - domain_removed.send_robust( - sender='dynamicdns', domain_type='dynamicdnsservice', - name=old_status['dynamicdns_domain']) + domain_removed.send_robust(sender='dynamicdns', + domain_type='dynamicdnsservice', + name=old_status['dynamicdns_domain']) _run(['stop']) if new_status['enabled']: @@ -374,8 +376,7 @@ def _apply_changes(request, old_status, new_status): domain_added.send_robust( sender='dynamicdns', domain_type='dynamicdnsservice', name=new_status['dynamicdns_domain'], - description=_('Dynamic DNS Service'), - services=services) + description=_('Dynamic DNS Service'), services=services) _run(['start']) messages.success(request, _('Configuration updated')) diff --git a/plinth/modules/dynamicdns/templates/dynamicdns.html b/plinth/modules/dynamicdns/templates/dynamicdns.html index 98aedb4db..ba2570028 100644 --- a/plinth/modules/dynamicdns/templates/dynamicdns.html +++ b/plinth/modules/dynamicdns/templates/dynamicdns.html @@ -21,12 +21,22 @@ {% load i18n %} {% block content %} -

{{ title }}

+ {% block pagetitle %} +

{{ title }}

+ {% endblock %} {% for paragraph in description %}

{{ paragraph|safe }}

{% endfor %} + {% if manual_page %} +

+ + {% trans 'Learn more...' %} + +

+ {% endif %} +

{% blocktrans trimmed %} If you are looking for a free dynamic DNS account, you may find diff --git a/plinth/modules/ejabberd/__init__.py b/plinth/modules/ejabberd/__init__.py index ed4092a6f..570f32c02 100644 --- a/plinth/modules/ejabberd/__init__.py +++ b/plinth/modules/ejabberd/__init__.py @@ -18,23 +18,20 @@ FreedomBox app to configure ejabberd server. """ -from django.urls import reverse_lazy -from django.utils.translation import ugettext_lazy as _ -from plinth.utils import format_lazy - import logging import socket -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import frontpage -from plinth import service as service_module -from plinth.menu import main_menu -from plinth.signals import pre_hostname_change, post_hostname_change -from plinth.signals import domainname_change -from .manifest import clients +from django.urls import reverse_lazy +from django.utils.translation import ugettext_lazy as _ +from plinth import service as service_module +from plinth import action_utils, actions, cfg, frontpage +from plinth.menu import main_menu +from plinth.signals import (domainname_change, post_hostname_change, + pre_hostname_change) +from plinth.utils import format_lazy + +from .manifest import clients version = 1 @@ -49,14 +46,13 @@ short_description = _('Chat Server') description = [ _('XMPP is an open and standardized communication protocol. Here ' 'you can run and configure your XMPP server, called ejabberd.'), - format_lazy( _('To actually communicate, you can use the web client or any other XMPP client. ' 'When enabled, ejabberd can be accessed by any user with a {box_name} login.'), - box_name=_(cfg.box_name)) + '/users">user with a {box_name} login.'), box_name=_( + cfg.box_name)) ] clients = clients @@ -65,22 +61,24 @@ reserved_usernames = ['ejabberd'] service = None +manual_page = 'ejabberd' + logger = logging.getLogger(__name__) def init(): """Initialize the ejabberd module""" menu = main_menu.get('apps') - menu.add_urlname(name, 'glyphicon-comment', 'ejabberd:index', short_description) + menu.add_urlname(name, 'glyphicon-comment', 'ejabberd:index', + short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - 'ejabberd', name, - ports=['xmpp-client', 'xmpp-server', 'xmpp-bosh'], - is_external=True, is_enabled=is_enabled, enable=enable, - disable=disable) + service = service_module.Service('ejabberd', name, ports=[ + 'xmpp-client', 'xmpp-server', 'xmpp-bosh' + ], is_external=True, is_enabled=is_enabled, enable=enable, + disable=disable) if is_enabled(): add_shortcut() pre_hostname_change.connect(on_pre_hostname_change) @@ -99,21 +97,19 @@ def setup(helper, old_version=None): helper.call('post', actions.superuser_run, 'ejabberd', ['setup']) global service if service is None: - service = service_module.Service( - 'ejabberd', name, - ports=['xmpp-client', 'xmpp-server', 'xmpp-bosh'], - is_external=True, is_enabled=is_enabled, enable=enable, - disable=disable) + service = service_module.Service('ejabberd', name, ports=[ + 'xmpp-client', 'xmpp-server', 'xmpp-bosh' + ], is_external=True, is_enabled=is_enabled, enable=enable, + disable=disable) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) def add_shortcut(): - frontpage.add_shortcut('ejabberd', name=name, - short_description=short_description, - details=description, - configure_url=reverse_lazy('ejabberd:index'), - login_required=True) + frontpage.add_shortcut( + 'ejabberd', name=name, short_description=short_description, + details=description, configure_url=reverse_lazy('ejabberd:index'), + login_required=True) def is_enabled(): @@ -146,10 +142,10 @@ def on_pre_hostname_change(sender, old_hostname, new_hostname, **kwargs): del sender # Unused del kwargs # Unused - actions.superuser_run('ejabberd', - ['pre-change-hostname', - '--old-hostname', old_hostname, - '--new-hostname', new_hostname]) + actions.superuser_run('ejabberd', [ + 'pre-change-hostname', '--old-hostname', old_hostname, + '--new-hostname', new_hostname + ]) def on_post_hostname_change(sender, old_hostname, new_hostname, **kwargs): @@ -157,11 +153,10 @@ def on_post_hostname_change(sender, old_hostname, new_hostname, **kwargs): del sender # Unused del kwargs # Unused - actions.superuser_run('ejabberd', - ['change-hostname', - '--old-hostname', old_hostname, - '--new-hostname', new_hostname], - run_in_background=True) + actions.superuser_run('ejabberd', [ + 'change-hostname', '--old-hostname', old_hostname, '--new-hostname', + new_hostname + ], run_in_background=True) def on_domainname_change(sender, old_domainname, new_domainname, **kwargs): @@ -170,10 +165,9 @@ def on_domainname_change(sender, old_domainname, new_domainname, **kwargs): del old_domainname # Unused del kwargs # Unused - actions.superuser_run('ejabberd', - ['change-domainname', - '--domainname', new_domainname], - run_in_background=True) + actions.superuser_run( + 'ejabberd', ['change-domainname', '--domainname', new_domainname], + run_in_background=True) def diagnose(): @@ -186,7 +180,6 @@ def diagnose(): results.append(action_utils.diagnose_port_listening(5269, 'tcp6')) results.append(action_utils.diagnose_port_listening(5280, 'tcp4')) results.append(action_utils.diagnose_port_listening(5280, 'tcp6')) - results.extend( - action_utils.diagnose_url_on_all('http://{host}/bosh/')) + results.extend(action_utils.diagnose_url_on_all('http://{host}/bosh/')) return results diff --git a/plinth/modules/ejabberd/views.py b/plinth/modules/ejabberd/views.py index 6d92c8ab7..4da02bbd1 100644 --- a/plinth/modules/ejabberd/views.py +++ b/plinth/modules/ejabberd/views.py @@ -18,13 +18,15 @@ Views for the Ejabberd module """ -from plinth.modules import ejabberd -from plinth.views import ServiceView -from .forms import EjabberdForm -from plinth import actions from django.contrib import messages from django.utils.translation import ugettext as _ +from plinth import actions +from plinth.modules import ejabberd +from plinth.views import ServiceView + +from .forms import EjabberdForm + class EjabberdServiceView(ServiceView): """Show ejabberd as a service.""" @@ -33,6 +35,7 @@ class EjabberdServiceView(ServiceView): description = ejabberd.description diagnostics_module_name = 'ejabberd' form_class = EjabberdForm + manual_page = ejabberd.manual_page def get_initial(self): initdict = super().get_initial() diff --git a/plinth/modules/firewall/__init__.py b/plinth/modules/firewall/__init__.py index 1c6da1541..9d0244fb1 100644 --- a/plinth/modules/firewall/__init__.py +++ b/plinth/modules/firewall/__init__.py @@ -18,17 +18,16 @@ FreedomBox app to configure a firewall. """ -from django.utils.translation import ugettext_lazy as _ import logging -from plinth import actions -from plinth import cfg +from django.utils.translation import ugettext_lazy as _ + +import plinth.service as service_module +from plinth import actions, cfg from plinth.menu import main_menu from plinth.signals import service_enabled -import plinth.service as service_module from plinth.utils import format_lazy - version = 1 is_essential = True @@ -45,6 +44,8 @@ description = [ 'security threat from the Internet.'), box_name=cfg.box_name) ] +manual_page = 'Firewall' + LOGGER = logging.getLogger(__name__) @@ -105,8 +106,7 @@ def on_service_enabled(sender, service_id, enabled, **kwargs): if port not in internal_enabled_services: add_service(port, zone='internal') - if (service.is_external and - port not in external_enabled_services): + if (service.is_external and port not in external_enabled_services): add_service(port, zone='external') else: # service already configured. @@ -116,8 +116,9 @@ def on_service_enabled(sender, service_id, enabled, **kwargs): enabled_services_on_port = [ service_.is_enabled() for service_ in service_module.services.values() - if port in service_.ports and - service_id != service_.service_id] + if port in service_.ports + and service_id != service_.service_id + ] if not any(enabled_services_on_port): remove_service(port, zone='internal') @@ -126,8 +127,8 @@ def on_service_enabled(sender, service_id, enabled, **kwargs): service_.is_enabled() for service_ in service_module.services.values() if port in service_.ports and - service_id != service_.service_id and - service_.is_external] + service_id != service_.service_id and service_.is_external + ] if not any(enabled_services_on_port): remove_service(port, zone='external') diff --git a/plinth/modules/firewall/views.py b/plinth/modules/firewall/views.py index f5e83f3f0..5b9b33313 100644 --- a/plinth/modules/firewall/views.py +++ b/plinth/modules/firewall/views.py @@ -20,25 +20,29 @@ FreedomBox app to configure a firewall. from django.template.response import TemplateResponse -from plinth.modules import firewall import plinth.service as service_module +from plinth.modules import firewall def index(request): """Serve introduction page""" if not firewall.get_enabled_status(): - return TemplateResponse(request, 'firewall.html', - {'title': firewall.name, - 'description': firewall.description, - 'firewall_status': 'not_running'}) + return TemplateResponse( + request, 'firewall.html', { + 'title': firewall.name, + 'description': firewall.description, + 'firewall_status': 'not_running' + }) internal_enabled_services = firewall.get_enabled_services(zone='internal') external_enabled_services = firewall.get_enabled_services(zone='external') return TemplateResponse( - request, 'firewall.html', - {'title': firewall.name, - 'description': firewall.description, - 'services': list(service_module.services.values()), - 'internal_enabled_services': internal_enabled_services, - 'external_enabled_services': external_enabled_services}) + request, 'firewall.html', { + 'title': firewall.name, + 'description': firewall.description, + 'services': list(service_module.services.values()), + 'manual_page': firewall.manual_page, + 'internal_enabled_services': internal_enabled_services, + 'external_enabled_services': external_enabled_services + }) diff --git a/plinth/modules/help/help.py b/plinth/modules/help/help.py index 9c0c5354a..f61d7af23 100644 --- a/plinth/modules/help/help.py +++ b/plinth/modules/help/help.py @@ -51,8 +51,9 @@ def init(): def index(request): """Serve the index page""" - return TemplateResponse(request, 'help_index.html', - {'title': _('Documentation and FAQ')}) + return TemplateResponse(request, 'help_index.html', { + 'title': _('Documentation and FAQ') + }) def about(request): @@ -68,20 +69,22 @@ def about(request): return TemplateResponse(request, 'help_about.html', context) -def manual(request): +def manual(request, page='freedombox-manual.part.html'): """Serve the manual page from the 'doc' directory""" try: - with open( - os.path.join(cfg.doc_dir, 'freedombox-manual.part.html'), 'r', - encoding='utf-8') as input_file: + page = '{}.part.html'.format( + page) if not page.endswith('html') else page + with open(os.path.join(cfg.doc_dir, page), 'r', + encoding='utf-8') as input_file: content = input_file.read() except IOError: raise Http404 - return TemplateResponse(request, 'help_manual.html', { - 'title': _('{box_name} Manual').format(box_name=_(cfg.box_name)), - 'content': content - }) + return TemplateResponse( + request, 'help_manual.html', { + 'title': _('{box_name} Manual').format(box_name=_(cfg.box_name)), + 'content': content + }) def download_manual(request): diff --git a/plinth/modules/help/urls.py b/plinth/modules/help/urls.py index db3a3ae08..dba07ecf0 100644 --- a/plinth/modules/help/urls.py +++ b/plinth/modules/help/urls.py @@ -32,8 +32,10 @@ urlpatterns = [ url(r'^help/index/$', non_admin_view(views.index), name='index-explicit'), url(r'^help/about/$', non_admin_view(views.about), name='about'), url(r'^help/manual/$', non_admin_view(views.manual), name='manual'), - url(r'^help/manual/download/$', - non_admin_view(views.download_manual), name='download-manual'), - url(r'^help/status-log/$', - non_admin_view(views.status_log), name='status-log'), + url(r'^help/manual/download/$', non_admin_view(views.download_manual), + name='download-manual'), + url(r'^help/manual/(?P[\w-]+)?/?$', non_admin_view(views.manual), + name='manual-page'), + url(r'^help/status-log/$', non_admin_view(views.status_log), + name='status-log'), ] diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py index ab8b7cf0e..c6dd6dec4 100644 --- a/plinth/modules/ikiwiki/__init__.py +++ b/plinth/modules/ikiwiki/__init__.py @@ -19,23 +19,21 @@ FreedomBox app to configure ikiwiki. """ from django.utils.translation import ugettext_lazy as _ -from plinth.utils import format_lazy -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, cfg, frontpage from plinth.menu import main_menu from plinth.modules.users import register_group -from .manifest import clients +from plinth.utils import format_lazy +from .manifest import clients version = 1 -managed_packages = ['ikiwiki', 'libdigest-sha-perl', 'libxml-writer-perl', - 'xapian-omega', 'libsearch-xapian-perl', - 'libimage-magick-perl'] +managed_packages = [ + 'ikiwiki', 'libdigest-sha-perl', 'libxml-writer-perl', 'xapian-omega', + 'libsearch-xapian-perl', 'libimage-magick-perl' +] service = None @@ -49,7 +47,6 @@ description = [ 'common blogging functionality such as comments and RSS feeds. ' 'When enabled, the blogs and wikis will be available ' 'at /ikiwiki (once created).'), - format_lazy( _('Only {box_name} users in the admin group can create ' 'and manage blogs and wikis, but any user in the wiki ' @@ -60,14 +57,16 @@ description = [ clients = clients - group = ('wiki', _('View and edit wiki applications')) +manual_page = 'Ikiwiki' + def init(): """Initialize the ikiwiki module.""" menu = main_menu.get('apps') - menu.add_urlname(name, 'glyphicon-edit', 'ikiwiki:index', short_description) + menu.add_urlname(name, 'glyphicon-edit', 'ikiwiki:index', + short_description) register_group(group) global service @@ -98,9 +97,8 @@ def add_shortcuts(): sites = actions.run('ikiwiki', ['get-sites']).split('\n') sites = [name for name in sites if name != ''] for site in sites: - frontpage.add_shortcut( - 'ikiwiki_' + site, site, url='/ikiwiki/' + site, - login_required=False, icon='ikiwiki') + frontpage.add_shortcut('ikiwiki_' + site, site, url='/ikiwiki/' + site, + login_required=False, icon='ikiwiki') def is_enabled(): @@ -124,7 +122,8 @@ def diagnose(): """Run diagnostics and return the results.""" results = [] - results.extend(action_utils.diagnose_url_on_all( - 'https://{host}/ikiwiki', check_certificate=False)) + results.extend( + action_utils.diagnose_url_on_all('https://{host}/ikiwiki', + check_certificate=False)) return results diff --git a/plinth/modules/ikiwiki/views.py b/plinth/modules/ikiwiki/views.py index 1b71b44ea..b6f7eba69 100644 --- a/plinth/modules/ikiwiki/views.py +++ b/plinth/modules/ikiwiki/views.py @@ -22,11 +22,10 @@ from django.contrib import messages from django.shortcuts import redirect from django.template.response import TemplateResponse from django.urls import reverse_lazy -from django.utils.translation import ugettext as _, ugettext_lazy +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy -from plinth import actions -from plinth import frontpage -from plinth import views +from plinth import actions, frontpage, views from plinth.modules import ikiwiki from .forms import IkiwikiCreateForm @@ -63,11 +62,12 @@ def manage(request): sites = actions.run('ikiwiki', ['get-sites']).split('\n') sites = [name for name in sites if name != ''] - return TemplateResponse(request, 'ikiwiki_manage.html', { - 'title': _('Manage Wikis and Blogs'), - 'subsubmenu': subsubmenu, - 'sites': sites - }) + return TemplateResponse( + request, 'ikiwiki_manage.html', { + 'title': _('Manage Wikis and Blogs'), + 'subsubmenu': subsubmenu, + 'sites': sites + }) def create(request): @@ -87,22 +87,21 @@ def create(request): form.cleaned_data['admin_password']) site = form.cleaned_data['name'].replace(' ', '') - frontpage.add_shortcut( - 'ikiwiki_' + site, - site, - url='/ikiwiki/' + site, - login_required=False, - icon='ikiwiki') + frontpage.add_shortcut('ikiwiki_' + site, site, + url='/ikiwiki/' + site, + login_required=False, icon='ikiwiki') return redirect(reverse_lazy('ikiwiki:manage')) else: form = IkiwikiCreateForm(prefix='ikiwiki') - return TemplateResponse(request, 'ikiwiki_create.html', { - 'title': _('Create Wiki or Blog'), - 'form': form, - 'subsubmenu': subsubmenu - }) + return TemplateResponse( + request, 'ikiwiki_create.html', { + 'title': _('Create Wiki or Blog'), + 'form': form, + 'subsubmenu': subsubmenu, + 'manual_page': ikiwiki.manual_page, + }) def _create_wiki(request, name, admin_name, admin_password): @@ -114,8 +113,8 @@ def _create_wiki(request, name, admin_name, admin_password): input=admin_password.encode()) messages.success(request, _('Created wiki {name}.').format(name=name)) except actions.ActionError as error: - messages.error( - request, _('Could not create wiki: {error}').format(error=error)) + messages.error(request, + _('Could not create wiki: {error}').format(error=error)) def _create_blog(request, name, admin_name, admin_password): @@ -127,8 +126,8 @@ def _create_blog(request, name, admin_name, admin_password): input=admin_password.encode()) messages.success(request, _('Created blog {name}.').format(name=name)) except actions.ActionError as error: - messages.error( - request, _('Could not create blog: {error}').format(error=error)) + messages.error(request, + _('Could not create blog: {error}').format(error=error)) def delete(request, name): diff --git a/plinth/modules/letsencrypt/__init__.py b/plinth/modules/letsencrypt/__init__.py index 10feffc81..98baa385a 100644 --- a/plinth/modules/letsencrypt/__init__.py +++ b/plinth/modules/letsencrypt/__init__.py @@ -23,16 +23,12 @@ import logging from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import cfg +from plinth import action_utils, actions, cfg, module_loader from plinth.errors import ActionError from plinth.menu import main_menu -from plinth.modules import names -from plinth.modules import config +from plinth.modules import config, names +from plinth.signals import domain_added, domain_removed, domainname_change from plinth.utils import format_lazy -from plinth import module_loader -from plinth.signals import domainname_change, domain_added, domain_removed version = 1 @@ -53,8 +49,7 @@ description = [ '{box_name} 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).'), - box_name=_(cfg.box_name)), + 'certificate authority (CA).'), box_name=_(cfg.box_name)), _('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 ' @@ -64,6 +59,8 @@ description = [ service = None +manual_page = 'LetsEncrypt' + MODULES_WITH_HOOKS = ['ejabberd'] LIVE_DIRECTORY = '/etc/letsencrypt/live/' logger = logging.getLogger(__name__) @@ -72,8 +69,8 @@ logger = logging.getLogger(__name__) def init(): """Intialize the module.""" menu = main_menu.get('system') - menu.add_urlname(name, - 'glyphicon-lock', 'letsencrypt:index', short_description) + menu.add_urlname(name, 'glyphicon-lock', 'letsencrypt:index', + short_description) domainname_change.connect(on_domainname_change) domain_added.connect(on_domain_added) domain_removed.connect(on_domain_removed) @@ -112,8 +109,8 @@ def enable_renewal_management(domain): except ActionError as exception: logger.error( _('Failed to enable certificate renewal management for ' - '{domain}: {error}').format( - domain=domain, error=exception.args[2])) + '{domain}: {error}').format(domain=domain, + error=exception.args[2])) def on_domainname_change(sender, old_domainname, new_domainname, **kwargs): @@ -124,11 +121,11 @@ def on_domainname_change(sender, old_domainname, new_domainname, **kwargs): for module in MODULES_WITH_HOOKS: actions.superuser_run( - module, ['letsencrypt', 'drop', '--domain', - old_domainname], run_in_background=True) + module, ['letsencrypt', 'drop', '--domain', old_domainname], + run_in_background=True) actions.superuser_run( - 'letsencrypt', ['manage_hooks', 'disable', '--domain', - old_domainname], run_in_background=True) + 'letsencrypt', ['manage_hooks', 'disable', '--domain', old_domainname], + run_in_background=True) def get_manage_hooks_status(): @@ -143,10 +140,12 @@ def get_manage_hooks_status(): def get_installed_modules(): - installed_modules = [module_name for module_name, module in - module_loader.loaded_modules.items() - if module_name in MODULES_WITH_HOOKS - and module.setup_helper.get_state() == 'up-to-date'] + installed_modules = [ + module_name + for module_name, module in module_loader.loaded_modules.items() + if module_name in MODULES_WITH_HOOKS + and module.setup_helper.get_state() == 'up-to-date' + ] return installed_modules @@ -196,10 +195,12 @@ def get_status(): status = json.loads(status) curr_dom = config.get_domainname() current_domain = { - 'name': curr_dom, - 'has_cert': (curr_dom in status['domains'] and - status['domains'][curr_dom]['certificate_available']), - 'manage_hooks_status': get_manage_hooks_status() + 'name': + curr_dom, + 'has_cert': (curr_dom in status['domains'] + and status['domains'][curr_dom]['certificate_available']), + 'manage_hooks_status': + get_manage_hooks_status() } status['current_domain'] = current_domain diff --git a/plinth/modules/letsencrypt/views.py b/plinth/modules/letsencrypt/views.py index 650523dfb..466a67a0e 100644 --- a/plinth/modules/letsencrypt/views.py +++ b/plinth/modules/letsencrypt/views.py @@ -29,8 +29,7 @@ from django.views.decorators.http import require_POST from plinth import actions from plinth.errors import ActionError -from plinth.modules import config -from plinth.modules import letsencrypt +from plinth.modules import config, letsencrypt logger = logging.getLogger(__name__) @@ -38,12 +37,14 @@ logger = logging.getLogger(__name__) def index(request): """Serve configuration page.""" status = letsencrypt.get_status() - return TemplateResponse(request, 'letsencrypt.html', - {'title': letsencrypt.name, - 'description': letsencrypt.description, - 'status': status, - 'installed_modules': - letsencrypt.get_installed_modules()}) + return TemplateResponse( + request, 'letsencrypt.html', { + 'title': letsencrypt.name, + 'description': letsencrypt.description, + 'status': status, + 'manual_page': letsencrypt.manual_page, + 'installed_modules': letsencrypt.get_installed_modules() + }) @require_POST @@ -95,8 +96,8 @@ def enable_renewal_management(request, domain): messages.error( request, _('Failed to enable certificate renewal management for ' - '{domain}: {error}').format( - domain=domain, error=exception.args[2])) + '{domain}: {error}').format(domain=domain, + error=exception.args[2])) @require_POST @@ -111,9 +112,10 @@ def toggle_hooks(request, domain): try: if subcommand == 'disable': - enabled_modules = [module for module in - letsencrypt.MODULES_WITH_HOOKS - if module in manage_hooks_status] + enabled_modules = [ + module for module in letsencrypt.MODULES_WITH_HOOKS + if module in manage_hooks_status + ] for module in enabled_modules: actions.superuser_run(module, ['letsencrypt', 'drop'], run_in_background=True) @@ -138,8 +140,10 @@ def toggle_hooks(request, domain): def toggle_module(request, domain, module): """Toggle usage of LE cert for a module name, for the current domain.""" manage_hooks_status = letsencrypt.get_manage_hooks_status() - enabled_modules = [module for module in letsencrypt.MODULES_WITH_HOOKS - if module in manage_hooks_status] + enabled_modules = [ + module for module in letsencrypt.MODULES_WITH_HOOKS + if module in manage_hooks_status + ] if module in enabled_modules: mod_le_arg = 'drop' @@ -157,9 +161,9 @@ def toggle_module(request, domain, module): try: actions.superuser_run(module, module_args) actions.superuser_run('letsencrypt', le_arguments) - messages.success( - request, _('Switched use of certificate for app {module}') - .format(module=module)) + messages.success(request, + _('Switched use of certificate for app {module}') + .format(module=module)) except ActionError as exception: messages.error( request, @@ -173,8 +177,10 @@ def toggle_module(request, domain, module): def delete(request, domain): """Delete a certificate for a given domain, and cleanup renewal config.""" manage_hooks_status = letsencrypt.get_manage_hooks_status() - enabled_modules = [module for module in letsencrypt.MODULES_WITH_HOOKS - if module in manage_hooks_status] + enabled_modules = [ + module for module in letsencrypt.MODULES_WITH_HOOKS + if module in manage_hooks_status + ] try: for module in enabled_modules: diff --git a/plinth/modules/matrixsynapse/__init__.py b/plinth/modules/matrixsynapse/__init__.py index a9f42b987..7d1f1f5aa 100644 --- a/plinth/modules/matrixsynapse/__init__.py +++ b/plinth/modules/matrixsynapse/__init__.py @@ -25,11 +25,10 @@ from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ from ruamel.yaml.util import load_yaml_guess_indent -from plinth import action_utils -from plinth import actions -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, frontpage from plinth.menu import main_menu + from .manifest import clients version = 2 @@ -50,7 +49,6 @@ description = [ 'synchronization and does not require phone numbers to work. Users on a ' 'given Matrix server can converse with users on all other Matrix ' 'servers via federation.'), - _('To communicate, you can use the ' 'available clients ' 'for mobile, desktop and the web. Riot ' @@ -61,6 +59,8 @@ clients = clients service = None +manual_page = 'MatrixSynapse' + logger = logging.getLogger(__name__) SERVER_NAME_PATH = "/etc/matrix-synapse/conf.d/server_name.yaml" @@ -76,11 +76,10 @@ def init(): global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - 'matrix-synapse', name, - ports=['matrix-synapse-plinth'], - is_external=True, is_enabled=is_enabled, enable=enable, - disable=disable) + service = service_module.Service('matrix-synapse', name, ports=[ + 'matrix-synapse-plinth' + ], is_external=True, is_enabled=is_enabled, enable=enable, + disable=disable) if is_enabled(): add_shortcut() @@ -90,11 +89,10 @@ def setup(helper, old_version=None): helper.install(managed_packages) global service if service is None: - service = service_module.Service( - 'matrix-synapse', name, - ports=['matrix-synapse-plinth'], - is_external=True, is_enabled=is_enabled, enable=enable, - disable=disable) + service = service_module.Service('matrix-synapse', name, ports=[ + 'matrix-synapse-plinth' + ], is_external=True, is_enabled=is_enabled, enable=enable, + disable=disable) helper.call('post', actions.superuser_run, 'matrixsynapse', ['post-install']) @@ -138,8 +136,9 @@ def diagnose(): results.append(action_utils.diagnose_port_listening(8008, 'tcp4')) results.append(action_utils.diagnose_port_listening(8448, 'tcp4')) - results.extend(action_utils.diagnose_url_on_all( - 'https://{host}/_matrix', check_certificate=False)) + results.extend( + action_utils.diagnose_url_on_all('https://{host}/_matrix', + check_certificate=False)) return results diff --git a/plinth/modules/matrixsynapse/views.py b/plinth/modules/matrixsynapse/views.py index dfad689cd..43b8b198b 100644 --- a/plinth/modules/matrixsynapse/views.py +++ b/plinth/modules/matrixsynapse/views.py @@ -79,6 +79,7 @@ class MatrixSynapseServiceView(ServiceView): context = super().get_context_data(*args, **kwargs) context['domain_name'] = matrixsynapse.get_configured_domain_name() context['clients'] = matrixsynapse.clients + context['manual_page'] = matrixsynapse.manual_page return context def get_initial(self): diff --git a/plinth/modules/mediawiki/__init__.py b/plinth/modules/mediawiki/__init__.py index 7fbec6f19..889c6c992 100644 --- a/plinth/modules/mediawiki/__init__.py +++ b/plinth/modules/mediawiki/__init__.py @@ -51,6 +51,8 @@ description = [ service = None +manual_page = 'MediaWiki' + clients = clients diff --git a/plinth/modules/mediawiki/views.py b/plinth/modules/mediawiki/views.py index c6fbe5b39..f92ea2a65 100644 --- a/plinth/modules/mediawiki/views.py +++ b/plinth/modules/mediawiki/views.py @@ -38,6 +38,7 @@ class MediaWikiServiceView(views.ServiceView): diagnostics_module_name = 'mediawiki' service_id = 'mediawiki' form_class = MediaWikiForm + manual_page = mediawiki.manual_page show_status_block = False def form_valid(self, form): diff --git a/plinth/modules/minetest/__init__.py b/plinth/modules/minetest/__init__.py index f639e4e42..5d70da7aa 100644 --- a/plinth/modules/minetest/__init__.py +++ b/plinth/modules/minetest/__init__.py @@ -19,19 +19,15 @@ FreedomBox app for Minetest server. """ import augeas - from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, cfg, frontpage from plinth.menu import main_menu from plinth.utils import format_lazy -from .manifest import clients +from .manifest import clients version = 2 @@ -39,11 +35,13 @@ service = None managed_services = ['minetest-server'] -managed_packages = ['minetest-server', 'minetest-mod-advspawning', - 'minetest-mod-animalmaterials', 'minetest-mod-animals', - 'minetest-mod-mesecons', 'minetest-mod-mobf-core', - 'minetest-mod-mobf-trap', 'minetest-mod-moreblocks', - 'minetest-mod-nether', 'minetest-mod-torches'] +managed_packages = [ + 'minetest-server', 'minetest-mod-advspawning', + 'minetest-mod-animalmaterials', 'minetest-mod-animals', + 'minetest-mod-mesecons', 'minetest-mod-mobf-core', + 'minetest-mod-mobf-trap', 'minetest-mod-moreblocks', 'minetest-mod-nether', + 'minetest-mod-torches' +] name = _('Minetest') @@ -60,6 +58,8 @@ description = [ clients = clients +manual_page = 'Minetest' + reserved_usernames = ['Debian-minetest'] CONFIG_FILE = '/etc/minetest/minetest.conf' @@ -69,15 +69,15 @@ AUG_PATH = '/files' + CONFIG_FILE + '/.anon' def init(): """Initialize the module.""" menu = main_menu.get('apps') - menu.add_urlname(name, 'glyphicon-th-large', 'minetest:index', short_description) + menu.add_urlname(name, 'glyphicon-th-large', 'minetest:index', + short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - managed_services[0], name, - ports=['minetest-plinth'], is_external=True, enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'minetest-plinth' + ], is_external=True, enable=enable, disable=disable) if service.is_enabled(): add_shortcut() @@ -88,20 +88,18 @@ def setup(helper, old_version=None): helper.install(managed_packages) global service if service is None: - service = service_module.Service( - managed_services[0], name, - ports=['minetest-plinth'], is_external=True, enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'minetest-plinth' + ], is_external=True, enable=enable, disable=disable) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) def add_shortcut(): - frontpage.add_shortcut('minetest', name, url=None, - short_description=short_description, - details=description, - configure_url=reverse_lazy('minetest:index'), - login_required=False) + frontpage.add_shortcut( + 'minetest', name, url=None, short_description=short_description, + details=description, configure_url=reverse_lazy('minetest:index'), + login_required=False) def enable(): @@ -127,8 +125,8 @@ def diagnose(): def load_augeas(): """Initialize Augeas.""" - 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/Php/lens', 'Php.lns') aug.set('/augeas/load/Php/incl[last() + 1]', CONFIG_FILE) aug.load() diff --git a/plinth/modules/minetest/views.py b/plinth/modules/minetest/views.py index 5320fe827..170a6cd30 100644 --- a/plinth/modules/minetest/views.py +++ b/plinth/modules/minetest/views.py @@ -22,12 +22,11 @@ from django.contrib import messages from django.utils.translation import ugettext_lazy as _ from plinth import actions -from plinth.modules import minetest +from plinth.modules import minetest, names from plinth.views import ServiceView -from . import description, managed_services, get_configuration +from . import description, get_configuration, managed_services from .forms import MinetestForm -from plinth.modules import names class MinetestServiceView(ServiceView): # pylint: disable=too-many-ancestors @@ -39,6 +38,7 @@ class MinetestServiceView(ServiceView): # pylint: disable=too-many-ancestors template_name = 'minetest.html' form_class = MinetestForm clients = minetest.clients + manual_page = minetest.manual_page def get_initial(self): """Return the values to fill in the form.""" @@ -49,9 +49,9 @@ class MinetestServiceView(ServiceView): # pylint: disable=too-many-ancestors def get_context_data(self, *args, **kwargs): """Add service to the context data.""" context = super().get_context_data(*args, **kwargs) - domains = [domain - for domains in names.domains.values() - for domain in domains] + domains = [ + domain for domains in names.domains.values() for domain in domains + ] context['domains'] = domains return context @@ -62,10 +62,10 @@ class MinetestServiceView(ServiceView): # pylint: disable=too-many-ancestors if old_config['max_players'] != data['max_players'] \ and data['max_players'] != None: - actions.superuser_run('minetest', [ - 'configure', '--max_players', - str(data['max_players']) - ]) + actions.superuser_run( + 'minetest', + ['configure', '--max_players', + str(data['max_players'])]) messages.success(self.request, _('Maximum players configuration updated')) diff --git a/plinth/modules/monkeysphere/__init__.py b/plinth/modules/monkeysphere/__init__.py index 15d89a346..7e33216c2 100644 --- a/plinth/modules/monkeysphere/__init__.py +++ b/plinth/modules/monkeysphere/__init__.py @@ -22,7 +22,6 @@ from django.utils.translation import ugettext_lazy as _ from plinth.menu import main_menu - version = 1 managed_packages = ['monkeysphere'] @@ -38,7 +37,6 @@ description = [ '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 ' @@ -49,14 +47,16 @@ description = [ 'website.') ] +manual_page = "Monkeysphere" + reserved_usernames = ['monkeysphere'] def init(): """Initialize the monkeysphere module.""" menu = main_menu.get('system') - menu.add_urlname(_('Monkeysphere'), 'glyphicon-certificate', - 'monkeysphere:index') + menu.add_urlname( + _('Monkeysphere'), 'glyphicon-certificate', 'monkeysphere:index') def setup(helper, old_version=None): diff --git a/plinth/modules/monkeysphere/views.py b/plinth/modules/monkeysphere/views.py index c7dc71b7d..eebb7ea92 100644 --- a/plinth/modules/monkeysphere/views.py +++ b/plinth/modules/monkeysphere/views.py @@ -14,22 +14,21 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ Views for the monkeysphere module. """ +import json + from django.contrib import messages from django.shortcuts import redirect from django.template.response import TemplateResponse from django.urls import reverse_lazy from django.utils.translation import ugettext as _ from django.views.decorators.http import require_POST -import json from plinth import actions -from plinth.modules import monkeysphere -from plinth.modules import names +from plinth.modules import monkeysphere, names publish_process = None @@ -39,23 +38,25 @@ def index(request): _collect_publish_result(request) status = get_status() return TemplateResponse( - request, 'monkeysphere.html', - {'title': monkeysphere.name, - 'description': monkeysphere.description, - 'status': status, - 'running': bool(publish_process)}) + request, 'monkeysphere.html', { + 'title': monkeysphere.name, + 'description': monkeysphere.description, + 'status': status, + 'manual_page': monkeysphere.manual_page, + 'running': bool(publish_process) + }) @require_POST def import_key(request, ssh_fingerprint): """Import a key into monkeysphere.""" - available_domains = [domain - for domains in names.domains.values() - for domain in domains] + available_domains = [ + domain for domains in names.domains.values() for domain in domains + ] try: actions.superuser_run( - 'monkeysphere', ['host-import-key', ssh_fingerprint] + - available_domains) + 'monkeysphere', + ['host-import-key', ssh_fingerprint] + available_domains) messages.success(request, _('Imported key.')) except actions.ActionError as exception: messages.error(request, str(exception)) @@ -65,9 +66,10 @@ def import_key(request, ssh_fingerprint): def details(request, fingerprint): """Get details for an OpenPGP key.""" - return TemplateResponse(request, 'monkeysphere_details.html', - {'title': monkeysphere.name, - 'key': get_key(fingerprint)}) + return TemplateResponse(request, 'monkeysphere_details.html', { + 'title': monkeysphere.name, + 'key': get_key(fingerprint) + }) @require_POST @@ -88,7 +90,8 @@ def cancel(request): global publish_process if publish_process: actions.superuser_run( - 'monkeysphere', ['host-cancel-publish', str(publish_process.pid)]) + 'monkeysphere', ['host-cancel-publish', + str(publish_process.pid)]) publish_process = None messages.info(request, _('Cancelled key publishing.')) @@ -107,17 +110,18 @@ def get_keys(fingerprint=None): ['host-show-keys'] + fingerprint) keys = json.loads(output)['keys'] - domains = [domain - for domains_of_a_type in names.domains.values() - for domain in domains_of_a_type] + domains = [ + domain for domains_of_a_type in names.domains.values() + for domain in domains_of_a_type + ] for key in keys.values(): key['imported_domains'] = set(key.get('imported_domains', [])) key['available_domains'] = set(key.get('available_domains', [])) if '*' in key['available_domains']: key['available_domains'] = set(domains) - key['all_domains'] = sorted( - key['available_domains'].union(key['imported_domains'])) + key['all_domains'] = sorted(key['available_domains'].union( + key['imported_domains'])) key['importable_domains'] = key['available_domains'] \ .difference(key['imported_domains']) diff --git a/plinth/modules/mumble/__init__.py b/plinth/modules/mumble/__init__.py index 9f9e647a5..8477e000d 100644 --- a/plinth/modules/mumble/__init__.py +++ b/plinth/modules/mumble/__init__.py @@ -21,12 +21,11 @@ FreedomBox app to configure Mumble server. from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, frontpage from plinth.menu import main_menu from plinth.views import ServiceView + from .manifest import clients version = 1 @@ -53,6 +52,8 @@ clients = clients reserved_usernames = ['mumble-server'] +manual_page = 'Mumble' + def init(): """Intialize the Mumble module.""" @@ -63,13 +64,9 @@ def init(): global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - managed_services[0], - name, - ports=['mumble-plinth'], - is_external=True, - enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'mumble-plinth' + ], is_external=True, enable=enable, disable=disable) if service.is_enabled(): add_shortcut() @@ -80,6 +77,7 @@ class MumbleServiceView(ServiceView): diagnostics_module_name = "mumble" description = description clients = clients + manual_page = manual_page def setup(helper, old_version=None): @@ -87,25 +85,18 @@ def setup(helper, old_version=None): helper.install(managed_packages) global service if service is None: - service = service_module.Service( - managed_services[0], - name, - ports=['mumble-plinth'], - is_external=True, - enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'mumble-plinth' + ], is_external=True, enable=enable, disable=disable) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) def add_shortcut(): - frontpage.add_shortcut( - 'mumble', - name, - short_description=short_description, - details=description, - configure_url=reverse_lazy('mumble:index'), - login_required=False) + frontpage.add_shortcut('mumble', name, short_description=short_description, + details=description, + configure_url=reverse_lazy('mumble:index'), + login_required=False) def enable(): diff --git a/plinth/modules/names/__init__.py b/plinth/modules/names/__init__.py index 992be3d64..139ea2e41 100644 --- a/plinth/modules/names/__init__.py +++ b/plinth/modules/names/__init__.py @@ -18,13 +18,13 @@ FreedomBox app to configure name services. """ -from django.utils.translation import ugettext_lazy as _ import logging +from django.utils.translation import ugettext_lazy as _ + from plinth.menu import main_menu from plinth.signals import domain_added, domain_removed - SERVICES = ( ('http', _('HTTP'), 80), ('https', _('HTTPS'), 443), @@ -42,6 +42,8 @@ domains = {} logger = logging.getLogger(__name__) +manual_page = 'NameServices' + def init(): """Initialize the names module.""" @@ -69,8 +71,8 @@ def on_domain_added(sender, domain_type, name='', description='', # new domain_type domains[domain_type] = {} domains[domain_type][name] = services - logger.info('Added domain %s of type %s with services %s', - name, domain_type, str(services)) + logger.info('Added domain %s of type %s with services %s', name, + domain_type, str(services)) def on_domain_removed(sender, domain_type, name='', **kwargs): diff --git a/plinth/modules/names/views.py b/plinth/modules/names/views.py index 3ba379445..ac8adedac 100644 --- a/plinth/modules/names/views.py +++ b/plinth/modules/names/views.py @@ -21,18 +21,21 @@ FreedomBox app for name services. from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ -from . import SERVICES, get_domain_types, get_description -from . import get_domain, get_services_status from plinth.modules import names +from . import (SERVICES, get_description, get_domain, get_domain_types, + get_services_status) + def index(request): """Serve name services page.""" status = get_status() - return TemplateResponse(request, 'names.html', - {'title': names.name, - 'status': status}) + return TemplateResponse(request, 'names.html', { + 'title': names.name, + 'manual_page': names.manual_page, + 'status': status + }) def get_status(): diff --git a/plinth/modules/networks/__init__.py b/plinth/modules/networks/__init__.py index af0dc97b2..494721329 100644 --- a/plinth/modules/networks/__init__.py +++ b/plinth/modules/networks/__init__.py @@ -18,16 +18,14 @@ FreedomBox app to interface with network-manager. """ -from django.utils.translation import ugettext_lazy as _ -from logging import Logger import subprocess +from logging import Logger -from plinth import actions -from plinth import action_utils -from plinth import network +from django.utils.translation import ugettext_lazy as _ + +from plinth import action_utils, actions, network from plinth.menu import main_menu - version = 1 is_essential = True @@ -38,6 +36,8 @@ name = _('Networks') logger = Logger(__name__) +manual_page = 'Networks' + def init(): """Initialize the Networks module.""" @@ -113,9 +113,10 @@ def _diagnose_dnssec(kind='4'): result = 'failed' try: - output = subprocess.check_output( - ['dig', kind_option, '+time=2', '+tries=1', - 'test.dnssec-or-not.net', 'TXT']) + output = subprocess.check_output([ + 'dig', kind_option, '+time=2', '+tries=1', + 'test.dnssec-or-not.net', 'TXT' + ]) if 'Yes, you are using DNSSEC' in output.decode(): result = 'passed' diff --git a/plinth/modules/networks/networks.py b/plinth/modules/networks/networks.py index 7bbbd8a2b..6553b9f68 100644 --- a/plinth/modules/networks/networks.py +++ b/plinth/modules/networks/networks.py @@ -15,37 +15,47 @@ # along with this program. If not, see . # +from logging import Logger + from django.contrib import messages from django.shortcuts import redirect from django.template.response import TemplateResponse from django.urls import reverse_lazy -from django.utils.translation import ugettext as _, ugettext_lazy +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy from django.views.decorators.http import require_POST -from logging import Logger + +from plinth import network +from plinth.modules import networks from .forms import (ConnectionTypeSelectForm, EthernetForm, GenericForm, PPPoEForm, WifiForm) -from plinth import network - logger = Logger(__name__) -subsubmenu = [{'url': reverse_lazy('networks:index'), - 'text': ugettext_lazy('Network Connections')}, - {'url': reverse_lazy('networks:scan'), - 'text': ugettext_lazy('Nearby Wi-Fi Networks')}, - {'url': reverse_lazy('networks:add'), - 'text': ugettext_lazy('Add Connection')}] +subsubmenu = [{ + 'url': reverse_lazy('networks:index'), + 'text': ugettext_lazy('Network Connections') +}, { + 'url': reverse_lazy('networks:scan'), + 'text': ugettext_lazy('Nearby Wi-Fi Networks') +}, { + 'url': reverse_lazy('networks:add'), + 'text': ugettext_lazy('Add Connection') +}] def index(request): """Show connection list.""" connections = network.get_connection_list() - return TemplateResponse(request, 'connections_list.html', - {'title': _('Network Connections'), - 'subsubmenu': subsubmenu, - 'connections': connections}) + return TemplateResponse( + request, 'connections_list.html', { + 'title': _('Network Connections'), + 'manual_page': networks.manual_page, + 'subsubmenu': subsubmenu, + 'connections': connections + }) def show(request, uuid): @@ -53,8 +63,9 @@ def show(request, uuid): try: connection = network.get_connection(uuid) except network.ConnectionNotFound: - messages.error(request, _('Cannot show connection: ' - 'Connection not found.')) + messages.error(request, + _('Cannot show connection: ' + 'Connection not found.')) return redirect(reverse_lazy('networks:index')) # Connection status @@ -86,13 +97,15 @@ def show(request, uuid): access_point_status = network.get_status_from_wifi_access_point( device, connection_status['wireless']['ssid']) - return TemplateResponse(request, 'connection_show.html', - {'title': _('Connection Information'), - 'subsubmenu': subsubmenu, - 'connection': connection_status, - 'active_connection': active_connection_status, - 'device': device_status, - 'access_point': access_point_status}) + return TemplateResponse( + request, 'connection_show.html', { + 'title': _('Connection Information'), + 'subsubmenu': subsubmenu, + 'connection': connection_status, + 'active_connection': active_connection_status, + 'device': device_status, + 'access_point': access_point_status + }) def edit(request, uuid): @@ -100,8 +113,9 @@ def edit(request, uuid): try: connection = network.get_connection(uuid) except network.ConnectionNotFound: - messages.error(request, _('Cannot edit connection: ' - 'Connection not found.')) + messages.error(request, + _('Cannot edit connection: ' + 'Connection not found.')) return redirect(reverse_lazy('networks:index')) if connection.get_connection_type() not in network.CONNECTION_TYPE_NAMES: @@ -127,10 +141,12 @@ def edit(request, uuid): return redirect(reverse_lazy('networks:index')) else: - return TemplateResponse(request, 'connections_edit.html', - {'title': _('Edit Connection'), - 'subsubmenu': subsubmenu, - 'form': form}) + return TemplateResponse( + request, 'connections_edit.html', { + 'title': _('Edit Connection'), + 'subsubmenu': subsubmenu, + 'form': form + }) else: settings_connection = connection.get_setting_connection() form_data['interface'] = connection.get_interface_name() @@ -211,10 +227,11 @@ def edit(request, uuid): form_data['password'] = secrets['pppoe']['password'] form = PPPoEForm(form_data) - return TemplateResponse(request, 'connections_edit.html', - {'title': _('Edit Connection'), - 'subsubmenu': subsubmenu, - 'form': form}) + return TemplateResponse(request, 'connections_edit.html', { + 'title': _('Edit Connection'), + 'subsubmenu': subsubmenu, + 'form': form + }) @require_POST @@ -223,16 +240,17 @@ def activate(request, uuid): try: connection = network.activate_connection(uuid) name = connection.get_id() - messages.success(request, _('Activated connection {name}.') - .format(name=name)) + messages.success(request, + _('Activated connection {name}.').format(name=name)) except network.ConnectionNotFound: - messages.error(request, _('Failed to activate connection: ' - 'Connection not found.')) + messages.error(request, + _('Failed to activate connection: ' + 'Connection not found.')) except network.DeviceNotFound as exception: name = exception.args[0].get_id() - messages.error(request, _('Failed to activate connection {name}: ' - 'No suitable device is available.') - .format(name=name)) + messages.error(request, + _('Failed to activate connection {name}: ' + 'No suitable device is available.').format(name=name)) return redirect(reverse_lazy('networks:index')) @@ -243,11 +261,12 @@ def deactivate(request, uuid): try: active_connection = network.deactivate_connection(uuid) name = active_connection.get_id() - messages.success(request, _('Deactivated connection {name}.') - .format(name=name)) + messages.success(request, + _('Deactivated connection {name}.').format(name=name)) except network.ConnectionNotFound: - messages.error(request, _('Failed to de-activate connection: ' - 'Connection not found.')) + messages.error(request, + _('Failed to de-activate connection: ' + 'Connection not found.')) return redirect(reverse_lazy('networks:index')) @@ -255,10 +274,12 @@ def deactivate(request, uuid): def scan(request): """Show a list of nearby visible Wi-Fi access points.""" access_points = network.wifi_scan() - return TemplateResponse(request, 'wifi_scan.html', - {'title': _('Nearby Wi-Fi Networks'), - 'subsubmenu': subsubmenu, - 'access_points': access_points}) + return TemplateResponse( + request, 'wifi_scan.html', { + 'title': _('Nearby Wi-Fi Networks'), + 'subsubmenu': subsubmenu, + 'access_points': access_points + }) def add(request): @@ -279,10 +300,11 @@ def add(request): return redirect(reverse_lazy('networks:add_pppoe')) else: form = ConnectionTypeSelectForm() - return TemplateResponse(request, 'connections_type_select.html', - {'title': _('Add Connection'), - 'subsubmenu': subsubmenu, - 'form': form}) + return TemplateResponse(request, 'connections_type_select.html', { + 'title': _('Add Connection'), + 'subsubmenu': subsubmenu, + 'form': form + }) def add_generic(request): @@ -297,10 +319,12 @@ def add_generic(request): else: form = GenericForm() - return TemplateResponse(request, 'connections_create.html', - {'title': _('Adding New Generic Connection'), - 'subsubmenu': subsubmenu, - 'form': form}) + return TemplateResponse( + request, 'connections_create.html', { + 'title': _('Adding New Generic Connection'), + 'subsubmenu': subsubmenu, + 'form': form + }) def add_ethernet(request): @@ -315,10 +339,12 @@ def add_ethernet(request): else: form = EthernetForm() - return TemplateResponse(request, 'connections_create.html', - {'title': _('Adding New Ethernet Connection'), - 'subsubmenu': subsubmenu, - 'form': form}) + return TemplateResponse( + request, 'connections_create.html', { + 'title': _('Adding New Ethernet Connection'), + 'subsubmenu': subsubmenu, + 'form': form + }) def add_pppoe(request): @@ -333,10 +359,12 @@ def add_pppoe(request): else: form = PPPoEForm() - return TemplateResponse(request, 'connections_create.html', - {'title': _('Adding New PPPoE Connection'), - 'subsubmenu': subsubmenu, - 'form': form}) + return TemplateResponse( + request, 'connections_create.html', { + 'title': _('Adding New PPPoE Connection'), + 'subsubmenu': subsubmenu, + 'form': form + }) def add_wifi(request, ssid=None, interface_name=None): @@ -346,14 +374,16 @@ def add_wifi(request, ssid=None, interface_name=None): if ssid: device = network.get_device_by_interface_name(interface_name) - form_data = {'name': ssid, - 'interface': interface_name if device else None, - 'zone': 'external', - 'ssid': ssid, - 'mode': 'infrastructure', - 'band': 'auto', - 'auth_mode': 'wpa', - 'ipv4_method': 'auto'} + form_data = { + 'name': ssid, + 'interface': interface_name if device else None, + 'zone': 'external', + 'ssid': ssid, + 'mode': 'infrastructure', + 'band': 'auto', + 'auth_mode': 'wpa', + 'ipv4_method': 'auto' + } if request.method == 'POST': form = WifiForm(request.POST) @@ -366,10 +396,12 @@ def add_wifi(request, ssid=None, interface_name=None): else: form = WifiForm() - return TemplateResponse(request, 'connections_create.html', - {'title': _('Adding New Wi-Fi Connection'), - 'subsubmenu': subsubmenu, - 'form': form}) + return TemplateResponse( + request, 'connections_create.html', { + 'title': _('Adding New Wi-Fi Connection'), + 'subsubmenu': subsubmenu, + 'form': form + }) def delete(request, uuid): @@ -381,11 +413,12 @@ def delete(request, uuid): if request.method == 'POST': try: name = network.delete_connection(uuid) - messages.success(request, _('Connection {name} deleted.') - .format(name=name)) + messages.success(request, + _('Connection {name} deleted.').format(name=name)) except network.ConnectionNotFound: - messages.error(request, _('Failed to delete connection: ' - 'Connection not found.')) + messages.error(request, + _('Failed to delete connection: ' + 'Connection not found.')) return redirect(reverse_lazy('networks:index')) @@ -393,11 +426,13 @@ def delete(request, uuid): connection = network.get_connection(uuid) name = connection.get_id() except network.ConnectionNotFound: - messages.error(request, _('Failed to delete connection: ' - 'Connection not found.')) + messages.error(request, + _('Failed to delete connection: ' + 'Connection not found.')) return redirect(reverse_lazy('networks:index')) - return TemplateResponse(request, 'connections_delete.html', - {'title': _('Delete Connection'), - 'subsubmenu': subsubmenu, - 'name': name}) + return TemplateResponse(request, 'connections_delete.html', { + 'title': _('Delete Connection'), + 'subsubmenu': subsubmenu, + 'name': name + }) diff --git a/plinth/modules/openvpn/__init__.py b/plinth/modules/openvpn/__init__.py index cc68d5fc6..374749e90 100644 --- a/plinth/modules/openvpn/__init__.py +++ b/plinth/modules/openvpn/__init__.py @@ -21,11 +21,8 @@ FreedomBox app to configure OpenVPN server. from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, cfg, frontpage from plinth.menu import main_menu from plinth.utils import format_lazy @@ -52,6 +49,8 @@ description = [ 'for added security and anonymity.'), box_name=_(cfg.box_name)) ] +manual_page = 'OpenVPN' + def init(): """Initialize the OpenVPN module.""" diff --git a/plinth/modules/openvpn/views.py b/plinth/modules/openvpn/views.py index 88d48d6a7..255951402 100644 --- a/plinth/modules/openvpn/views.py +++ b/plinth/modules/openvpn/views.py @@ -18,18 +18,19 @@ FreedomBox app for configuring OpenVPN server. """ +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 -import logging + +from plinth import actions +from plinth.modules import config, openvpn from .forms import OpenVpnForm -from plinth import actions -from plinth.modules import openvpn -from plinth.modules import config logger = logging.getLogger(__name__) @@ -55,11 +56,14 @@ def index(request): else: form = OpenVpnForm(initial=status, prefix='openvpn') - return TemplateResponse(request, 'openvpn.html', - {'title': openvpn.name, - 'description': openvpn.description, - 'status': status, - 'form': form}) + return TemplateResponse( + request, 'openvpn.html', { + 'title': openvpn.name, + 'description': openvpn.description, + 'manual_page': openvpn.manual_page, + 'status': status, + 'form': form + }) @require_POST diff --git a/plinth/modules/pagekite/__init__.py b/plinth/modules/pagekite/__init__.py index 13845412a..74ae8c9d4 100644 --- a/plinth/modules/pagekite/__init__.py +++ b/plinth/modules/pagekite/__init__.py @@ -60,7 +60,7 @@ description = [ _('Your ISP does not provide you an external IP address and ' 'instead provides Internet connection through NAT.'), _('Your ISP does not provide you a static IP address and your IP ' - 'address changes evertime you connect to Internet.'), + 'address changes every time you connect to Internet.'), _('Your ISP limits incoming connections.'), format_lazy( _('PageKite works around NAT, firewalls and IP-address limitations ' @@ -71,6 +71,8 @@ description = [ box_name=_(cfg.box_name)) ] +manual_page = 'PageKite' + def init(): """Intialize the PageKite module""" diff --git a/plinth/modules/pagekite/templates/pagekite_introduction.html b/plinth/modules/pagekite/templates/pagekite_introduction.html index 5e51361b1..e8f821a1f 100644 --- a/plinth/modules/pagekite/templates/pagekite_introduction.html +++ b/plinth/modules/pagekite/templates/pagekite_introduction.html @@ -19,15 +19,27 @@ {% endcomment %} {% load i18n %} +{% load static %} {% block content %} -

{{ title }}

+ + {% block pagetitle %} +

{{ title }}

+ {% endblock %} {% for paragraph in description %}

{{ paragraph|safe }}

{% endfor %} -

+ {% if manual_page %} +

+ + {% trans 'Learn more...' %} + +

+ {% endif %} + +

{% trans "Configure PageKite" %}

diff --git a/plinth/modules/pagekite/views.py b/plinth/modules/pagekite/views.py index 607032516..dfc6656f7 100644 --- a/plinth/modules/pagekite/views.py +++ b/plinth/modules/pagekite/views.py @@ -49,11 +49,13 @@ subsubmenu = [{ def index(request): """Serve introduction page""" - return TemplateResponse(request, 'pagekite_introduction.html', { - 'title': pagekite.name, - 'description': pagekite.description, - 'subsubmenu': subsubmenu - }) + return TemplateResponse( + request, 'pagekite_introduction.html', { + 'title': pagekite.name, + 'description': pagekite.description, + 'manual_page': pagekite.manual_page, + 'subsubmenu': subsubmenu + }) class ContextMixin(object): diff --git a/plinth/modules/power/__init__.py b/plinth/modules/power/__init__.py index ea6e9b4c2..4eecf1d75 100644 --- a/plinth/modules/power/__init__.py +++ b/plinth/modules/power/__init__.py @@ -26,9 +26,9 @@ is_essential = True name = _('Power') -description = [ - _('Restart or shut down the system.') -] +description = [_('Restart or shut down the system.')] + +manual_page = 'Power' def init(): diff --git a/plinth/modules/power/templates/power_restart.html b/plinth/modules/power/templates/power_restart.html index 740e7b1b1..75bd8d3e6 100644 --- a/plinth/modules/power/templates/power_restart.html +++ b/plinth/modules/power/templates/power_restart.html @@ -20,10 +20,19 @@ {% load bootstrap %} {% load i18n %} +{% load static %} {% block content %} -

{{ title }}

+ {% block pagetitle %} +

{{ title }} + {% if manual_page %} + + Manual + + {% endif %} +

+ {% endblock %}

{% blocktrans trimmed %} diff --git a/plinth/modules/power/templates/power_shutdown.html b/plinth/modules/power/templates/power_shutdown.html index defead717..b2bf271cf 100644 --- a/plinth/modules/power/templates/power_shutdown.html +++ b/plinth/modules/power/templates/power_shutdown.html @@ -20,10 +20,19 @@ {% load bootstrap %} {% load i18n %} +{% load static %} {% block content %} -

{{ title }}

+ {% block pagetitle %} +

{{ title }} + {% if manual_page %} + + Manual + + {% endif %} +

+ {% endblock %}

{% blocktrans trimmed %} diff --git a/plinth/modules/power/views.py b/plinth/modules/power/views.py index 92960ce33..5283d6c41 100644 --- a/plinth/modules/power/views.py +++ b/plinth/modules/power/views.py @@ -30,10 +30,13 @@ from plinth.modules import power def index(request): """Serve power controls page.""" - return TemplateResponse(request, 'power.html', - {'title': power.name, - 'description': power.description, - 'pkg_manager_is_busy': _is_pkg_manager_busy()}) + return TemplateResponse( + request, 'power.html', { + 'title': power.name, + 'description': power.description, + 'manual_page': power.manual_page, + 'pkg_manager_is_busy': _is_pkg_manager_busy() + }) def restart(request): @@ -46,10 +49,13 @@ def restart(request): else: form = Form(prefix='power') - return TemplateResponse(request, 'power_restart.html', - {'title': _('Power'), - 'form': form, - 'pkg_manager_is_busy': _is_pkg_manager_busy()}) + return TemplateResponse( + request, 'power_restart.html', { + 'title': _('Power'), + 'form': form, + 'manual_page': power.manual_page, + 'pkg_manager_is_busy': _is_pkg_manager_busy() + }) def shutdown(request): @@ -62,10 +68,13 @@ def shutdown(request): else: form = Form(prefix='power') - return TemplateResponse(request, 'power_shutdown.html', - {'title': _('Power'), - 'form': form, - 'pkg_manager_is_busy': _is_pkg_manager_busy()}) + return TemplateResponse( + request, 'power_shutdown.html', { + 'title': _('Power'), + 'form': form, + 'manual_page': power.manual_page, + 'pkg_manager_is_busy': _is_pkg_manager_busy() + }) def _is_pkg_manager_busy(): diff --git a/plinth/modules/privoxy/__init__.py b/plinth/modules/privoxy/__init__.py index d930bfad8..1055953d4 100644 --- a/plinth/modules/privoxy/__init__.py +++ b/plinth/modules/privoxy/__init__.py @@ -21,16 +21,12 @@ FreedomBox app to configure Privoxy. from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, cfg, frontpage from plinth.menu import main_menu from plinth.utils import format_lazy from plinth.views import ServiceView - version = 1 is_essential = False @@ -48,7 +44,6 @@ description = [ 'capabilities for enhancing privacy, modifying web page data and ' 'HTTP headers, controlling access, and removing ads and other ' 'obnoxious Internet junk. '), - format_lazy( _('You can use Privoxy by modifying your browser proxy settings to ' 'your {box_name} hostname (or IP address) with port 8118. ' @@ -63,19 +58,21 @@ reserved_usernames = ['privoxy'] service = None +manual_page = 'Privoxy' + def init(): """Intialize the module.""" menu = main_menu.get('apps') - menu.add_urlname(name, 'glyphicon-cloud-upload', 'privoxy:index', short_description) + menu.add_urlname(name, 'glyphicon-cloud-upload', 'privoxy:index', + short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - managed_services[0], name, ports=['privoxy'], - is_external=False, - enable=enable, disable=disable) + service = service_module.Service(managed_services[0], name, + ports=['privoxy'], is_external=False, + enable=enable, disable=disable) if service.is_enabled(): add_shortcut() @@ -87,20 +84,18 @@ def setup(helper, old_version=None): helper.install(managed_packages) global service if service is None: - service = service_module.Service( - managed_services[0], name, ports=['privoxy'], - is_external=False, - enable=enable, disable=disable) + service = service_module.Service(managed_services[0], name, + ports=['privoxy'], is_external=False, + enable=enable, disable=disable) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) def add_shortcut(): - frontpage.add_shortcut('privoxy', name, - short_description=short_description, - details=description, - configure_url=reverse_lazy('privoxy:index'), - login_required=True) + frontpage.add_shortcut( + 'privoxy', name, short_description=short_description, + details=description, configure_url=reverse_lazy('privoxy:index'), + login_required=True) def enable(): @@ -119,6 +114,7 @@ class PrivoxyServiceView(ServiceView): service_id = managed_services[0] diagnostics_module_name = 'privoxy' description = description + manual_page = manual_page def diagnose(): diff --git a/plinth/modules/quassel/__init__.py b/plinth/modules/quassel/__init__.py index caf8cb0c9..347f7636e 100644 --- a/plinth/modules/quassel/__init__.py +++ b/plinth/modules/quassel/__init__.py @@ -21,14 +21,12 @@ FreedomBox app for Quassel. from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, cfg, frontpage from plinth.menu import main_menu from plinth.utils import format_lazy from plinth.views import ServiceView + from .manifest import clients version = 1 @@ -51,8 +49,7 @@ description = [ 'the client is disconnected. {box_name} can run the Quassel ' 'core service keeping you always online and one or more Quassel ' 'clients from a desktop or a mobile can be used to connect and ' - 'disconnect from it.'), - box_name=_(cfg.box_name)), + 'disconnect from it.'), box_name=_(cfg.box_name)), _('You can connect to your Quassel core on the default Quassel port ' '4242. Clients to connect to Quassel from your ' 'desktop and ' @@ -64,6 +61,8 @@ clients = clients reserved_usernames = ['quasselcore'] +manual_page = 'Quassel' + def init(): """Initialize the quassel module.""" @@ -74,13 +73,9 @@ def init(): global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - managed_services[0], - name, - ports=['quassel-plinth'], - is_external=True, - enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'quassel-plinth' + ], is_external=True, enable=enable, disable=disable) if service.is_enabled(): add_shortcut() @@ -91,6 +86,7 @@ class QuasselServiceView(ServiceView): diagnostics_module_name = "quassel" description = description clients = clients + manual_page = manual_page def setup(helper, old_version=None): @@ -98,24 +94,17 @@ def setup(helper, old_version=None): helper.install(managed_packages) global service if service is None: - service = service_module.Service( - managed_services[0], - name, - ports=['quassel-plinth'], - is_external=True, - enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'quassel-plinth' + ], is_external=True, enable=enable, disable=disable) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) def add_shortcut(): frontpage.add_shortcut( - 'quassel', - name, - short_description=short_description, - details=description, - configure_url=reverse_lazy('quassel:index'), + 'quassel', name, short_description=short_description, + details=description, configure_url=reverse_lazy('quassel:index'), login_required=True) diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py index 37adb38d3..d9fb2c649 100644 --- a/plinth/modules/radicale/__init__.py +++ b/plinth/modules/radicale/__init__.py @@ -22,15 +22,12 @@ import augeas from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, cfg, frontpage from plinth.menu import main_menu from plinth.utils import format_lazy -from .manifest import clients +from .manifest import clients version = 1 @@ -57,21 +54,23 @@ clients = clients reserved_usernames = ['radicale'] +manual_page = 'Radicale' + CONFIG_FILE = '/etc/radicale/config' def init(): """Initialize the radicale module.""" menu = main_menu.get('apps') - menu.add_urlname(name, 'glyphicon-calendar', 'radicale:index', short_description) + menu.add_urlname(name, 'glyphicon-calendar', 'radicale:index', + short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - managed_services[0], name, ports=['http', 'https'], - is_external=True, - enable=enable, disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'http', 'https' + ], is_external=True, enable=enable, disable=disable) if service.is_enabled(): add_shortcut() @@ -83,20 +82,18 @@ def setup(helper, old_version=None): helper.call('post', actions.superuser_run, 'radicale', ['setup']) global service if service is None: - service = service_module.Service( - managed_services[0], name, ports=['http', 'https'], - is_external=True, - enable=enable, disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'http', 'https' + ], is_external=True, enable=enable, disable=disable) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) def add_shortcut(): - frontpage.add_shortcut('radicale', name, - short_description=short_description, - details=description, - configure_url=reverse_lazy('radicale:index'), - login_required=True) + frontpage.add_shortcut( + 'radicale', name, short_description=short_description, + details=description, configure_url=reverse_lazy('radicale:index'), + login_required=True) def enable(): @@ -113,8 +110,8 @@ def disable(): def load_augeas(): """Prepares the augeas.""" - 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) # INI file lens aug.set('/augeas/load/Puppet/lens', 'Puppet.lns') @@ -137,7 +134,8 @@ def diagnose(): results.append(action_utils.diagnose_port_listening(5232, 'tcp4')) results.append(action_utils.diagnose_port_listening(5232, 'tcp6')) - results.extend(action_utils.diagnose_url_on_all( - 'https://{host}/radicale', check_certificate=False)) + results.extend( + action_utils.diagnose_url_on_all('https://{host}/radicale', + check_certificate=False)) return results diff --git a/plinth/modules/radicale/views.py b/plinth/modules/radicale/views.py index 23f3e2bfa..62ab7b2d4 100644 --- a/plinth/modules/radicale/views.py +++ b/plinth/modules/radicale/views.py @@ -36,6 +36,7 @@ class RadicaleServiceView(ServiceView): diagnostics_module_name = 'radicale' form_class = RadicaleForm service_id = managed_services[0] + manual_page = radicale.manual_page def get_initial(self): """Return the values to fill in the form.""" @@ -47,9 +48,9 @@ class RadicaleServiceView(ServiceView): """Change the access control of Radicale service.""" data = form.cleaned_data if get_rights_value() != data['access_rights']: - actions.superuser_run('radicale', [ - 'configure', '--rights_type', data['access_rights'] - ]) + actions.superuser_run( + 'radicale', + ['configure', '--rights_type', data['access_rights']]) messages.success(self.request, _('Access rights configuration updated')) return super().form_valid(form) diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py index 820e74803..269379f5a 100644 --- a/plinth/modules/repro/__init__.py +++ b/plinth/modules/repro/__init__.py @@ -21,12 +21,11 @@ FreedomBox app for repro. from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, frontpage from plinth.menu import main_menu from plinth.views import ServiceView + from .manifest import clients version = 2 @@ -64,6 +63,8 @@ reserved_usernames = ['repro'] service = None +manual_page = 'Repro' + def init(): """Initialize the repro module.""" @@ -74,13 +75,9 @@ def init(): global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - managed_services[0], - name, - ports=['sip', 'sips', 'rtp-plinth'], - is_external=True, - enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'sip', 'sips', 'rtp-plinth' + ], is_external=True, enable=enable, disable=disable) if service.is_enabled(): add_shortcut() @@ -91,6 +88,7 @@ class ReproServiceView(ServiceView): description = description diagnostics_module_name = "repro" service_id = managed_services[0] + manual_page = manual_page def setup(helper, old_version=None): @@ -99,25 +97,18 @@ def setup(helper, old_version=None): helper.call('post', actions.superuser_run, 'repro', ['setup']) global service if service is None: - service = service_module.Service( - managed_services[0], - name, - ports=['sip', 'sips', 'rtp-plinth'], - is_external=True, - enable=enable, - disable=disable) + service = service_module.Service(managed_services[0], name, ports=[ + 'sip', 'sips', 'rtp-plinth' + ], is_external=True, enable=enable, disable=disable) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) def add_shortcut(): - frontpage.add_shortcut( - 'repro', - name, - short_description=short_description, - details=description, - configure_url=reverse_lazy('repro:index'), - login_required=True) + frontpage.add_shortcut('repro', name, short_description=short_description, + details=description, + configure_url=reverse_lazy('repro:index'), + login_required=True) def enable(): diff --git a/plinth/modules/roundcube/__init__.py b/plinth/modules/roundcube/__init__.py index 309201f6e..85c8eb29e 100644 --- a/plinth/modules/roundcube/__init__.py +++ b/plinth/modules/roundcube/__init__.py @@ -20,13 +20,11 @@ FreedomBox app to configure Roundcube. from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, frontpage from plinth.menu import main_menu -from .manifest import clients +from .manifest import clients version = 1 @@ -42,14 +40,12 @@ description = [ 'full functionality you expect from an email client, including ' 'MIME support, address book, folder manipulation, message ' 'searching and spell checking.'), - _('You can access Roundcube from ' '/roundcube. Provide the username and password of the email ' 'account you wish to access followed by the domain name of the ' 'IMAP server for your email provider, like imap.example.com' '. For IMAP over SSL (recommended), fill the server field ' 'like imaps://imap.example.com.'), - _('For Gmail, username will be your Gmail address, password will be ' 'your Google account password and server will be ' 'imaps://imap.gmail.com. Note that you will also need ' @@ -62,11 +58,14 @@ clients = clients service = None +manual_page = 'Roundcube' + def init(): """Intialize the module.""" menu = main_menu.get('apps') - menu.add_urlname(name, 'glyphicon-envelope', 'roundcube:index', short_description) + menu.add_urlname(name, 'glyphicon-envelope', 'roundcube:index', + short_description) global service setup_helper = globals()['setup_helper'] @@ -93,9 +92,9 @@ def setup(helper, old_version=None): def add_shortcut(): - frontpage.add_shortcut( - 'roundcube', name, short_description=short_description, url='/roundcube', - login_required=True) + frontpage.add_shortcut('roundcube', name, + short_description=short_description, + url='/roundcube', login_required=True) def is_enabled(): @@ -119,7 +118,8 @@ def diagnose(): """Run diagnostics and return the results.""" results = [] - results.extend(action_utils.diagnose_url_on_all( - 'https://{host}/roundcube', check_certificate=False)) + results.extend( + action_utils.diagnose_url_on_all('https://{host}/roundcube', + check_certificate=False)) return results diff --git a/plinth/modules/roundcube/urls.py b/plinth/modules/roundcube/urls.py index b8b66c49a..ebc730e76 100644 --- a/plinth/modules/roundcube/urls.py +++ b/plinth/modules/roundcube/urls.py @@ -14,22 +14,22 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ URLs for the Roundcube module. """ from django.conf.urls import url -from plinth.views import ServiceView from plinth.modules import roundcube - +from plinth.views import ServiceView urlpatterns = [ - url(r'^apps/roundcube/$', ServiceView.as_view( + url(r'^apps/roundcube/$', + ServiceView.as_view( service_id="roundcube", diagnostics_module_name="roundcube", description=roundcube.description, - show_status_block=False + show_status_block=False, + manual_page=roundcube.manual_page, ), name='index'), ] diff --git a/plinth/modules/searx/__init__.py b/plinth/modules/searx/__init__.py index aa076146f..0f375b72a 100644 --- a/plinth/modules/searx/__init__.py +++ b/plinth/modules/searx/__init__.py @@ -54,6 +54,8 @@ group = ('web-search', _('Search the web')) service = None +manual_page = 'Searx' + def init(): """Intialize the module.""" diff --git a/plinth/modules/searx/views.py b/plinth/modules/searx/views.py index 309bb75f7..9e285477d 100644 --- a/plinth/modules/searx/views.py +++ b/plinth/modules/searx/views.py @@ -23,7 +23,8 @@ from django.utils.translation import ugettext as _ from plinth import actions, views from plinth.errors import ActionError -from plinth.modules.searx import clients, description, get_safe_search_setting +from plinth.modules.searx import (clients, description, + get_safe_search_setting, manual_page) from .forms import SearxForm @@ -36,6 +37,7 @@ class SearxServiceView(views.ServiceView): service_id = 'searx' form_class = SearxForm show_status_block = False + manual_page = manual_page def get_initial(self): """Return the status of the service to fill in the form.""" diff --git a/plinth/modules/security/__init__.py b/plinth/modules/security/__init__.py index 5a37cbe57..3ee62f635 100644 --- a/plinth/modules/security/__init__.py +++ b/plinth/modules/security/__init__.py @@ -23,7 +23,6 @@ from django.utils.translation import ugettext_lazy as _ from plinth import actions from plinth.menu import main_menu - version = 2 is_essential = True @@ -34,6 +33,8 @@ managed_packages = ['fail2ban'] managed_services = ['fail2ban'] +manual_page = 'Security' + ACCESS_CONF_FILE = '/etc/security/access.conf' ACCESS_CONF_SNIPPET = '-:ALL EXCEPT root fbx (admin) (sudo):ALL' diff --git a/plinth/modules/security/views.py b/plinth/modules/security/views.py index 6cd519ccd..6aca171e2 100644 --- a/plinth/modules/security/views.py +++ b/plinth/modules/security/views.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ Views for security module """ @@ -23,10 +22,10 @@ from django.contrib import messages from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ -from .forms import SecurityForm +from plinth import action_utils, actions from plinth.modules import security -from plinth import actions -from plinth import action_utils + +from .forms import SecurityForm def index(request): @@ -44,15 +43,19 @@ def index(request): else: form = SecurityForm(initial=status, prefix='security') - return TemplateResponse(request, 'security.html', - {'title': _('Security'), - 'form': form}) + return TemplateResponse(request, 'security.html', { + 'title': _('Security'), + 'manual_page': security.manual_page, + 'form': form + }) def get_status(request): """Return the current status""" - return {'restricted_access': security.get_restricted_access_enabled(), - 'fail2ban_enabled': action_utils.service_is_enabled('fail2ban')} + return { + 'restricted_access': security.get_restricted_access_enabled(), + 'fail2ban_enabled': action_utils.service_is_enabled('fail2ban') + } def _apply_changes(request, old_status, new_status): @@ -61,10 +64,9 @@ def _apply_changes(request, old_status, new_status): try: security.set_restricted_access(new_status['restricted_access']) except Exception as exception: - messages.error( - request, - _('Error setting restricted access: {exception}') - .format(exception=exception)) + messages.error(request, + _('Error setting restricted access: {exception}') + .format(exception=exception)) else: messages.success(request, _('Updated security configuration')) diff --git a/plinth/modules/shaarli/__init__.py b/plinth/modules/shaarli/__init__.py index ea8d2e685..63d9e5734 100644 --- a/plinth/modules/shaarli/__init__.py +++ b/plinth/modules/shaarli/__init__.py @@ -20,13 +20,11 @@ FreedomBox app to configure Shaarli. from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, frontpage from plinth.menu import main_menu -from .manifest import clients +from .manifest import clients version = 1 @@ -38,7 +36,6 @@ short_description = _('Bookmarks') description = [ _('Shaarli allows you to save and share bookmarks.'), - _('When enabled, Shaarli will be available from ' '/shaarli path on the web server. Note that Shaarli only supports a ' 'single user account, which you will need to setup on the initial ' @@ -49,11 +46,14 @@ clients = clients service = None +manual_page = 'Shaarli' + def init(): """Initialize the module.""" menu = main_menu.get('apps') - menu.add_urlname(name, 'glyphicon-bookmark', 'shaarli:index', short_description) + menu.add_urlname(name, 'glyphicon-bookmark', 'shaarli:index', + short_description) global service setup_helper = globals()['setup_helper'] @@ -79,7 +79,8 @@ def setup(helper, old_version=None): def add_shortcut(): - frontpage.add_shortcut('shaarli', name, short_description=short_description, url='/shaarli', + frontpage.add_shortcut('shaarli', name, + short_description=short_description, url='/shaarli', login_required=True) diff --git a/plinth/modules/shaarli/urls.py b/plinth/modules/shaarli/urls.py index 6f8c21b24..09478b1d5 100644 --- a/plinth/modules/shaarli/urls.py +++ b/plinth/modules/shaarli/urls.py @@ -14,21 +14,19 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ URLs for the Shaarli module. """ from django.conf.urls import url -from plinth.views import ServiceView from plinth.modules import shaarli - +from plinth.views import ServiceView urlpatterns = [ - url(r'^apps/shaarli/$', ServiceView.as_view( - service_id="shaarli", - description=shaarli.description, - show_status_block=False, - ), name='index'), + url(r'^apps/shaarli/$', + ServiceView.as_view( + service_id="shaarli", description=shaarli.description, + show_status_block=False, manual_page=shaarli.manual_page), + name='index'), ] diff --git a/plinth/modules/shadowsocks/__init__.py b/plinth/modules/shadowsocks/__init__.py index ccaf91bd3..eb1d5eeb6 100644 --- a/plinth/modules/shadowsocks/__init__.py +++ b/plinth/modules/shadowsocks/__init__.py @@ -21,15 +21,11 @@ FreedomBox app to configure Shadowsocks. from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import frontpage from plinth import service as service_module +from plinth import action_utils, actions, cfg, frontpage from plinth.menu import main_menu from plinth.utils import format_lazy - version = 1 name = _('Shadowsocks') @@ -50,12 +46,14 @@ description = [ _('Your {box_name} can run a Shadowsocks client, that 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.'), - box_name=_(cfg.box_name)), + 'encrypted and proxied through the Shadowsocks server.'), box_name=_( + cfg.box_name)), _('To use Shadowsocks after setup, set the SOCKS5 proxy URL in your ' 'device, browser or application to http://freedombox_address:1080/') ] +manual_page = 'Shadowsocks' + def init(): """Intialize the module.""" @@ -66,11 +64,10 @@ def init(): global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service( - 'shadowsocks', name, - ports=['shadowsocks-local-plinth'], is_external=False, - is_enabled=is_enabled, is_running=is_running, - enable=enable, disable=disable) + service = service_module.Service('shadowsocks', name, ports=[ + 'shadowsocks-local-plinth' + ], is_external=False, is_enabled=is_enabled, is_running=is_running, + enable=enable, disable=disable) if service.is_enabled(): add_shortcut() @@ -82,20 +79,18 @@ def setup(helper, old_version=None): helper.call('post', actions.superuser_run, 'shadowsocks', ['setup']) global service if service is None: - service = service_module.Service( - 'shadowsocks', name, - ports=['shadowsocks-local-plinth'], is_external=False, - is_enabled=is_enabled, is_running=is_running, - enable=enable, disable=disable) + service = service_module.Service('shadowsocks', name, ports=[ + 'shadowsocks-local-plinth' + ], is_external=False, is_enabled=is_enabled, is_running=is_running, + enable=enable, disable=disable) def add_shortcut(): """Helper method to add a shortcut to the frontpage.""" - frontpage.add_shortcut('shadowsocks', name, - short_description=short_description, - details=description, - configure_url=reverse_lazy('shadowsocks:index'), - login_required=False) + frontpage.add_shortcut( + 'shadowsocks', name, short_description=short_description, + details=description, configure_url=reverse_lazy('shadowsocks:index'), + login_required=False) def is_enabled(): diff --git a/plinth/modules/shadowsocks/views.py b/plinth/modules/shadowsocks/views.py index 95836ec81..282b81d8a 100644 --- a/plinth/modules/shadowsocks/views.py +++ b/plinth/modules/shadowsocks/views.py @@ -19,15 +19,16 @@ FreedomBox app for configuring Shadowsocks. """ import json + from django.contrib import messages from django.utils.translation import ugettext_lazy as _ -from .forms import ShadowsocksForm -from plinth import actions -from plinth import views +from plinth import actions, views from plinth.errors import ActionError from plinth.modules import shadowsocks +from .forms import ShadowsocksForm + class ShadowsocksServiceView(views.ServiceView): """Configuration view for Shadowsocks local socks5 proxy.""" @@ -35,6 +36,7 @@ class ShadowsocksServiceView(views.ServiceView): diagnostics_module_name = 'shadowsocks' form_class = ShadowsocksForm description = shadowsocks.description + manual_page = shadowsocks.manual_page def get_initial(self, *args, **kwargs): """Get initial values for form.""" @@ -73,9 +75,8 @@ class ShadowsocksServiceView(views.ServiceView): 'method': new_status['method'], } - actions.superuser_run( - 'shadowsocks', ['merge-config'], - input=json.dumps(new_config).encode()) + actions.superuser_run('shadowsocks', ['merge-config'], + input=json.dumps(new_config).encode()) messages.success(self.request, _('Configuration updated')) return super().form_valid(form) diff --git a/plinth/modules/snapshot/__init__.py b/plinth/modules/snapshot/__init__.py index efbcd36f6..13e44b027 100644 --- a/plinth/modules/snapshot/__init__.py +++ b/plinth/modules/snapshot/__init__.py @@ -49,6 +49,8 @@ description = [ service = None +manual_page = 'Snapshots' + def init(): """Initialize the module.""" diff --git a/plinth/modules/snapshot/views.py b/plinth/modules/snapshot/views.py index 1825ea1cc..e8a3c661f 100644 --- a/plinth/modules/snapshot/views.py +++ b/plinth/modules/snapshot/views.py @@ -82,6 +82,7 @@ def manage(request): 'snapshots': snapshots, 'has_deletable_snapshots': has_deletable_snapshots, 'subsubmenu': subsubmenu, + 'manual_page': snapshot_module.manual_page, }) diff --git a/plinth/modules/storage/__init__.py b/plinth/modules/storage/__init__.py index a97984189..5ba284447 100644 --- a/plinth/modules/storage/__init__.py +++ b/plinth/modules/storage/__init__.py @@ -18,15 +18,15 @@ FreedomBox app to manage storage. """ -from django.utils.translation import ugettext_lazy as _ +import json import logging import subprocess -import json + +from django.utils.translation import ugettext_lazy as _ from plinth import actions from plinth.menu import main_menu - version = 1 name = _('Storage') @@ -37,6 +37,8 @@ service = None logger = logging.getLogger(__name__) +manual_page = 'Storage' + def init(): """Intialize the module.""" @@ -62,9 +64,10 @@ def get_disks(): def _get_disks_from_df(): """Return the list of disks and free space available using 'df'.""" - command = ['df', '--exclude-type=tmpfs', '--exclude-type=devtmpfs', - '--block-size=1', - '--output=source,target,fstype,size,used,avail,pcent'] + command = [ + 'df', '--exclude-type=tmpfs', '--exclude-type=devtmpfs', + '--block-size=1', '--output=source,target,fstype,size,used,avail,pcent' + ] try: process = subprocess.run(command, stdout=subprocess.PIPE, check=True) except subprocess.CalledProcessError as exception: @@ -110,8 +113,10 @@ def _get_disks_from_lsblk(): def get_root_device(disks): """Return the root partition's device from list of partitions.""" - devices = [disk['dev_kname'] for disk in disks - if disk['mountpoint'] == '/' and disk['type'] == 'part'] + devices = [ + disk['dev_kname'] for disk in disks + if disk['mountpoint'] == '/' and disk['type'] == 'part' + ] try: return devices[0] except IndexError: @@ -124,8 +129,8 @@ def is_expandable(device): return False try: - output = actions.superuser_run( - 'storage', ['is-partition-expandable', device]) + output = actions.superuser_run('storage', + ['is-partition-expandable', device]) except actions.ActionError: return False @@ -145,17 +150,17 @@ def format_bytes(size): if size < 1024: return _('{disk_size:.1f} bytes').format(disk_size=size) - if size < 1024 ** 2: + if size < 1024**2: size /= 1024 return _('{disk_size:.1f} KiB').format(disk_size=size) - if size < 1024 ** 3: - size /= 1024 ** 2 + if size < 1024**3: + size /= 1024**2 return _('{disk_size:.1f} MiB').format(disk_size=size) - if size < 1024 ** 4: - size /= 1024 ** 3 + if size < 1024**4: + size /= 1024**3 return _('{disk_size:.1f} GiB').format(disk_size=size) - size /= 1024 ** 4 + size /= 1024**4 return _('{disk_size:.1f} TiB').format(disk_size=size) diff --git a/plinth/modules/storage/templates/storage.html b/plinth/modules/storage/templates/storage.html index d29925520..2cf31128b 100644 --- a/plinth/modules/storage/templates/storage.html +++ b/plinth/modules/storage/templates/storage.html @@ -20,6 +20,7 @@ {% load bootstrap %} {% load i18n %} +{% load static %} {% block page_head %}