Mon CV

Modifier le contenu du Dock grâce à Dockutil

24 mai 2015

Et bien, ça faisait quelques semaines que je n’ai pu prendre le temps de publier sur ce blog. Ce ne sont pas les sujets qui manquent, mais tout simplement le temps que je peux dédier à l’informatique, qui n’est qu’un hobby pour moi s’est encore un peu restreint cette année !

Dans les petites choses que j’ai testées et mises en oeuvre depuis le début de l’année, j’ai été confronté récemment à la problématique de gestion du Dock sur le parc de Mac de ma structure.

Pour que vous puissiez situer la problématique, notre parc est exclusivement en Mac 10.6.x à 10.10.x avec un serveur Mac OS X 10.6.8. Nous utilisons Munki pour déployer les applications et packages nécessaires au fonctionnement de chaque poste.

Comme notre serveur est encore en version 10.6.8 cela pose certaines limites. Par exemple il n’est pas simple avec le Gestionnaire de Groupe de Travail et les préférences gérées (MCX) de pouvoir facilement gérer le contenu du Dock pour certaines applications. Tans que l’on veut afficher dans le dock des postes clients sur l’ensemble du parc les mêmes applications, ça va. Mais quand par exemple on utilise une application pour la messagerie instantanée différence sur plusieurs versions (iChat.app sur OS X 10.6 et Jitsi.app sur 10.7>10.10) c’est un peu plus compliqué.

Le premier qui m’envoie un commentaire pour me conseiller d’utiliser Messages.app … bref, je m’abstient !

La solution la plus simple serait de créer dans le Gestionnaire de Groupe de Travail un groupe de machines distinct par version de l’OS et pouvoir ainsi déployer des préférences spécifiques par version de l’OS, et ainsi notamment pouvoir déployer une version du fichier de préférence com.apple.dock.plist différent pour chaque version. C’est une solution, certes, mais dans mon cas, après l’avoir utilisée quelques temps je l’ai trouvé un peu disproportionnée vue la taille de mon parc.

 

Le principe : un script lancé à chaque ouverture de session grâce à Outset

Entre temps, j’avais intégré Outset dont j’ai déjà parlé précédemment sur l’ensemble du parc. Du coup, je me suis dit qu’il suffisait, pour résoudre ma problématique d’écrire un petit script qui se charge, en fonction de la version de l’OS :

  • d’ajouter au Dock l’application,
  • de lancer l’application.

Cela permet ainsi de m’assurer que l’ensemble de l’équipe a bien son application de messagerie instantanée sous la main (ou plutôt sous le Dock) ! Pour cela, je vais charger mon script, grâce à Outset, chaque fois qu’un utilisateur ouvre une session. Pour cela je déposerai mon script dans le répertoire login-every d’Outset.

 

Le seul prérequis : Dockutil, et son installation conditionnelle avec Munki

Mon script va s’appuyer sur un utilitaire codé en Python : dockutil. Attention, dockutil dans sa dernière version (2.x) n’est compatible qu’à partir de OS X 10.9.x. Il nous faudra du coup soit installer une version plus ancienne. Ca tombe bien, car Kyle Crawford propose sur son site une version déjà packagée de dockutil en version 1.1.2.

Dans mon cas, ce sera encore mieux, les applications étant déployées par Munki, j’ai packagée une version 2.0.2 de Dockutil, et je vais utiliser Munki pour déployer Dockutil en ajoutant une condition. Ainsi sur les version inférieures ou égales à 10.8.x je déploierai la version 1.1.1 et sur les version 10.9.x et supérieures, je déploierai la version 2.0.2.

Pour cela il suffit d’utiliser une condition dans le catalog de munki, du type :

# pour dockutil 1.1.2
<key>maximum_os_version</key>
<string>10.8.99</string>
<key>minimum_os_version</key>
<string>10.4.0</string>
# pour dockutil 2.0.2
<key>minimum_os_version</key>
<string>10.9.0</string>

 

Maintenant, détaillons le principe de mon script

Mon script va donc utiliser Dockutil pour faciliter l’ajout au Dock de l’application de messagerie. Pour déterminer la quelle application doit être ajoutée, je vais exploiter le résultat de la commande sw_vers -productVersion.

Mon script est simple, en fonction d’une variable qui utilise cette commande, je détermine le nom de l’application :

# Ligne qui créé une variable contenant la version de l'OS
versionOSX=$(sw_vers -productVersion | awk -F '.' '{print $(NF-1)}')
# Conditions qui permettent de choisir l'application en fonction de l'OS 
[[ ${versionOSX} -gt 6 ]] && jabberApplication="Jitsi"
[[ ${versionOSX} -le 6 ]] && jabberApplication="iChat"

Une seule chose importante, ce script a besoin de savoir où est localisé Dockutil. Il y a une variable pour cela, à modifier si besoin :

dockutilBin="/usr/local/bin/dockutil"

Voyons donc le script dans son intégralité, les commentaires devraient vous aider à le modifier et l’adapter à vos besoins :

#! /bin/bash

versionOSX=$(sw_vers -productVersion | awk -F '.' '{print $(NF-1)}')
scriptDir=$(dirname "${0}")
scriptName=$(basename "${0}")
dockutilBin="/usr/local/bin/dockutil"

echo ""
echo "****************************** `date` ******************************"
echo "${scriptName} démarré..."
echo ""
echo "[${scriptName}] Mac OSX version $(sw_vers -productVersion)"

# On détermine le logiciel à utiliser en fonction de la version de Mac OSX
[[ ${versionOSX} -gt 6 ]] && jabberApplication="Jitsi"
[[ ${versionOSX} -le 6 ]] && jabberApplication="iChat"

# Test si l'application correspondante existe
if [[ -d "/Applications/${jabberApplication}.app" ]]; then
	echo "[${scriptName}] ${jabberApplication}.app est installé, nous le démarrons..."
	# Test si l'application est déjà lancée (recherche processus)
	if [[ $(ps -Av | grep -i ${jabberApplication}.app | sed "/grep -i ${jabberApplication}.app/d" | wc -l) -gt 0 ]]; then
		echo "[${scriptName}] ${jabberApplication}.app est déjà démarré, pas besoin de le ré-ouvrir."
	# Si le processus n'est pas actif on lance l'application
	elif [[ ! $(ps -Av | grep -i ${jabberApplication}.app | sed "/grep -i ${jabberApplication}.app/d" | wc -l) -gt 0 ]]; then
		open -a ${jabberApplication}
		[[ $? -eq 0 ]] && echo "[${scriptName}] problème rencontré pour ouvrir ${jabberApplication}.app"
	fi
	# Ajout au Dock de l'application
	# On vérifie préalablement que Dockutil est installé
	if [[ -e ${dockutilBin} ]]; then
		echo "[${scriptName}] L'utilitaire ${dockutilBin} est installé, nous allons l'utiliser."
		# Test si l'application n'est pas déjà dans le Dock
		echo "[${scriptName}] Nous vérifions que ${jabberApplication} soit dans le Dock :"
		${dockutilBin} --find ${jabberApplication}
		if [[ $? -eq 0 ]]; then
			echo "[${scriptName}] ${jabberApplication} est déjà dans votre Dock, nous ne l'ajoutons pas."
		else
			# L'application n'est pas dans le Dock, on l'ajoute
			echo "[${scriptName}] Nous ajoutons ${jabberApplication} dans votre Dock, à côté de Mail..."
			${dockutilBin} --add /Applications/${jabberApplication}.app --after Mail
			if [[ $? -eq 0 ]]; then
				echo "[${scriptName}] ${jabberApplication} ajouté dans votre Dock avec succès !"
			else
				echo "[${scriptName}] Un problème a été rencontré pour ajouter ${jabberApplication} dans votre Dock avec ${dockutilBin} !"
			fi
		fi
	elif [[ ! -e ${dockutilBin} ]]; then
		echo "[${scriptName}] L'utilitaire ${dockutilBin} n'est pas installé, nous ne pourrons pas ajouter ${jabberApplication} dans le Dock."
	fi
# L'application correspondante n'existe pas dans les applications
elif [[ ! -d "/Applications/${jabberApplication}.app" ]]; then
	echo "[${scriptName}] ${jabberApplication}.app n'est pas installé."
fi
echo ""
echo "${scriptName} fini !"
echo "*******************************************************************************************"

exit 0

Dans mon cas précis, je vais utiliser aussi Munki pour déployer ce script dans Outset (ainsi que Dockutil). Pour éviter d’installer un script sans ses dépendances, si vous utilisez Munki, pensez à utiliser dans le catalogue Munki :

<key>requires</key>
<array>
	<string>dockutil</string>
	<string>outset</string>
</array>

 

N’hésitez pas à commenter si vous avez des questions ou retours !

 

Posted in Apple et MacintoshTags: