26. Git introduction

Nous allons prendre un dépôt relativement simple comme celui se trouvant à l’adresse : https://git.roflcopter.fr/guyotv/TM_latex

Un tel dépôt peut être téléchargé (Bouton download) ou cloné (bouton clone). Téléchargé signifie que vous allez en récupérer tous les fichiers, que vous pourrez les utiliser et les modifier sur votre ordinateur, mais pas interagir avec le dépôt. Par contre, quand vous clonez le dépôt, en plus de récupérer tous les fichiers du dépôts, vous récupérez aussi un répertoire caché nommé « .git » qui va vous permettre de modifier les fichiers du dépôt.

Pour cloner le dépôt, cliquez sur le bouton clone et copiez l’adresse de clonage. Puis, placez-vous dans le répertoire dans lequel vous mettez les dépôts clonés et clonez :

clone https://git.roflcopter.fr/guyotv/TM_latex.git

Quelques instants plus tard se trouvera cloné sur votre ordinateur le répertoire du dépôt. Vous pourrez alors travailler localement sur ses fichiers en toute liberté sans modifier le dépôt.

Une fois les modifications faites, vous pourrez utiliser la suite classique de commandes suivante :

git status
git add .
git commit -m "Voici les modifications que j'ai faites."
git push -u origin master

Cette suite de commandes est à comprendre en s’imaginant qu’il existe trois éléments de travail : les fichiers que vous avez modifiés, un dépôt local et un dépôt distant. Quand vous travaillez sur les fichiers qui sont sur votre ordinateur, vous ne modifiez aucun des deux dépôt local et distant. Ainsi :

  • la commande « git status » va comparer les fichiers qui sont dans votre répertoire local à ceux qui se trouvent dans le dépôt local. S’il n’existe pas de différence, elle vous répondra qu’aucune modifications n’est nécessaire. Par contre, si vous avez modifié les fichiers de votre répertoire local, elle va vous afficher tous ceux qui ne correspondent pas à ceux qui se trouvent dans le dépôt local.
  • la commande « git add . » (attention le point « . » est nécessaire) va vous permettre d’ajouter tous ces fichiers (le point « . » signifie tous) à la liste des fichier à modifier sur le dépôt local. Vous pourriez vouloir ne modifier que quelques uns de ceux-ci sur le dépôt local, auquel cas, il faudra les spécifier à la place du point. Ainsi, les fichiers à modifier seront marqués en tant que tel.
  • la commande « git commit -m « C’est fait. » » vous permet d’envoyer les modifications du répertoire de travail dans le dépôt local avec un message obligatoire décrivant ces changements.

À ce stade, rien n’a été effectué sur le dépôt distant. Mais tous les changements que vous avez réalisés se trouvent en attente sur le dépôt local, c’est-à-dire sur votre ordinateur.

  • la commande « git push -u origin master » vous permet d’envoyer vos changements sur le dépôt distant nommé « master ». Plus précisément, elle vous permet de les envoyer sur la branche « origin » du dépôt « master ». En effet, il peut y avoir plusieurs branches branches du même projet sur lesquelles on peut travailler en parallèle. Pour en savoir plus reportez-vous à l’article https://www.cvgg.org/wordpress/blog/27-git-et-les-branches/. Le « -u » va vous demander de spécifier l’utilisateur et vous demandera son mot de passe.

Voilà. AInsi vous pourrez reporter vos changements (pour autant que vous y soyez autorisés : utilisateur et mot de passe) sur le dépôt distant. Ainsi aussi les autres utilisateurs pourront les récupérer.


Une utilisation intéressante en mode mono-utilisateur est la suivante. Imaginez que vous travailliez comme cela est présenté ci-dessus à la maison. Vous vous rendez ensuite à votre travail et là-bas désirez modifier vos fichiers. Pour cela vous les récupérez en clonant le dépôt, faites vos modifications et les reportez successivement sur le dépôt local (à votre travail) puis sur le dépôt distant. Tout va bien. De retour chez vous, vous voulez synchroniser le dépôt distant qui a été modifié au travail avec les fichiers qui sont sur votre ordinateur à la maison. Une seule commande suffira :

git pull

Et vous verrez avec un grand plaisir que toutes les modifications faites au travail seront reportée dans vos fichiers à la maison.

Voilà. Amusez-vous bien. La puissance de git est simplement stupéfiante.

32. Gestion du temps en ligne de commande

La mise-à-jour automatique de l’heure sur un ordinateur est tellement classique qu’on en oublierait qu’elle existe. Par ailleurs, justement puisqu’elle existe, pourquoi s’en charger ? Comme il existe un service (NTP) qui se charge de fournir l’heure à l’ordinateur, pourquoi ne pas le laisser faire ?

Si NTP est un service, il doit pour faire son office, utiliser des serveurs de temps disponible sur internet. Il est donc nécessaire que l’ordinateur ait accès au réseau. Si ce n’est pas le cas, l’heure ne sera pas mise à jour. Pour des ordinateurs comprenant une petite pile (la plupart d’entre eux) ou des smartphones constamment branchés sur la batterie, ce n’est qu’après beaucoup de temps que l’heure va prendre quelque retard, puis le quartz intégré à la machine permet aujourd’hui une précision importante.

Par contre, sur certains ordinateurs non munis d’une pile, comme le raspberrypi, si vous l’éteignez, l’horloge s’arrête. En le rallumant sans connexion, l’heure ne sera donc pas correcte.

Une distribution intéressante pour faire de l’astronomie avec un raspberrypi directement sur le télescope permettant d’utiliser la raspicam au foyer (avec un télescope comme le pikon, par exemple) est Astroberry. Cette distribution crée un point d’accès wifi permettant de mettre en place un VPN pour accéder au raspberrypi depuis un portable. Généralement, le réseau internet n’est pas disponible lors d’observations hors de chez soi (le réglage de l’heure via son smartphone ne sera pas abordé ici). Il est donc nécessaire d’effectuer un réglage manuel. Avec Astroberry, on peut le faire avec une interface graphique. Mais, Astroberry nécessite un raspberrypi 3 ou 4. Si on préfère un raspberrypi 0, consommant bien moins de ressources énergétiques (on peut utiliser raspivid sur TCP pour voir les images de la caméra sur un portable et raspistill pour faire les photos), il est nécessaire de s’y connecter via ssh, c’est-à-dire en ligne de commande. Ainsi, en astronomie, avec un raspberrypi 0, le réglage manuel de l’heure peut être nécessaire régulièrement.


Pratiquement, la gestion du temps passait il y a peu par les commandes suivantes permettant notamment de gérer l’accès à un ou des serveurs ntp :

date et ntpdate

Aujourd’hui, avec systemd, un autre outil permet ce type de réglages :

timedatectl

C’est un outil de systemd, à l’instar de systemctl, disponible avec celui-ci. Voici quelques commandes intéressantes :

Activation – désactivation du réglage automatique

timedatectl set-ntp false
timedatectl set-ntp true

Réglage de la zone

timedatectl set-timezone Europe/Zurich

Réglage de la date et de l’heure

timedatectl set-time 'A-M-J HH:MM:SS'
timedatectl set-time 'A:M:J HH:MM:SS'
timedatectl set-time 'A-M-J'
timedatectl set-time 'HH:MM:SS'

Configuration du serveur de temps dans le fichier de configuration /etc/systemd/timesyncd.conf

[Time]
NTP=
FallbackNTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org/

puis réactiver ntp, comme vu plus haut.

Enfin, vous pouvez consulter les réglages en cours avec :

timedatectl status

Ce qui devrait vous retourner quelque chose comme :

Local time: lun 2021-08-23 08:50:33 CEST
           Universal time: lun 2021-08-23 06:50:33 UTC
                 RTC time: n/a
                Time zone: Europe/Zurich (CEST, +0200)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Voilà. Timedatectl permet donc le réglage d’un client ntp.

Gemini

J’ai trop longtemps négligé l’importance du texte. Jeune j’ai été passionné de littérature. La science m’en a alors détourné. Paul Feyerabend m’ayant rappelé qu’elle était elle-même langage et Noam Shomsky ayant confirmé qu’il en était de même pour l’informatique, mes pratiques ont lentement dérivées vers le texte par la programmation, des cours de physiques en LaTeX et le un nouveau plaisir d’écrire en opposition radicale avec la période désagréable des vidéos-conférences. Tout alors m’a éloigné du monde des images à tel point que j’ai abandonné la télévision. Ce changement ne fut pas radical, car des années auparavant, j’avais déjà abandonné la voiture pour le vélo et je savais que le ralentissement de ses déplacements pouvait être très bénéfique. J’ai alors compris que le filtrage des informations par le texte pouvait l’être tout autant.

La découvert du groupe « rawtext.club » a donc été pour moi une véritable révélation. Toutes les valeurs des membres de ce groupe me correspondaient et comme ils proposaient de mettre de l’information sur le tout jeune Gemini, un autre web focalisé sur le texte, je me suis lancé dans l’aventure.

Le protocole

Gemini est un protocole, à l’instar d’http. Il s’agit d’accorder deux ordinateurs pour qu’il se comprennent et puissent se transmettre de l’information. Ainsi, quand vous utilisez « Hyper Text Transfer Protocol », soit http, vous utilisez un « un protocole de communication client-serveur développé pour le World Wide Web » (Wikipedia). Quand vous utilisez « Gemini », soit gemini, vous utilisez « un protocole de communication client-serveur. C’est un protocole de la couche application qui utilise le protocole TCP comme couche de transport. Il permet notamment d’accéder à des documents texte simples de type hypertexte. Les échanges entre le client et le serveur sont sécurisés à l’aide du protocole TLS. Le protocole est mis au point de manière collaborative mais n’est pas un standard internet » (Wikipedia).

« Les ressources Gemini sont identifiées au moyen d’URL dont le schéma est gemini://. Il est à noter que contrairement au protocole HTTPS qui possède un équivalent non chiffré (HTTP), le protocole Gemini ne définit volontairement pas d’équivalent non-chiffré.

La syntaxe des pages gemini, appelée Gemtext, est inspirée de celle de Markdown. »

Navigation

Pour visiter des sites gemini, on pourrait croire qu’il suffit de taper gemini:// dans la barre d’un navigateur. Mais le protocole n’étant pas standard, cela n’est pas possible aujourd’hui. Il faut un navigateur spécifique pour cela. Plusieurs solutions existent. Personnellement j’utilise « Amfora », un navigateur Gemini en mode ligne de commande. Une liste de clients gemini vous permettra de faire votre choix et de les installer. Outre Amphora, écrit en go, AV-98 écrit en python sont à tester. Sur la figure suivante, vous pouvez voir les deux navigateurs, Amfora à gauche, coloré sur fond noir et à droite dans une console transparente, AV-98 qui se superpose dans un style plus classique. Pour les navigateurs en mode graphique, Lagrange semble un bon choix.

Rawtext.club

Comme dit plus haut, ce groupe est plus qu’un hébergeur Gemini. Je vous conseille donc de vous y intéresser de plus près si vous aimez le texte et la philosophie des mouvement « LOW ».

À l’url :
gemini://rawtext.club
vous trouverez une description de ce « Slow social network », comme il se décrit lui-même.

À l’url :
gemini://rawtext.club/~guyotv
vous trouverez mon site gemini. Tout progressivement, celui-ci va prendre de l’importance et j’espère à terme pouvoir migrer entièrement vers celui-ci.

31. Just sudo it

Un petit article pour préciser divers usages du compte root.

Comme le dit le titre, il est tout-à-fait possible, et souvent nécessaire, de réaliser des opérations en mode de Super Utilisateur : su. Plusieurs possibilités s’offrent à nous.

  • sudo, qui est une manière de gérer l’accès d’un utilisateur courant à certaines commandes réservées au super utilisateur,
  • sudo -s, …
  • sudo -i, …
  • sudo su … et
  • su, qui offre un accès complet et sans limites au système.

Accès au super utilisateur

Généralement, il n’est pas nécessaire de se connecter su le compte root. Non seulement cela peut être risqué en raison des erreurs qu’on peut y commettre, mais aussi pour des raisons de sécurité.

La commande sudo est donc généralement celle utilisée pour effectuer des opérations spécifiques nécessitant le lancement d’une unique commande, comme la mise-à-jour des paquets par exemple. Cette commande est hautement paramétrable grâce à l’utilitaire visudo, qui ne sera pas décrite ici, mais qui permet d’attribuer une ou plusieurs commandes à faire sous root, à un utilisateur particulier.

sudo -s, est une commande donnant accès au commandes du compte root, mais pas au compte root. Les variables d’environnement, le répertoire root, le changement du mot de passe root, … ne sont pas accessibles.

sudo -i va un peut plus loin que sudo -s. C’est le mot de passe utilisateur qui est toujours demandé et les commandes restent déléguées par setuid root, mais le shell est initialisé comme au login de l’utilisateur.

sudo su est totalement identique à sudo root, décrit ci-dessous, à l’exception que le mot de passe demandé sera celui de l’utilisateur référencé dans les sudoers. Ainsi, il est possible, pour autant qu’on y soit autorisé, de se connecter en root sans connaître le mot de passe root.

Enfin la commande su, qui est identique à su root (on peut aussi faire su unautreutilisateur), remplace l’utilisateur courant par le super utilisateur, avec tous ses pouvoirs. C’est très pratique, mais nécessite de connaître le mot de passe du super utilisateur.

Gestion des comptes

Par ailleurs, il est nécessaire d’évoquer ici la gestion des comptes et mots de passe dans le cadre du super utilisateur. Notamment, la possibilité d’imposer des changements de mots de passe ou de désactiver des comptes après un temps donné.

La commande « chage » sert à « modifier les informations de validité d’un mot de passe ». Un man chage nous fournit la description suivante :

« La commande chage modifie le nombre de jours entre les changements de mot de passe et la date du dernier changement. Ces informations sont
utilisées par le système pour déterminer si un utilisateur doit changer son mot de passe. »

man chage

Ainsi, si vous êtes confrontés, lors d’une tentative de vous connecter en super utilisateur via la commande su, à une information spécifiant que le compte a été désactivé, c’est que l’administrateur à trouvé nécessaire de vous obliger à reconsidérer votre accès au compte à un moment donné ou au bout d’un certain temps.

La désactivation de l’obligation de changer le mot de passe root se fait par la commande :

chage -E -1 -I -1 -M -1 root

dont l’explication est la suivante :

  • -E : date d’expiration du compte ; -1 supprime l’expiration,
  • -I : durée d’inactivité avant le blocage du compte ; -1 supprime cette durée d’inactivité,
  • -M : nombre de jours maximums pendant les quels un mot de passe est valable ; -1 supprime cette durée.

Voilà pour ces quelques précisions.

30. Systemd utilisateur

Ceci n’est pas un article sur systemd, mais la présentation d’une utilisation très pratique de systemd par un utilisateur pour lancer une commande avec systemd au lancement de la session de l’utilisateur. L’article sur lequel je me suis basé pour réaliser ce que je voulais est : https://medium.com/@alexeypetrenko/systemd-user-level-persistence-25eb562d2ea8

Mon problème était le suivant : je dispose d’un clavier bluetooth récupéré d’une tablette obsolète. Or ce clavier ne dispose pas de la touche backslash (\). C’est extrêmement désagréable pour quelqu’un qui pratique intensivement LaTeX.

Il s’agissait donc de lancer une modification du clavier à chaque lancement de session. Pour cela il fallait d’abord savoir comment affecter la touche backslash à l’une des touches libre de mon clavier. Après quelques recherches, le logiciel permettant cette modification a été trouvé et la commande suivante testée fonctionnelle :

xmodmap -e 'keycode 202=backslash' & 

Xmodmap permet d’affecter une touche physique, ici la touche 202, à un caractère, ici backslash. Pour déterminer le code de la touche, la commande suivante est nécessaire :

xev -event keyboard

Une fois lancée, en pressant sur une touche, on obtient un retours comme :

KeyPress event, serial 25, synthetic NO, window 0x3a00001,
    root 0x389, subw 0x0, time 5876177, (922,180), root:(924,260),
    state 0x0, keycode 202 (keysym 0x5c, backslash), same_screen YES,
    XLookupString gives 1 bytes: (5c) "\"
    XmbLookupString gives 1 bytes: (5c) "\"
    XFilterEvent returns: False

dans lequel figure « keycode 202 » (ici déjà affectée à backslash). L’esperluette (&) de la fin de commande permettait de lancer la commande pour une session, ce que systemd va nous permettre de faire automatiquement et cela sans aucun droits de superutilisateur.

Venons en donc à systemd. À l’instar des services lancés par systemd pour root, l’idée est de mettre dans le répertoire (à créer au besoin) :

.config/systemd/user/

un fichier de service à lancer au démarrage de la session. Dans mon cas, le nom de ce fichier sera évidemment « backslash.service » puisque ce service va me permettre de disposer de la touche backslash. Son contenu sera le suivant :

[Unit]
Description=Just for backslash character

[Service]
ExecStart= /usr/bin/xmodmap -e 'keycode 202=backslash'
Restart=always
RestartSec=60

[Install]
WantedBy=default.target

Les lignes de restart signifient qu’en cas de problème le démon est relancé au bout de 60 secondes.

Pour installer le service, il faut alors utiliser la commande :

systemctl --user enable backslash.service

Un certains nombre de liens seront créé pour que systemd puisse lancer le service au démarrage de la session.

Pour démarrer le démon sans relancer la session, il faut classiquement faire :

systemctl --user start backslash.service

Si cela ne fonctionne pas, comme ce fut le cas pour moi, lancez :

systemctl --user status backslash.service

L’état du service vous sera retourné et vous verrez apparaître un « Failure » si la commande de votre service est mauvaise. En l’occurrence, pour moi, ce fut le fait qu’il fallait mettre le chemin complet vers xmodmap, soit /user/bin/xmodmap.

Enfin, après avoir corrigé les problèmes, un :

systemctl --user restart backslash.service

ne suffit pas. Il faut encore recharger l’ensemble des démons de l’utilisateur par :

systemctl --user daemon-reload
Voilà. Systemd peut donc être très utile au niveau utilisateur pour remettre en place des fonds d'écran par exemple ou tout autre commande à lancer au démarrage de la session utilisateur.

Raspberrypi : mise-à-jour stretch-buster

Voici un petit memo pour réaliser la mise-à-jour d’un raspberrypi tournant sous Raspbian stretch vers Raspbian buster.

Tout d’abord, il faut savoir que le téléchargement des paquets nécessaires à la mise-à-jour ne peut se faire que si la place nécessaire pour les stocker est disponible. Pour un système complet, il faut prévoir 8Go. Ainsi, vérifiez avec la commande :

df -h

que celle-ci est bien disponible. Cette commande signifie « disk free -human », soit en français « quelle est la place libre sur le disque, dans un langage humain ». Vous verrez alors apparaître une colonne vous donnant la mémoire disponible directement en Go.

Il faut ensuite réaliser un audit des paquet permettant de savoir si ceux-ci sont dans un état correct pour la mise-à-jour :

sudo dpkg --audit

Puis, il faut voir si des paquet sont bloqués :

sudo dpkg --get-selections | grep hold

L’argument de dpkg permet de récupérer la liste des paquets installés dont on recherche avec grep le motif « hold ». Ce motif signifie que l’utilisateur ne veut pas modifier (mettre-à-jour) le paquet. Comme cela peut poser problème, il faut qu’aucun paquet ne soit dans cet état à moins d’une bonne raison.

Il faut ensuite mettre à jour le système à partir duquel on va faire la mise-à-jour :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

La première commande fait une mise-à-jour de la liste des paquets. La seconde mets à jour les paquets non vitaux et la troisième fait la mise-à-jour des paquets vitaux.

Il faut ensuite changer le nom des dépôts pour passer les faire pointer vers la nouvelle distribution Buster :

sudo sed -i /deb/s/stretch/buster/g /etc/apt/sources.list
sudo sed -i /deb/s/stretch/buster/g /etc/apt/sources.list.d/*.list

Ce deux lignes sont complexes. L’idée est de changer toutes les ocurences « strech » en « buster » dans plusieurs fichiers. Comme avec Debian, le fichier « source.list » du répertoire /etc/apt/ est touché. Mais en plus tous les fichiers .list du répertoire /etc/apt/source.list.d/, ce qui est propre à Raspbian.

L’utilitaire permettant ces modifications automatiquement est sed. Dans le cas présent, on utilise -i pour spécifier qu’on va écraser le fichier original. Puis, on spécifie que toutes les lignes (/g) commençant par deb se verront substituer (s) le motif stretch par buster.

Cela fait, on met à jour la liste des paquets de buster :

sudo apt-get update

Puis, on met à jour la distribution :

sudo apt-get upgrade
sudo apt-get dist-upgrade

Des questions vous seront posées auxquelles il faudra répondre Y dans la plupart des cas, à moins de savoir ce que vous faites.

Reste à effacer les paquets qui ne sont plus nécessaires :

sudo apt autoremove -y
sudo apt autoclean

Normalement tout devrait bien se passer. Mais, il arrive que ce ne soit pas le cas. Lisez bien alors les messages d’erreurs, car parfois ils permettent de forcer l’installation de quelques paquets récalcitrants qui peuvent bloquer la mise-à-jour.