25/05/07

Des machins (en AppleScript) pour Geektool...

Geektool

Dans d'autres billets de ce blog[1], on pouvait voir que, et comment, Geektool pouvait exécuter des scripts AppleScript. A partir de là, il devient très facile de faire quelques bricoles.

Afficher les X dernières lignes de la Console

Lors de son exécution, le logiciel échange des messages concernant ses activités entre les différentes parties du système. Ces informations sont enregistrées dans les historiques des messages. Console permet de visualiser n'importe quel message échangé entre le système et les applications. (Aide Console)

Pour y accéder avec Geektool, on peut se contenter de demander la lecture du fichier console.log… ouais, mais non, Geektool affichera alors tout le contenu du fichier, et même en jouant sur la taille de la fenêtre, le résultat sera peu satisfaisant et peu esthétique. De plus, il contient une information répétitive et inutile[2] la date du jour, dans 2 types de formats possibles, c'est pourquoi je me suis fait une petit script[3] :

console.scpt

(*    
    console.scpt
    HP <http://blogosx.jupiterii.com>
 
    updated May. 24, 2007
*)
 
property myXlines : 3
 
set uid to do shell script "id -u"
set shortDate to (do shell script "date '+%h %d'" as text) & space
set hippenDate to (do shell script "date '+%Y-%m-%d'" as text) & space
 
on simpleReplace(search, replace, subject)
	local search, replace, subject, ASTID
	set ASTID to text item delimiters
	try
		set text item delimiters to search
		set subject to text items of subject
		set text item delimiters to replace
		set subject to "" & subject
	end try
	set text item delimiters to ASTID
	return subject
end simpleReplace
 
set lastXlines to ((do shell script "tail -n " & myXlines & " /Library/Logs/Console/" & uid & "/console.log") as text)
 
set myConsole to my simpleReplace(shortDate, "", lastXlines)
set myConsole to my simpleReplace(hippenDate, "", myConsole)

Il suffit de modifier la valeur numérique de property myXlines pour ajuster la quantité de messages affichés.

infoSys.scpt

(*    
    infoSys.scpt
    HP <http://blogosx.jupiterii.com>
 
    updated Jul. 18, 2007
*)
 
on bash(cmd)
	try
		do shell script (cmd)
	on error
		"error"
	end try
end bash
 
on run
	set hostname to bash("hostname -s")
	set uptime to bash("uptime | cut -d, -f1 | colrm 1 10")
	set RAM to bash("top -l 1 | awk '/PhysMem/ {print $8}'")
	set ethernet to bash("ifconfig en0 | grep 'inet ' | awk '{print $2}'") --ethernet
	set wifi to bash("ifconfig en1 | grep 'inet ' | awk '{print $2}'")
	set CPU_temp to bash("sysctl -a kern.cpu_temp | awk -F \": \" '/cpu_temp:/ {print $2}'")
	set start_volume to bash("df -h / | tail -1 | awk '{print $5}'")
	set swapfile to bash("/usr/bin/du -hc /var/vm/swap* | grep 'total' | awk '{print $1}'")
	
	set path2public to bash("whoami") & "/Public/"
	set publicfile to bash("/usr/bin/du -hc /Users/" & path2public & "* | grep 'total' | awk '{print $1}'")
	if (publicfile = "0B") then
		set publicfile to "empty"
	else
		set Xfiles to bash("ls /Users/" & path2public & " | wc -l | awk '{print $1}'")
		set wordfile to "files"
		if ((Xfiles as real) is less than or equal to 1) then
			set wordfile to "file"
		end if
		set publicfile to publicfile & space & "(" & Xfiles & space & wordfile & ")"
	end if
	
	set load_average to word 1 of bash("uptime | sed 's/.*load averages: //g' | cut -d, -f2")
	
	--warning 1.00, critical 3.20 (*2 : dual core)
	set load_message to ""
	if (load_average is greater than or equal to 1 * 2) then set load_message to "(warning)"
	if (load_average is greater than or equal to 3.2 * 2) then set load_message to "(critical)"
	
	if wifi = "" then set wifi to "OFF"
	
	set final_output to ¬
		hostname & " : " & ethernet & return ¬
		& "AirPort : " & wifi & return ¬
		& return ¬
		& "Public : " & publicfile & return ¬
		& "Uptime : " & uptime & return ¬
		& "RAM : " & RAM & return ¬
		& "Temp. CPU : " & CPU_temp & "°C" & return ¬
		& "Charge moyenne : " & load_average & space & load_message & return ¬
		& "Utilisation disque : " & start_volume & return ¬
		& "SWAP : " & swapfile
	
	return final_output
end run

Un petit script destiné à afficher diverses informations systèmes (réseau : IP, hostname et occupation du dossier Public ; RAM, CPU, occupation du disque de démarrage, uptime, charge[4][5]…). L'affichage de la température nécessite l'installation de SpeedIt, un framework de Increw Team[6].

Utilisation d'Applescript avec GeekTool

Créer un nouveau shell (GeekTool) :

osascript '/path/to/myScript.scpt' | iconv -f utf-8 -t ucs-2-internal

l'utilisation de iconv est facultative et permet l'affichage correct des caractères accentués.

Notes

[1] recherche : AppleScript et iTunes

[2] si on veut n'afficher que les quelques derniers messages sur le bureau

[3] la fonction simpleReplace() vient de : MacScripter - str_replace() [Search/find and replace text]

[4] load average, voir : loadaverage - Documentation Ubuntu Francophone

[5] Determining system info (lists.freebsd.org)

[6] voir aussi : CoreDuoTemp

#1 WaterCooled écrivait :

03/08/08

Merci pour l'astuce, assez pratique! Malheureusement relativement "cher" en utilisation CPU si l'on veut avoir un rafraichissement rapide.

RSS commentaires

  1. 5
  2. 4
  3. I
  4. Q
  5. I
  6. 2

Pour valider le formulaire, saisissez les 3 derniers caractères de la série

  • caca
  • confused
  • cry
  • dizzy
  • happy
  • lol
  • neutral
  • omg
  • sad
  • smile
  • tongue
  • wink