Docker tags

Buscar una imágen en docker es fácil con el comando docker search, pero luego que encuentras la imágen localizar las etiquetas disponibles ya no está al alcance del comando rápido… se requiere un consultar la respuesta json de una URL del registry.

Agregando este bloque de función al .bashrc

es posible tener un comando docker_tags que recibe por parámetro la imágen que se va a buscar y devuelve la lista de etiquetas disponibles:

$ docker_tags alpine
"20190707"
"20190809"
"20190925"
"3"
"3.10"
"3.10.1"
"3.10.2"
"3.8.4"
"edge"
"latest"

Si encuentras una mejora a esto, agradezco lo compartas en los comentarios.

Certbot: No module named pip.__main__; ‘pip’ is a package and cannot be directly executed

De un tiempo a esta parte he tenido sistemas de certificados Let’s Encrypt que han dejado de renovar el certificado automáticamente, al ejecutar certbot-auto obtengo el siguiente mensaje de error:

/opt/eff.org/certbot/venv/bin/python: No module named pip.__main__; 'pip' is a package and cannot be directly executed
Traceback (most recent call last):
  File "/tmp/tmp.p48KR72ZCs/pipstrap.py", line 177, in <module>
    sys.exit(main())
  File "/tmp/tmp.p48KR72ZCs/pipstrap.py", line 149, in main
    pip_version = StrictVersion(check_output([python, '-m', 'pip', '--version'])
  File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['/opt/eff.org/certbot/venv/bin/python', '-m', 'pip', '--version']' returned non-zero exit status 1

Opcion 1

La solución que he encontrado es actualizar a mano certbot-auto e indicarle que corra sin tratar de actualizarse. Estos serían los comandos:

rm ./certbot-auto*
wget https://raw.githubusercontent.com/certbot/certbot/75499277be6699fd5a9b884837546391950a3ec9/certbot-auto
chmod +x ./certbot-auto
./certbot-auto --no-self-upgrade

La referencia a este procedimiento la he conseguido de este post en foro de la comunidad Let’s Encrypt.

Opcion 2

Es posible parchar certbot-auto directamente con estos cambios

pip_version = StrictVersion(check_output([python, '-m', 'pip', '--version'])

cambiar por:

pip_version = StrictVersion(check_output(['pip', '--version'])

y

command = [python, ‘-m’, ‘pip’, ‘install’, ‘–no-index’, ‘–no-deps’, ‘-U’]

cambiar por:

command = ['pip', 'install', '--no-index', '--no-deps', '-U']

El primer contenedor Docker

La primera vez que se presentó un contenedor Docker en forma pública lo hizo Solomon Hykes en la conferencia PyCon Santa Clara de 2013.

Es increíble y emocionante cómo Solomon describe rápidamente lo que hace un contenedor (minuto 2:30) que ejecuta un simple echo hello world.

  1. se genera la configuración de un contenedor
  2. se aloja el filesystem (se copia la imagen a una carpeta)
  3. se monta la capa de escritura del contenedor
  4. se configura la interfaz de red
  5. se gestiona una dirección IP y se configura
  6. se configura un NAT para comunicar el contenedor
  7. se ejecuta el comando y se despliega la salida
  8. se apaga el contenedor (o se destruye)

e inmediatamente recibe un aplauso del público, que asiste emocionado a lo que nosotros hoy día hacemos normalmente, sin emoción.

exito ok

whois para nuevos TLDs

Los nuevos TLDs como guru, americanfamily, showtime y muchos otros son un desafío para el comando whois con cierta antigüedad, ya que no los pueden resolver y muestra el error:

No whois server is known for this kind of object.

La solución es configurar un archivo /etc/whois.conf con las referencias a los nuevos TLDs y los servidores whois que los resuelven.

Este gist es un archivo /etc/whois.conf pronto para pegar y tener resuelto el problema para la siguiente consulta whois que se haga con los nuevos TLDs.

Sobre escribir variables al invocar el shell script

Todos utilizamos variables de tipo constantes en nuestros shell scripts, que en principio no son modificables pues están en el código, un ejemplo simple:

#!/bin/bash
HOLA="Hola, soy el script"
echo $HOLA

así en cada ejecución de este script se mostrará el contenido de la variable HOLA:

$ ./hola
hola soy el script
$

Pero al definir/crear la variable podemos hacerlo con un contenido por defecto, que se usa en caso que la variable no tenga otro valor, mediante esta sintaxis de definición:

HOLA=${HOLA:-"Hola, soy el script"}

de esta forma HOLA tomará el valor que ya traiga o, en caso de ser nula, asignará el string indicado luego del :-

Esta sintaxis para la definición de las variables en nuestros script permite que se le pueda cambiar el valor al invocar el script, así:

$ HOLA="Hola, soy el shell" ./hola
Hola, soy el shell
$

También esta sintaxis de valor por defecto de las variables puede ser asignado directamente al invocarlas, utilizando una sintaxis equivalente:

#!/bin/bash
echo ${HOLA:-"Hola, soy el script"}

lo que simplifica el script, aunque puede distribuir los valores de las variables a lo largo y ancho del código así que a usarlo con cuidado.

Obviamente es algo muy documentado y explicado, aquí unos ejemplos:

Rocket Chat super rápido con Vagrant

Rocket Chat es un excelente sistema corporativo de chat completamente software libre (clientes y servidores), con todo el glamour de un sistema de chat moderno (canales, integración, componentes embebitos, chatbots, etc. etc.)

En este Vagrantfile es posible levantarlo de forma tan simple como escribir vagrant up

[pastacode lang=»ruby» path_id=»aX3qrbgr» highlight=»» lines=»» provider=»pastebin»/]

Publicar la llave pública SSH

Los principales repositorios (Gitlab y Github) exponen las llaves públicas SSH de sus usuarios de forma que están accesibles para descarga:

https://(gitlab|github).com/<usuario>.keys

Es la URL de donde se obtienen, y aquí las mías:

La ventaja es tener un sitio disponible donde está nuestra clave (y la de nuestros colegas) para usar en automatismos como esta task de Ansible:

- name: Enable pilasguru root access
  authorized_key:
    user: root
    state: present
    key: https://gitlab.com/pilasguru.keys
    validate_certs: False

Fundamentos y doctrinas de la Guerra Fría

Tuve el gusto de presentar ante dos sextos años de la Escuela Elbio Fernandez un análisis de los fundamentos y las doctrinas de la Guerra Fría, con la idea de complementar el estudio que previamente ellos habían hecho sobre ese período histórico, pero acercando una visión desde la «academia», gracias a Von Neumann, claro.

Me divertí muchísimo contándoles cómo explota una bomba nuclear y explicando cómo la Teoría de Juegos de John Von Neumann y Oskar Morgenstern podía responder por qué la Guerra Fría fue, precisamente, fría.

Hasta nos hicimos tiempo para representar el dilema del prisionero y el equilibrio de Nash.

Agradezco a las maestras Irene y Annie que me permitieron estar frente a sus alumnos.

Enviar correo SMTP por telnet

Nada nuevo, esto está por todo internet explicado en muchas formas, tamaños y colores. Pero sucede que lo utilizo mucho y lo que siempre hago es entrar a mi blog y hacer una búsqueda por el término «telnet» y ahi me doy cuenta que tengo todas las formas de telnet para correo, menos la común y corriente. Eso motiva este artículo.

Como enviar un correo electrónico al puerto 25 por telnet:

# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.mydomain.com ESMTP

HELO yourdomain.com
250 mail.mydomain.com

MAIL FROM: you@server.com
250 2.1.0 Ok

RCPT TO: rpilas@mydomain.com
250 2.1.5 Ok

DATA
354 End data with <CR><LF>.<CR><LF>
From: "Some One" <you@server.com>
To: "Rodolfo Pilas" <rpilas@mydomain.com>
Subject: Testing
MIME-Version: 1.0
Content-Type: multipart/alternative;
        boundary="boundary-type-1234567892-alt"
--boundary-type-1234567890
--boundary-type-1234567892-alt
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


Testing the text to see if it works!

--boundary-type-1234567892-alt
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


<html>Does this actually work?</html>

--boundary-type-1234567892-alt--
--boundary-type-1234567890
Content-Transfer-Encoding: base64
Content-Type: text/plain;name="Here2.txt"
Content-Disposition: attachment;filename="Here2.txt"

KiAxMyBGRVRDSCAoQk9EWVtURVhUXSB7NjU5fQ0KLS1fZjZiM2I1ZWUtMjA3YS00ZDdiLTg0NTgtNDY5YmVlNDkxOGRhXw0KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQ0KDQoNCkp1c3Qgc2VlaW5nIHdoYXQgdGhpcyBhY3R1
YWxseSBjb250YWlucyEgCQkgCSAgIAkJICA9DQoNCi0tX2Y2YjNiNWVlLTIwN2EtNGQ3Yi04NDU4LTQ2OWJlZTQ5MThkYV8NCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQ0KDQo8aHRtbD4NCjxoZWFkPg0KPHN0eWxlPjwhLS0N
Ci5obW1lc3NhZ2UgUA0Kew0KbWFyZ2luOjBweD0zQg0KcGFkZGluZzowcHgNCn0NCmJvZHkuaG1tZXNzYWdlDQp7DQpmb250LXNpemU6IDEwcHQ9M0INCmZvbnQtZmFtaWx5OlRhaG9tYQ0KfQ0KLS0+PC9zdHlsZT48L2hlYWQ+DQo8Ym9keSBjbGFzcz0zRCdobW1lc3NhZ2UnPjxkaXYgZGlyPTNEJ2x0cic+DQpKdXN0IHNlZWluZyB3aGF0IHRo
aXMgYWN0dWFsbHkgY29udGFpbnMhIAkJIAkgICAJCSAgPC9kaXY+PC9ib2R5Pg0KPC9odG1sPj0NCg0KLS1fZjZiM2I1ZWUtMjA3YS00ZDdiLTg0NTgtNDY5YmVlNDkxOGRhXy0tDQopDQpmbHlubmNvbXB1dGVyIE9LIEZFVENIIGNvbXBsZXRlZA


--boundary-type-1234567890--


.
QUIT
250 2.0.0 Ok: queued as 1EDE71400DE

221 2.0.0 Bye
Connection closed by foreign host.

(esto lo he extraido de internet)

fingerprint de certificados ssh

Con el tiempo uno va coleccionando muchos certificados, algunos dedicados a un determinado proyecto, otros dedicados a algun cliente y, por supuesto los propios. En ese repositorio de certificados que suele ser la carpeta ~/.ssh/ hay que agregar los certificados que por algun motivo distribuimos en algunos servidores… en fin, llegará el día que necesitemos identificar algun certificado privado.

Así que estos son los comandos para obtener el fingerprint (huella dactilar) de certificados privados.

Certificado ssh

$ openssl rsa -in id_rsa -pubout -outform DER | openssl md5 -c
Enter pass phrase for .ssh/id_rsa:
writing RSA key
a2:d7:19:27:fa:89:43:aa:59:fd:ac:eb:71:3f:fb:a8

Como ven, mi certificado privado tiene passphrase y, para leerlo se require que la escriba.

Certificado pem (AWS)

openssl pkcs8 -in .ssh/proyectoX  -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
d3:ff:c0:cf:6f:25:a1:88:b5:c7:9e:9b:ba:b9:57:a4:bb:45:62:68

Los certificados que creamos en AWS se suelen guardar sin passphrase y el fingerprint se muestra inmediatamente.