Voir le changelog d’un package avec DNF (Fedora)

Pour voir le changelog (nouveautés) d’un package sous Fedora 22+ :

dnf updateinfo --info --refresh [nom du package]

Exemple avec libreoffice-core :

$ dnf updateinfo --info --refresh libreoffice-core
===============================================================================
  libreoffice-5.3.6.1-4.fc26
===============================================================================
ID de mise à jour : FEDORA-2017-76f5e02c37
             Type : correction d’anomalie
      Mis à jour  : 2017-09-09 22:54:31
      Description : - tdf#110737 animations starved of redraw events in dual head mode
                  : - fix redraw of embedded calc in writer

L’argument --refresh force DNF à récupérer les informations sur le repo (dnf update ne le fait pas).

Remplacer --info par --list pour avoir quelque chose de plus synthétique :

$ dnf updateinfo --list --refresh libreoffice-core
FEDORA-2017-76f5e02c37 correction d’anomalie libreoffice-core-1:5.3.6.1-4.fc26.x86_64

A noter que le package yum-changelog est toujours proposé dans les repos Fedora 26 mais que son installation n’est pas nécessaire, updateinfo fait parti intégrante de dnf.

Puppet : Autorise %wheel à passer root sans mot de passe

Puppet offre plusieurs façons de manipuler /etc/sudoers : en remplaçant le fichier entier (via une ressource file), en éditant ou en ajoutant une ligne précise (via file_line) ou via la ressource augeas.

Méconnu, augeas est un utilitaire – non lié à Puppet – permettant de manipuler un grand nombre de types de fichiers avec une syntaxe similaire à https://fr.wikipedia.org/wiki/XPathXPath. Contrairement à file et file_line, il a l’immense avantage de ne pas provoquer d’erreur de syntaxe.

Voici ce que cela donne pour éditer /etc/sudoers :

augeas { 'sudoers-wheel-nopasswd':
  incl    => '/etc/sudoers',
  lens    => 'Sudoers.lns',
  changes => 'set spec[user=\'%wheel\']/host_group/command/tag NOPASSWD',
  require => Package['augeas'],
}

Requière d’installer préalablement le package augeas :

if ! defined(Package['augeas']) {
  package { 'augeas': ensure => present, }
}

A noter qu’il existe un module tout fait pour éditer sudoers : saz/puppet-sudo, lequel s’appuie sur Augeas.

Docker CE et Fedora 26

D’après la documentation d’installation de Docker pour Fedora, il suffit d’ajouter le repository docker-ce-stable :

sudo dnf config-manager \
    --add-repo \
    https://download.docker.com/linux/fedora/docker-ce.repo

Mais si l’on installe ensuite le package docker-ce comme indiqué :

[simon@simon-laptop ~]$ sudo dnf install docker-ce
Dernière vérification de l’expiration des métadonnées effectuée il y a 0:00:06 le dim. 20 août 2017 10:25:11 CEST.
Aucun paquet docker-ce disponible.

Ce que la documentation omet de dire, au 20 août 2017, c’est que docker-ce n’est pas encore disponible dans la branche stable pour Fedora 26, il faut impérativement utiliser la branche testing (il n’est pas non plus disponible dans edge) :

sudo dnf config-manager --set-enabled docker-ce-test

Et ensuite, magie :

[simon@simon-laptop ~]$ sudo dnf install docker-ce
Dernière vérification de l’expiration des métadonnées effectuée il y a 0:00:06 le dim. 20 août 2017 10:33:41 CEST.
Dépendances résolues.
================================================================================
 Paquet              Architecture
                              Version                    Dépôt            Taille
================================================================================
Installation de :
 docker-ce           x86_64   17.07.0.ce-0.3.rc3.fc26    docker-ce-test    21 M
Installation des dépendances:
 container-selinux   noarch   2:2.21-1.fc26              updates           33 k

Puppet : Convertir une chaîne en nombre

Puppet permet de convertir une chaîne en nombre de plusieurs façons.

Implicitement :

# cat test.pp
$nombre = '8080'
$type = type($nombre)
notify { "Type: ${type}": }
# puppet apply --verbose test.pp
Notice: Type: Integer[8080, 8080]

Chose qui ne fonctionne pas toujours, notamment avec Hiera :

# cat /etc/puppetlabs/code/environments/production/hieradata/common.yaml 
foo::port: '8080'
# cat test.pp
class foo(Any $port) {
    $type = type($port)
    notify { "Type: ${type}": }
}
include foo
# puppet apply --verbose test.pp
Notice: Type: String

On peut cependant lui forcer la main en ajoutant 0 – méthode que l’on peut retrouver dans la documentation officielle :

# cat test.pp
class foo(Any $port) {
    $port_int = 0 + $port
    $type = type($port_int)
    notify { "Type: ${type}": }
}
include foo
# puppet apply --verbose test.pp
Notice: Type: Integer[8080, 8080]

Procéder de la sorte génère le warning suivant depuis Puppet 4.10.2 :

Warning: The string '8080' was automatically coerced to the numerical value 8080

En mode strict, Puppet va même transformer cela en erreur.

La seule et unique méthode désormais est d’utiliser Numeric (apparu avec Puppet 4.1), Integer ou Float :

# cat test.pp 
class foo(Any $port) {
    $port_int = Numeric($port)
    $type = type($port_int)
    notify { "Type: ${type}": }
}
include foo
# puppet apply --verbose test.pp
Notice: Type: Integer[8080, 8080]

Puppet : The argument signature (String format, [String timezone]) is deprecated for #strfime

Pour obtenir un timestamp avec Puppet, je faisais jusqu’à présent :

$timestamp = strftime('%s')

Cela fonctionnait bien mais générait le warning suivant :

Puppet : The argument signature (String format, [String timezone]) is deprecated for #strfime

La bonne pratique est désormais :

$timestamp = Timestamp().strftime('%s')

Pour rappel, strftime est fourni nativement depuis Puppet 4.8. Ce n’est plus puppetlabs-stdlib qui est utilisé. Il y a d’ailleurs un changement dans la syntaxe entre les deux, cf PUP-6724.

Source : https://docs.puppet.com/puppet/latest/function.html#strftime

Modifier le comportement à la fermeture de l’écran avec systemd-logind

logind est le composant en charge de la gestion des sessions sur les systèmes avec systemd. Il suit les utilisateurs connectés (systemd-loginctl list-users), les sessions ouvertes (systemd-loginctl list-sessions) et détermine le comportement lorsque l’on appuie sur le bouton d’alimentation (Power Key), ferme l’écran (Lid Switch) et en cas d’inactivité (Idle).

Sa configuration est située dans /etc/systemd/logind.conf :

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#HandleLidSwitchDocked=ignore
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min
#RuntimeDirectorySize=10%
#RemoveIPC=no

La variable qui nous intéresse aujourd’hui s’intitule HandleLidSwitch et détermine l’action à effectuer lorsque l’on ferme / rabat l’écran. Sa valeur par défaut est suspend (mise en veille).

Les valeurs acceptées sont les suivantes :

Can be one of "ignore", "poweroff", "reboot",
"halt", "kexec", "suspend", "hibernate", "hybrid-sleep", and "lock"

Mettons de côté « poweroff » (arrêt), « reboot » (redémarrage), « halt » et « kexec » et regardons les valeurs réellement utiles pour HandleLidSwitch :

  • « ignore » : Faire comme si de rien n’était. Si la session ne se verrouille pas après X minutes d’inactivité, elle restera ouverte.
  • « hibernate » : Mise en hibernation
  • « hybrid-sleep » : Mise en hibernation avec conservation des données en mémoire (pour reprendre plus rapidement).
  • « lock » : Verrouillage de la session
  • « suspend » : Mise en veille. Le comportement par défaut.

Pour verrouiller la session, ce sera donc :

HandleLidSwitch=lock

Une fois la modification faîte, inutile de redémarrer, il suffit de relancer le service systemd-logind :

systemctl restart systemd-logind

Sources :