What would you like to see most in minix?
I’m working on a couple of presentations and I wanted to share this nugget of joy with anyone who hasn’t actually read it.
Path: gmdzi!unido!fauern!ira.uka.de!sol.ctr.columbia.edu!zaphod.mps. ohio-state.edu!wupost!uunet!mcsun!news.funet.fi!hydra!klaava!torvalds From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds) Newsgroups: comp.os.minix Subject: What would you like to see most in minix? Summary: small poll for my new operating system Keywords: 386, preferences Message-ID: <1991Aug25.205708.9541@klaava.Helsinki.FI> Date: 25 Aug 91 20:57:08 GMT Organization: University of Helsinki Lines: 20 Hello everybody out there using minix - I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months, and I'd like to know what features most people would want. Any suggestions are welcome, but I won't promise I'll implement them :-) Linus (torvalds@kruuna.helsinki.fi) PS. Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT protable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(.
Mañana del segundo día de Akademy 2020 en línea
Sigue adelante el evento más importante de la Comunidad KDE Internacional. Bienvenidos a la mañana del segundo día de Akademy 2020 en línea, un resumen de lo que ha dado de sí la jornada matinal del sábado la cual ha sido muy fructífera y variada. Como es habitual, me gusta partir estas entradas en mañana y tarde para no tener artículos excesivamente largos. Mañana la jornada vespertina.
Mañana del segundo día de Akademy 2020 en línea
Tras el gran vídeo de presentación que espero que hayáis visto antes de empezar a leer estas líneas (sale un servidor, miembros de KDE España y un crisol de personas de todo el mundo que dan muestra de la diversidad de la Comunidad) hoy toca comentar lo que dio de sí las charlas de ayer.
Tenéis toda la información en la sección de noticias de la Comunidad KDE (el dot) así que aquí, por no repetir, solo voy a dar pinceladas:
Aleix Pol, Presidente de KDE, comenzó el día puntualmente a las 8:50 UTC reproduciendo un video hecho por Bhavisha Dhruve y Skye Fentras dando la bienvenida a todos al evento, que es el que habéis visto arriba.

Después, Aleix explicó las circunstancias muy especiales de la Akademy de este año y presentó a la primera oradora principal Gina Häußge.
El resto de la mañana se puede dividir en dos grandes bloques: Objetivos KDE y charlas relámpago.

De esta forma tuvimos a Jonathan Riddell, Niccolo Venerandi y Méven Car hablando cada uno sobre los objetivos de la Comunidad de KDE: las Aplicaciones, la consistencia y Wayland.
Fueron tres charlas independientes que confluyeron a una mesa redonda donde Niccolo Venerandi, Méven Car, Jonathan Riddell, Lydia Pintscher y Adam SzopaCreo hablaron largo tendido sobre dichos objetivos.
Creo que no se podía empezar mejor una Akademy que dejando sobre mesa qué quiere conseguir la Comunidad y cómo lo está haciendo.

Tras este primer bloque llegaron las charlas relámpago con:
- Andreas Cord-Landweh hablando de SPDX.
- Shawn Rutledge nos presentó «Editing Markdown with QTextDocument»
- Carl Schwan expuso «How to Create a Good Promotional Website for your Project.»
Y hasta aquí la mañana. Si no hay nada que lo impida mañana comento la jornada vespertina.
Material audiovisual Akademy 2020 en línea
Una de las cosas positivas de esta Akademy es que todo el material debe ser emitido digitalmente, lo cual hace que ya puede estar listo para ser compartido en diferido, aunque sea sin editar.
De esta forma, en caso de que te lo hayas perdido, las charlas de hoy ya están disponibles en línea en tres bloques – uno para la mañana y dos para cada una de las habitaciones utilizadas por la tarde. También se ha grabado grabado todas las charlas por separado y pronto podrás verlas en las plataformas de vídeo disponibles de KDE.
Mencoba Destop Pantheon pada openSUSE Tumbleweed

- Pasang openSUSE Tumbleweed
- Tambahkan repo Pantheon
sudo zypper https://download.opensuse.org/repositories/X11:/Pantheon:/Branch/openSUSE_Tumbleweed/ X11:Pantheon - Segarkan
sudo zypper ref - Pasang pola Pantheon
sudo zypper in -t pattern pantheon - Have Fun!
#openSUSE Tumbleweed revisión de la semana 36 de 2020
Tumbleweed es una distribución “Rolling Release” de actualización contínua. Aquí puedes estar al tanto de las últimas novedades.

openSUSE Tumbleweed es la versión “rolling release” o de actualización continua de la distribución de GNU/Linux openSUSE.
Hagamos un repaso a las novedades que han llegado hasta los repositorios estas semanas.
El anuncio original lo puedes leer en el blog de Dominique Leuenberger, publicado bajo licencia CC-by-sa, en este enlace:
Durante esta semana, se ha publicado una “snapshot” muy grando, debido a que ha sido necesario hacer una recompilación completa de la distro debido a algunos cambios en los paquetes RPM y otros paquetes básicos. Por lo que todos los paquetes se han visto afectados.
Aunque todo parece que discurrió sin problemas, algunos usuarios han tenido problemas con el programa “man”. En total se ha publicado 5 nuevas snapshots: 0826, 0829, 0831, 0901 y 0902.
Que entre otros, se pueden destacar estos cambios como los más notables:
- Mesa 20.1.6
- Linux kernel 5.8.y & 5.8.4
- rpm: %{_libexecdir} ahora es /usr/libexec, y la carga de compresión cambió de xz a zstd. Esto da como resultado una descompresión más rápida de RPM’s en prácticamente el mismo espacio
- VirtualBox 6.1.3
- Mozilla Firefox 80.0
- Kubernetes 1.19
Y entre lo que podremos encontrar en próximas actualizaciones, podemos destacar:
- KDE Applications 20.08.1
- KDE Plasma 5.19.5
- systemd 246
- glibc 2.32
- binutils 2.35
- gettext 0.21
- bison 3.7.1
- SELinux 3.1
Si quieres estar a la última con software actualizado y probado utiliza openSUSE Tumbleweed la opción rolling release de la distribución de GNU/Linux openSUSE.
Mantente actualizado y ya sabes: Have a lot of fun!!
Enlaces de interés
-
-
- ¿Por qué deberías utilizar openSUSE Tumbleweed?
- zypper dup en Tumbleweed hace todo el trabajo al actualizar
- ¿Cual es el mejor comando para actualizar Tumbleweed?
- Comprueba la valoración de las “snapshots” de Tumbleweed
- ¿Qué es el test openQA?
- http://download.opensuse.org/tumbleweed/iso/
- https://es.opensuse.org/Portal:Tumbleweed
-

——————————–
Primer día de Akademy 2020 en línea
El evento más importante de la Comunidad KDE Internacional está en marcha. Bienvenidos al primer día de Akademy 2020 en línea, un resumen de lo que ha dado de sí la primera jornada del evento.
Primer día de Akademy 2020 en línea
Esta edición del encuentro de desarrolladores de la Comunidad KDE se está desarrollando de forma muy diferente a las anteriores por su carácter no-presencial.
Esto ha dado pie a que se hayan podido realizar otro tipo de actividades que, por lo visto en el panel de asistentes, han tenido un éxito abrumador.
De esta forma el primer día de Akademy 2020 en línea se ha organizado alrededor de talleres con las siguientes temáticas:
- Nuno Pinheiro, uno de los artífices del aspecto de KDE 4, impartió una clase de diseño de interfaz y de interfaz de usuario en QML para el escritorio. Este taller online contenía ejercicios prácticos sobre lo que se debe hacer, lo que no se debe hacer y la integración; y consejos sobre el diseño de la interfaz de usuario.
- Milian Wolff, nos enseñó sobre Depuración y Perfiles en Linux. Este taller fue a un nivel ligeramente superior y requirió algunos conocimientos y experiencia con Qt y C++, así como una comprensión básica de la programación multihilo.
- Michael Friedrich, un evangelista desarrollador de GitLab, nos aconsejó cómo acelerar sus flujos de trabajo de desarrollo con GitLab en su taller de buenas prácticas. Michael nos llevó a través de nuestros primeros pasos en GitLab con la gestión de proyectos (temas, tableros, etiquetas, plantillas, etc.) y lo combinó con los flujos de trabajo de desarrollo.

- Albert Astals Cid dirigió una sesión llamada Introducción al QML y nos enseñó cómo componer interfaces de usuario fluidas usando el lenguaje QML y también aprendimos a enganchar la parte QML a la lógica de C++.
- David Faure nos habló de Multithreading in Qt, que es esencial para los desarrolladores que quieren crear aplicaciones rápidas y con capacidad de respuesta en computadoras, teléfonos y dispositivos incorporados con un número cada vez mayor de núcleos.
- La Dra. Carlee Hawkins habló sobre el sesgo implícito en la sala 3. En esta sesión, se nos pidió que consideráramos nuestros propios sesgos en cuanto a raza, género, edad, etc. Exploramos cómo los investigadores entienden los sesgos y aprendimos a mitigar la influencia de nuestros propios sesgos en nuestros pensamientos.
Más información: KDE
openSUSE Tumbleweed – Review of the week 2020/36
Dear Tumbleweed users and hackers,
During the last week, we have shipped a massive snapshot, due to a full rebuild (RPM libexecdir change, rpm payload compression change, and symlink changes to /etc/alternatives). The libexecdir was not exactly as smooth as we wish it to be, on the other hand, it was also not disastrous. The biggest issue seen by users was likely the no-longer working ‘man’ program. This was a trap by update-alternatives, that does not like changing target paths, paired with a packaging bug. In total, we have shipped 5 snapshots (0826, 0829, 0831, 0901 and 0902).
The most noteworthy changes were:
- Mesa 20.1.6
- Linux kernel 5.8.2 & 5.8.4
- rpm: %{_libexecdir} is now /usr/libexec, and payload compression change from xz to zstd. This results in ‘faster decompression’ of the RPMs at roughly the same space (in average a bit smaller even)
- VirtualBox 6.1.3: working support for kernel 5.8
- Mozilla Firefox 80.0
- Kubernetes 1.19
Currently, the developers are bust bringing you these changes, that are being tested in the staging areas:
- KDE Applications 20.08.1
- KDE Plasma 5.19.5
- systemd 246
- glibc 2.32
- binutils 2.35
- gettext 0.21
- bison 3.7.1
- SELinux 3.1
Hoy empieza Akademy 2020 en línea
Asistiré a lo que pueda pero creo que es importante recordar que hoy empieza Akademy 2020 en línea. De esta forma del 4 al 11 de septiembre los desarrolladores del Proyecto KDE se verán las caras virtualmente durante casi una semana. Si puedes no te lo pierdas.
Hoy empieza Akademy 2020 en línea
Fue anunciado en el blog en mayo, en una edición especial de Akademy 2020 ya que se realizará en línea por motivos de sobras conocidos por todo el mundo.
En este evento, en el primer día será para la realización de talleres, los dos siguientes será para las charlas y el resto de días para encuentros de desarrolladores.

De esta forma, si os podéis conectar escucharéis las novedades de Plasma para los próximos años y cómo acelerar la versión actual, el reporte de la fundación KDE e.V. en un ejercicio de transparencia, qué hace el desconocido pero vital equipo de promoción, etc.
En esta ocasión, se perderán los momentos de hermandad que se solían cristalizan en cenas y comidas grupales, visitas culturales, cervezas comunitarias y cualquier momento de encuentro que se generaba cerca de la máquina de café, por ejemplo. Una verdadera lástima que se pierdan pero debe primar la seguridad ante este problema al que nos enfrentamos.
Por cierto, puedes seguir las novedades con la etiqueta #akademy2020.
¿Qué es Akademy?
Para los que no lo sepan, Akademy es el evento de la Comunidad KDE que aúna en una gran conferencia todo tipo de simpatizantes de KDE como desarrolladores, diseñadores, usuarios, traductores, promotores. Allí se reunirán a lo largo de una semana para compartir charlas, cenas, ponencias, talleres y, en definitiva, para trabajar juntos.
Es una gran semana que sirve para unir más fuerte los lazos que unen nuestra Comunidad, así como para crear nuevos.
Akademy lleva realizándose anualmente bajo este nombre desde 2004, en la página web oficial o en la wikipedia podéis encontrar los nombres y fechas anteriores eventos.
Para que os hagáis una ligera idea de la magnitud del evento, os dejo una imagen de grupo de Akademy 2017 de Almería en la que tuve la suerte de participar.

Tumbleweed Rises from Rebuilt Packages
With “literally all 15,000” packages being rebuilt in snapshot 20200826, openSUSE Tumbleweed roared back from a stability rating of 36 in the rebuild snapshot to a 95 rating in snapshot 20200901, according to the snapshot reviewer.
Each snapshot progressively increased in stability this week.
Snapshot 20200901 brought ImageMagick 7.0.10.28, which provided a patch for correct colospace and fixed paths for conversion of Photoshop EPS files. VirtualBox 6.1.13 arrived in the snapshot and updated the sources to run with versions above the 5.8 Linux Kernel with no modifications needed to the kernel. The library for rendering Postscript documents, libspectre 0.2.9, now requires Ghostscript 9.24 and fixed memory leaks and crashes to the program caused by malformed documents. One major version update to the game freecell-solver was made in the snapshot; version 6.0.1 had some code cleanup, minor bug fixes and the addition of a compile time option. openSUSE’s snapper package updated to 0.8.13 and fixed the Logical Volume Manager setup for volume groups and logical volumes with one character-long names. Other notable packages updated in the snapshot were xapian-core 1.4.17, openldap2 2.4.52 and qalculate 3.12.1.
Trending at a 87 rating, snapshot 20200831, brought less than a handful of updates. The packages updated in the snapshot were bind 9.16.6, libverto 0.3.1, permissions 1550_20200826, and suse-module-tools 15.3.4. The bind package, which implements the Domain Name System (DNS) protocols for the Internet, fixed several Common Vulnerabilities and Exposure including one that made it possible to trigger an assertion failure by sending a specially crafted large TCP DNS message.
Snapshot 20200829, which is likely to record a rating of 69, updated the Linux Kernel to 5.8.4. Some Advanced Linux Sound Architecture additions arrived in the kernel update. VLC player 3.0.11.1 fixed the handling of subtitles and fixed the HLS playlist that was unable to start. Fetchmail 6.4.8 plugged a memory leak where parts of the configuration overrode one another and the configuration now supports Python 3. Flatpak 1.8.2 provided a fix for seccomp filters on s390. GNU Compiler Collection 10 made some fixes and nano 5.2 made some changes that prevent a crash after a large paste in the text editor. Packages pango 1.46.1, lvm2 2.03.10 and mariadb 10.4.14 were also updated in the snapshot along with several other packages.
The 20200826 snapshot that rebuilt all the packages had a few updated versions and an update to the 5.8.2 Linux Kernel. The updates included Mesa 20.1.6, which dropped some dependencies and provided a note in the spec file to enable the dependencies when changing the defines. Several Python packages including python-setuptools were updated in the snapshot; python-setuptools 44.1.1 had a notable change referencing a fix for Python 4 in the changelog. Optimising Web Delivery, Squid improved Transfer-Encoding handling in version 4.13 and enforce token characters for field-names.
How to write a Samba Winbind Group Policy Extension
This tutorial will explain how to write a Group Policy Extension for Samba’s Winbind. Group Policy is a delivery mechanism for distributing system settings and company policies to machines joined to an Active Directory domain. Unix/Linux machines running Samba’s Winbind can also deploy these policies. Read my previous post about which Client Side Extensions and Server Side Extensions currently exist in Winbind.
Creating the Server Side Extension
The first step to deploying Group Policy is to create a Server Side Extension (SSE). There are multiple ways to create an SSE, but here we’ll only discuss Administrative Templates (ADMX). The purpose of the SSE is to deploy policies to the SYSVOL share. Theoretically, you could manually deploy any file (even plain text) to the SYSVOL and then write a Client Side Extension that parses it, but ADMX can be read and modified by the Group Policy Management Editor, which makes administration of policies simpler.
ADMX files are simply XML files which explain to the Group Policy Management Console how to display and store a policy in the SYSVOL. AMDX files always store policies in Registry.pol files. Samba provides a mechanism for parsing these, which we’ll discuss later.
Below is a simple example of an ADMX template, and it’s corresponding ADML file.
samba.admx:
<policyDefinitions revision="1.0" schemaVersion="1.0">
<policyNamespaces>
<target prefix="fullarmor" namespace="FullArmor.Policies.98BB16AF_01EE_4D17_870D_A3311A44D6C2" />
<using prefix="windows" namespace="Microsoft.Policies.Windows" />
</policyNamespaces>
<supersededAdm fileName="" />
<resources minRequiredRevision="1.0" />
<categories>
<category name="CAT_3338C1DD_8A00_4273_8547_158D8B8C19E9" displayName="$(string.CAT_3338C1DD_8A00_4273_8547_158D8
B8C19E9)" />
<category name="CAT_7D8D7DC8_5A9D_4BE1_8227_F09CDD5AFFC6" displayName="$(string.CAT_7D8D7DC8_5A9D_4BE1_8227_F09CD
D5AFFC6)">
<parentCategory ref="CAT_3338C1DD_8A00_4273_8547_158D8B8C19E9" />
</category>
</categories>
<policies>
<policy name="POL_9320E11F_AC80_4A7D_A5C8_1C0F3F727061" class="Machine" displayName="$(string.POL_9320E11F_AC80_4A7D_A5C8_1C0F3F727061)" explainText="$(string.POL_9320E11F_AC80_4A7D_A5C8_1C0F3F727061_Help)" presentation="$(presentation.POL_9320E11F_AC80_4A7D_A5C8_1C0F3F727061)" key="Software\Policies\Samba\Unix Settings">
<parentCategory ref="CAT_7D8D7DC8_5A9D_4BE1_8227_F09CDD5AFFC6" />
<supportedOn ref="windows:SUPPORTED_WindowsVista" />
<elements>
<list id="LST_2E9A4684_3C0E_415B_8FD6_D4AF68BC8AC6" key="Software\Policies\Samba\Unix Settings\Daily Scripts" valueName="Daily Scripts" />
</elements>
</policy>
</policies>
</policyDefinitions>
en-US/samba.adml:
<policyDefinitionResources revision="1.0" schemaVersion="1.0">
<displayName>
</displayName>
<description>
</description>
<resources>
<stringTable>
<string id="CAT_3338C1DD_8A00_4273_8547_158D8B8C19E9">Samba</string>
<string id="CAT_7D8D7DC8_5A9D_4BE1_8227_F09CDD5AFFC6">Unix Settings</string>
<string id="POL_9320E11F_AC80_4A7D_A5C8_1C0F3F727061">Daily Scripts</string>
<string id="POL_9320E11F_AC80_4A7D_A5C8_1C0F3F727061_Help">This policy setting allows you to execute commands,
either local or on remote storage, daily.</string>
</stringTable>
<presentationTable>
<presentation id="POL_9320E11F_AC80_4A7D_A5C8_1C0F3F727061">
<listBox refId="LST_2E9A4684_3C0E_415B_8FD6_D4AF68BC8AC6">Script and arguments</listBox>
</presentation>
</presentationTable>
</resources>
</policyDefinitionResources>
The meaning of the various tags are explained in Microsoft’s Group Policy documentation. Before the endless documentation and confusing XML scares you away, be aware there is an easier way!
ADMX Migrator

FullArmor created the ADMX Migrator to simplify the shift for system administrators from the old ADM policy templates to ADMX. Fortunately, this tool also serves our purpose for assisting us in easily creating these templates for our SSE. Unfortunately, the tool hasn’t seen any development in the past 8 years, and wont run in Windows 10 (or any Unix/Linux platform, for that matter). I had to dredge up a Windows 7 VM in order to install and use the tool (supposedly Vista works as well, but who wants to install that?).
Creating the Administrative Template
- Open ADMX Migrator
- Right click on ADMX Templates in the left tree view, and click New Template.
- Give your template a name, and click OK.
- Right click on the new template in the left tree view, and click New Category.
- Give the Category a name. This name will be displayed in the Group Policy Management Editor under Administrative Templates. You can choose to nest template under an existing category, or simply add it as a new root.
Note: You can also add sub-categories under this category. After clicking OK, right click the category you created and select New Category. - Next, create your policy by right clicking on your new category, and selecting New Policy Setting.
- Because we’ll be applying these settings to a Linux machine, the Registry fields are mostly meaningless, but they are required. Your policies will be stored under these keys on the SYSVOL in the Registry.pol file. Choose some sensible Registry Key, such as ‘Software\Policies\Samba\Unix Settings’, and a Registry Value Name, such as ‘Daily Scripts’ (these are the values used for Samba’s cron.daily policy). The Display Name is the name that will be displayed for this policy in the Group Policy Management Editor. I usually make this the same as the Registry Value Name, but it doesn’t need to be.
- Select whether this policy will be applied to a Machine, a User, or to Both in the Class field. In our example, we could potentially set Both, then our Client Side Extension would need to handle both cron.daily scripts (the Machine) and also User crontab entries. Click OK for your policy to be created.
- Your new policy will appear in the middle list view. Highlight it, and you will see a number of tabs below for configuring the policy.
- Select the Values tab and set the Enabled Value Type. In this case, we’ll use String, since our cron commands will be saved to the Registry.pol as a string. In the Value field, you can set a default enabled value (this is optional).
- Select the Presentation tab, right click in the Elements view, and click New Element > ListBox (or a different presentation, depending on the policy). If you look at the samba.adml file from the previous section, you’ll notice that the presentationTable contains a listBox item. That’s what we’re creating here.
- Choose an element Label, this will be the name for the list displayed in the Group Policy Management Editor.
- Choose a Registry Key. This will be pre-populated with the parent Registry Key you gave when creating the policy. Append something to the key to make it unique. We’ll use ‘Software\Policies\Samba\Unix Settings\Daily Scripts’ for our cron.daily policy.
- Navigate to the Explain tab, and add an explanation of what this policy is and what it does. This will be displayed to users in the Group Policy Management Editor.
- Now right click on your template name in the left tree, and select Save As.
- Finally, you’ll need to deploy your new policy definition to the SYSVOL. It should be saved to the Policies\PolicyDefinitions (the Group Policy Central Store) directory. These instructions from Microsoft can assist you in setting up your Group Policy Central Store.
Creating the Client Side Extension
The Client Side Extension (CSE) is the code that will be called by Samba’s Winbind to deploy our newly created policy to a client machine. CSEs must be written in Python3, and are deployed using the register_gp_extension() and unregister_gp_extension() samba functions.
#!/usr/bin/python3
# gp_scripts_ext samba gpo policy
# Copyright (C) David Mulder <dmulder@suse.com> 2020
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os, re
from samba.gpclass import gp_pol_ext, register_gp_extension, \
unregister_gp_extension, list_gp_extensions
from base64 import b64encode
from tempfile import NamedTemporaryFile
from samba import getopt as options
import optparse
intro = '''
### autogenerated by samba
#
# This file is generated by the gp_scripts_ext Group Policy
# Client Side Extension. To modify the contents of this file,
# modify the appropriate Group Policy objects which apply
# to this machine. DO NOT MODIFY THIS FILE DIRECTLY.
#
'''
class gp_scripts_ext(gp_pol_ext):
def __str__(self):
return 'Unix Settings/Scripts'
def process_group_policy(self, deleted_gpo_list, changed_gpo_list):
# Iterate over GPO guids and their previous settings, reverting
# changes made by this GPO.
for guid, settings in deleted_gpo_list:
# Tell the Group Policy database which GPO we're working on
self.gp_db.set_guid(guid)
if str(self) in settings:
for attribute, script in settings[str(self)].items():
# Delete the applied policy
if os.path.exists(script):
os.unlink(script)
# Remove the stored removal information
self.gp_db.delete(str(self), attribute)
# Commit the changes to the Group Policy database
self.gp_db.commit()
# Iterate over GPO objects, applying new policies found in the SYSVOL
for gpo in changed_gpo_list:
if gpo.file_sys_path:
reg_key = 'Software\\Policies\\Samba\\Unix Settings'
sections = { '%s\\Daily Scripts' % reg_key : '/etc/cron.daily',
'%s\\Monthly Scripts' % reg_key : '/etc/cron.monthly',
'%s\\Weekly Scripts' % reg_key : '/etc/cron.weekly',
'%s\\Hourly Scripts' % reg_key : '/etc/cron.hourly' }
# Tell the Group Policy database which GPO we're working on
self.gp_db.set_guid(gpo.name)
# Load the contents of the Registry.pol from the SYSVOL
pol_file = 'MACHINE/Registry.pol'
path = os.path.join(gpo.file_sys_path, pol_file)
pol_conf = self.parse(path)
if not pol_conf:
continue
# For each policy in the Registry.pol, apply the settings
for e in pol_conf.entries:
if e.keyname in sections.keys() and e.data.strip():
cron_dir = sections[e.keyname]
attribute = '%s:%s' % (e.keyname,
b64encode(e.data.encode()).decode())
# Check if this policy has already been applied in the
# Group Policy database. Skip the apply if it's already
# been installed.
old_val = self.gp_db.retrieve(str(self), attribute)
if not old_val:
# Create a temporary file and store policy in it,
# then move the file to the cron directory for
# execution.
with NamedTemporaryFile(prefix='gp_', mode="w+",
delete=False, dir=cron_dir) as f:
contents = '#!/bin/sh\n%s' % intro
contents += '%s\n' % e.data
f.write(contents)
os.chmod(f.name, 0o700)
# Store the name of the applied file, so that
# we can remove it later on unapply (see the
# first loop in this function).
self.gp_db.store(str(self), attribute, f.name)
# Commit the changes to the Group Policy database
self.gp_db.commit()
def rsop(self, gpo):
output = {}
pol_file = 'MACHINE/Registry.pol'
if gpo.file_sys_path:
path = os.path.join(gpo.file_sys_path, pol_file)
pol_conf = self.parse(path)
if not pol_conf:
return output
for e in pol_conf.entries:
key = e.keyname.split('\\')[-1]
if key.endswith('Scripts') and e.data.strip():
if key not in output.keys():
output[key] = []
output[key].append(e.data)
return output
if __name__ == "__main__":
parser = optparse.OptionParser('gp_scripts_ext.py [options]')
sambaopts = options.SambaOptions(parser)
parser.add_option_group(sambaopts)
parser.add_option('--register', help='Register extension to Samba',
action='store_true')
parser.add_option('--unregister', help='Unregister extension from Samba',
action='store_true')
(opts, args) = parser.parse_args()
# We're collecting the Samba loadparm simply to find our smb.conf file
lp = sambaopts.get_loadparm()
# This is a random unique GUID, which identifies this CSE.
# Any random GUID will do.
ext_guid = '{5930022C-94FF-4ED5-A403-CFB4549DB6F0}'
if opts.register:
# The extension path is the location of this file. This script
# should be executed from a permanent location.
ext_path = os.path.realpath(__file__)
# The machine and user parameters tell Samba whether to apply this
# extension to the computer, to individual users, or to both.
register_gp_extension(ext_guid, 'gp_scripts_ext', ext_path,
smb_conf=lp.configfile, machine=True, user=False)
elif opts.unregister:
# Remove the extension and do not apply policy.
unregister_gp_extension(ext_guid)
# List the currently installed Group Policy Client Side Extensions
exts = list_gp_extensions(lp.configfile)
for guid, data in exts.items():
print(guid)
for k, v in data.items():
print('\t%s: %s' % (k, v))
The gp_pol_ext/gp_inf_ext Python Classes
Your CSE must be a class that inherits from a subclass of gp_ext. The gp_pol_ext is a subclass of gp_ext that provides simplified parsing of Registry.pol files. If you choose to store your policies in ini/inf files in the SYSVOL (instead of using Administrative Templates), then you can inherit from the gp_inf_ext instead.
If your class inherits from either gp_pol_ext or gp_inf_ext, it has a parse() function defined, which takes a single filename. The parse() function will parse the contents of the policy file and return it in a sensible format.
If for some reason you choose to store data on the SYSVOL in some other format (such as in XML, etc), you’ll need to subclass gp_ext, then implement a read() function, like this:
import xml.etree.ElementTree
class gp_xml_ext(gp_ext):
def read(self, data_file):
return xml.etree.ElementTree.parse(data_file)
The read() function is called by parse(), passing it a local filename tied to the systems SYSVOL cache. Then within process_group_policy() you can call parse() to fetch the parsed data from the SYSVOL.
Process Group Policy
The process_group_policy() function serves two primary purposes; it applies new policy, and it removes old policy. In the example, you’ll notice there are two main loops. The first loop iterates over the deleted_gpo_list, which are all the policies that should be removed. The second loop iterates over the changed_gpo_list, which are new policies which must be applied.
Deleted GPOs
for guid, settings in deleted_gpo_list:
self.gp_db.set_guid(guid)
if str(self) in settings:
for attribute, script in settings[str(self)].items():
if os.path.exists(script):
os.unlink(script)
self.gp_db.delete(str(self), attribute)
self.gp_db.commit()
The deleted_gpo_list is a dictionary which contains the guids of Group Policy Objects, with associated settings which were previously applied. This list of applied settings is generated by the second loop (changed_gpo_list) while it is applying policy. The self.gp_db object is a database handle which allows you to manipulate the Group Policy Database.
The Group Policy Database keeps track of all settings that have been applied, and info on how to revert those applied settings. For example, in the smb.conf CSE, the attribute stored in settings could be client max protocol and the stored value could be NT1. If our GPO has applied a client max protocol set to SMB3_11, the Group Policy database keeps track of the previous value of NT1 for when it’s time to remove the SMB3_11 policy.
In our example cron script policy above, you can see that the stored value is a filename (the script variable). This is actually the name of the script we’ve applied, which will allow us to delete it later (therefore removing the policy). The scripts CSE is a special case, where we don’t need to keep track of an old value to restore, instead we’re keeping track of files to delete (since the ‘old value’ is that the script didn’t exist).
Changed GPOs
for gpo in changed_gpo_list:
if gpo.file_sys_path:
reg_key = 'Software\\Policies\\Samba\\Unix Settings'
sections = { '%s\\Daily Scripts' % reg_key : '/etc/cron.daily',
'%s\\Monthly Scripts' % reg_key : '/etc/cron.monthly',
'%s\\Weekly Scripts' % reg_key : '/etc/cron.weekly',
'%s\\Hourly Scripts' % reg_key : '/etc/cron.hourly' }
self.gp_db.set_guid(gpo.name)
pol_file = 'MACHINE/Registry.pol'
path = os.path.join(gpo.file_sys_path, pol_file)
pol_conf = self.parse(path)
if not pol_conf:
continue
for e in pol_conf.entries:
if e.keyname in sections.keys() and e.data.strip():
cron_dir = sections[e.keyname]
attribute = '%s:%s' % (e.keyname,
b64encode(e.data.encode()).decode())
old_val = self.gp_db.retrieve(str(self), attribute)
if not old_val:
with NamedTemporaryFile(prefix='gp_', mode="w+",
delete=False, dir=cron_dir) as f:
contents = '#!/bin/sh\n%s' % intro
contents += '%s\n' % e.data
f.write(contents)
os.chmod(f.name, 0o700)
self.gp_db.store(str(self), attribute, f.name)
self.gp_db.commit()
The second loop is a little more involved. When we iterate over changed_gpo_list, we’re actually iterating over a list of GPO objects. The attributes of the object are:
-
gpo.name: The GUID of theGPO. -
gpo.file_sys_path: A physical path to a cache ofGPOon the local filesystem.
There are other methods and attributes, but these are the only ones important to a CSE.
The primary purpose of this loop is to iterate over the GPOs, read their policy in the SYSVOL, then check the sections for the Registry Key we created in our Server Side Extension. If our policy Registry Key exists, then we read the entry and apply the policy.
In our example, we find the ‘Software\Policies\Samba\Unix Settings\Daily Scripts’ policy, then read the script contents from Registry.pol entry and write the script to a local file. In the example code, we write the script to a temporary file, then move the file to it’s permanent location in /etc/cron.daily.
We also have to make sure we set the name of the new script in our self.gp_db (Group Policy Database). This ensures that we can remove the policy when we delete the GPO. At the beginning of our loop, we also need to ensure we call set_guid() on our Group Policy Database, so it knows which GPO we’re operating on.
Resultant Set of Policy
The rsop() function in the extension is optional. It should return a dictionary containing key/value pairs of what our current policy will or has applied. The function is passed a list of GPO objects (similar to our changed_gpo_list), and we should parse the list similar to how we did in our changed_gpo_list loop. The difference is that the rsop() function does not apply any policy. It only returns what will be applied. This function enables the samba-gpupdate --rsop command to report on applied, or soon to be applied policy.
Registering/Unregistering a Client Side Extension
The final step is to register an extension on the host. While the example code provides a detailed example of how to register an extension, the basic requirement is simply to call register_gp_extension().
ext_guid = '{5930022C-94FF-4ED5-A403-CFB4549DB6F0}'
ext_path = os.path.realpath(__file__)
register_gp_extension(ext_guid, 'gp_scripts_ext', ext_path,
smb_conf='/etc/samba/smb.conf', machine=True, user=False)
The extension guid can be any random guid. It simply must be unique among all extensions that you register to the host. The extension path is literally just the path to the source file containing your CSE.
You must pass your smb.conf file to the extension, so it knows where to store the list of registered extensions. You also must specify whether to apply this extension to the machine, or to individual users (or to both).
Unregistering the extension is simple. You call the unregister_gp_extension() and pass it the unique guid you previously chose which represents this CSE.
Conclusion
I hope this tutorial proves useful. Please comment below if you have questions! You can also reach me on freenode in the samba-technical channel (nic: dmulder).
Cómo editar OpenStreetMap fácilmente con StreetComplete
Aunque el blog se centra en la Comunidad KDE también me interesa compartir todo aquello relacionado con el Conocimiento Libre. Es por ello que he participado en proyectos como la Wikipedia con mis alumnos o dedico esta entrada a cómo editar OpenStreetMap fácilmente con StreetComplete, mi descubrimiento de estas vacaciones con el que he colaborado con el mapa libre y compartido tiempo con mi hijo.
Cómo editar OpenStreetMap fácilmente con StreetComplete
Estas vacaciones las he disfrutado en un pequeño pueblo de montaña, con lo cual tenía tiempo de sobra para pasear con mi hijo y descubrir esos rincones tan mágicos que ocultan estas poblaciones.
Venía con la idea de aprovechar estos momentos para colaborar con la edición de OpenStreet Maps, el proyecto libre para cartografiar el mundo, pero la verdad es que hacerlo de memoria me parecía un poco árido y, sobre todo, «poco motivador» para mi hijo.

Así que fue todo un acierto descubrir StreetComplete, una aplicación Open Source para Android creada por Tobias Zwick que se encarga de encontrar errores, información incompleta o ampliable, preguntarla de forma clara y precisa al usuario y volcarla a OpenStreetMap. ¡Maravilloso!
En otras palabras, StreetComplete es una aplicación que en forma de juego te permite colaborar con el OpenStreetMap completando la información que todavía le falta, la cual es menos de lo que podríamos pensar.
La aplicación usa Tangram-ES para mostrar el mapa. el cual depende de Overpass API para encontrar las peticiones y las sube directametne vía API de OpenStreetMap. Su código fuente está alojado en GitHub y os recomiendo visitar la wiki del proyecto.
Cómo funciona StreetComplete
Quizás lo más destacado de la aplicación es su facilidad de uso. Para empezar a editar apenas requiere unos minutos y los pasos para hacerlo desde cero son los siguientes:
- Te descargas e instalas la aplicación de F-Droid o Google Play.
- Te registras con la cuenta de OpenStreetMap que tengas (o te creas una).
- La aplicación cargará retos de la zona en la que te encuentres y te los mostrará en pantalla.

- Simplemente pasea hasta el reto, pulsa en el mismo y responde a la pregunta que te plantea. Por ejemplo:
- ¿De qué tipo es la calle? La aplicación te mostrará diversos tipos como asfalto, tierra, adoquines, hormigón, etcétera.
- ¿Qué horario tiene el establecimiento? StreetComplete te permite de forma rápida introducir los días y las horas de apertura.
- ¿Tiene iluminación la calle? Con respuesta binaria si/no.
- ¿Tiene acera la calle? Y te mostrará un dibujo con la distribución de la misma.
- A medida que vayas contestando te dará estrellas a modo de puntuación y desbloqueará otros retos.

Todo ello con una interfaz muy cuidada y con la posibilidad de acceder a la Wiki de OpenStreetMap para afinar en tus decisiones. Además, la aplicación está destinada a ser utilizada en exteriores, funciona sin conexión a Internet y no consume demasiado saldo del móvil.
Mi experiencia con niños
El uso de esta aplicación ha sido fabulosa con mi hijo y mi sobrina de ocho años, nos hemos pateado el pueblo arriba y abajo contestando a las preguntas que nos iba planteando y averiguando cosas que desconocíamos de la población.
Al principio muy básicas y en pequeñas cantidades, del estilo tipo de pavimento de la calle o si había iluminación, pero a medida que «avanzábamos» en el uso de StreetComplete nos planteaba retos más precisos como el tipo de vivienda, el número de plantas o los horarios de los establecimientos.
Fueron unos días de exploración muy entretenidos y divertidos ya que la gamificación (término que significa introducir mecánicas de juegos como puntos o logros en actividades educativas) de la aplicación lograba que mis pequeño acompañantes estuvieran más que motivados para salir a pasear por el pueblo, debiendo mediar entre ellos en los turnos de búsqueda.
Además, y según mi experiencia de maestro y padre, propició que mi hijo y mi sobrina:
- Empezaran a orientarse con un mapa, aunque fuera virtual.
- Colaborar sin saberlo en mejorar un proyecto colaborativo como OpenStreetMap.
- Se animaran a la hora de hablar con las personas encargadas de los comercios.
- Identificaran carriles bicis, aceras, tipos de pavimentos, etc.
- Mejorara el conocimiento del pueblo y sus servicios, valorando incluso la belleza de algunas casas o edificios.
- Realizaran un ejercicio físico continuo (después del confinamiento se perdió esa costumbre).
Para finalizar el artículo comentar StreetComplete me parece una aplicación extraordinaria de código abierto para utilizar con nuestros alumnos para fomentar el conocimiento de su propio entorno y, al tiempo, colaborar con la Comunidad de OpenStreetMap.
De hecho me planteo que sería muy interesante para su incorporación en alguna que otra asignatura como Ciencias Sociales o Informática.