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

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

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

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

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

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é.

07 Feb 2022, 00:00

Gestion fine de la stratégie de mot de passe sur un AD

Sous Windows Server, la stratégie de mot de passe gérée par les GPO est commune à tous les utilisateurs.

À partir de Windows Server 2008 (et 2012 pour l’interface graphique, il me semble), si on veut définir des stratégies plus fines, on peut le faire en passant par les PSO (Password Settings Objects).
Il faut d’abord créer un groupe de sécurité, et y placer les utilisateurs concernés.
Ensuite, ouvrir le Active Directory Admin Center (ADAC) :
dsac.exe
Aller dans domain (local) -> System -> Password Settings Container et faire clic-droit -> Nouveau -> Paramètres de mot de passe.
Donner un nom et une priorité (1 = la + élevée) à la stratégie, régler les paramètres désirés, et choisir le groupe de sécurité précedemment créé dans “S’applique directement à”.

Une fois le PSO créé, il devrait s’appliquer correctement, uniquement aux utilisateurs positionnés dans le groupe, en étant prioritaire par rapport à la stratégie par défaut.

31 Jan 2022, 00:00

Compatibilité DDR DDR-L

La mémoire DDRxL est prévue pour fonctionner à plus bas voltage que la DDRx (par exemple 1.35V pour la DDR3L contre 1.5V pour la DDR3).
Elle est toutefois capable de fonctionner à voltage “complet”.

Donc, la DDRxL peut être mise à la place de la DDRx, mais pas l’inverse. Il faut toutefois, sur une même carte-mère, que toutes les barrettes soient du même type (?).
Pour que le système fonctionne en voltage bas, il faut que l’ensemble des composants le supporte.

31 Jan 2022, 00:00

Notes sur find

Suivre les liens symboliques

Par défaut, find voit les liens symboliques comme des fichiers. Pour qu’il considère la cible du lien et non le lien lui-même, il faut utiliser find -L.

Éxécuter une ou plusieurs commandes sur les résultats

-exec echo {} \; pour une commande (ici echo)
-exec echo {} \; -exec touch {} \; - exec cat {} \; pour plusieurs commandes.

Trouver des dates de modification dans le futur

Si une arborescence contient des fichiers dont la date de modification est dans le futur, on peut utiliser -mmin -0,01 pour trouver les fichiers dont la date de modification est plus récente que 0,01 minutes (soit moins d’une seconde) :
find ./ -mmin -0,01

On peut modifier cette date avec touch (avec -exec)

Trouver les liens symboliques

Source

find ./ -type l

Trouver les liens durs

Source

find -type f -links +1 pour lister les fichiers dont les inodes sont référencés plus d’une fois (ces autres références peuvent être en dehors du répertoire dans lequel est lancé find) . Pour ensuite voir les différents fichiers qui référencent le même inode qu’un fichier précis, on peut faire find -samefile ./my-file.

Trouver les dossiers vides

find ./ -type d -empty
find /path/to/data/ -type d -empty -print -delete pour les supprimer

31 Jan 2022, 00:00

Permissions des disques VHD/VHDX

Dans Hyper-V, si on crée un disque virtuel, et qu’on l’attribue à une VM dans un 2nd temps, il est possible qu’elle ne puiss pas démarrer avec le message “Erreur d’accès général refusé” concernant le fichier VHD.

Ceci est parce que chaque VM est un objet de sécurité, et qu’il faut lui affecter les autorisation correctes sur le fichier disque. Pour ceci, lancer Powershell, et obtenir le SID de la VM :
Get-VM 'Mon serveur virtuel' | Select-Object VMID (en entrant le nom de la VM).
Puis lui donner les droits sur le fichier :
icacls hard-disk.vhdx /grant %SID%:F (en entrant le SID trouvé ci-dessus).

La VM devrait alors pouvoir démarrer.

Source

27 Jan 2022, 00:00

Gestion des certificats sous Windows

certmgr.msc pour voir les ceertificats de l’utilisateur actuel
certlm.msc pour voir les certificats de la machine elle-même (bureau à distance, etc.)

Pour voir à quel certificat correspond un hachage précis, on peut aller dans Actions -> Rechercher des certificats, choisir “Tous les magasins de certificats”, rechercher dans le champ “Hachage SHA1” et entrer le hash dans le champ “Contenu”.

Les certificats expirés pour l’authentification des clients (Magasin ordinateur -> Personnel -> Certificats) ne semblent pas se supprimer tout seuls après leur expiration, ce qui crée un Evt 64 dans l’observateur d’événement. On peut les supprimer manuellement.

14 Jan 2022, 00:00

Voir date d'expiration d'un certificat

openssl x509 -enddate -noout -in file.crt
Doit fonctionner avec les fichiers crt, pem