Hace poco me ha aparecido una casuística que no veía desde los tiempos de windows xp, el permitir a un usuario el arrancar una aplicación con permisos de administrador local ya que sin ellos la aplicación no funciona (hay desarrolladores que simplemente quieren ver el mundo arder).
El caso es que en windows xp la solución a este problema era relativamente sencilla, simplemente con dejar un acceso directo en el escritorio que con el siguiente contenido:
runas /user:nombre-maquina\nombre-administrador /savedcred "L:\a\ruta\al\ejecutable.exe"
Ejecutándolo tu mismo e introduciendo la contraseña del administrador local una vez, el usuario podía arrancar ese programa como administrador sin saber la contraseña del mismo.
A partir de windows 7, si intentamos usar este “truquillo” del runas nos aparecerá el siguiente mensaje:
La solución mas rápida para permitir al usuario ejecutar el programa seria deshabilitar el UAC, pero esta solución no es en absoluto recomendable. No obstante se puede conseguir una màquina en donde un usuario (en nuestro caso un administrador de la maquina) solo pueda ejecutar un programa y nada mas.
Crear usuario para ejecutar el programa
Crearemos un usuario administrador local, en nuestro caso, ya que el programa en cuestión necesita de permisos de administrador.
New-LocalUser -AccountNeverExpires -UserMayNotChangePassword -PasswordNeverExpires -Name "usuario-programa"
Add-LocalGroupMember -Group "Administradores" -Member "usuario-programa"
Configurar políticas locales para limitar ejecución de programas para el usuario
Abrir editor de políticas para un usuario en concreto del equipo local.
Win + R
y ejecutaremos mmc
Una vez que tengamos la MMC abierta añadiremos el complemento mediante la entrada de menú Archivo –> Agregar o quitar complemento…“ o mediante el shortcut Ctrl + M
:
Cuando se nos abra el cuadro de dialogo de Agregar o quitar complementos buscaremos la entrada de Complementos disponibles: Editor de objetos y directivas de grupo y pulsaremos en Agregar:
En el asistente que nos aparecerá pulsaremos sobre el botón Examinar…:
En la ventana que nos aparecerá seleccionaremos la pestaña Usuarios y dentro de usuarios seleccionaremos el usuario que hemos creado en el paso anterior (usuario-programa) y pulsaremos en Aceptar:
Una vez que le hemos dado a Aceptar podremos ver en el asistente que nos aparece seleccionado como Objeto de directiva de grupo el usuario que hemos creado en el paso anterior, pulsaremos en Finalizar para agregar el complemento a la consola de administración.
Configurar la política para limitar la ejecución de programas a un solo programa.
Accederemos a Configuración de usuario -> Plantillas administrativas -> Sistema y haremos doble click sobre la entrada Ejecutar solo aplicaciones especificas de Windows:
En la ventana de configuración de la política que nos aparece, habilitaremos la politica selccionando Habilitada y pulsaremos el botón Mostrar… de la opcion Lista de aplicaciones permitidas
En el cuadro de dialogo que nos aparecerá introduciremos el nombre del ejecutable que queremos permitir que se ejecute (para este articulo usaremos firefox como ejemplo) y pulsaremos en Aceptar.
Importante: En la ventana anterior hay que poner solo el nombre del programa que queremos permitir ejecutar, no hay que poner la ruta del hacia el ejecutable.
Pulsaremos Aceptar en la ventana e configuración de la política
Y ya nos aparecerá como configurada y habilitada:
Comprobación de la política
Si iniciamos sesión con el usuario usuario-programa que hemos creado en el primer paso e intentamos abrir cualquier aplicación, excepto firefox, nos aparecerá el siguiente mensaje de error:
En cambio si ejecutamos firefox, se nos abrirá sin problema alguno.
Esta solución solo vale para las sesiones interactivas del usuario sobre el que configuramos la política, si por ejemplo tenemos un usuario en el mismo equipo que sabe la contraseña del administrador capado e intenta ejecutar cualquier cosa mediante ejecutar como administrador y selecciona este administrador:
Podrá hacerlo sin ningún problema:
Comento esto por que mi idea inicial era configurar esta política, darle la contraseña a un usuario y dejar que ejecutar la aplicación que requería permisos de administrador mediante “Ejecutar como administrador”.
Notas finales
Para solventar el problema de que el usuario no pueda arrancar programas a través del “Ejecutar como administrador” se ha creado una VM en la misma màquina y para entrar al programa se arranca la VM y se conecta por rdp a esta con el administrador con restricciones.
Si en lugar de configurar esta política configuramos la política “No ejecutar aplicaciones de Windows especificas”
El usuario podrá ejecutar cualquier cosa excepto lo que nosotros especifiquemos, por ejemplo podríamos configurar que un usuario no arranque los navegadores para impedir que navegue por internet.
Documentación
Hace poco me pasaron un tochaco de pdfs para publicar en la pagina web, escaneos de diferentes publicaciones anuales. Por suerte la info venia ya estructurada de la siguiente forma:
.
├── 1942
│ └── 1942.pdf
├── 1944
│ └── 1944.pdf
├── 1945
│ └── 1945.pdf
.
.
.
└── 1985
└── 1985.pdf
Automáticamente pensé que la mejor opción para publicarlo seria una galería con la portada de cada publicación enlazando al pdf de la publicación y que con el poder unix/linux seria una tarea sencilla el poder generar los thumbnais de las portadas de las publicaciones.
En este articulo veremos el proceso para generar esta galería a partir de un conjunto de pdfs.
Prerequisitos
Necesitaremos una maquina linux (en nuestro caso una ubuntu 20.04) con las utilidades pdftk
, convert
y mogrify
todas ellas presentes en los paquetes imagemagick y pdftk. Para instalarlas simplemente ejecutaremos.
sudo apt install imagemagick pdftk -y
El primer paso es extraer la primera pagina de cada pdf, que contiene la portada de la publicación, en un archivo a parte, si ejecutamos sobre un fichero pdf
pdftk pdf-origen.pdf cat 1 output pdf-orinen-front.pdf
nos generara un pdf nuevo con solo la primera pagina del original.
Para hacerlo sobre todos los pdf presentes en la estructura de en la estructura de directorios y ficheros que hemos visto antes, ejecutaremos la siguiente secuencia de comandos en la carpeta pricipal que contiene todas las carpetas con los pdfs.
find . -iname "*.pdf" | xargs -I{} echo "{}" | sed 's/\.pdf//g' | xargs -I{} pdftk "{}.pdf" cat 1 output "{}-front.pdf"
Ahora pasamos a destripar un poco este oneliner:
find . -iname "*.pdf"
: Nos encontrará todos los archivos pdfs presentes en la carpeta y subcarpetas.
xargs -I{} echo "{}" | sed 's/\.pdf//g'
: elimina la extensión pdf de la ruta del archivo para asi poder trabajar con el nombre del archivo mejor, se introduce xargs -I{} echo "{}"
antes de quitar el .pdf de la cadena con sed por que si se le hace el pipe desde el find directamente a sed, sed busca y substituye .pdf en el contenido del fichero y empieza a escupir un churro de caracteres (el contenido del pdf) en pantalla.
xargs -I{} pdftk "{}.pdf" cat 1 output "{}-front.pdf"
: se genera un pdf a partir del existente con solo la primera pagina del pdf original, en la carpeta donde teniamos el pdf original cuyo nombre es [nombre_pdf]-front.pdf.
Una vez ejecutado este oneliner nos quedara una estructura de carpetas y contenido como la siguiente:
.
├── 1942
│ ├── 1942-front.pdf
│ └── 1942.pdf
├── 1944
│ ├── 1944-front.pdf
│ └── 1944.pdf
├── 1945
│ ├── 1945-front.pdf
│ └── 1945.pdf
.
.
.
Convertir la portada a imagen
El siguiente paso es convertir el pdf que tenemos con la portada en una imagen, ejecutando lo siguiente:
convert 1942.pdf 1942.jpg
conseguiremos que nuestro pdf con la portada se convierta en un jpg.
Para hacerlo sobre todas las portadas que hemos extraido en el paso anterior, ejecutaremos:
find . -name "*-front.pdf" | xargs -I{} echo "{}" | sed 's/\.pdf//g' | xargs -I{} convert "{}.pdf" "{}.jpg"
Destripando este oneliner tenemos que:
find . -name "*-front.pdf"
: nos encuentra todos los achivos pdfs con las portadas que hemos generado en el paso anterior.
xargs -I{} echo "{}" | sed 's/\.pdf//g'
: elimina la extensión pdf de la ruta del archivo, al igual que en la seccion anterior se usa el truquete del echo para que sed no trabaje sobre el contenido del fichero.
xargs -I{} convert "{}.pdf" "{}.jpg"
: convierte el pdf con la portada a una imagen jpg
una vez ejecutado tendremos una estructura de carpetas y contenido como la siguiente:
.
├── 1942
│ ├── 1942-front.jpg
│ ├── 1942-front.pdf
│ └── 1942.pdf
├── 1944
│ ├── 1944-front.jpg
│ ├── 1944-front.pdf
│ └── 1944.pdf
├── 1945
│ ├── 1945-front.jpg
│ ├── 1945-front.pdf
│ └── 1945.pdf
.
.
.
Corregir error imagemagick
Al ejecutar el comando convert en ubuntu 20.04, nos aparecerá el siguiente error:
onvert-im6.q16: no images defined `./1977/1977-front.jpg' @ error/convert.c/ConvertImageCommand/3258.
convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
Para solventarlo hay que aplicar lo que se dice en el siguiente hilo de stackoverflow y cambiar en el fichero /etc/ImageMagick-6/policy.xml
la siguiente línea:
-<policy domain="coder" rights="none" pattern="PDF" />
+<policy domain="coder" rights="read | write" pattern="PDF" />
Eliminar pdf de la portada
Ahora que ya tenemos la imagen, los pdf donde hemos extraido la portada en el primer paso ya no nos interesan, podemos deshacernos de ellos ejecutando
find . -name "*-front.pdf" -delete
una vez ejecutado nos quedara la estructura de carpetas y contenido del siguiente modo:
.
├── 1942
│ ├── 1942-front.jpg
│ └── 1942.pdf
├── 1944
│ ├── 1944-front.jpg
│ └── 1944.pdf
├── 1945
│ ├── 1945-front.jpg
│ └── 1945.pdf
.
.
.
Reducir tamaño de la imagen y normalizarla como thumbnail
El conjunto de imágenes generadas contiene tanto imagenes apaisadas como imagenes horizontales, ademas el tamaño de estas es mejorable para que el el tiempo de carga de la pagina sea mas optimo.
Por ejemplo, tenemos la siguiente imagen 1942-front.jpg
que nos ocupa 148KB:
ls -lh
total 32M
-rw-rw-r-- 1 david david 148K abr 7 09:32 1942-front.jpg
-rw-r--r-- 1 david david 32M dic 18 10:42 1942.pdf
Si ejecutamos:
mogrify -resize 242x200 -background white -gravity center -extent 242x200 -format jpg -quality 75 1942-front.jpg
nos generara un thumbnail a partir de la imagen que:
- tiene una tamaño de 242px x 200px:
-extent 242x200
- la imagen original se ajustara al tamaño 242x200,
-resize 242x200
- la imagen original aparecera centrada dentro del thumbnail:
-gravity center
- se rellerara lo que no ocupe la imagen original con el color blanco:
-background white
- nos generara un jpg con una calidad un 25% inferior al original:
-format jpg -quality 75
con lo que despues de ejecutar este comando obtendremos un thumbnail que nos ocupa 11KB (una reduccion del 93%):
s -lh
total 32M
-rw-rw-r-- 1 david david 11K abr 7 09:37 1942-front.jpg
-rw-r--r-- 1 david david 32M dic 18 10:42 1942.pdf
Para conseguir un thumbnail de todas las imagenes que hemos conseguido en los passos anteriores ejecutaremos:
find . -name "*-front.jpg" | xargs -I{} mogrify -resize 242x200 -background white -gravity center -extent 242x200 -format jpg -quality 75 "{}"
Mostrar las imagenes en el navegador
Con el siguiente snippet en php conseguiremos que nos pinte la galeria en el navegador a partir de la estructura de carpetas y contenido que tenemos.
<?php foreach(glob($_SERVER['DOCUMENT_ROOT'].'/path/directorio/pdfs/*/*.pdf') as $pdfFile) : ?>
<?php
$path_parts = pathinfo($pdfFile);
$html_base_path = str_replace($_SERVER['DOCUMENT_ROOT'], "", $path_parts['dirname']);
$pdf_path = $html_base_path."/".$path_parts['basename'];
$image_path = $html_base_path."/".$path_parts['filename']."-front.jpg";
?>
<div class="col-sm-6 col-md-4">
<a href="<?=$pdf_path?>">
<div class="thumbnail">
<img src="<?=$image_path?>" alt="Llibre Festes <?=$path_parts['filename']?>">
<div class="caption" style="text-align:center">
<h3>Llibre Festes <?=$path_parts['filename']?></h3>
</div>
</div>
</a>
</div>
<?php endforeach ?>
Esto nos pintará una galería como la de la siguiente imagen:
Tambien podeis ver el resultado en vivo.
Una de las features que mas me gustan de Gnome 3 es la vista de actividades:
En donde, mediante un simple shortcut de teclado, o un click de ratón, aparecen todas las ventanas que tenemos abiertas en el escritorio como una miniatura y podemos cambiar a la que queremos llegar identificándola por su miniatura y clickando sobre ella nos lleva directamente a ella. Si eres, como yo, una persona que llega a tener decenas de ventanas abiertas al mismo tiempo durante el desarrollo de la jornada de trabajo, probablemente te guste esta feature.
En macOS también existe esta feature y recibe el nombré de exposé, en windows 10 también la tenemos al pulsar Win
+ Tab
.
Por desgracia, el sistema de escritorio xfce, mi favorito para equipos poco potentes (o no tan poco potentes) por su ligereza y velocidad de respuesta, no trae ninguna característica como esta integrada.
Si buscan en google te aparecen alternativas como skippy-xd, pero su código (tal y como se puede ver en el repositorio de github) no se actualiza desde hace 7 años y la PPA a la que apuntan para instalar en ubuntu no tiene paquetes mas allá de la release 16.04.
En este articulo vamos a configurar una utilidad llamada xfdashboard, que tiene pinta de ser parte del proyecto xfce y que ademas distros como ubuntu 20.04 o fedora la ofrecen ya empaquetada.
En este articulo nos centraremos en su instalación y configuración en xubuntu 20.04.
Instalación de xfdashboard
Como hemos dicho la utilidad viene por defecto en los repositorios de ubuntu, asi que instalarla es simplemente escribir en un terminal:
sudo apt install xfdashboard -y
si ejecutamos en un terminal xfdashboard
podremos ver que ya nos aparece la vista de actividades de gnome.
Ejecución en backgroud y shortcut
Aunque podríamos crear solamente el shortcut de teclado que nos lance esta vista, la solución mas optima es ejecutar el programa mediante la opción daemonize, para dejarlo en segundo plano, al iniciar sesión y una vez lanzado todas las veces que lo llamemos no lanzara una instancia nueva sino que nos mostrara la que esta ejecutandose en backgroud.
Ejecución en segundo plano.
Simplemente añadiremos a aplicaciones de inicio en Settings -> Session and Startup -> Application Autostart que se ejecute el comando:
Ahora si salimos/cerramos nuestra sesión y volvemos a entrar podremos ver que xfdashboard se esta ejecutando en segundo plano:
Creación de un shortcut de teclado
Ahora que ya tenemos xfdashboard ejecutándose en segundo plano procederemos a crear un atajo de teclado para poder lanzar la vista de actividades. En Settings -> Keyboard ->Applicattion Shortcuts pulsaremos sobre Add para añadir un nuevo shortcut.
En el primer cuadro de dialogo nos pide el programa que se va a ejecutar con el atajo de teclado, introduciremos simplemente xfdashboard
:
En el segundo cuadro de dialogo nos pedira que pulsemos la combinación de teclas que queremos asignar a este nuevo atajo de teclado, la pulsaremos. A mi personalmente me gusta la combinación de teclado **+W**, pero se puede introducir cualquiera (como por ejemplo + para tener un shortcut equivalente al de windows).
Nota: si elegimos un shortcut que xfce ya tiene asignado (por ejemplo la combiancion *+W* esta ya asignada a lanzar el navegador web), nos preguntará si queremos reasignarla.
Una vez tenemos el shortcut definido si lo pulsamos podremos ver que nos aparece el xfdashboard.
Recientemente he actualizado unas instalaciones de zabbix de la versión 4.0 a la 5.0 que mantengo. Una en un server ubuntu, una en un server debian y una en una raspberrypi, aqui dejo el proceso para actualizar el servidor de zabbix.
Actualizar los repositorios
Simplemente seguir las instrucciones que hay en la documentación, como si fueramos a instalar por primera vez zabbix, para el caso de un servidor ubuntu 18.04, por ejemplo, ejecutariamos:
wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+bionic_all.deb
sudo dpkg -i zabbix-release_5.0-1+bionic_all.deb
Parar los servicios de zabbix
sudo systemctl stop zabbix-server
sudo systemctl stop zabbix-agent
Actualizar los paquetes
En la documentación oficial se indica otro modo, pero simplemente si ejecutamos:
sudo apt update && sudo apt upgrade -y
funciona igualmente.
Durante la actualización nos preguntara que hacer con los ficheros de configuración /etc/zabbix/zabbix_server.conf
y /etc/zabbix/zabbix_agentd.conf
, si queremos conservar las versiones instaladas o instalar la versión que viene con el paquete, contestaremos que no (N, opción por defecto) para no perder la configuración del servidor.
Nota en raspbian, o raspberry OS como se llama ahora, la actualización marca como no necearios los paquetes libapache2-mod-php libapache2-mod-php7.3 libsodium23 php7.3-cli php7.3-json php7.3-opcache php7.3-readline, con lo que si ejecutamos un sudo apt autoremove -y
se desinstalarán y el frontend de zabbix dejará de funcionar, hay que marcarlos como que són necesareos.
apt install libapache2-mod-php libapache2-mod-php7.3 libsodium23 php7.3-cli php7.3-json php7.3-opcache php7.3-readline -y
Quitar error “Database history tables upgraded: No”
Una vez realizado el upgrade a la versión 5.0 en el dashboard principal, nos apaarecerá el mensaje de error “Database history tables upgraded: No”:
Para que este mensaje desaparezca tenemos que:
Descargar y pasar el patch ‘double.sql’
wget https://git.zabbix.com/projects/ZBX/repos/zabbix/raw/database/mysql/double.sql
mysql -u'zabbix' -p zabbix < double.sql
Nota: Nos pedira el password del usuario de la base de datos zabbix.
Editar el fichero zabbix.conf.php
Tendremos que editar los contenidos del fichero /etc/zabbix/web/zabbix.conf.php
y añadir la siguiente línea:
$DB['DOUBLE_IEEE754'] = 'true';
Notas finales
El proceso de actualización de los agentes zabbix en linux es muy similar al del servidor. Estoy trabajando en un playbook ansible para automatizar todo el proceso de actualizar los agentes de zabbix en linux.
Enlaces
La fuente que trae por defecto el thunderbird no casa demasiado con el look and feel de OSX, no obstante se puede cambiar si realizamos los siguientes cambios.
En la carpeta del perfil de usuario (en OSX /Users/xoner/Library/Thunderbird/Profiles/xxxxxxxxx.default) crear una carpeta que se llame chrome i crear en ella un fichero que se llame userChrome.css.
Editar el fichero que hemos creado anteriormente e introducir el siguiente contenido:
* {
font-size: 14px !important;
font-family: "Lucida Grande", Arial !important;
}
Se supone que este truco también tiene que funcionar con la gui del firefox, si se coloca el fichero chrome\userChrome.css
en la carpeta del perfil de firefox.
Se añade la creación de las claves de registro mediante powershell
En los entornos linux/unix hacer que un script sea directamente ejecutable es algo tan sencillo como marcar el fichero como ejecutable, mediante chmod
, y poner en la primera linea del script el path del interprete comentado. En windows esto mismo no es posible, no obstante es posible asociar cada extensión de fichero con que programa se ha de usar por defecto al ejecutarlo. En este articulo haremos que los ficheros .py
se ejecuten con el interprete de python IronPython, implementación de python sobre el clr de .NET)
Habilitar HKEY_CLASS_ROOT en powershell
Por defecto powershell no tiene acceso al grupo de claves de registro HKEY_CLASSES_ROOT
, para poder tener acceso a este conjunto de claves de registro hay que ejecutar el siguiente comando en powershell:
New-PSDrive -PSProvider registry -Root HKEY_CLASSES_ROOT -Name HKCR
Crear una clave de registro para el tipo de archivo (si no existe)
Version regedit
- Abrir el editor de registro de windows i sobre la clave de registro
HKEY_CLASSES_ROOT
crear una nueva clave con la extension de archivos que queremos hacer ejecutable (en nuestro caso .py)
- Sobre esta nueva clave de registro que hemos creado, crear un nuevo valor con estos valores:
Nombre | Tipo | Datos |
Content | Type | REG_SZ text/plain |
- Sobre esta nueva clave de registro que hemos creado cambiar el valor (Predeterminado) para que quede de la siguiente forma:
Nombre | Tipo | Datos |
(Predeterminado) | REG_SZ | IronPython.File |
Versión powershell
Set-Location HKCR:
New-Item -Path HKCR:\ -Name '.py'
Set-ItemProperty -Path HKCR:\.py -Name '(Default)' -Value 'IronPython.File'
Crear una clau para el manejador de archivo que hemos declarado anteriormente
Versión regedit
- Sobre la clave de registro
HKEY_CLASS_ROOT
crear una nueva clave con el valor introducido en el punto 3 del apartado anterior (En nuestro caso IronPython.File).
- Sobre la clave de registro creada en el paso anterior crear una subclave llamada Shell.
- Sobre la clave creada en el paso anterior crear una subclave llamada Open, editar el valor del valor (Predeterminado) de la clave Open. para que quede de la siguiente forma.
Nombre | Tipo | Datos |
(Predeterminado) | REG_SZ | Open |
- Sobre la clave de registro creada en el paso anterior crear una subclave Command.
- Editar el valor (Predeterminado) de la clave creada en el paso anteiror para que quede de la siguiente forma:
Nombre | Tipo | Datos |
(Predeterminado) | REG_SZ | “C:\Program Files\IronPython 2.7\ipy.exe” “%1″ %* |
Nota!!: C:\Program Files\IronPython 2.7\ipy.exe es la ruta hacia el ejecutable de ironpython.
Versión powershell
New-Item -Path HKCR:\ -Name 'IronPython.File'
New-Item -Path HKCR:\IronPython.File -Name 'Shell'
New-Item -Path HKCR:\IronPython.File\Shell -Name 'Open'
New-ItemProperty -Path HKCR:\IronPython.File\Shell\Open -Name '(Default)' -Value 'Open'
New-Item -Path HKCR:\IronPython.File\Shell\Open -Name 'Command'
New-ItemProperty -Path HKCR:\IronPython.File\Shell\Open\Command -Name '(Default)' -Value '"C:\Program Files\IronPython 2.7\ipy.exe" "%1" %*'