Générer une paire de clé RSA avec openSSL

Pour générer la clé privé, on utilise l’action genrsa de openssl (voir le man genrsa pour plus de détails), la taille de la clé privée ici est de 2048 bits ce qui assure une niveau de sécurité acceptable pour des utilisations civiles (authentification, signature…) :

openssl genrsa -aes256 2018 >private.pem

Ensuite pour extraire la clé publique de la clé privé, on utilise l’action rsa (voir le man rsa pour plus de détail) :

openssl rsa -in private.pem -pubout > public.pem

Mémo postgresql

Quelques raccourcis sur le client psql

\l : lister toutes les bases

\c <base> : se connecter à la base <base>

\dt : lister les tables de la base courante

\d : quitter le client

\du : lister les roles

Créer une base et son utilisateur

CREATE DATABASE my_db;
CREATE USER my_username WITH encrypted password 'my_pass';
GRANT ALL ON DATABASE my_db to my_username;

Requête dynamique en plsql

Le but est de requêter une table dont le nom est récupéré depuis la colonne d’une autre table.

CREATE OR REPLACE FUNCTION ressource.getRessource(integer)
  RETURNS character varying AS
$BODY$
DECLARE
    ressource RECORD;
    name_list RECORD;
BEGIN
  BEGIN
    FOR name_list IN (SELECT id, name FROM table_index)
    LOOP
     EXECUTE 'SELECT * FROM  ressource.' || quote_ident(name_list.name) || ' as t where t.id = '|| $1 
     INTO ressource;
     EXIT WHEN FOUND;
    END LOOP;
  END;
RETURN ressource;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Get rid of « error PANIC: could not locate a valid checkpoint record »

Sur Postgresql 9.6, il est possible de forcer la suppression des xlogs (avec une possible perte des transactions) :
pg_resetxlog -f DATADIR
En s’assurant que DATADIR est le chemin vers le repertoire de la bdd.
Sur Debian Strech :

  • il faut lancer pg_resetxlog en étant connecté avec le user « postgres »
  • pg_resetxlog n’est pas dans le PATH du user
  • pg_resetxlog se trouve dans /usr/lib/postgresql/9.6/bin

Pour plus de détails : http://www.postgresql.org/docs/current/interactive/app-pgresetxlog.html

Faire un full backup sans interruption client sur un serveur standalone

Il est important de comprendre que postgresql bufferise les transactions et qu’une copie brute force des données du disque (avec un dd ou autre) ne suffit pas à garantir la cohérence d’un backup. Ces buffers sont liés à la notion de checkpoint, ceux sont eux qui permettent d’identifier quand un ensemble de transaction a été effectivement écrit sur le disque. Avec l’activation de l’archivage dans des WAL, on peut récupérer l’ensemble des transactions qui sont en attente dans un fichier (le WAL).

Donc un backup complet doit se composer des données brutes et des WAL qui se sont accumulées pendant la copie des données brutes. Avec une réplication sur un standby on reste sur la même philosophie.

Cette solution est basée sur un export des backups sur une machine distante via rsync, il faut donc avoir préparé les accès ssh pour le user postgres entre les machines pour que tout fonctionne.

Voici les paramètres du fichier de conf postgresql.conf qui sont nécessaires :

wal_level = replica                     # minimal, replica, or logical
checkpoint_timeout = 1min               # à règler en fonction de la charge de la base
max_wal_size = 1GB
min_wal_size = 80MB
checkpoint_completion_target = 0.5      # checkpoint target duration, 0.0 - 1.0
checkpoint_flush_after = 256kB          # à règler en fonction du type de disque (SAN, disque virtuel...)
checkpoint_warning = 30s                
archive_mode = on
archive_command = 'test ! -f /var/lib/postgresql/backup_in_progress || (test ! -f /data/db_backup/archive/%f && cp %p /data/db_backup/archive/%f)'
# si vous voulez gzipper les WAL: (attention a bien dezipper lors du restore sinon postgres ne verra pas les WAL
# archive_command = 'test ! -f /var/lib/postgresql/backup_in_progress || (test ! -f /data/db_backup/archive/%f && gzip < %p > /data/db_backup/archive/%f)'

Ensuite voici un script qui lance le backup à bas niveau et la copie les WAL en attente. Voir les commentaires pour les explications :

#!/bin/bash
set -x

SYNCUSER=postgres
TARGET=backup_server
TARGET_BACKUP_FOLDER_NAME=backup_b

OLD_PWD=`pwd`
# fichier drapeau qui indique a postgres si il doit archiver ou non les WAL, fichier defini dans le parametre archive_command lui meme defini dans postgresql.conf
FLAG_FILE=/var/lib/postgresql/backup_in_progress

BACKUP_PATH=/data/db
DATA_FOLDER_NAME=main
DATA_PATH=/var/lib/postgresql/9.6/$DATA_FOLDER_NAME
# idem le repertoire d'archive est defini dans le archive_command
ARCHIVE_FOLDER_NAME=archive

DATE=`date +%F%T`

echo "Démarrage backup $DATE"
# demarre l'archivage des fichiers WAL
touch $FLAG_FILE

# demarre le buffering des transactions dans des WAL 
psql -c "select pg_start_backup('backup_$DATE');"

echo "Copie des données"
# copie bas niveau de tous les fichiers de données de postgresql sur le distant 
cd $DATA_PATH/..
rsync -aivz --delete --exclude postmaster.pid --exclude postmaster.opts --exclude pg_xlog $DATA_FOLDER_NAME/ $SYNCUSER@$TARGET:$BACKUP_PATH/$TARGET_BACKUP_FOLDER_NAME/ 

# Decommentez la ligne ci-dessous pour simuler un temps d'attente (cela permet de tester que l'injection d'une transaction pendant le backup est bien stocké dans le WAL et effectivement restauré par le script de restoration
# read

# arrete le buffering des transactions
psql -c "select pg_stop_backup();"

echo "copie terminée"
# arrete l'archivage des WAL
rm $FLAG_FILE 

echo "Sauvegarde des transactions en attentes"
# ajout des WAL archivés lors du backup dans le repertoire pg_xlog du backup distant

cd $BACKUP_PATH
rsync -aivz $ARCHIVE_FOLDER_NAME/ $SYNCUSER@$TARGET:$BACKUP_PATH/$TARGET_BACKUP_FOLDER_NAME/pg_xlog/


echo "Base de donnée et WAL sauvegardées sur $TARGET dans $BACKUP_PATH"
DATE=`date +%F%T`
echo "Fin de backup $DATE"
cd $OLD_PWD

Restaurer le backup

Avec une version 9.6 et un standalone, il suffit de lancer ce script pour restaurer la base sauvegardée.

Procédure :

  1. arrêter le service postgresql (il devrait l’être vu que vous voulez faire une restauration)
  2. Lancer le script en tant que user postgres
  3. relancer le service postgresql
#!/bin/bash
#set -x

echo "Make sure postgresql server is down, if not press CTRL+C"
read

SYNCUSER=postgres
TARGET=backup_server
TARGET_BACKUP_FOLDER_NAME=backup_b

OLD_PWD=`pwd`
# fichier drapeau qui indique a postgres si il doit archiver ou non les WAL, fichier defini dans le parametre archive_command lui meme defini dans postgresql.conf
FLAG_FILE=/var/lib/postgresql/backup_in_progress

BACKUP_PATH=/data/db
DATA_FOLDER_NAME=main
DATA_PATH=/var/lib/postgresql/9.6/$DATA_FOLDER_NAME

DATE=`date +%F%T`

echo "Restauration du dernier backup"

echo "Déplacement du repertoire data"
cd $DATA_PATH/..
tar -c $DATA_FOLDER_NAME | gzip > $DATA_FOLDER_NAME_$DATE.tar.gz

echo "Restauration des données"
# copie bas niveau de tous les fichiers de données de postgresql sauvegardés sur le local (inlcus les WAL, cf. script de backup)
rsync -aivz --delete $SYNCUSER@$TARGET:$BACKUP_PATH/$TARGET_BACKUP_FOLDER_NAME/ $DATA_FOLDER_NAME/

DATE=`date +%F%T`
echo "Base de donnée restaurée $DATE, vous pouvez redémarrer le service"

cd $OLD_PWD

Erreur stupide : s’assurer que les WAL ne sont pas compressés quand vous les restaurez dans le répertoire pg_xlog, sinon postgres vous indiquera que le backup n’est pas valide. En effet le WAL pointé par le backup_label porte bien l’id du WAL mais il sera illisible pour postgresql.

Utiliser les expressions dans une query JMESPath sur les retours des appels CLI AWS

Les commandes CLI AWS retournent des objets JSON, bien sûr on peut filtrer le résultat retourné côté serveur avec l’option filter mais l’option query permet de rajouter un filtre sur le résultat retourné côté client.

Je note cette expression pour mémo car l’idée est d’afficher l’objet instance au complet en filtrant sur une propriété qui se trouve 2 niveaux plus bas (on pourrait filtrer directement côté serveur, mais je me dis que ca peut servir) :

$ aws ec2 describe-instances --filter "Name=tag:group,Values=dev" --query "Reservations[*].Instances[?NetworkInterfaces[?VpcId == 'vpc-0173ed49959f3dab0']]" 

Importer une découpe de texte réalisée avec Inkscape dans Scribus

Lorsque l’on importe un objet vectoriel réalisé avec Inkscape dans Scribus, Scribus affiche une message d’avertissement mais en général l’objet vectoriel est correctement affiché.

Mais avec la découpe suivante, les premiers essais d’import était infructueux. Voici la découpe :

Les tests :

Premier essai : deux bloc textes, application de la découpe et hop on import : échec, seul le second texte est importé.

Deuxième essai : Annuler la découpe précédente, passage du bloc texte de découpe en objet vectoriel (objet vers chemin), le chemin résultant est en fond noir sans contour. Application de la découpe, hop on import : échec.

Troisième essai : Annuler la découpe précédente, passer l objet vectoriel de découpe en fond blanc et le passer au dessus du bloc texte à découper. Hop on import dans Scribus : échec…

Quatrième essai : sélectionner l’objet découpé et le passer en vectoriel (objet vers chemin). Hop on import : succès !

A retenir :

Trois points importants pour que l’import fonctionne :

  • L’ordre des objets : la découpe au dessus de l’objet à découper.
  • La couleur de la découpe : en blanc parce que l’opération de découpe est probablement une multiplication, donc pour conserver les bits, il vaut mieux du 1 (blanc) que du 0 (noir).
  • Passer en chemin le résultat de découpe pour s assurer que la police de caractère n’a plus d’influence lors de l’import

Blender does not detect GPU on Ubuntu 18.10 with an Nvidia card

Make sure your nvidia driver is properly installed

To make sure that the card is properly running within your system, you should run glxgears, it is a small openGL application that can only run properly if you have an openGL card installed :

# glxgears -info
Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.
GL_RENDERER   = GeForce GTX 750 Ti/PCIe/SSE2
GL_VERSION    = 4.6.0 NVIDIA 390.87
GL_VENDOR     = NVIDIA Corporation
GL_EXTENSIONS = GL_AMD_multi_draw_indirect [...]

if you do not see your card here, make sure all nouveau related components are uninstalled (driver, nouveau-xorg configurations…). You should use aptitude to see the dependencies.

Once nouveau is removed, you can install nvidia-xorg conf (search for nvidia with aptitude) and restart X (or reboot)

Make sure Nvidia Cuda toolkit is installed

Blender is using Cuda directive to render the scene, so you need Cuda toolkit to be installed otherwise Blender won’t see your card even if it is properly working.

So install cuda toolkit :

# aptitude install nvidia-cuda-toolkit

restart Blender once installed, and that’s it !

Gérer correctement l’exposition et la colorimétrie lors du rendu dans Blender

Installer le gestionnaire de couleur suivant, en suivant les instructions du « How » :

https://github.com/sobotka/filmic-blender

En complément des explications du site pour réaliser l’installation (qui est très simple : extraire le zip, un déplacement et un  renommage) vous avez le tutoriel de Blender Guru qui démontre bien les défauts de sRGB et les avantages de passer sur un gestionnaire optimisé pour le rendu tel que celui-ci.

 

Set key repetition within lxde

First, identify the code of the key with « xev » (it is an events catcher)

$ xev
[...]
KeyPress event, serial 48, synthetic NO, window 0x3c00001,
root 0x163, subw 0x0, time 280713293, (261,623), root:(263,648),
state 0x0, keycode 116 (keysym 0xff54, Down), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

In this example, the keycode is 116

Use this keycode to enable the repetition on this key with the command « set »

$ set r 116

save this command in .xsessionrc or .xinitrc to keep settings after a restart

Formation « Solution architect associate » sur 3 jours chez TNP : checked !

Cette formation de 3 jours chez TNP a permis de revoir les bases et d’affiner certains sujets (architecture serverless, lambda, dynamoDB…). Avec 1430 nouveaux services ouverts cette année chez AWS, il y avait tout de même de quoi faire en nouveautés intéressantes.

Merci à Oliver Bazatole, le formateur de cette session pour ses conseils avisés.

La certification va suivre…