23 Sep 2022, 00:00

Création manuelle d'une clé bootable USB en EFI et en BIOS avec GRUB

Détruit toutes les données sur la clé !
On repère le chemin de la clé USB et on le stocke dans une variable (à adapter) :
DEVICE=/dev/sdX

Paquets nécéssaires

Il faut :
sudo apt install grub-efi-amd64-bin
sudo apt install grub-pc-bin
sudo apt install pmount

Avec table GPT :

Préparation des partitions

Créer table de partition GPT. Créer 3 partitions :

  • 500M FAT32 - drapeau esp (sdX1)
  • 1M non formaté - drapeau bios_grub (sdX2)
  • le reste en fat32 (sdX3)

Puis on les monte :
pmount ${DEVICE}1 efi
pmount ${DEVICE}3 boot

Installation de GRUB pour le mode EFI

Pour l’EFI 64 bits :
sudo grub-install --removable --no-nvram --root-directory=/media/boot --boot-directory=/media/boot --efi-directory=/media/efi --target=x86_64-efi

Ceci installe les exécutables efi SHIM (BOOTX64.efi) et GRUB (grubx64.efi) dans la partition EFI, avec un fichier de configuration minimaliste (grub.cfg) qui va définir le chemin des ressources et configuration de GRUB sur la 3e partition.
Ceci installe aussi les ressources (modules, police etc) de GRUB dans le dossier /boot/grub de la partition principale.

Je n’ai pas réussi à faire fonctionner shim (écran bleu “Boot restoration)”, donc je le désactive pour l’instant, et tant pis pour le secureboot :
mv /media/efi/EFI/BOOT/BOOTX64.EFI /media/efi/EFI/BOOT/BOOTX64.EFI.SHIM && mv /media/efi/EFI/BOOT/grubx64.efi /media/efi/EFI/BOOT/BOOTX64.EFI

Installation de GRUB pour le mode BIOS

Ceci semble fonctionner sans créer une table hybrid-mbr. On installe donc simplement GRUB sur le disque :
sudo grub-install --removable --no-nvram --root-directory=/media/boot --boot-directory=/media/boot --target=i386-pc ${DEVICE}

S’il y’a une erreur liée aux listes de blocs, c’est que le drapeau bios_grub n’a pas été positionné sur la 2e partition.

Configuration

Grub devrait alors pouvoir démarrer, mais n’est pas configuré ! On va donc créer un fichier de configuration minimaliste, simplement pour vérifier que la clé est bien démarrable :

cat > /media/boot/grub/grub.cfg <<EOF
insmod efi_gop
insmod font
insmod gfxterm
insmod png
loadfont /grub/fonts/unicode.pf2
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm

search.fs_uuid AAAA-AAAA efi
search.fs_uuid BBBB-BBBB root

menuentry "Tetrefis" {
        insmod chain
        chainloader (\$root)/grub/EFI-loaders/tetris.efi
}
EOF

On met les bonnes valeurs d’UUID :

sed "s/AAAA-AAAA/$(/usr/sbin/blkid -s UUID -o value ${DEVICE}1)/" /media/boot/grub/grub.cfg -i
sed "s/BBBB-BBBB/$(/usr/sbin/blkid -s UUID -o value ${DEVICE}3)/" /media/boot/grub/grub.cfg -i

On peut enfin démonter les 2 partitions :
pumount efi && pumount boot
et tester la clé.

GRUB devrait alors être bootable et afficher le menu (même si l’entrée est actuellement non-fonctionnelle). Pour plus de détails sur la configuration de GRUB et le démarrage de différents systèmes (exécutables EFI, noyaux linux, ISOs etc), voir un prochain article.

31 Aug 2022, 00:00

Réinitialiser un SSD

SATA:

Détruit toutes les données sur le disque

Si plantage pendant la procédure, le disque peut être rendu inutilisable !

Ne PAS utiliser via adapt USB, peut mener à un disque briqué. Uniquement SATA directement.

Ici, sous Debian Bullseye. Peut être différent sous d’autres versions de hdparm.

https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase

Principe :

  • mettre un mot de passe ATA sur le disque
  • lancer la commande ATA Secure Erase

Ainsi toutes les cellules sont marquées vides et les perfs reviennent

Commandes :

device=/dev/sdX

  • démonter toutes les partitions du disque

sudo umount ${device}*

  • vérif si security est pas frozen, et si security-erase-enhanced est supporté :
sudo hdparm -I $device | grep -Ei 'security|frozen|locked|erase|enhanced|enabled|supported'

donne

Security: 
       Master password revision code = 65534
               supported
       not     enabled
       not     frozen
               supported: enhanced erase

Si “frozen”, on peut essayer de mettre en veille puis réveiller le pc.

  • on setup le password “p”
sudo hdparm --user-master u --security-set-pass p $device
  • on vérifie que le mot de passe est bien pris en compte
sudo hdparm -I $device  | grep -Ei 'supportsecurity|frozen|locked|erase|enhanced|enabled|supported'

donne

Security: 
       Master password revision code = 65534
               supported
               enabled
               supported: enhanced erase
  • on lance la commande ATA Secure Erase (Enhanced si disponible)
    ATTENTION NE PAS INTERROMPRE L’OPERATION SOUS PEINE DE BRIQUER LE DISQUE
time sudo hdparm --user-master u --security-erase-enhanced p $device

## ou 
time sudo hdparm --user-master u --security-erase p $device

Ceci a mis environ 30 secondes pour un SSD Crucial de 500Go, 80s pour un ssd intel de 180Go et ~10h pour un HDD de 6To.

Pour nvme ? https://superuser.com/questions/1530363/how-to-securely-erase-an-nvme-ssd

apt-get install nvme-cli

nvme list

nvme format -s1 /dev/nvmeXn1

29 Aug 2022, 00:00

Généralités audio

Signal symétrique ou asymétrique

Un signal asymétrique circule sur une paire de fils, la masse et le signal (+). Il est simple, mais est relativement sensible aux perturbations éléctromagnétiques.

Un signal symétrique circule sur 3 fils, la masse, le signal (+) et le “négatif” du signal (-). Ceci nécessite 1 cable supplémentaire, mais permet d’effectuer une addition des 2 signaux, ce qui annule les perturbations.
Il permet aussi de couvrir des distances + longues sans trop de perte de signal.

On peut convertir un signal asymétrique en signal symétrique (et vice-versa) via un boîte de direct (ou DI, direct injection box).
https://www.projethomestudio.fr/boitiers-direct-di-guide/

Câbles et appareils

Un câble à 3 parties (XLR ou jack TRS) permettra de transporter indifféremment 2 signaux asymétriques (stereo) ou bien 1 signal symétrique.

Il faut toutefois que les appareils en émission et en réception soient prévus pour générer et recevoir le même type de signal. Si on branche une source symétrique sur une réception stereo, une enceinte recevra le signal “normal”, et l’autre enceinte recevra le même signal avec une polarité inversée, ce qui devrait créer un rendu assez peu agréable.
Il faut donc vérifier clairement le type de signal prévu pour chaque connecteur !

https://www.bax-shop.fr/blog/cable/les-connexions-symetriques-et-asymetriques-expliquees/ https://www.formation.crossmediavignon.fr/Les-connecteurs-audio.html

Niveau des signaux

https://www.projethomestudio.fr/niveau-ligne-micro-instrument/

Tous les appareils ne génèrent pas le même niveau de signal (en dBV).

Le niveau microphone est particulièrement faible. Il doit être amené au niveau ligne par un préampli.
Le niveau instrument correspond au niveau de sortie des guitares et basses électriques. Il doit aussi être amené au niveau ligne.
Le niveau ligne (line) est le niveau de la plupart des synthés, ordis etc, ainsi que pour la connexion de différents appareils de sonorisation entre eux.

Il est important de brancher une source sur une entrée adaptée à son niveau de signal.

Il y’a en réalité 2 niveaux ligne : le niveau des appareils grand public (-10dBV) et le niveau des appareils pro (+4dBU). On peut utiliser des boitiers pour convertir de l’un vers l’autre (mais la conversion du niveau grand public vers le niveau pro va amplifier aussi le bruit).

XLR

Câble majoritairement utilisée pour les micros, et le branchement des enceintes sur la table de mixage.
Le signal voyage toujours du côté femelle vers le côté mâle (du point de vue du câble).

Il y’a le plus souvent 3 cables : la masse, le point chaud (+) et le point froid (-).
Ceci permet de faire circuler un signal symétrique, ou bien 2 signaux asymétriques (et donc de la stereo, même si en pratique ce n’est quasiment jamais utilisé ainsi).

Il y’a parfois seulement 2 câbles soudés : la masse et point chaud, (+).
Le cable est alors dit asymétrique (car uniquement capable de transporter un signal asymétrique) ; il sera moins cher, mais offre moins de possibilités.

JACK

3.5mm : format écouteurs. Les prises sont uniquement asymétriques : soit 2 parties (masse/signal mono), soit 3 (signal/droite/gauche).

6.5 mm : format guitares. 2 versions : câble TS (tip/sleeve) à 2 parties, ou TRS (tip/ring/sleeve) à 3 parties. Utilisé pour de la connexion symétrique ou de la connexion stéréo, en fonction des appareils/prises.

Enceintes

Les enceintes de monitoring sont des enceintes dont le son est prévu pour être le + neutre possible, contrairement à des enceintes hifi, dont le son est arrangé pour donner une couleur particulière.

Micros

Micros statiques (ou à condensateur) -> besoin d’alim fantôme. Il faut toujours brancher le micro à la table/carte AVANT d’allumer l’alim fantôme.
Micros dynamiques : pas besoin alim fantôme mais ne devrait pas poser problème ? Micros à ruban : alim fantôme dangereuse ?

Table de mixage

PFL : pré-fade listen -> le niveau de signal avant le fader général de la piste.

https://www.bax-shop.fr/isolateur-de-boucle-de-masse/art-dti-isolateur-de-boucle-de-masse#reviews

29 Aug 2022, 00:00

Supprimer un profil de domaine d'un poste connecté au domaine

Depuis un compte administrateur local, qui n’est PAS le compte que l’on souhaite supprimer du poste, aller dans les propriétés système -> Paramètres système avancés -> Profile des utilisateurs -> Paramètres.

On peut y supprimer les profils, y compris les profils issus d’un domaine.

20 Aug 2022, 00:00

Notes sur shell (sh)

Cet article se concentre sur les fonctionnalités des shells POSIX (notamment sh).

Debug

On peut mettre au début du script (ou en argument du shebang) ces directives :
set -x : toutes les commandes exécutées sont inscrites sur le terminal (standard error) avant leur exécution (avec un + en tête de ligne)
set -v : chaque ligne lue est inscrite sur le terminal (standard error)

Il me semble que ce sont des commandes “built-in” de bash ; toutefois cela semble fonctionner même si le shebang du script est /bin/sh.

Code de retour

Chaque commande/fonction exécutée renvoie un code de retour (exit code, ou encore code de retour), qui indique l’état de réussite de la commande.
C’est un entier de 0 à 255.

Généralement, 0 signifie un succès de l’opération, et tous les autres nombres un échec.

On peut définir le code de retour d’un script ou d’une fonction avec les commandes return et exit.

return & exit

return et exit servent tous 2 à interrompre l’exécution, et renvoient la valeur passée en argument (ou 0 à défaut d’argument ; et modulo 256 pour exit).
La différence entre les 2 est que return va interrompre la fonction mais rester dans le script, alors que exit va interrompre l’ensemble du script.

Récupérer la sortie d’une commande

Permet de stocker dans une variable la sortie d’une commande (standard output, et non le code de retour ; donc ce qui est affiché dans le terminal en cas d’exécution interactive). C’est la “substitution de commande”, que l’on fait avec la syntaxe
var=$(command)

On voit aussi
var=`command`
mais la première syntaxe est recommandée (notamment pour de l’imbrication de substitution, voir cette page ).

Si on récupère la sortie d’une fonction, cela contiendra la succession de toutes les sorties des commandes de la fonction.

Le retour $? d’une substitution correspond au retour de la commande/fonction, et non au retour de l’affectation de la variable.

Quelques symboles spéciaux

https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables

$# : le nombre d’arguments
$1 : premier argument ; $2 : le 2e argument, etc…
$? : code renvoyé par la dernière commande executée ; renvoie 0 si aucune commande précédemment executée dans ce contexte (au sein d’un script, ou d’une session bash)
$@ : liste sous forme de vecteur de tous les paramètres : {$1, $2, $3 …}
$$ : PID du shell actuel
$IFS : séparateur de champ (actuel, car peut être changé)
$0 : nom de la commande ou du script shell

[ et test

En shell, [ est une commande ; c’est un alias de la commande test.
Celle-ci renverra vraie si la chaîne fournie est non-nulle, ou bien si l’affirmation qui suit est vraie.

[[ est une spécificité bash, et ne fonctionne pas en sh.

Arithmétique

bash possède des fonctions d’arithmétique avancées, mais ce n’est pas le cas de sh.
En shell POSIX, on peut utiliser la command expr. Par exemple :

a=1
a=$(expr $a + 1)
echo $a

qui donne 2.
Il faut bien penser à mettre les espaces autour du symbole +

Pour voir la liste des opérateurs : man expr
ou cette page.

Fonction

Déclaration :

myfunction () {
  echo $1
  echo $2
  return 0
}

À défaut de code de retour explicitement spécifié, la fonction retournera le retour de sa dernière commande exécutée.
Les paramètres de position ($1, $2 etc) sont ceux de l’appel de la fonction.

Utilisation :
myfunction 1 2 3

EN bash, on peut spécifier le mot clé “function” avant le nom de la fonction, mais ceci n’est pas reconnu en POSIX shell.

Portée

Il semble que les variables définies dans une fonction restent accessibles même après la sortie de la fonction (les variables sont par défaut globales).

Par exemple :

myfunction () {
  echo $a
  b=2
}

a=1
myfunction
echo $b

affichera “1 2”.

À l’inverse,

myfunction () {
  echo $a
  local b=2
}

a=1
myfunction
echo $b

affichera uniquement 1, la variable b étant définie localement.

if

Sous la forme
if [ blabla ]; then echo YES; fi
la condition if sera validée si test blabla renvoie 0. Par exemple blabla est une chaîne non-nulle ; ou encore blabla est une opération logique qui est vraie (par exemple 1 -eq 1, ou "abc" = "abc").

Sous la forme
if command ; then echo YES; fi
la condition sera validée si la commande/fonction “command” renvoie 0.
La commande “command” sera exécutée, et sa sortie affichée si applicable.

20 Jul 2022, 00:00

Désactiver les touches mortes (dead keys)

Très inspiré de cet article.

Les touches mortes sont des touches modificatrices qui, seules, ne produisent pas d’entrée clavier. Elles doivent être suivies d’une autre touche qui sera alors modifiée (par exemple le circonflexe, le backtick qui peut devenir un accent grave etc). Il faut répéter l’appui sur la touche pour obtenir le caractère seul.

Dans mon cas, je souhaite utiliser le backtick lors du premier appui. Pour ceci, il faut déjà identifier l’ID de l’evenement lorsque j’appuie sur la touche en question. Lancer
xev
appuyer sur la touche à paramétrer, et regarder le “keycode”. Pour le backtick, c’est 16.

Ensuite, on vérifie le comportement de cette touche (modifier l’ID si besoin) :
xmodmap -pke | grep " 16 "
qui me donne
keycode 16 = egrave 7 egrave 7 dead_grave Egrave dead_grave

Le “dead_” signifie que la touche se comporte comme une touche morte. Le “grave” signifie le backtick. On remplace donc l’entrée par :
keycode 16 = egrave 7 egrave 7 grave Egrave grave

et le backtick s’affiche directement lors du premier appui !

Je suppose que ce réglage ne tient pas un reboot, voire une déconnexion de session. À vérifier.

20 Jul 2022, 00:00

Gestion des onduleurs sous Linux : NUT

Ressources en vrac

Doc debian-fr.xyz
Doc officielle Debian
Doc ArchLinux
Doc Ubuntu, un peu vieille
https://ignace72.eu/utiliser-un-onduleur-eaton-sur-gnu-linux.html

Présentation

NUT (Network UPS Tools) est un ensemble de logiciels qui servent à surveiller les onduleurs et réagir à leur état. Il y’a :

  • le démon nut-driver (commande upsdrvctl) qui communique avec l’onduleur
  • le démon nut-server (commande upsd) qui permet de répondre à des requêtes (locales ou réseau)

Ces 2 démons doivent être lancés sur le poste qui communique en USB avec l’onduleur.

  • le logiciel upsc qui va interroger les démons upsd (en local ou sur d’autres postes)
  • le démon upsmon qui permet d’interroger différents démons upsd et lancer des alertes

Dépôt git du projet

Dans l’exemple ici, il y’a un seul pc qui contrôlera NUT et qui sera relié à l’onduleur ; on ignore donc toutes les configurations réseau.
L’onduleur utilisé est un Eaton Ellipse ECO 800.

Install de NUT et vérification du branchement de l’onduleur

apt install nut
sous Debian.
C’est un paquet virtuel qui dépend de nut-client et nut-server.
nut-client contient entre autres les exécutables upsc, upscmd, upsmon.
nut-server contient entre autre upsd, upsdrvctl.

Brancher l’onduleur via USB.
lsusb donne :
Bus 006 Device 005: ID 0463:ffff MGE UPS Systems UPS

On peut vérifier que le fichier appartient bien au groupe nut (adapter les chiffres au résultat ci-dessus) :
ls -l /dev/bus/usb/006/005

Pilote de l’onduleur

sudo nano /etc/nut/ups.conf

Chaque onduleur doit être défini sous la forme

[upsname]
       driver = <drivername>
       port = <portname>

avec éventuellement d’autres options facultatives. On peut mettre auto pour le port. Le champ desc semble être là pour mettre une description plus complète commentaire).

Pour identifier la liste des pilotes en fonction du matériel, consulter cette page.
Pour un Eaton Ellipse Eco 800, c’est usbhid-ups. Si on clique sur le nom du pilote, on accède à ses otions de configuration.

On peut aussi tester la commande nut-scanner, qui renvoie un bloc de configuration auto-detecté (+ d’infos avec sudo).

Cela me donne le bloc suivant à ajouter à la fin du fichier :

[eaton800]
    driver = usbhid-ups
    port = auto
    desc = "Eaton Ellipse ECO 800"

Lancement

On peut vérifier en lançant manuellement :
sudo upsdrvctl start eaton800

Le processus sera visible via
ps aux | grep usbhid

On peut lancer le service
sudo service nut-driver start
mais visiblement, si le service nut-server n’est pas en route, il quitte au bout de quelques secondes.

Configuration du démon upsd

Celui-ci sert à mettre les informations de l’onduleur à disposition de clients.

Lancement manuel

À fin de compréhension et de debug. On peut lancer upsd manuellement avec le chemin
/usr/lib/nut/upsd
La commande upsd intégrée dans le path (/usr/sbin/) est un script qui va lancer la commande ci-dessus uniquement si la configuration du fichier upsd.conf autorise le lancement.

Si on a l’erreur Can't connect to UPS [...] au lancement, c’est probablement que le processus driver (upsdrvctl) n’est pas lancé.
Sinon on doit avoir Connected to UPS [...]

On peut vérifier le bon lancement du processus via
ps aux | grep upsd | grep nut

Lancement via service

Cette méthode permettra le démarrage automatique de l’ensemble des services nut.
sudo nano /etc/nut/nut.conf
mettre MODE=standalone

On démarre le service :
sudo service nut-server start

Utilisateur

Il faut définir (au moins) un utilisateur dans upsd car une authentification sera nécessaire pour effectuer certaines commandes, notamment celles d’upscmd qui permettent de contrôler l’onduleur (bip, extinction etc).

Pour ceci,
sudo nano /etc/nut/upsd.users et ajouter à la fin un bloc par utilisateur, de type :

[myadmin]
        password = mypass
        #allowfrom = localhost
        actions = SET
        actions = FSD
        instcmds = all
        upsmon master

Détail des options : man upsd.users
(ou https://linux.die.net/man/5/upsd.users )
Actuellement (2022), fsd (forced shutdown) et set (définir des variables sur l’onduleur) sont les 2 seules actions.
instcmds sont les options disponibles dans upscmd -l.

Logiciels clients

upsrw ??

upscmd

upscmd permet de s’adresser directement à l’onduleur.

upscmd -l eaton800
pour voir les commandes supportées par l’onduleur (par exemple contrôler le bip, forcer l’extinction etc)

upscmd eaton800 command:enable
pour lancer la commande en question sur l’onduleur

Sur mon Ellipse ECO 800, il semlble que beeper.disable n’ait pas d’effet, et que load.off et shutdown aient le même effet : couper les prises de courant de l’onduleur ET éteindre l’onduleur, le rendant injoignable sans rallumage manuel de l’onduleur.

upsc

upsc permet de s’adresser à un démon upsd.

upsc -L [host]
pour lister tous les onduleurs détectés sur host ; si l’host n’est pas spécifié, c’est localhost.

Si on a le message d’erreur Error: Connection failure: Cannot assign requested address, c’est que upsc n’arrive pas à communiquer avec upsd ; soit que ce dernier n’est pas lancé, soit qu’il n’accepte pas la requête (voir dans ce cas la directive LISTEN du fichier upsd.conf, même s’il me semble qu’il n’est pas nécessaire de la configurer si tout se fait en local sur 1 seul poste).

upsc eaton800[@host]
pour voir les données actuelles de l’onduleur ; on peut quérir un seul attribut en le mentionnant ; par exemple
upsc eaton800 ups.status
qui peut être OL (OnLine, sur secteur), OB (OnBattery)
ou encore upsc eaton800 battery.charge

Si non a l’erreur Error: Driver not connected, c’est que upsc arrive à communiquer avec upsd, mais que upsd n’arrive pas à communiquer avec le pilote (par exemple processus pilote qui a été tué).

Si prise USB débranchée -> “Error: Data stale”

Monitoring automatique - upsmon

upsmon est le composant qui va surveiller l’état de l’onduleur, et lancer des actions selon l’état (surt batterie, batterie critique etc).
On définit au moins 1 onduleur à surveiller :

sudo nano /etc/nut/upsmon.conf

Le fichier documente chaque section.
Il faut une ligne MONITOR par onduleur ; par exemple
MONITOR eaton800@localhost 1 myadmin mypass master

Le “1” correspond au nombre d’alims qui sont alimentés par l’onduleur en question ; pour la plupart des pcs standard, qui n’ont qu’une seule alim, ce sera 1.

On peut toutefois entrer “0” si le pc surveille l’onduleur mais n’est pas branché dessus ; il effectuera les actions d’alerte (mail etc.) mais ne s’éteindra pas en cas de batterie critique. En ca cas, il faut aussi définir la variable MINSUPPLIES à 0 (pour déclarer que le poste peut fonctionner sans aucun onduleur).

master & slave

En général, un poste branché sur l’onduleur ET capable de communiquer avec lui sera considéré comme master ;
Un poste branché sur l’onduleur mais sans communication de données sera considéré comme slave.

En action automatique, un poste master ne s’éteindra que lorsque tous les slaves seront éteints.

NOTIFYCMD

https://networkupstools.org/docs/user-manual.chunked/ar01s07.html

Toujours dans upsmon.conf, on peut définir la commande appelée pour informer l’admin lorsqu’un événement se produit (coupure courant, batterie faible etc). C’est le paramètre NOTIFYCMD.

Cette commande ne sera exécutée que pour les alertes possédant le flag EXEC !! (voir plus bas)

Ce peut être un script custom, ou bien le planificateur intégré à NUT (upssched). Le message de l’événement sera envoyé à cet exécutable en tant que 1er et seul argument.

Penser aux droits d’accès ! La commande sera exécutée par l’utilisateur nut (sur Debian), il doit pouvoir y accéder en exécution.

NOTIFYMSG

Permet de personnaliser le message associé à chaque alerte.

NOTIFYFLAGS

Définit le type d’actions à effectuer pour chaque type d’alerte. Il y’a :

  • WALL : prévient chaque utilisateur sur le système
  • SYSLOG : inscrit dans le syslog
  • EXEC : lance la commande définie à NOTIFYCMD
  • IGNORE : ne rien faire

Il faut noter FLAG+FLAG+FLAG, par exemple
EXEC+SYSLOG+WALL

Lancement via service

sudo service nut-client start

upssched

upssched est un script qui permet de gérer la planification des alertes plus finement. Par exemple de définir un délai avant de déclencher l’alerte, pour ne pas êztre prévenu en cas de micro-coupure de courant.
On le configure via le fichier /etc/nut/upssched.conf.

Je n’aborde pas son usage ici.

GUI

nut-monitor
nut-cgi (interface web)

Journaux et contrôle des services

Voir les journaux de nut-driver (upsdrvctl) :

sudo journalctl -u nut-driver
sudo service nut-driver status

Voir les journaux de nut-server (upsd) :

sudo journalctl -u nut-server
sudo service nut-server status

Voir les journaux de nut-client (nut-monitor, upsmon) :

sudo journalctl -u nut-monitor
sudo service nut-monitor status
sudo service nut-client status

sudo service ups-monitor ??

20 Jul 2022, 00:00

Notes sur Powershell

Version

$PSVersionTable.PSVersion

Profils

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.3

Les profils sont un peu l’équivalent du .bashrc pour bash.

echo

echo bidule est équivalent à 'bidule'

Variables

Affecter un nombre
$myvar = 1.1

Affecter une chaîne :
$myvar = "Chaîne de caractères"

Affecter plusieurs valeurs (vecteur ?) :
$myvar = 1,"chaine",3

Afficher une variable :
$myvar

Test si variable vide :
if ($myvar) { echo 'not empty' } else { 'empty' }

Variables d’environnement

Obtenir la liste :
dir env:

Utiliser une variable d’env spécifique (ici username) :
$env:username

Lancer Powershell à partir d’un script bat

Dans le script :
powershell -command myPScommand
Les variables affectées dans le script bat sont disponible sous PS dans les variables d’environnement

Langue des messages

on peut changer la langue d’affichage des messages (à l’échelle d’une seule commande) via la syntaxe :
[cultureinfo]::CurrentUICulture='en-us'; myPSCommand
(remplacer myPSCommand par la commande à exécuter)

Encodage

L’encodage par défaut n’est pas UTF-8 (il me semble que c’est UTF-16).
Pour le changer, par exemple avec get-content, il y’a l’option -encoding utf8.

Si cette commande est lancée via un bat, et le résultat utilisé, il faudra changer l’encodage dans le script bat pour qu’il passe en UTF-8 :
chcp 65001

Modules

https://learn.microsoft.com/en-us/powershell/scripting/developer/module/understanding-a-windows-powershell-module?view=powershell-7.4

Peuvent être sauvegardés en tant que fichier .psm1 (script module).
Peuvent aussi être fournis sous forme de code .Net compilé, en tant que fichier .dll.
Les manifestes de modules sont stockés en tant que fichier .psd1.

Get-Module : liste les modules actuellement importés.
Get-Module -ListAvailable : liste tous les modules actuellement installés (avec leur emplacement)
Get-InstalledModule : liste les modules qui ont été installés via install-module (il me semble)

install-module -Name modulename
Demandera à installer NuGet si absent.

uninstall-module ModuleName : pour désinstaller le module

import-Module ModuleName
pour importer le module (rendre les commandes disponibles)

Exemples de modules :

  • MicrosoftTeams
  • PowershellGet

Lister les dépôts :
Get-PSRepository

Si message d’erreur :
AVERTISSEMENT : Unable to resolve package source 'https://www.powershellgallery.com/api/v2

Il faut forcer TLS 1.2. Pour ceci :
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Ceci force TLS1.2 pour la session PS actuelle uniquement. Pour le forcer par défaut, on peut utiliser une clé de registre (force pour Powershell) :
HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\ et créer une clé DWORD SchUseStrongCrypto avec la valeur 1.
Pour les apps 32b sur un OS 64b, on peut aussi créer la même clé à cet emplacement :
HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319

https://learn.microsoft.com/en-us/mem/configmgr/core/plan-design/security/enable-tls-1-2-client
https://www.inflectra.com/support/knowledgebase/kb510.aspx

29 May 2022, 00:00

Notes sur locate

La commande locate est fournie par plusieurs paquets, notamment mlocate puis plocate, qui prennent notamment en charge l’option de configuration PRUNENAMES.

L’installation du paquet crée une tache cron dans /etc/cron.daily. On peut la désactiver via chmod -x /etc/cron.daily/mlocate ou chmod -x /etc/cron.daily/plocate.

locate -i pour ne pas prendre la casse en compte.

Pour voir tous les fichiers indexés, on peut faire un locate /.

23 May 2022, 00:00

FTP - passif ou actif

Très bonne lecture : http://slacksite.com/other/ftp.html

En succint :

FTP utilise 2 canaux de communication : commande (C) et données (D). FTP n’utilise que du TCP, jamais d’UDP.

Mode actif

En mode actif, le client contacte le serveur via le canal C. Le serveur est alors autorisé à lui répondre via le même canal.

Le serveur contacte ensuite le client sur le canal D. (le serveur initie la connexion, il est actif).
Le client n’ayant “rien demandé” sur ce canal, le message est très probablement rejeté (par le pare-feu ou routeur du client).

Mode passif

Pour palier à ce problème, lorsque le client initie la connexion sur le canal C, il dit “PASV” (un genre de “j’ai besoin qui tu sois passif, tu n’arriveras pas à me joindre sinon”).
Le serveur crée alors une nouvelle “ouverture” pour le canal D, dont il informe le client, et c’est à nouveau le client qui initie la connexion sur le canal D.

Le serveur est passif, en ceci qu’il n’est à l’origine d’aucune connexion.

Plus de détails

En mode actif, les ports des canaux C et D par défaut sont :

  • serveur : 21 et 20
  • client : 2 ports random >1023 (N et N+1)

Côté serveur, il me semble que seul le port 21 a besoin d’être ouvert dans le pare-feu/routeur.

A compléter

En mode passif, il faut définir une fourchette de ports qui pourront être utilisés par le serveur pour recevoir des connexions (apparemment 1 port par connexion pourrait ne pas suffire).
Il faut ouvrir ces ports dans le pare-feu/routeur.

Une explication de pourquoi le serveur n’utilise pas le port 20 en mode passif.
En gros, dans le canal de données, rien n’identifie le client à part le port utilisé.