GemMenu (et non MenuGems)
Mise à jour : ROSXAuth est maintenant disponible sur RubyForge.
Voilà, comme je l'avais promis il y a quelques jours, je viens de pousser GemMenu sous GitHub. Ceux qui suivent (merci !) auront remarqué que j'ai poussé en même temps ROSXAuth. J'ai en effet décidé de sortir une petite partie du projet pour en faire un module à part entière. Comme son nom le laisse penser, ROSXAuth est une petite classe permettant, avec Ruby, de lancer un script avec les droits de l'administrateur.
Je n'ai pas pris le temps de packager proprement les deux projets. ROSXAuth devrait prendre sa place sur RubyForge, ce qui permettra de le récupérer comme un gem "classique". Pour le moment, vous pouvez passer pas GitHub. Notez bien que ce module est nécessaire pour utiliser GemMenu. Si vous ne l'installez pas, le menu se lancera sans problème, mais vous ne pourrez pas faire les mises à jour.
En ce qui concerne GemMenu, il faudra récupérer les sources et compiler le projet vous même.
Ceux qui vont passer le pas devraient se rendre rapidement compte des limitations de l'outil. Voici donc une petite liste de courses pour les jours à venir :
- Ajouter dans la liste des gems à mettre à jour une entrée permettant de faire un update complet. Ainsi quand on clic sur un package donné, seul ce dernier est mis à jour.
- Améliorer l'activation et la désactivation des entrées du menu en fonction des actions en cours. Par exemple, ne pas permettre de quitter l'application pendant une mise à jour.
- Mettre en place des animations au niveau de l'icône du menu indiquant qu'une action est en cours (recherche de mise à jour et mise à jour en cours)
- Permettre la mise à jour sans authentification.
- Installer automatiquement ROSXAuth s'il n'est pas présent.
- Internationalisation de l'interface.
- A plus long terme, permettre de gérer plusieurs installations (cela peut être intéressant si vous avez, par exemple, Ruby et jRuby installés sur votre machine)
- ...
Autre amélioration à prévoir : il n'y a aucun retour sur l'update. En fait, tout est loggué dans la console.

Je pense qu'il serait préférable de permettre d'afficher ce log. A voir !
Je suis également très énervé contre le panneau de préférences. Il est, à mon goût, très moche et mal organisé. Malheureusement, j'ai l'impression d'avoir touché mes limites de designeur et je serais très heureux d'avoir un peu d'aide pour l'améliorer.

Si vous regarder le code, vous remarquerez très certainement que je gère l'authentification pour l'exécution de la mise à jour d'une façon un peu bancale. ROSXAuth est très simple à utiliser. Il suffit de créer une instance de la classe et d'utiliser ROSXAuth.exec pour exécuter le processus avec les droits root :
require 'rubygems'
require 'rosxauth'
h = ROSXAuth.new()
# execution de `/bin/ls -l /Users/greg'
f = h.exec( "/bin/ls", ["-l", "/Users/greg"] )
if f.nil?
puts "Aie !"
else
IO.for_fd( f ).each do |g|
puts g
end
end
Tout cela est fait en utilisant le service de gestion des autorisations de MacOSX. C'est la première fois que je jouais avec et j'ai dû passer à côté de certaines subtilités, car si vous vous amusez à exécuter la commande gem via le module, vous n'aurez le droit qu'a une insulte en guise de résultat :
ERROR: While executing gem ... (SecurityError)
Insecure operation - exist?
En gros il y a une légère discordance entre le niveau de sécurité imposé par rubygems et celui qui est positionné via ROSXAuth. Idéalement il faudrait que l'on puisse positionner les autorisations de façon fine lors de l'instanciation. Je vais y travailler. En attendant, j'ai trouvé une solution, mais elle est très moche :
1 autz = ROSXAuth.new()
2 ...
3 output = autz.exec(
4 "/usr/bin/sudo",
5 [@gemExecutable.stringValue().to_s, "update", "-y" ]
6 )
Dernier petit détail, j'ai ajouté la notification via Growl. Si vous voulez en profiter, il faudra installer growlnotifier.
Anyway, c'est sur GitHub, donc vous pouvez jouer avec...