Mon CV

iChat server (jabber) et autobuddy

30 mars 2013

Mac OS X Server 10.5 offre trois solutions de configuration : basic, workgroup & advanced. Dans les deux premières, lorsqu’un utilisateur se connecte au service iChat avec son client iChat pour Leopard, il reçoit immédiatement la liste complète des correspondants existants dans le service iChat Server. En mode advanced, cette fonction est désactivée.

Sous OS X Server 10.6, pour des raisons que je n’ai pas identifiées, cette fonction d’ajout automatique aux listes de contacts iChat se désactive parfois.

Traditionnellement on passe alors par le Terminal pour

1. Vérifier si la fonction AutoBuddy de Jabber est activée (jabber:enableAutoBuddy = yes) avec :

sudo serveradmin settings jabber

2. Activer AutoBuddy le cas échéant, puis redémarrer Jabber :

sudo serveradmin settings jabber:enableAutoBuddy = yes
sudo serveradmin stop jabber
sudo serveradmin start jabber

3. Les commandes pour gérer les listes automatiques

## La base des contacts disponibles n'est pas contenue dans l'Open Directory. 
## Une base SQLlite a été crée à cet effet.
## La base n'est pas automatiquement renseignée à la création d'un compte utilisateur.
## En revanche elle doit l'être manuellement après la première connexion de chaque utilisateur.
## Bien heureusement, une ligne de commande a été mise à notre disposition pour cela :
sudo /usr/bin/jabber_autobuddy -m
## Pour forcer l'ajout dans la base SQLite de Jabber avant sa première connexion :
sudo /usr/bin/jabber_autobuddy -i user@moi.fr
## Pour ajouter automatiquement à la liste des contacts de tous les utilisateurs :
sudo /usr/bin/jabber_autobuddy -a user@moi.fr
## Pour le retirer de la liste de contacts de tous les utilisateurs :
sudo /usr/bin/jabber_autobuddy -r user@moi.fr
## Pour supprimer un utilisateur dans la base SQLite de Jabber :
sudo /usr/bin/jabber_autobuddy -d user@moi.fr

Pour aller plus loin, je vous propose, en AppleScript une petite application permettant d’ajouter ou supprimer un utilisateur du service Jabber.

Le code est commenté pour vous permettre de l’adapter à vos besoins !

--Initialisation des variables d'erreur
set ERROR_1 to "0"
set ERROR_2 to "0"
--Emplacement du fichier journal
set LOGS to "/var/log/jabber-user.log"
--Création d'un journal temporaire pendant l'exécution de l'application
do shell script "LOG_TEMP=$(mktemp /tmp/templog.XXXXX); basename $LOG_TEMP"
set LOG_TEMP to "/tmp/" & result
do shell script "date"
set DATE_DU_JOUR to result
do shell script "echo \" \" >> " & LOG_TEMP
set ETOILES to "\" ****************************** \""
do shell script "echo " & ETOILES & DATE_DU_JOUR & ETOILES & " >> " & LOG_TEMP
--Test pour vérifier si le service iChat/Jabber est actif
try
	do shell script "sudo serveradmin status jabber | grep -c \"RUNNING\"" with administrator privileges
on error
	set JABBER_STATUS to "0"
end try
set JABBER_STATUS to result
if JABBER_STATUS = "0" then
	display dialog "Le serveur Jabber n'est pas en service." & return & ¬
		"Merci de l'activer et le configurer avant de relancer cette application." with icon 2 buttons {"Quitter"} default button {"Quitter"}
	do shell script "echo \"Le serveur Jabber n'est pas en service.\" >> " & LOG_TEMP
	do shell script "echo \"Merci de l'activer et le configurer avant de relancer cette application.\" >> " & LOG_TEMP

else if JABBER_STATUS = "1" then
	--Vérification si la fonction AutoBuddy de Jabber est active
	try
		do shell script "sudo serveradmin settings jabber | grep -c \"jabber:enableAutoBuddy = yes\"" with administrator privileges
	on error
		set AUTO_BUDDY to "0"
	end try
	set AUTO_BUDDY to result
	--Si AutoBuddy inactif on change la configuration via serveradmin puis on relance le service
	if AUTO_BUDDY = "0" then
		do shell script "sudo serveradmin settings jabber:enableAutoBuddy = yes >> " & LOG_TEMP with administrator privileges
		do shell script "sudo serveradmin stop jabber >> " & LOG_TEMP with administrator privileges
		do shell script "sudo serveradmin start jabber >> " & LOG_TEMP with administrator privileges
	end if
	--Récupération de la liste de domaines gérés par Jabber
	do shell script "IFS=$'\\n'; CONFIG=$(sudo serveradmin fullstatus jabber); for LINE in $CONFIG; do TEST_GREP=$(echo $LINE | grep -c \"jabber:hosts:_array_index\"); if [ $TEST_GREP -eq 1 ]; then echo $LINE | grep -o '\\\".*\\\"' | sed -e 's/\"//g'; fi; done" with administrator privileges
	set DOMAINS to result
	set DOMAINS_LIST to paragraphs of DOMAINS
	--Choix du domaine par l'utilisateur
	choose from list DOMAINS_LIST with prompt "Choisissez le domaine Jabber sur lequel travailler :" OK button name "Continuer" without empty selection allowed
	set DOMAIN_NAME to "@" & result
	--Entrée du login
	set {text returned:LOGIN, button returned:action} to (display dialog "Entrez l'identifiant Jabber à traiter et choisissez une action." default answer "m.test" with icon 1 buttons {"Ajouter", "Supprimer"} default button {"Ajouter"})
	set adress to LOGIN & DOMAIN_NAME
	--Traitement si ajout de l'utilisateur
	if action = "Ajouter" then
		do shell script "echo \"Traitement : ajout de l'utilisateur \"" & adress & " >> " & LOG_TEMP
		try
			do shell script "/usr/bin/jabber_autobuddy -i " & adress & " >> " & LOG_TEMP with administrator privileges
		on error
			set ERROR_1 to "1"
		end try
		try
			do shell script "/usr/bin/jabber_autobuddy -a " & adress & " >> " & LOG_TEMP with administrator privileges
		on error
			set ERROR_2 to "1"
		end try
		--Test pour vérifier si l'utilisateur existe dans l'OpenDirectory
		--Changer l'adresse /LDAPv3/127.0.0.1 si besoin si l'OD n'est pas sur la même machine
		try
			set LOGIN_EXIST to (do shell script "dscl /LDAPv3/127.0.0.1 -list /Users | grep -c \"" & LOGIN & "\"")
		on error
			set LOGIN_EXIST to "0"
		end try
		if LOGIN_EXIST = "0" then
			display dialog "L'entrée a été correctement ajoutée dans Jabber mais l'utilisateur n'est pas créé dans l'OpenDirectory." with icon 2 buttons {"OK"} default button {"OK"}
			do shell script "echo \"L'entrée a été correctement ajoutée dans Jabber mais l'utilisateur n'est pas créé dans l'OpenDirectory. \"" & " >> " & LOG_TEMP
		end if
	end if
	--Traitement si l'action choisie est la suppression
	if action = "Supprimer" then
		do shell script "echo \"Traitement : suppression de l'utilisateur \"" & adress & " >> " & LOG_TEMP
		try
			do shell script "/usr/bin/jabber_autobuddy -r " & adress & " >> " & LOG_TEMP with administrator privileges
		on error
			set ERROR_1 to "1"
		end try
		try
			do shell script "/usr/bin/jabber_autobuddy -d " & adress & " >> " & LOG_TEMP with administrator privileges
		end try
		set ERROR_2 to "1"
		--Test pour vérifier si l'utilisateur existe dans l'OpenDirectory
		--Changer l'adresse /LDAPv3/127.0.0.1 si besoin si l'OD n'est pas sur la même machine
		try
			set LOGIN_EXIST to (do shell script "dscl /LDAPv3/127.0.0.1 -list /Users | grep -c \"" & LOGIN & "\"")
		on error
			set LOGIN_EXIST to "0"
		end try
		if LOGIN_EXIST = "1" then
			display dialog "L'entrée a été correctement supprimée dans Jabber mais l'utilisateur existe encore dans l'OpenDirectory." with icon 2 buttons {"OK"} default button {"OK"}
			do shell script "echo \"L'entrée a été correctement supprimée dans Jabber mais l'utilisateur existe encore dans l'OpenDirectory. \"" & " >> " & LOG_TEMP
		end if
	end if
	--Gestion d'un message d'erreur spécifique si des erreurs sont rencontrées pendant le processus
	set GLOBAL_ERROR to ERROR_1 + ERROR_2
	if GLOBAL_ERROR = 2 then
		display dialog "Une erreur a été rencontrée." & return & ¬
			"Veuillez consulter le journal : " & LOGS with icon 2 buttons {"OK"} default button {"OK"}
	else
		display dialog "Traitement effectué avec succès." with icon 1 buttons {"OK"} default button {"OK"}
	end if
end if
--Bascule du log temporaire dans le journal de l'application
do shell script "cat " & LOG_TEMP & " >> " & LOGS with administrator privileges
do shell script "rm " & LOG_TEMP

N’hésitez pas à me faire des retours, car évidemment, tout cela est très artisanal.

 

 

Posted in Apple et Macintosh, Unix et LinuxTags: