MyWebName.comhttps://MyWebName.comMyWebName.comhttps://MyWebName.comhttps://<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 and should change the username and password using the configuration form in Plinth. + {% blocktrans trimmed %} + Custom paragraph content. + {% endblocktrans %} +
+ + {% endblock %} + +This template extends an existing template known as ``app.html``. This template +is available in FreedomBox core to provide all the basic layout, styling, menus, +JavaScript and CSS libraries required for a typical app view. We will override +the configuration area after inheriting from the app template and keep the rest +as is. ``{{ block.super }}`` adds back the overwritten content in the +``configuration`` block. + +Yet again, there is nothing special about the way this template is written. This +is a regular Django template. See :doc:`Django Template documentation +https://<your freedombox>/deluge. You will need to enter a password to login: https://<your freedombox>/deluge. You will need to enter a password to login: MyWebName.comhttps://MyWebName.comhttps://<your freedombox>/mldonkey. Users belonging to the https://<your freedombox>/mldonkey. Users belonging to the internal and external appropriately. nmcli command, see its man page. Also for a full list of configuration settings and type of connections accepted by Network Manager see: nmcli command, see its man page. Also for a full list of configuration settings and type of connections accepted by Network Manager see: ip addr should show a tun0 connection. traceroute freedombox.org should show you the ip address of the VPN server as the first hop. ip addr should show a tun0 connection. traceroute freedombox.org should show you the ip address of the VPN server as the first hop. enable-edit-actions in /etc/privoxy/config to 1. Before doing so, read carefully the manual, especially: EDIT button on the configuration screen in http://config.privoxy.org/. enable-edit-actions in /etc/privoxy/config to 1. Before doing so, read carefully the manual, especially: EDIT button on the configuration screen in http://config.privoxy.org/. irc://irc.debian.org/freedombox. If your FreedomBox is running Connect to Core. Add button to launch Add Core Account dialog. Account Name field. Fill proper DNS hostname of your FreedomBox in Hostname filed. Port field must have the value 4242. Provide the username and password of the account you wish to create to connect to the Quassel Core in the User and Password fields. Choose Remember if don't wish to be prompted for a password every time you launch Quassel client. OK in the Add Core Account dialog, you should see the core account in the Connect to Core dialog. OK to connect to it. Untrusted Security Certificate warning and need to accept the server certificate. Continue. Then you will be asked if you wish to accept the certificate permanently. Select Forever. Core Configuration Wizard. Select Next. Create Admin User page, enter the username and password you have used earlier to create the core connection. Select Remember password to remember this password for future sessions. Click Next. Select Storage Backend page, select SQLite and click Commit. Quassel IRC wizard to configure your IRC connections. Click Next. Setup Identity page next, provide a name and multiple nicknames. This is how you present yourself to other users on IRC. It is not necessary to give your real world name. Multiple nicknames are useful as fallback nicknames when the first nickname can't be used for some reason. After providing the information click Next. Setup Network Connection page next, provide a network name of your choice. Next provide a list of servers to which Quassel Core should connect to in order to join this IRC network (such as irc.debian.org:6667). Edit. In the Server Info dialog, set the port 6697 (consult your network's documentation for actual list of servers and their secure ports) and click Use SSL. Click OK. This is to ensure that communication between your FreedomBox and the IRC network server is encrypted. Setup Network Connection dialog, provide a list of IRC channels (such as #freedombox) to join upon connecting to the network. Click Save & Connect. All Chats pane on the left of the Quassel Client main window. irc://irc.debian.org/freedombox. If your FreedomBox is running Connect to Core. Add button to launch Add Core Account dialog. Account Name field. Fill proper DNS hostname of your FreedomBox in Hostname filed. Port field must have the value 4242. Provide the username and password of the account you wish to create to connect to the Quassel Core in the User and Password fields. Choose Remember if don't wish to be prompted for a password every time you launch Quassel client. OK in the Add Core Account dialog, you should see the core account in the Connect to Core dialog. OK to connect to it. Untrusted Security Certificate warning and need to accept the server certificate. Continue. Then you will be asked if you wish to accept the certificate permanently. Select Forever. Core Configuration Wizard. Select Next. Create Admin User page, enter the username and password you have used earlier to create the core connection. Select Remember password to remember this password for future sessions. Click Next. Select Storage Backend page, select SQLite and click Commit. Quassel IRC wizard to configure your IRC connections. Click Next. Setup Identity page next, provide a name and multiple nicknames. This is how you present yourself to other users on IRC. It is not necessary to give your real world name. Multiple nicknames are useful as fallback nicknames when the first nickname can't be used for some reason. After providing the information click Next. Setup Network Connection page next, provide a network name of your choice. Next provide a list of servers to which Quassel Core should connect to in order to join this IRC network (such as irc.debian.org:6667). Edit. In the Server Info dialog, set the port 6697 (consult your network's documentation for actual list of servers and their secure ports) and click Use SSL. Click OK. This is to ensure that communication between your FreedomBox and the IRC network server is encrypted. Setup Network Connection dialog, provide a list of IRC channels (such as #freedombox) to join upon connecting to the network. Click Save & Connect. All Chats pane on the left of the Quassel Client main window. --export-storage feature that is responsible for data migration. This feature is not available in radicale 2.x unfortunately. --export-storage feature that is responsible for data migration. This feature is not available in radicale 2.x unfortunately. https://<your freedombox>/roundcube. Enter your username and password. The username for many mail services will be the full email address such as https://<your freedombox>/roundcube. Enter your username and password. The username for many mail services will be the full email address such as 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. Admin users are able to log in using ssh (see Logging In below) and have superuser privileges via sudo. sudo ./bin/passwd-in-image <image-file> fbx. 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 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. libpam-abl package that FreedomBox installs by default. To control this behavior consult libpam-abl documentation. admin username (see above). admin username, and ADDRESS with the hidden service address for your FreedomBox. fbx default user is not managed by Plinth and its password cannot be changed in the web interface. admin username (see above). admin username, and ADDRESS with the hidden service address for your FreedomBox. fbx default user is not managed by Plinth and its password cannot be changed in the web interface. all_proxy environment variable: https://<your freedombox>/transmission. Transmission uses single sign-on from FreedomBox, which means that if you are logged in on your FreedomBox, you can directly access Transmission without having to enter the credentials again. Otherwise, you will be prompted to login first and then redirected to the Transmission app. apt-get update asks for a confirmation to change apt-get update asks for a confirmation to change https://<your freedombox>/plinth/apps/xmpp/jsxc/. It will automatically check the BOSH server connection to the configured domain name. https://<your freedombox>/plinth/apps/xmpp/jsxc/. It will automatically check the BOSH server connection to the configured domain name. 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 and should change the username and password using the configuration form in Plinth. https://<your freedombox>/transmission. Transmission uses single sign-on from FreedomBox, which means that if you are logged in on your FreedomBox, you can directly access Transmission without having to enter the credentials again. Otherwise, you will be prompted to login first and then redirected to the Transmission app. all_proxy environment variable: MyWebName.comMyWebName.com/home/<un_usuario_de_plinth>/public_htmlUser websites servirá los documentos que haya en este directorio cuando se reciban peticiones con la URI ~<un_usuario_de_plinth>. Por tanto para un dominio ejemplo.org con un usuario pepe una petición ejemplo.org/~pepe/index.html transferirá el fichero /home/pepe/public_html/index.html. https://<tu freedombox>/deluge. Necesitarás introducir una contraseña para ingresar: deluge. La primera vez que ingreses interna está pensada para servicios ofrecidos a todas las máquinas de la red local. Esto podría incluir servicios como externa está pensada para servicios públicamente expuestos a Internet. Esto podría incluir servicios como blog, sitio web, cliente web de correo electrónico etc. .i2p. Por ejemplo, http://i2p-projekt.i2p/ es el sitio web del proyecto I2P en la red I2P. Los eepsites son inaccesibles a un navegador normal a través de una conexión Internet normal. Para navegar a los eepsites tu navegador necesita configurarse para usar los proxies HTTP y HTTPS como se describió antes. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona MiWeb.comhttps://MiWeb.comhttps://<tu_freedombox>/mldonkey. @usuario:dominio. @su-usuario:su-dominio. También podrás unirte a salas de otros servidores y tener llamadas de audio/video con contactos de otros servidores. Minetest en esta FreedomBox, en su puerto por defecto (30000). Para conectar al servidor se necesita un setup detecta los interfaces (tarjetas) de red e intenta configurarlos automáticamente de modo que la FreedomBox quede disponible para seguir configurandola a través del interfaz web de otra máquina, sin necesidad de conectar un monitor a la FreedomBox. La configuración automática también procura dejar la FreedomBox operativa para sus escenarios de uso más importantes. FreedomBox más el nombre del interfaz (para tratar el caso de que haya varios). freedombox123. /etc/NetworkManager/NetworkManager.conf: wifi.scan-rand-mac-address=no en la sección [device]: network manager lo configurará automáticamente. En la mayoría de los casos esto no funcionará. Borra la configuración creada automáticamente en el interfaz y crea una conexión de red nueva. Selecciona tu interfaz recién creado en la página "añadir conexión". BATMAN (con mayúsculas). nmcli mira su página man. Para obtener una lista completa de configuraciones y tipos de conexión que acepta Network Manager mira: <usuario>.ovpn, siendo <usuario> un usuario de FreedomBox. Todos los usuarios de FreedomBox podrán descargar un perfil propio y diferente. Los usuarios que no sean administradores pueden descargar el perfil desde la portada después de ingresar. <usuario>.ovpn. <usuario>.opvn que acabas de descargar. Pon un nombre a la conexión y graba el perfil. ip addr debe mostrar una conexión tun0. traceroute freedombox.org debiera mostrar la dirección IP del servidor VPN como primer salto. http://config.privoxy.org/ o en http://p.p. /etc/privoxy/config a 1. Antes de hacerlo lee el manual con atención, especialmente: EDITAR en la pantalla de configuración de http://config.privoxy.org/. irc://irc.debian.org/freedombox. Si tu FreedomBox ejecuta Conectar con el Núcleo. Añadir para abrir el diálogo Añadir Cuenta al Núcleo. Nombre de Cuenta. Introduce el Hostname. El campo Puerto debe tener el valor 4242. Pon el usuario y la contraseña de la cuenta que quieres crear para conectar con el Núcleo de Quassel en los campos Usuario y Contraseña. Si no quieres que se te pida la contraseña cada vez que arranques el cliente de Quassel marca la opción Recordarme. OK en el diálogo Añadir Cuenta al Núcleo deberías ver la cuenta en el diálogo Conectar con el Núcleo. OK para conectar con él. Certificado de Seguridad Desconocido y necesitarás aceptar el certificado del servidor. Continuar. Se te preguntará si quieres aceptar el certificado permanentemente. Selecciona Para siempre. Asistente de Configuración del Núcleo. Selecciona Siguiente. Crear Usuario Administrador introduce el usuario y la contraseña que has usado antes para crear la conexión al núcleo. Selecciona Recordar contraseña para que recuerde la contraseña para futuras sesiones. Haz clic en Siguiente. Seleccionar Backend de Almacenamiento selecciona SQLite y haz clic en Confirmar. Quassel IRC para configurar tus conexiones IRC. Haz clic en Siguiente. Configuración de Identidad pon un nombre y múltiples pseudónimos. Te presentarás con estos a otros usuarios de IRC. No es necesario dar tu nombre real. Los pseudónimos múltipes son útiles como suplentes cuando el primero no se pueda usar por cualquier motivo. Tras aportar la información haz clic en Siguiente. Configuración de Conexión de Red pon el nombre de red que quieras y una lista de servidores a los que se deba conectar el Núcleo de Quassel para unirte a esa red IRC (por ejemplo irc.debian.org:6667). Editar. En el diálogo Información del Servidor pon el puerto 6697 (consulta la lista real de servidores y sus puertos seguros en la documentación de tu red) y haz clic en Usar SSL. Clic en OK. Esto es para asegurar que la comunicación entre tu FreedomBox y el servidor de la red IRC va cifrada. Configuración de Conexión de Red proporciona una lista de canales IRC (como #freedombox) a los que unirte al conectarte a la red. Dale a Grabar y Conectar. Todas las conversaciones de la izquierda de la ventana principal del Cliente Quassel. https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/ https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/<usuario>/<nombre_del_calendario>.ics/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. / inicial de la ruta es importante. .vcf. https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. Tor Browser Bundle. https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/. como localización cambiando los elementos marcados entre <> de acuerdo a tu configuración. DAVx5, que está disponible p.ej. en / del final). DAVx5 averiguará las cuentas Usuario1 y Usuario2. Esto requiere acceso por SSH a la FreedomBox. /etc/radicale/rights [calendario_de_mis_amigos] es solo un identificador, puede ser cualquier nombre. [owner-write] asegura que los dueños tengan acceso a sus propios archivos. /etc/radicale/config y haz los siguientes cambios en la sección [rights) apt dist-upgrade en tu máquina Radicale se actualizará a 2.x y entonces tu FreedomBox no podrá ejecutar esta actualización (ya que el proyecto de origen decidió eliminar las herramientas de migración de la versión 2.x de Radicale). Para evitar esta situación se recomienda el siguiente procedimiento para actualizar. python-radicale es un paquete antigüo de la versión 1.x de Radicale que sigue disponible en las versiones "en pruebas" (testing) de Debian. Esto es un --export-storage que es responsable de la migración de datos. Por desgracia esta funcionalidad ya no está disponible en Radicale 2.x. .dpkg-dist solo existirán si has elegido "Conservar tu versión actualmente instalada" cuando se te preguntó durante la actualización a Radicale 2.x. El procedimiento anterior sobrescribirá la configuración antigüa con una nueva. No se necesitan cambios a los 2 ficheros de configuración salvo que hayas cambiado la preferencia de compartición de calendario. /var/lib/radicale/collections. Los datos nuevos se crearán y usarán en el directorio /var/lib/radicale/collections/collections-root/. tar hace una copia de seguridad de tu configuración y tus datos en /root/radicale_backup.tgz por si haces o algo va mal y quieres deshacer los cambios. /repro/domains.html de la FreedomBox. /repro/addUser.html. https://<tu_freedombox>/roundcube. Introduce tu usuario y contraseña. El usuario de muchos servicios de correo electrónico suele ser la propia dirección completa, como imaps://imap.servicio_de_ejemplo.org. imaps://imap.gmail.com. openssh-server por defecto permitiendo así accesos remotos desde todos los interfaces. Si tu dispositivo hardware está connectado a un monitor y un teclado, también puedes ingresar directamente. Para la operación habitual de FreedomBox no necesitas usar la shell. No obstante, algunas tareas o identificación de algún problema podrían requerirlo. Admin pueden ingresar mediante ssh (abajo se explica cómo) y escalar sus privilegios a superusuario mediante sudo. fbx pero no tiene contraseña establecida, así que no se puede ingresar con esta cuenta. freedom-maker que permite establecer la contraseña de esta cuenta si fuera necesario: freedom-maker en sudo ./bin/passwd-in-image <archivo_de_imagen> fbx. fbx por el usuario con el que quieres ingresar. Hay que reemplazar freedombox por el hostname o dirección IP de tu dispositivo FreedomBox como se indica en el proceso de fbx es el usuario de FreedomBox con privilegios de superusuario por defecto. Cualquier otro usuario creado con Plinth que pertenezca al grupo admin podrá ingresar. La cuenta root no tiene contraseña configurada y no podrá ingresar. A todos los demás usuarios se les denegará el acceso. fbx y los otros usuarios del grupo admin podrán ingresar directamente por el terminal. A todos los demás usuarios se les denegará el acceso. libpam-abl que FreedomBox instala por defecto. Para controlar este comportamiento consulta la documentación de libpam-abl. netcat-openbsd. ~/.ssh/config para habilitar conexiones sobre Tor. admin (ver arriba). admin y DIRECCION por la dirección del servicio oculto de SSH de tu FreedomBox. root root no puedes romperlo todo accidentalmente. fbx no se administra en Plinth y su contraseña no se puede cambiar desde la interfaz web. http://<tu_freedombox>:1080/. /syncthing. Actualmente este cliente web está accesible solo a los usuarios de FreedomBox que tengan privilegios de administrador aunque en alguna futura versión podría estarlo a todos los usuarios de FreedomBox. all_proxy: https://<tu freedombox>/transmission. Transmission emplea el ingreso único de FreedomBox lo que significa que si has ingresado en tu FreedomBox puedes acceder diréctamente a Transmission sin tener que volver a introducir las credenciales. Si no, se te pedirá que ingreses primero y luego se te redirigirá a la app Transmission. sftp para ver el directorio de descargas usando un gestor de archivos o un navegador apropiados (p.ej. apt-get update te pide confirmación para algo responde que freedombox te pregunta acerca de los archivos de configuración responde que instale los archivos de configuración nuevos que vienen con la última versión del paquete. Este proceso solo actualizará los paquetes que no necesitan preguntar (excepto el paquete freedombox). Después, deja que FreedomBox se encargue de la actualización de los demás paquetes. Sé paciente mientras se crean nuevas versiones de FreedomBox para tratar los paquetes que necesitan intervención manual. admin podrán ingresar en todos los servicios. También pueden ingresar al sistema por SSH y escalar a privilegios administrativos (sudo). https://<tu_freedombox>/plinth/apps/xmpp/jsxc/. Automáticamente comprobará la conexión del servidor BOSH al nombre de dominio configurado. XXX.XXX.XXX.0/24 Apache httpd sobre Debian. En el siguiente ejemplo estaría en http://192.168.0.165: 192.168.0.0/24 por 10.42.0.255/24. http://10.42.0.50. (10.42.0.1 es mi ordenador.) /var/lib/plinth/firstboot-wizard-secret. .sig. Por ejemplo: dmesg -w mara mostrar y seguir los mensajes del núcleo (kernel). /home/<un_usuario_de_plinth>/public_htmlUser websites servirá los documentos que haya en este directorio cuando se reciban peticiones con la URI ~<un_usuario_de_plinth>. Por tanto para un dominio ejemplo.org con un usuario pepe una petición ejemplo.org/~pepe/index.html transferirá el fichero /home/pepe/public_html/index.html. https://<tu freedombox>/transmission. Transmission emplea el ingreso único de FreedomBox lo que significa que si has ingresado en tu FreedomBox puedes acceder diréctamente a Transmission sin tener que volver a introducir las credenciales. Si no, se te pedirá que ingreses primero y luego se te redirigirá a la app Transmission. sftp para ver el directorio de descargas usando un gestor de archivos o un navegador apropiados (p.ej. https://<tu freedombox>/deluge. Necesitarás introducir una contraseña para ingresar: deluge. La primera vez que ingreses Minetest en esta FreedomBox, en su puerto por defecto (30000). Para conectar al servidor se necesita un https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/ https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/<usuario>/<nombre_del_calendario>.ics/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. / inicial de la ruta es importante. .vcf. https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. Tor Browser Bundle. https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/. como localización cambiando los elementos marcados entre <> de acuerdo a tu configuración. DAVx5, que está disponible p.ej. en / del final). DAVx5 averiguará las cuentas Usuario1 y Usuario2. Esto requiere acceso por SSH a la FreedomBox. /etc/radicale/rights [calendario_de_mis_amigos] es solo un identificador, puede ser cualquier nombre. [owner-write] asegura que los dueños tengan acceso a sus propios archivos. /etc/radicale/config y haz los siguientes cambios en la sección [rights) apt dist-upgrade en tu máquina Radicale se actualizará a 2.x y entonces tu FreedomBox no podrá ejecutar esta actualización (ya que el proyecto de origen decidió eliminar las herramientas de migración de la versión 2.x de Radicale). Para evitar esta situación se recomienda el siguiente procedimiento para actualizar. python-radicale es un paquete antigüo de la versión 1.x de Radicale que sigue disponible en las versiones "en pruebas" (testing) de Debian. Esto es un --export-storage que es responsable de la migración de datos. Por desgracia esta funcionalidad ya no está disponible en Radicale 2.x. .dpkg-dist solo existirán si has elegido "Conservar tu versión actualmente instalada" cuando se te preguntó durante la actualización a Radicale 2.x. El procedimiento anterior sobrescribirá la configuración antigüa con una nueva. No se necesitan cambios a los 2 ficheros de configuración salvo que hayas cambiado la preferencia de compartición de calendario. /var/lib/radicale/collections. Los datos nuevos se crearán y usarán en el directorio /var/lib/radicale/collections/collections-root/. tar hace una copia de seguridad de tu configuración y tus datos en /root/radicale_backup.tgz por si haces o algo va mal y quieres deshacer los cambios. https://<tu_freedombox>/plinth/apps/xmpp/jsxc/. Automáticamente comprobará la conexión del servidor BOSH al nombre de dominio configurado. @usuario:dominio. @su-usuario:su-dominio. También podrás unirte a salas de otros servidores y tener llamadas de audio/video con contactos de otros servidores. https://<tu_freedombox>/roundcube. Introduce tu usuario y contraseña. El usuario de muchos servicios de correo electrónico suele ser la propia dirección completa, como imaps://imap.servicio_de_ejemplo.org. imaps://imap.gmail.com. https://<tu_freedombox>/mldonkey. /syncthing. Actualmente este cliente web está accesible solo a los usuarios de FreedomBox que tengan privilegios de administrador aunque en alguna futura versión podría estarlo a todos los usuarios de FreedomBox. all_proxy: irc://irc.debian.org/freedombox. Si tu FreedomBox ejecuta Conectar con el Núcleo. Añadir para abrir el diálogo Añadir Cuenta al Núcleo. Nombre de Cuenta. Introduce el Hostname. El campo Puerto debe tener el valor 4242. Pon el usuario y la contraseña de la cuenta que quieres crear para conectar con el Núcleo de Quassel en los campos Usuario y Contraseña. Si no quieres que se te pida la contraseña cada vez que arranques el cliente de Quassel marca la opción Recordarme. OK en el diálogo Añadir Cuenta al Núcleo deberías ver la cuenta en el diálogo Conectar con el Núcleo. OK para conectar con él. Certificado de Seguridad Desconocido y necesitarás aceptar el certificado del servidor. Continuar. Se te preguntará si quieres aceptar el certificado permanentemente. Selecciona Para siempre. Asistente de Configuración del Núcleo. Selecciona Siguiente. Crear Usuario Administrador introduce el usuario y la contraseña que has usado antes para crear la conexión al núcleo. Selecciona Recordar contraseña para que recuerde la contraseña para futuras sesiones. Haz clic en Siguiente. Seleccionar Backend de Almacenamiento selecciona SQLite y haz clic en Confirmar. Quassel IRC para configurar tus conexiones IRC. Haz clic en Siguiente. Configuración de Identidad pon un nombre y múltiples pseudónimos. Te presentarás con estos a otros usuarios de IRC. No es necesario dar tu nombre real. Los pseudónimos múltipes son útiles como suplentes cuando el primero no se pueda usar por cualquier motivo. Tras aportar la información haz clic en Siguiente. Configuración de Conexión de Red pon el nombre de red que quieras y una lista de servidores a los que se deba conectar el Núcleo de Quassel para unirte a esa red IRC (por ejemplo irc.debian.org:6667). Editar. En el diálogo Información del Servidor pon el puerto 6697 (consulta la lista real de servidores y sus puertos seguros en la documentación de tu red) y haz clic en Usar SSL. Clic en OK. Esto es para asegurar que la comunicación entre tu FreedomBox y el servidor de la red IRC va cifrada. Configuración de Conexión de Red proporciona una lista de canales IRC (como #freedombox) a los que unirte al conectarte a la red. Dale a Grabar y Conectar. Todas las conversaciones de la izquierda de la ventana principal del Cliente Quassel. http://<tu_freedombox>:1080/. <usuario>.ovpn, siendo <usuario> un usuario de FreedomBox. Todos los usuarios de FreedomBox podrán descargar un perfil propio y diferente. Los usuarios que no sean administradores pueden descargar el perfil desde la portada después de ingresar. <usuario>.ovpn. <usuario>.opvn que acabas de descargar. Pon un nombre a la conexión y graba el perfil. ip addr debe mostrar una conexión tun0. traceroute freedombox.org debiera mostrar la dirección IP del servidor VPN como primer salto. http://config.privoxy.org/ o en http://p.p. /etc/privoxy/config a 1. Antes de hacerlo lee el manual con atención, especialmente: EDITAR en la pantalla de configuración de http://config.privoxy.org/. .i2p. Por ejemplo, http://i2p-projekt.i2p/ es el sitio web del proyecto I2P en la red I2P. Los eepsites son inaccesibles a un navegador normal a través de una conexión Internet normal. Para navegar a los eepsites tu navegador necesita configurarse para usar los proxies HTTP y HTTPS como se describió antes. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna está pensada para servicios ofrecidos a todas las máquinas de la red local. Esto podría incluir servicios como externa está pensada para servicios públicamente expuestos a Internet. Esto podría incluir servicios como blog, sitio web, cliente web de correo electrónico etc. MiWeb.comhttps://MiWeb.comsetup detecta los interfaces (tarjetas) de red e intenta configurarlos automáticamente de modo que la FreedomBox quede disponible para seguir configurandola a través del interfaz web de otra máquina, sin necesidad de conectar un monitor a la FreedomBox. La configuración automática también procura dejar la FreedomBox operativa para sus escenarios de uso más importantes. FreedomBox más el nombre del interfaz (para tratar el caso de que haya varios). freedombox123. /etc/NetworkManager/NetworkManager.conf: wifi.scan-rand-mac-address=no en la sección [device]: network manager lo configurará automáticamente. En la mayoría de los casos esto no funcionará. Borra la configuración creada automáticamente en el interfaz y crea una conexión de red nueva. Selecciona tu interfaz recién creado en la página "añadir conexión". BATMAN (con mayúsculas). nmcli mira su página man. Para obtener una lista completa de configuraciones y tipos de conexión que acepta Network Manager mira: openssh-server por defecto permitiendo así accesos remotos desde todos los interfaces. Si tu dispositivo hardware está connectado a un monitor y un teclado, también puedes ingresar directamente. Para la operación habitual de FreedomBox no necesitas usar la shell. No obstante, algunas tareas o identificación de algún problema podrían requerirlo. Admin pueden ingresar mediante ssh (abajo se explica cómo) y escalar sus privilegios a superusuario mediante sudo. fbx pero no tiene contraseña establecida, así que no se puede ingresar con esta cuenta. freedom-maker que permite establecer la contraseña de esta cuenta si fuera necesario: freedom-maker en sudo ./bin/passwd-in-image <archivo_de_imagen> fbx. fbx por el usuario con el que quieres ingresar. Hay que reemplazar freedombox por el hostname o dirección IP de tu dispositivo FreedomBox como se indica en el proceso de fbx es el usuario de FreedomBox con privilegios de superusuario por defecto. Cualquier otro usuario creado con Plinth que pertenezca al grupo admin podrá ingresar. La cuenta root no tiene contraseña configurada y no podrá ingresar. A todos los demás usuarios se les denegará el acceso. fbx y los otros usuarios del grupo admin podrán ingresar directamente por el terminal. A todos los demás usuarios se les denegará el acceso. libpam-abl que FreedomBox instala por defecto. Para controlar este comportamiento consulta la documentación de libpam-abl. netcat-openbsd. ~/.ssh/config para habilitar conexiones sobre Tor. admin (ver arriba). admin y DIRECCION por la dirección del servicio oculto de SSH de tu FreedomBox. root root no puedes romperlo todo accidentalmente. fbx no se administra en Plinth y su contraseña no se puede cambiar desde la interfaz web. apt-get update te pide confirmación para algo responde que freedombox te pregunta acerca de los archivos de configuración responde que instale los archivos de configuración nuevos que vienen con la última versión del paquete. Este proceso solo actualizará los paquetes que no necesitan preguntar (excepto el paquete freedombox). Después, deja que FreedomBox se encargue de la actualización de los demás paquetes. Sé paciente mientras se crean nuevas versiones de FreedomBox para tratar los paquetes que necesitan intervención manual. admin podrán ingresar en todos los servicios. También pueden ingresar al sistema por SSH y escalar a privilegios administrativos (sudo). freedombox. Para más detalles acerca de la instalación sobre Debian, ver el sudo su. 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 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: /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. ntp. You can add a crontab entry as root to restart ntp every 15 minutes by typing 'crontab -e' and adding this line: freedombox package. /var/lib/plinth/firstboot-wizard-secret. freedombox-setup package. /etc/network/interfaces, FreedomBox will not manage those interfaces. (See /etc/network/interfaces manually and ensure that it contains only the following: /etc/network/interfaces file keeping only the above lines. Then perform a reboot. On Debian 9 (Stretch), 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. nmtui or nmcli commands. nmcli can be used as follows: armel. This means floating point computations are done in software and most operations are slower than what Raspberry Pi is capable of. armel. This means floating point computations are done in software and generally most operations are slower than what Raspberry Pi is capable of. https://domainname/) will redirect to the selected app. iqdisc setting. To apply this fix, disable and then re-enable the Message Archive Management setting. https://domainname/mediawiki/ArticleName. __init__.py indicates that the directory in which it is present is a Python module. For now, it is an empty file. 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 plinth/modules/ directory structure into any Python path and still be discovered as plinth.modules.*. data/etc/plinth/modules-enabled/. Let us create this file ttrss: /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. urls.py write the following: /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 __init__.py add the following: 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. ttrss:index and not just index. __init__.py. 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. forms.py. views.py, let us add a view that can handle the URL we have provided above. 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. get_status() method. Let us implement that method in views.py. __init__.py. 50-tt-rss is enabled. 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. 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.
+ +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. _apply_changes() to actually get the work done. Let us implement that method in views.py. 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. actions/ttrss. /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. 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. /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. 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. _() method call. Let us do that for the menu item of the application too. 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. 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. __init__.py add the top: init() call order guarantees that other applications that this application depends on will be initialized before this application is initialized. 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: plinth.modules.apps. package_list must be an iterable containing the Debian package names as strings. If provided, the before_install callable is called just before the installation process starts. Similarly, on_install callable is called just after the package installation completes. /usr/share/plinth/actions directory. They require no interaction beyond passing command line arguments or taking sensitive arguments via stdin. They change the operation of the services and applications of the FreedomBox and nothing else. These actions are also directly usable by a skilled administrator. actions/ directory. This runs subprocess.Popen() after some checks. The action must be present in the actions/ directory. options are a list of additional arguments to pass to the command. If input is given it must be bytearray containing the input to pass on to the executed action. If async is set to True, the method will return without waiting for the command to finish. plinth.actions.run() except the command is run with superuser privelages. Menu.add_item() and Menu.add_urlname() for adding items to this menu or its children. urlname must be the name of a URL as configured in Django. django.core.urlresolvers.reverse() is called before the lookup for child menu item is performed. url_args and url_kwargs are passed on to reverse(). label is the user visible string shown for the menu item. icon must be a glyphicon class from the Twitter Bootstrap library. url is the relative URL to which this menu item will take the user to. plinth.menu.Menu.add_item() but instead of URL as input it is the name of a URL as configured in Django. django.core.urlresolvers.reverse() is called before it is added to the parent menu item. url_args and url_kwargs are passed on to reverse(). service_id is a unique identifier for this application. name is a display name of this application that is shown by other applications such as on the firewall status page. ports is a list of names recognized by firewalld when enabling or disabling firewalld services. If is_external is true, the ports for this service are accessible from external interfaces, that is, from the Internet. Otherwise, the service is only available for client connected via LAN. enabled is the current state of the application. sender object should identify which application made the change. enabled is a boolean that signifies whether the application is enabled (= True) or disabled (= False).
{% blocktrans %}
- Upload a backup file downloaded from another {{ box_name }} to restore is
+ Upload a backup file downloaded from another {{ box_name }} to restore its
contents. You can choose the apps you wish to restore after uploading a
backup file.
{% endblocktrans %}
diff --git a/plinth/modules/config/__init__.py b/plinth/modules/config/__init__.py
index af28b5a8f..e732f1f81 100644
--- a/plinth/modules/config/__init__.py
+++ b/plinth/modules/config/__init__.py
@@ -22,7 +22,7 @@ import os
import socket
import augeas
-from django.utils.translation import ugettext_lazy
+from django.utils.translation import ugettext_lazy as _
from plinth import actions
from plinth import app as app_module
@@ -34,6 +34,8 @@ version = 2
is_essential = True
+name = _('General Configuration')
+
depends = ['firewall', 'names']
manual_page = 'Configure'
@@ -57,14 +59,12 @@ class ConfigApp(app_module.App):
def __init__(self):
"""Create components for the app."""
super().__init__()
- menu_item = menu.Menu('menu-config', ugettext_lazy('Configure'), None,
- 'fa-cog', 'config:index',
- parent_url_name='system')
+ menu_item = menu.Menu('menu-config', _('Configure'), None, 'fa-cog',
+ 'config:index', parent_url_name='system')
self.add(menu_item)
- domain_type = DomainType('domain-type-static',
- ugettext_lazy('Domain Name'), 'config:index',
- can_have_certificate=True)
+ domain_type = DomainType('domain-type-static', _('Domain Name'),
+ 'config:index', can_have_certificate=True)
self.add(domain_type)
diff --git a/plinth/modules/config/urls.py b/plinth/modules/config/urls.py
index 676e60a0f..5d4570bba 100644
--- a/plinth/modules/config/urls.py
+++ b/plinth/modules/config/urls.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
{% trans 'No repositories available.' %}
{% else %} -- + {% trans 'Learn more...' %}
diff --git a/plinth/modules/power/templates/power_shutdown.html b/plinth/modules/power/templates/power_shutdown.html index b5f19b683..6ce896b10 100644 --- a/plinth/modules/power/templates/power_shutdown.html +++ b/plinth/modules/power/templates/power_shutdown.html @@ -37,7 +37,7 @@ {% if manual_page %}- + {% trans 'Learn more...' %}
diff --git a/plinth/modules/sharing/templates/sharing.html b/plinth/modules/sharing/templates/sharing.html index bd4dbc369..e37ecb861 100644 --- a/plinth/modules/sharing/templates/sharing.html +++ b/plinth/modules/sharing/templates/sharing.html @@ -67,8 +67,8 @@- - {% trans 'Learn more...' %} - -
- {% endif %} - - - -{% endblock %} +class SSHServerForm(AppForm): + """SSH server configuration form.""" + password_auth_disabled = forms.BooleanField( + label=_('Disable password authentication'), + help_text=_('Improves security by preventing password guessing. ' + 'Ensure that you have setup SSH keys in your ' + 'administrator user account before enabling this option.'), + required=False, + ) diff --git a/plinth/modules/ssh/views.py b/plinth/modules/ssh/views.py index 83ce5b5f0..fc913085d 100644 --- a/plinth/modules/ssh/views.py +++ b/plinth/modules/ssh/views.py @@ -17,10 +17,16 @@ """ Views for the SSH module """ +from django.contrib import messages +from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth.modules import ssh from plinth.views import AppView +from . import is_password_authentication_disabled +from .forms import SSHServerForm + class SshAppView(AppView): app_id = 'ssh' @@ -28,9 +34,43 @@ class SshAppView(AppView): description = ssh.description port_forwarding_info = ssh.port_forwarding_info template_name = 'ssh.html' + form_class = SSHServerForm def get_context_data(self, *args, **kwargs): context = super().get_context_data(**kwargs) context['host_keys'] = ssh.get_host_keys() return context + + def get_initial(self): + """Initial form value""" + initial = super().get_initial() + initial.update({ + 'password_auth_disabled': is_password_authentication_disabled(), + }) + + return initial + + def form_valid(self, form): + """Apply changes from the form""" + old_config = self.get_initial() + new_config = form.cleaned_data + + def is_field_changed(field): + return old_config[field] != new_config[field] + + passwd_auth_changed = is_field_changed('password_auth_disabled') + if passwd_auth_changed: + if new_config['password_auth_disabled']: + passwd_auth = 'no' + message = _('SSH authentication with password disabled.') + else: + passwd_auth = 'yes' + message = _('SSH authentication with password enabled.') + + actions.superuser_run( + 'ssh', ['set-password-config', '--value', passwd_auth]) + actions.superuser_run('service', ['reload', 'ssh']) + messages.success(self.request, message) + + return super().form_valid(form) diff --git a/plinth/modules/storage/templates/storage.html b/plinth/modules/storage/templates/storage.html index 93f028691..dc2b162ee 100644 --- a/plinth/modules/storage/templates/storage.html +++ b/plinth/modules/storage/templates/storage.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of FreedomBox. @@ -30,25 +30,7 @@ {% endblock %} -{% block content %} - - {% block pagetitle %} -{{ paragraph|safe }}
- {% endfor %} - {% endblock %} - - {% if manual_page %} -- - {% trans 'Learn more...' %} - -
- {% endif %} +{% block configuration %}{% trans "The following storage devices are in use:" %}
@@ -121,9 +103,4 @@ {% endif %} - {% block status %} - - {{ block.super }} - - {% endblock %} {% endblock %} diff --git a/plinth/modules/storage/urls.py b/plinth/modules/storage/urls.py index b39b07bb4..493d6e894 100644 --- a/plinth/modules/storage/urls.py +++ b/plinth/modules/storage/urls.py @@ -23,7 +23,7 @@ from django.conf.urls import url from . import views urlpatterns = [ - url(r'^sys/storage/$', views.index, name='index'), + url(r'^sys/storage/$', views.StorageAppView.as_view(), name='index'), url(r'^sys/storage/expand$', views.expand, name='expand'), url(r'^sys/storage/eject/(?P- + {% trans 'Learn more...' %}
diff --git a/plinth/templates/setup.html b/plinth/templates/setup.html index 476b6a2f7..60bf8c64e 100644 --- a/plinth/templates/setup.html +++ b/plinth/templates/setup.html @@ -44,7 +44,7 @@ {% if setup_helper.module.manual_page %} diff --git a/plinth/templates/simple_app.html b/plinth/templates/simple_app.html index 2dcf75043..b812b752c 100644 --- a/plinth/templates/simple_app.html +++ b/plinth/templates/simple_app.html @@ -34,7 +34,7 @@ {% if manual_page %} diff --git a/plinth/tests/test_app.py b/plinth/tests/test_app.py index 3afd40caa..9f8c73a37 100644 --- a/plinth/tests/test_app.py +++ b/plinth/tests/test_app.py @@ -25,7 +25,7 @@ import pytest from plinth.app import App, Component, FollowerComponent, LeaderComponent -class TestApp(App): +class AppTest(App): """Sample App for testing.""" app_id = 'test-app' @@ -38,7 +38,7 @@ class LeaderTest(FollowerComponent): @pytest.fixture(name='app_with_components') def fixture_app_with_components(): """Setup an app with some components.""" - app = TestApp() + app = AppTest() app.add(FollowerComponent('test-follower-1')) app.add(FollowerComponent('test-follower-2')) app.add(LeaderTest('test-leader-1')) @@ -54,7 +54,7 @@ def fixture_empty_apps(): def test_app_instantiation(): """Test that App is instantiated properly.""" - app = TestApp() + app = AppTest() assert isinstance(app.components, collections.OrderedDict) assert not app.components assert app.app_id == 'test-app' @@ -64,13 +64,13 @@ def test_app_instantiation(): def test_get(): """Test that an app can be correctly retrieved.""" - app = TestApp() + app = AppTest() assert App.get(app.app_id) == app def test_app_add(): """Test adding a components to an App.""" - app = TestApp() + app = AppTest() component = Component('test-component') return_value = app.add(component) assert len(app.components) == 1 @@ -157,7 +157,7 @@ def test_app_is_enabled(app_with_components): def test_app_is_enabled_with_no_leader_components(): """When there are not leader components, app.is_enabled() returns True.""" - app = TestApp() + app = AppTest() assert app.is_enabled() diff --git a/plinth/tests/test_cfg.py b/plinth/tests/test_cfg.py index 6f478b497..486aa84af 100644 --- a/plinth/tests/test_cfg.py +++ b/plinth/tests/test_cfg.py @@ -90,7 +90,8 @@ def test_read_primary_config_file(): def test_read_fallback_config_file(): """Verify that the correct fallback config file is used""" - fallback_root = os.path.realpath('.') + test_dir = os.path.dirname(os.path.realpath(__file__)) + fallback_root = os.path.realpath(os.path.join(test_dir, '..', '..')) fallback_config_file = os.path.join(fallback_root, 'plinth.config') config_path, root_directory = cfg.get_fallback_config_paths() cfg.read(config_path, root_directory) diff --git a/plinth/views.py b/plinth/views.py index 42aaae7e0..57d811603 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -34,7 +34,6 @@ from plinth import package from plinth.app import App from plinth.daemon import app_is_running from plinth.modules.config import get_advanced_mode -from plinth.modules.storage import views as disk_views from plinth.translation import get_language_from_request, set_language from . import forms, frontpage @@ -54,6 +53,7 @@ def index(request): ] selected_shortcut = selected_shortcut[0] if selected_shortcut else None + from plinth.modules.storage import views as disk_views disk_views.warn_about_low_disk_space(request) return TemplateResponse( @@ -77,6 +77,7 @@ class AppsIndexView(TemplateView): def system_index(request): """Serve the system index page.""" + from plinth.modules.storage import views as disk_views disk_views.warn_about_low_disk_space(request) return TemplateResponse(request, 'system.html', {'advanced_mode': get_advanced_mode()}) diff --git a/plinth/web_server.py b/plinth/web_server.py index 1e8410501..a05679d3d 100644 --- a/plinth/web_server.py +++ b/plinth/web_server.py @@ -71,10 +71,12 @@ def init(): _mount_static_directory('/usr/share/javascript', '/javascript') - manual_dir = os.path.join(cfg.doc_dir, 'images') - manual_url = '/'.join([cfg.server_dir, 'help/manual/images']) \ - .replace('//', '/') - _mount_static_directory(manual_dir, manual_url) + langs = os.listdir(os.path.join(cfg.doc_dir, 'manual')) + for lang in langs: + manual_dir = os.path.join(cfg.doc_dir, 'manual', lang, 'images') + manual_url = '/'.join([cfg.server_dir, f'help/manual/{lang}/images']) \ + .replace('//', '/') + _mount_static_directory(manual_dir, manual_url) for module_name, module in module_loader.loaded_modules.items(): module_path = os.path.dirname(module.__file__) diff --git a/setup.py b/setup.py index a4917147a..01cd31791 100755 --- a/setup.py +++ b/setup.py @@ -44,7 +44,6 @@ DIRECTORIES_TO_CREATE = [ ] DIRECTORIES_TO_COPY = [ - ('/usr/share/doc/freedombox', 'doc'), ('/usr/share/plinth/static', 'static'), ] @@ -151,9 +150,18 @@ class CustomInstall(install): class CustomInstallData(install_data): """Override install command to allow directory creation and copy""" + def _run_doc_install(self): + """Install documentation""" + command = ['make', '-j', '8', '-C', 'doc', 'install'] + if self.root: + root = os.path.abspath(self.root) + command.append(f'DESTDIR={root}') + + subprocess.check_call(command) + def run(self): """Execute install command""" - subprocess.check_call(['make', '-C', 'doc']) + self._run_doc_install() install_data.run(self) # Old style base class @@ -240,7 +248,7 @@ setuptools.setup( scripts=['bin/plinth'], license='COPYING.md', classifiers=[ - 'Development Status :: 3 - Alpha', + 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment', 'Framework :: Django', 'Intended Audience :: End Users/Desktop', @@ -250,9 +258,36 @@ setuptools.setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3 :: Only', 'Programming Language :: Unix Shell', + 'Topic :: Communications', + 'Topic :: Communications :: Chat', + 'Topic :: Communications :: Chat :: Internet Relay Chat', + 'Topic :: Communications :: File Sharing', + 'Topic :: Internet', + 'Topic :: Internet :: Name Service (DNS)' + 'Topic :: Internet :: Proxy Servers', + 'Topic :: Internet :: WWW/HTTP', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Wiki', + 'Topic :: Internet :: WWW/HTTP :: WSGI', 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application', + 'Topic :: Office/Business', + 'Topic :: Office/Business :: Scheduling', + 'Topic :: Security', + 'Topic :: System' + 'Topic :: System :: Archiving', + 'Topic :: System :: Archiving :: Backup', + 'Topic :: System :: Distributed Computing' + 'Topic :: System :: Filesystems', + 'Topic :: System :: Installation/Setup', + 'Topic :: System :: Networking', + 'Topic :: System :: Networking :: Firewalls', + 'Topic :: System :: Operating System', + 'Topic :: System :: Software Distribution' 'Topic :: System :: Systems Administration', + 'Topic :: System :: Systems Administration :: Authentication/Directory', + 'Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP ', + 'Topic :: System :: System Shells', ], setup_requires=['pytest-runner', 'setuptools-git'], install_requires=[ @@ -280,7 +315,8 @@ setuptools.setup( }, exclude_package_data={'': ['*/data/*']}, data_files=_gather_data_files() + - [('/usr/share/plinth/actions', glob.glob(os.path.join('actions', '*'))), + [('/usr/share/plinth/actions', glob.glob( + os.path.join('actions', '[a-z]*'))), ('/usr/share/man/man1', ['doc/plinth.1'])], cmdclass={ 'install': CustomInstall,