cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

Sous Linux, gPhoto² prend en charge la synchronisation de l’horloge interne de l’appareil photo avec celle de l’ordinateur pour de nombreux modèles. La liste complète des modèles supportés est disponible sur le site de gPhoto², plus de détail dans le billet sur gPhoto² et la date.

Tant que votre ordinateur est configuré pour utiliser NTP, les horodatages des photos sont assez précis, on reviendra dans un prochain article sur l’intérêt de cette précision.

Exécuter cette synchronisation manuellement implique :

  • de brancher l’appareil photo,
  • de démonter le système de fichier de l’appareil photo après son éventuel montage automatique afin que gPhoto² puisse y accéder,
  • puis d’exécuter la commande gPhoto² appropriée pour synchroniser l’horloge de l’appareil photo.

Galère…

Mais il est possible d’automatiser ce processus en utilisant les fonctionnalités de udev. udev est le « service » (« daemon ») chargé de gérer les « device-nodes ». Si vous souhaitez plus de détail, je vous invite à lire l’introduction à udev, mais ce billet va s’autoriser une énorme simplification en disant que c’est un service qui gère l’ajout des périphériques USB.


ඏ

Explications

Après la petite introduction à udev du billet précédant, on peut envisager d’automatiser le processus de synchronisation de l’heure.

L’idée est d’ajouter une règle udev pour exécuter la commande de synchronisation d’horloge, avant le montage de la caméra.

Nous allons donc avoir besoin d’un script qui effectuera le traitement souhaité, puis une règle pour exécuter ce script.


ඏ

Le script exécuté par la règle

Le script doit effectuer la mise à jour de l’heure, on va s’appuyer sur les conclusions du billet sur gPhoto² et la date:

Cependant dans l’environnement udev on se retrouve dans un environnement système en cours d’initialisation et en particulier l’environnement de la date n’est pas encore correctement configuré. Nous allons devoir palier à cela en configurant nous même la commande TZ.

  • Version pour aider à l’analyse des problèmes

    Cette base de script ne doit être utilisée que dans le cadre d’une recherche de solution :

    #!/bin/bash
    #
    # /usr/local/bin/gphoto2-set-date.sh
    #
    (
      echo LC_TIME=$LC_TIME*
      echo TZ=$TZ
      date +'%F %T'
      date -u +"%s" --date="$( date +'%F %T' )"
      date -u +"%F %T" --date="$( date +'%F %T' )"
      timedatectl
    
      TZ=$( cat /etc/timezone ) || return $?
      export TZ
      echo LC_TIME=$LC_TIME
      echo TZ=$TZ
      date +'%F %T'
      date -u +"%s" --date="$( date +'%F %T' )"
      date -u +"%F %T" --date="$( date +'%F %T' )"
      timedatectl
    
      gphoto2 --set-config /main/settings/datetimeutc=$( date -u +"%s" --date="$( date +'%F %T' )" ) && gphoto2 --get-config datetime
    ) >>/tmp/gphoto2-set-date.log
    
    

    Pour obtenir la trace utiliser après change branchement du câble USB :

    cat /tmp/gphoto2-set-date.log
    

Le script :

#!/bin/bash
#
# /usr/local/bin/gphoto2-set-date.sh
#
TZ=$( cat /etc/timezone ) || return $?
export TZ

gphoto2 --set-config /main/settings/datetimeutc=$( date -u +"%s" --date="$( date +'%F %T' )" )

Voici comment créer ce script automatiquement et de manière plus sécurisée :

cat <<EOF | sudo tee /usr/local/bin/gphoto2-set-date.sh && sudo chmod -v 755 /usr/local/bin/gphoto2-set-date.sh
#!/bin/bash
#
# /usr/local/bin/gphoto2-set-date.sh
#
TZ=\$( cat /etc/timezone ) || return $?
export TZ

$( which gphoto2 ) --set-config /main/settings/datetimeutc=\$( date -u +"%s" --date="\$( date +'%F %T' )" )
EOF

Vous noterez que j’utilise $( which gphoto2 ) pour coder en dur le chemin vers gPhoto² afin de sécuriser un peu le script, ensuite on donne les droits en écriture à l’utilisateur root exclusivement.

La notation \$ permet lors du cat initial de ne pas exécuter la commande bash.


ඏ

Construire le nom de la règle

Les règles étant traitées dans l’ordre alphabétique, il faut donc identifier la règle responsable du montage de la caméra pour insérer notre nouvelle règle avant.

Nous avons vu cela dans le billet précédent :

Exécutez le code suivant depuis un terminal :

while read -r F ; do
  if grep --quiet gphoto2 "$F" ; then
    echo "$F"
  fi
done < <(
  [ -d /etc/udev/rules.d/ ] && find /etc/udev/rules.d/*.rules
  [ -d /run/udev/rules.d/ ] && find /run/udev/rules.d/*.rules
  [ -d /lib/udev/rules.d/ ] && find /lib/udev/rules.d/*.rules
  )

Suivant votre système et sa version vous devriez avoir un fichier du type :

  • /etc/udev/rules.d/40-libgphoto2-6.rules,
  • /lib/udev/rules.d/60-libgphoto2-6.rules ou
  • /etc/udev/rules.d/90-libgphoto2.rules

Je vous propose de créer une règle 39-gphoto2-sync-camera-times.rules et donc de créer un fichier /etc/udev/rules.d/39-gphoto2-sync-camera-times.rules afin qu’elle soit prise en compte avant le montage automatique de la caméra.


ඏ

La règle

Le contenu de ce fichier peu dépendre de la version de gPhoto² que vous utilisez, mais cela devrait être assez proche de la configuration que je vous propose.

  • La règle udev

    Il suffit de créer un fichier /etc/udev/rules.d/39-gphoto2-sync-camera-times.rules contenant :

    # udev rules file for libgphoto2 devices
    ACTION!="add", GOTO="sync_camera_time_rules_end"
    SUBSYSTEM!="usb", GOTO="sync_camera_time_rules_end"
    ENV{ID_USB_INTERFACES}=="", IMPORT{builtin}="usb_id"
    ENV{ID_USB_INTERFACES}=="*:060101:*", RUN+="/bin/bash -c /usr/local/bin/gphoto2-set-date.sh"
    LABEL="sync_camera_time_rules_end"
    

Je vous conseille d’exécuter le code suivant pour injecter la configuration :

cat <<EOF | sudo tee /etc/udev/rules.d/39-gphoto2-sync-camera-times.rules && sudo chmod -v 644 /etc/udev/rules.d/39-gphoto2-sync-camera-times.rules
# udev rules file for libgphoto2 devices
ACTION!="add", GOTO="sync_camera_time_rules_end"
SUBSYSTEM!="usb", GOTO="sync_camera_time_rules_end"
ENV{ID_USB_INTERFACES}=="", IMPORT{builtin}="usb_id"
ENV{ID_USB_INTERFACES}=="*:060101:*", RUN+="$( which bash ) -c /usr/local/bin/gphoto2-set-date.sh"
LABEL="sync_camera_time_rules_end"
EOF

Désormais, l’horloge interne de l’appareil photo sera synchronisée avec celle de l’ordinateur chaque fois que l’appareil est branché.

Cette règle a été testée sous Linux Mint 19, mais elle devrait fonctionner pour tout autre appareil photo pour lequel gPhoto² prend en charge la synchronisation de l’horloge et sous les distributions récentes basées sur Ubuntu.


ඏ

Références

ᦿ


ℹ 2006 - 2022 | 🏠 Accueil du domaine | 🏡 Accueil du blog