julio 27, 2019

Como reinstalar una nueva imagen de Raspberry Pi desde dentro y por ssh

Sin sacar siquiera la tarjeta de la RasperryPi :D (entre otras cosas por que ya no dispongo de lector de tarjetas). El sistema se que tenía era bastante viejo y tenía una debian Wheezy (7) para la que ya no se hacen paquetes. Total, imposible de hacer un update/upgrade. Aquí los pasos para reinstalar el sistema de nuevo con la última versión, todo por ssh, sin despeinarse ;)

Descargamos la ultima raspbian desde https://www.raspberrypi.org/downloads/raspbian/ en mi caso he cogido la lite.

Vamos a editar la imagen y transmitirla ya modificada para que el sistema arranque directamente con SSH e IP fija:

$ mkdir rpi
$ cd rpi
$ 7z x ../2019-07-10-raspbian-buster-lite.zip
$ fdisk -l 2019-07-10-raspbian-buster-lite.img
Disk 2019-07-10-raspbian-buster-lite.img: 2 GiB, 2197815296 bytes, 4292608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x17869b7d
Device                               Boot  Start     End Sectors  Size Id Type
2019-07-10-raspbian-buster-lite.img1        8192  532480  524289  256M  c W95 FAT32 (LBA)
2019-07-10-raspbian-buster-lite.img2      540672 4292607 3751936  1,8G 83 Linux

Montamos sobre loop devices las dos particiones (el valor del offset sale de multiplicar el comienzo de la partición por el tamaño de sector: 8192 * 512 = 4194304):
$ sudo losetup /dev/loop1 -o 4194304 2019-07-10-raspbian-buster-lite.img
$ sudo losetup /dev/loop2 -o 276824064 2019-07-10-raspbian-buster-lite.img
$ mkdir p1 p2

$ sudo mount /dev/loop1 p1
$ sudo mount /dev/loop2 p2

Ahora tenemos las particiones montadas en sendos directorios.

Para activar el ssh necesitamos crear en la primera partición un archivo llamado "ssh":
$ echo ssh > p1/ssh

Para fijar nuestra ip debemos editar el archivo "p2/etc/dhcpcd.conf", al final del archivo habilitamos el interfaz (por ej, el eth0)

# Example static IP configuration:
interface eth0
static ip_address=192.168.1.2/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.1.1
static domain_name_servers=8.8.8.8

Desmontamos las particiones y los loops:
$ sudo umount /dev/loop1
$ sudo umount /dev/loop2
$ sudo losetup -D

Ya tenemos la imagen preparada, para guardarla sobre la SD vamos a transmitirla por SSH directamente. Debemos activar el acceso root por ssh: "sudo passwd root" en la raspberry. Editar el /etc/sshd si fuera necesario.

Detener todos los demonios y procesos posibles, para asegurarnos que nadie se dedica a escribir en disco.

Ahora es recomendable tener una segunda consola abierta con root contra la Raspberry y lanzar el comando "sync" que nos asegurará que todos los datos están escritos en la SD y podemos apagarla.

En otra consola lanzamos:
$ gzip -c 2019-07-10-raspbian-buster-lite.img | ssh root@192.168.1.9 "gunzip -c > /dev/mmcblk0"

Una vez acabe volvemos a la consola previa, "sync" y esperamos a que finalice.

Ya podemos apagar y volver a encenderla, si todo hay ido bien:
$ ssh pi@[IP]
password: raspberry
Linux raspberrypi 4.19.57+ #1244 Thu Jul 4 18:42:50 BST 2019 armv6l

Y aunque pueda parecer poco heterodoxo, ya lo tenemos listo.

febrero 26, 2018

postfix certificate key values mismatch

Recientemente durante la instalación de un nuevo certificado en un servidor postfix me sucedió el siguiente error:
$ telnet x.x.x.x 25
Escape character is '^]'.
220 x.x.x ESMTP Postfix
> EHLO test
250-x.x.x
250-PIPELINING
250-SIZE 34044240
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
> STARTTLS
454 4.7.0 TLS not available due to local problem
Connection closed by foreign host.
En el log de postfix podemos ver la oscura razón:
postfix/smtpd[6376]: warning: cannot get RSA private key from file "/etc/postfix/smtpd.pem": disabling TLS support
postfix/smtpd[6376]: warning: TLS library problem: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:x509_cmp.c:340:
Tras varias vueltas resulta que efectivamente los certificados que está mirando son distintos, el problema se encontraba en que habia puesto el certificado de las CA intermedias antes que el certificado del propio servidor. Aquí hay una guía muy completa sobre la instalación en postfix, reproduzco algunas partes:
openssl x509 -noout -modulus -in cert.pem | openssl md5
(stdin)= d467b8860d03aec22ad97eed3d77cac2
openssl rsa -noout -modulus -in key.pem | openssl md5
(stdin)= d467b8860d03aec22ad97eed3d77cac2
Ambos modulos deberian coincidir, si no coinciden o nos hemos liados con los archivos o como yo hemos pegado el certificado incorrecto primero :)

marzo 25, 2017

Visual Studio Code indentation guides color

Primero activamos que se muestren las guias en settings.json:
  // Controls whether the editor should render indent guides
  "editor.renderIndentGuides": true,
Luego en el Color Theme que tengamos activo, editamos el color de la key: guide tal que así:
<plist version="1.0">
<dict>
  <key>name</key>
  <string>Monokai Yggdrasil</string>
  <key>settings</key>
  <array>
    <dict>
      <key>settings</key>
      <dict>
        <key>background</key>
        <string>#23241F</string>

        <!-- Color del cursor del editor -->
        <key>caret</key><string>#FF0000</string>

        <!-- Color de la guía del editor -->
        <key>guide</key><string>#303030</string>

marzo 15, 2017

Script de migracion de Gnome Terminal para Ubuntu 16.04 LTS

La migración de Ubuntu siempre trae sorpresas, esta vez ha sido no poder recuperar la configuración del Gnome Terminal y que no haya ninguna herramienta que lo haga cuando es relativamente sencillo, han pasado de gconf (un sistema de configuración mediante archivos xml) a dconf (sistema de db por clave en bajo nivel).

El script lee un directorio con los xml viejos (normalmente en /home/user/.gconf/apps/gnome-terminal) y los instala en el nuevo sistema pasandole un dump de la nueva config en un formato que dconf entiende.

python gterminal_tool.py --load-current-profiles --skip-duplicate-names \
    --load-gconf-profiles-from homefolder_backup/.gconf/apps/gnome-terminal \
    --execute-delete --execute-action

De paso permite también la alteración de uno o mas parámetros de todos los perfiles, que importamos o existentes al mismo tiempo.

python gterminal_tool.py --load-current-profiles --set="font='Consolas 13'" \
    --set="default-size-columns=170" --set="default-size-rows=50" \
    --execute-delete --execute-action
El código para descargar en github:

https://github.com/fcosantos/gnome-terminal-migrate