01 Jan 0001, 00:00

Création du conteneur

docker-compose.yml avec

image: mariadb
container_name: "my-db-container"

Variables d’environnement

environment:
  MARIADB_ROOT_PASSWORD=blabla1
  MARIADB_USER=myuser
  MARIADB_PASSWORD=blabla2
  MARIADB_DATABASE=my-database

Vont respectivement définir le mot de passe root, créer un user avec un password, et créer une base de données.
Le user créé pourra se connecter depuis n’importe quel hôte, et aura les droits complets sur la base créée.

J’ai l’impression qu’elles ne sont utilisées que si aucune base de données (volume) n’existe déjà. Par la suite, elles n’ont aucun effet.

Configuration

Les fichiers de configuration, à l’intérieur du conteneur, donc dans
/etc/mysql/
/etc/mysql/my.cnf est un lien vers /etc/alternatives/my.cnf qui est un lien vers /etc/mysql/mariadb.cnf.

On peut lister les options en SQL :
SHOW VARIABLES;
Si on connaît le nom de l’option que l’on cherche on peut faire
SHOW VARIABLES LIKE 'my_config_option';
On peut aussi utiliser le wildcard % :
SHOW VARIABLES LIKE '%option%';

Résolution des noms

Par défaut, la résolution des noms est désactivée dans la configuration MariaDB du conteneur Docker, via la directive skip-name-resolve présente dans le fichier /etc/mysql/mariadb.conf.d/05-skipcache.cnf.

La raison à ceci semble être que le résolveur DNS d’un conteneur est défini uniquement au moment de sa création, et s’il change, le conteneur ne recevra pas les nouvelles informations et n’aura plus de DNS disponible, ce qui ralentira considérablement les requêtes DNS.
Ceci empêche toutefois d’utiliser une syntaxe de type user@conteneur.network pour autoriser les connexions à la base.

Pour changer ce comportement, on peut monter un fichier vide à l’emplacement du fichier de conf :

    volumes:
    - ./config/empty.cnf:/etc/mysql/mariadb.conf.d/05-skipcache.cnf

Connexion à l’interface SQL du conteneur

docker exec -it docker-db mariadb --user root -pblabla1

On arrive sur un shell type
MariaDB [(selected-database)]
Aucune base n’étant initialement sélectionnée, on a
MariaDB [(none)]

On peut directement fournir la commande à exécuter avec
-e 'COMMAND;'

Voir la version

Sur le shell SQL :
SELECT VERSION() ;

Caractères spéciaux

Éviter les points ou tirets. underscore OK.
Si besoin quand même, échapper avec backtick `

Gestion des bases de données

voir les différents bases :
SHOW DATABASES;

Créer une base :
CREATE DATABASE my_database;

Choisir une base pour l’usage courant :
USE my_database;

Supprimer une DB et toutes les tables dedans :
DROP DATABASE my_database;

Gestion des users

Créer un user et restreindre l’accès depuis un domaine :
CREATE USER 'myuser'@'authorizeddomain' IDENTIFIED BY 'my-password'

Si on ne spécifie pas de “authorizeddomain”, alors ce sera %, ce qui semble signifier “tous”.

Lister les users et le(s) domaines qui autorisent leur accès :
SELECT user,host FROM mysql.user;
Ceci va lire le contenu de la table “user” de la base “mysql” (base créée automatiquement au déploiement de MariaDB).

Supprimer un user, ou un accès :
DROP USER 'myuser'@'authorizeddomain';
Si on ne spécifie pas de “@authorizeddomain”, il va supprimer ‘user’@’%’

Voir les permissions d’un utilisateur :
SHOW GRANTS for myuser;

Ajouter des droits complets à un utilisateur :
GRANT ALL ON my_database.* TO 'my-user'@'authorizeddomain';
Les apostrophes semblent poser problème sur le nom de la base de données.
Bien ajouter le .* car les privilèges s’appliquent aux tables.

Gestion des tables

Voir les tables d’une base :
SHOW TABLES; # si DB déjà selectionnée
SHOW TABLES FROM my-database; # si pas encore sélectionnée

01 Jan 0001, 00:00

voir les infos raid d’un device :
mdadm --examine /dev/sdX1

voir le détail d’un raid en cours de fonctionnement :
mdadm --detail /dev/mdX

01 Jan 0001, 00:00

v19.10 ?

AOMEI partition assistant :
capable de cloner un disque bitlocker vers un disque vierge (le disque bitlocker étant deverrouillé)

  • secteur par secteur : la partition reste chiffrée via Bitlocker ; le partitionnement est dupliqué. Il est possible de booter l’OS sur un autre poste à partir du nouveau disque (au moins après avoir déchiffré le disque bitlocker)

  • copy rapide : si le disque source et cible n’ont pas la même table de partition, ne sera PAS corrigé automatiquement, il faut préparer un format de table de partition identique. La partition Bitlocker sera copiée NON chiffrée, mais prendra environ autant de temps qu’une copie secteur/secteur.
    Le disque cible ne sera pas bootable sur un autre poste, erreur de fichiers de démarrage. Une réparation du démarrage par USB semble durer très longtemps (interrompu avant la fin).

01 Jan 0001, 00:00

https://blog.landr.com/fr/quest-ce-que-le-midi-guide-pour-debutant-sur-loutil-le-plus-puissant-de-la-musique/
https://www.pianoweb.fr/comprendre-le-midi.php

MMC (MIDI machine control):
https://en.wikipedia.org/wiki/MIDI_Machine_Control

CC list :
https://fr.audiofanzine.com/glossaire/a.play,word.Control-change.html

Description technique des messages MIDI :
https://www.midi.org/specifications-old/item/table-1-summary-of-midi-message

01 Jan 0001, 00:00

Pruning :

https://gist.github.com/yorickdowne/67be09b3ba0a9ff85ed6f83315b5f7e0 https://docs.nethermind.io/nethermind/ethereum-client/configuration/pruning

01 Jan 0001, 00:00

sudo sed -i "/^mac-address=.*$/d" /etc/NetworkManager/system-connections/*

01 Jan 0001, 00:00

cat : windows, serveur, gpo

Créer : crée le lecteur s’il n’existe pas déjà ; s’il existe, ne fait rien.

Replace : force la suppression puis re-création de l’objet, même s’il n’a pas changé. Pour cette raison, c’est pratique pour forcer un changement (genre nouveau chemin de serveur), mais une fois que tout est en place, il vaut mieux repasser en “update” pour éviter les suppressions régulières du dossier en cours de travail

Update

01 Jan 0001, 00:00

Configuration générale de nginx et configuration en reverse proxy

Installation

apt install nginx

Généralités

nginx -t : vérifie la syntaxe des fichiers de conf
nginx -s reload : recharge les fichiers de conf

:## Main server (vhost) definition

server {
        listen 8080 default_server;        # port and defining it as default server
        # listen 443 ssl default_server;   # for SSL
        root /var/www/html;  # root directory
        index index.html index.htm index.nginx-debian.html; # filenames it might search
        server_name _;  # URL it will respond to ; _ is default
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
}

Reverse proxy

https://www.freecodecamp.org/news/docker-nginx-letsencrypt-easy-secure-reverse-proxy-40165ba3aee2/

Pour rediriger une requête vers un hôte différent

upstream my-service {
  server        my-service-hostname:8080;
}

server {
  listen        8080;
  server_name   my-service.example.com;

  location / {
    proxy_pass  http://my-service;
  }
}

La directive server sert à définir le cas dans lequel la configuration est utilisée : on écoute sur le port 8080, on répond aux requêtes qui demandent my-service.example.com, et dans le cas où on demande l’URL / (ou à un niveau plus bas, du genre /truc/bidule.html, donc dans ce cas précis tous les chemins).
Dans ce cas, via proxy_passon passe la requete à l’hôte (défini via “upstream”) my-service.

La directive upstream sert à définir un hôte contactable par nginx ; il est nommé (dans nginx uniquement) my-service et est accessible via son adresse IP ou nom d’hôte : hostname:port

https://www.linode.com/docs/web-servers/nginx/use-nginx-reverse-proxy/

https://www.thepolyglotdeveloper.com/2017/03/nginx-reverse-proxy-containerized-docker-applications/

01 Jan 0001, 00:00

Vecteurs/tableaux

http://www.ixany.org/docs/Shell_Les_tableaux_en_bash.html
Les tableaux en bash peuvent être indicés ou associatifs. Pour l’instant je ne parle que des indicés.

Déclaration

Espaces indispensables près des parenthèses.

Déclaration implicite avec initialisation :
arraytest=( a b c )

Déclaration explicite :
declare -a tableau_indi
(ou pour un tableau associatif :)
declare -A tableau_asso

Remplacer “declare” par readonly pour un tableau en lecture seule.

Usage

Accolades indispensables.
${arraytest} équivaut à ${arraytest[0]}

Obtenir la première valeur :
echo ${arraytest[0]}

la 2e :
echo ${arraytest[1]}
etc…

Obtenir la liste de toutes les valeurs :
echo ${arraytest[@]}

Obtenir le nombre de valeurs :
echo ${#arraytest[@]}

Ajouter une valeur :
arraytest+=( d )

read

Permet de lire un fichier ligne par ligne, et de récupérer chaque champ.
IFS choisit le séparateur de champs (par défaut espace)

while IFS=\; read -r name domain port options; do
  echo "nom : $name"
  echo "port : $port"
  echo "domain : $domain"
  echo "options : $options "
done < "/my/data/file"

/my/data/file contient :

# name;domain;port;options
imap;mail.example.com;993;;
smtp;mail.example.com;465;;

commentaires dans le fichier

https://unix.stackexchange.com/questions/244465/how-to-make-bash-built-in-read-ignore-commented-or-empty-lines

Pour que read ignore les lignes avec les commentaires, on peut utiliser ça en ligne finale :
done <(sed -e 's/[[:space:]]*#.*// ; /^[[:space:]]*$/d' "/my/data/file")

01 Jan 0001, 00:00

https://www.gnu.org/software/grub/manual/grub/ https://askubuntu.com/questions/751259/how-to-change-grub-command-line-grub-shell-keyboard-layout

Périphériques

Représente un support physique de stockage ainsi qu’une séparation logique (typiquement disque et partition). Doivent être notés entre parenthèses.
Sont de type (hd0,gpt1) la plupart du temps.
https://www.gnu.org/software/grub/manual/grub/html_node/Device-syntax.html#Device-syntax

Chemins

Comprend nécessairement un périphérique puis un chemin absolu.
Par exemple (hd0,1)/boot/grub/grub.cfg
Si on ne spécifie pas le périphérique, alors c’est ($root).

https://www.gnu.org/software/grub/manual/grub/html_node/File-name-syntax.html#File-name-syntax

Variables

set : voir toutes les variables affectées

$root : le périphérique par défaut pour les chemins ; doit être mis entre parenthèses pour être utilisé explicitement. On peut le définir à la volée en demandant une recherche d’UUID.
https://www.gnu.org/software/grub/manual/grub/html_node/root.html#root

$prefix : l’emplacement de “/boot/grub” ; devrait être ($root)/boot/grub https://www.gnu.org/software/grub/manual/grub/html_node/prefix.html#prefix

$cmdpath : l’emplacement contenant l’executable EFI de grub (peut ne contenir que le disque dans certains cas) https://www.gnu.org/software/grub/manual/grub/html_node/cmdpath.html#cmdpath

On peut créer des variables perso avec la syntaxe var=valeur.

Pour qu’une variable soit conservée lors d’un appel de “configfile” ou quand on rentre dans un sous-menu, il faut l’exporter : export var.a

Commandes

Clavier

https://askubuntu.com/questions/751259/how-to-change-grub-command-line-grub-shell-keyboard-layout insmod keylayouts keymap /boot/grub/bepo.gkb

ls : explore les chemins absolus (doivent commencer par le périphérique, ou alors sur root)
ls -l : + de détails dont UUID pour les périphériques

source : insère le contenu d’un fichier de configuration

configfile : lance un fichier de configuration

Réinstaller GRUB depuis une Debian live

Je pars du principe que tout le système, les partitions, les flags et les UUID (dans le fstab) sont bien en place ; notamment la partition ESP en cas de boot EFI.

Il faut monter la partition / sur un point de montage dans le live ; par exemple /mnt/ .
ATTENTION, si la partition est en btrfs, il est indispensable de monter le subvolume contenant la partition slash (typiquement @ ou @rootfs ) ; monter le toplevel volume et faire les manips sur mnt/@rootfs ne fonctionnera pas ! (erreurs de /dev introuvable notamment)
S’il y a du LUKS impliqué, s’assurer que les conteneurs sont déverrouillés et mappés dans le live, sous le même nom qu’il ne le sont dans le système baremetal.

Ensuite, il faut faire :

cd /mnt/
sudo mount --rbind --make-rslave /dev/ ./dev
sudo mount --rbind --make-rslave /proc/ ./proc
sudo mount --rbind --make-rslave /sys/ ./sys
sudo mount --rbind --make-rslave /run/ ./run
chroot ./

Ensuite, on s’assure que toutes les partitions soient bien montées dans le live :
mount -a

Puis on réinstalle GRUB et on recompile l’initramfs :

grub-install
update-grub
update-initramfs -k all -u
exit

Pour démonter tous les dossiers bindés précédemment :
sudo umount -R ./dev ./proc ./sys ./run