cClaude.rocks ☕ Le blog

[Nouvelles technologies du libre, sciences et coups de gueule…]

Menu
đŸ˜€ Ce billet a Ă©tĂ© Ă©ditĂ© le : 2022-11-30

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ĂȘmes la valeur TZ (« Time Zone »).

  • 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 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog