Petit mémo pour lire une référence de source lumineuse et calculer les lumens nécessaires

Prenons par exemple cette référence :

Ecobasic LED A60 E27 6W 2700K Opale 240V

bon, « Ecobasic » : c’est du marketing ; ensuite « LED » : facile, c’est de la LED (oui, j’ai peiné sur celle-ci). La suite est plus subtile :

  • A60 : c’est la forme et le diamètre de la bulle de verre qui protège la source. Voici la liste des principales formes de bulle :
  • E27 : c’est la forme et la dimension (généralement le diamètre) du système de fixation à l’alimentation électrique (le culot). Voici les principales formes de culot :
  • 6W : la puissance consommée par la source, à ne pas confondre avec le flux lumineux émis. (ici on parle de conso électrique pas de lumière… et oui, par le passé nous n’avions que cette information sur les ampoules… et donc ce n’était pas mieux avant 🙂 ) Cette valeur peut permettre de savoir si votre lampe est de bonne qualité : en faisant le ratio entre votre puissance consommée et le flux lumineux : c’est l’efficacité lumineuse de la source (https://fr.wikipedia.org/wiki/Efficacit%C3%A9_lumineuse_d%27une_source)
  • 2700K : la température de couleur émise par la source dans le cas d’une source ‘blanche’ :
  • Opale : la couleur, on peut aussi avoir un chiffre pour la référence de couleur par exemple : 827.
  • 240V : la tension d’alimentation

Il manque dans l’histoire :

Mémo pour calculer le nombre de lumens à installer dans une pièce.

Je préfère d’ailleurs parler d’ambiance plutôt que de pièce pour ce calcul, car je vois souvent deux ambiances par pièce. (voir l’exemple ci-après)

AmbianceIntensité lumineuse
Tamisée25-50 lux
Détente100-150 lux
Travail ou jeux.200-250 lux
Dégagée / précision des détails350-500 lux

Pour finir le calcul, on applique la règle suivante : lumens = lux * m2

Donc si je veux une ambiance tamisée (25 lux) dans ma chambre de 10 m2, je dois avoir 25 * 10 lumens, soit 250 lumens. Une lampe de chevet avec une source à 250 lumens peut faire le job, mais il faudra surement passer à une ambiance plus « éclairée » type détente pour les matins d’hiver, il faut donc penser à ajouter une ou deux sources (spot encastré, dalle…) pour monter à 1000 lumens (100 * 10) dans la pièce avec si possible une source qui apporte 350 lumens sur l’armoire ou le dressing. On commence à relever ici la problématique du positionnement des sources…

Remarque importante : pensez aux ombres portées

Ce n’est pas parce que vous aurez les lumens calculés précédemment que vous aurez un bon éclairage dans votre pièce. Il faut aussi penser aux ombres portées. C’est tout le travail de la pose des sources et du choix de la forme des flux lumineux. C’est ce que je trouve de plus passionnant dans cet exercice : pensez au travail du technicien lumière sur un plateau de théâtre, chaque pièce est votre plateau… à vous d’éclairer !

Dissolution de Cycélium, mais renfort de Cyblex Technologies

Ayant rejoint Cyblex Technologies en début d’année en tant qu’architecte de la solution Custocy, j’ai décidé de mettre en sommeil Cycélium afin de me focaliser à 100% sur ce projet passionnant. C’est un projet qui pique comme je les aime : relier les mondes du machine learning/data lake, de la threat intelligence, des telcos/réseaux et de l’UX ; tout cela avec des volumétries bien « lourdes » 🙂

Cycélium est donc en sommeil, et Cyblex Technologies en ébullition.

Plus d’info sur Cyblex Technologies ici : https://www.cyblextechnologies.com/

Problème de connexion Samba depuis la maj Ubuntu Studio 20.04 (focal fossa)

Depuis l’installation de la version Focal Fossa, j’ai perdu l’accès à ma mon imprimante réseau partagé via Samba. Le problème est simplement identifié en essayant de lister les services mis à disposition par le serveur samba distant:

# smbclient -A ~/auth.smb -L 192.168.1.1
protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED

// Test en forcant le protocol 

# smbclient -m smb2 -A ~/auth.smb -L 192.168.1.1
protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED

Le problème vient du fait que le protocol nt1 n’est plus proposé par le client samba dans cette version Ubuntu (ce qui est plutôt une bonne chose compte tenu de ses failles de sécurité). Mais si votre serveur n’est pas upgradable vous devez forcer votre client samba à utiliser le protocole nt1. Pour ce faire, ajoutez ceci à la config samba dans le fichier /etc/samba/smb.conf :

[global]
client min protocol = NT1

Nouvelle tentative :

# smbclient -A ~/auth.smb -L 192.168.1.1

	Sharename       Type      Comment
	---------       ----      -------
	EPSON AL-M2000  Printer   
Reconnecting with SMB1 for workgroup listing.

	Server               Comment
	---------            -------

	Workgroup            Master
	---------            -------
	WORKGROUP            SAMBA_SERVER

Effectivement, le problème est résolu.

Une bonne référence pour l'intégration CUPS et Samba : https://wiki.debian.org/fr/SystemPrinting

Monter une connexion VPN Fortinet sur debian ou ubuntu

Fortinet fournit un paquet client clé en main mais il n’est pas open source et pas forcément compatible avec votre version de distrib. En revanche le paquet openfortivpn est open source (sur GIT) et disponible dans les dépôts debian et ubuntu.

sudo apt install openfortivpn

Voici un exemple d’utilisation dans le cadre d’une authentification username/password :

openfortivpn <ip_gateway_forti>:<port_forti> -u <username> --use-syslog --pppd-ifname=<network_interface> --trusted-cert <cert>

le <cert> est délivré :

  • soit par l administrateur
  • soit lors d’un premier appel sans l’option cert et l’option use-syslog. (dans ce cas assurez-vous que votre réseau n’est pas détourné)

Pour simplifier la chose vous pouvez enregistrer votre configuration dans le fichier /etc/openfortivpn/config

Intégration dans le network-manager

En prime, il est possible de l’intégrer dans le network manager. Pour cela, installez les paquets suivants :

sudo apt install network-manager-fortisslvpn

Avec ce paquet, la configuration du VPN est possible via l’interface graphique et il est possible de monter/démonter le VPN en 1 clic et d’inclure des options de configuration DNS spécifiques pour chaque VPN.

Problème lors de la création d’une nouvelle connexion

si le bouton « save » est grisé, c’est probablement qu’il vous manque une lib. Pour identifier le problème, lancez l’editeur de connexion via une console, vous verrez passer les logs d’erreur dans la console.

sudo nm-connection-editor

Donner les droits de capture de paquets à un binaire sur Centos

Plutôt que donner les droits root à un utilisateur, il est possible de donner des droits spécifique à un binaire (par exemple python). D’un point de vue de sécurité, tous les utilisateurs qui utilisent le binaire possède de ce fait la permission (le contrôle de l’usage du binaire est alors nécessaire…)

 setcap cap_net_raw,cap_net_admin=eip /bin/python2.7

Règler un XMP télémécanique

 Le réglage s’effectue en agissant sur l’écrou A pour obtenir le point haut (pression à partir de laquelle le contact est ouvert, déclenchement) et sur l’écrou B pour régler le point bas (pression à partir de laquelle le contact se ferme, enclenchement).

Le règlage sur B est une augmentation ou une diminution du delta (ou écart sur la doc telemeca) relatif à la pression max définie par A.

Les contacts 1/2 , 3/4 et 5/6 se ferment simultanément.

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']]"