domingo, 7 de julho de 2013

Mac OS X: notificações automáticas de actualizações do sistema para utilizadores standard

UpdateCheck, Mac OS X Software Update notifications for non-admin users
Ideia/script original de Sven Anderson. Modificado por mim para ser compatível com o Mountain Lion. Usa o Finder em vez do Growl para notificar o utilizador; descarrega e instala as actualizações via terminal em vez de abrir a App Store por causa disto.

1.- Aceder à conta administrator.

2.- Abrir o ficheiro "sudoers" via visudo:
~$ sudo visudo

2a) Premir a tecla 'i' para editar.

2b) Adicionar o seguinte:
username ALL=NOPASSWD:/usr/sbin/softwareupdate
(ex: paulo_ ALL=NOPASSWD:/usr/sbin/softwareupdate)

2c) Premir a tecla 'Esc' para sair do modo edição.

2d) Escrever ':w' para gravar o ficheiro.
 
2e) Escrever ':q' para sair.

Nota: Se por qualquer motivo for preciso sair sem gravar, escrever ':q!'.

3.- Voltar à conta standard.


4.- Criar o ficheiro updateChecker.scpt via AppleScript Editor...
 set theList to every paragraph of (do shell script "sudo softwareupdate -l")  
 set updates to ""  
 repeat with anItem in theList  
      if anItem starts with "  * " then  
           if updates is not "" then  
                set updates to updates & return  
           end if  
           set updates to updates & (characters 6 thru -1 of anItem)  
      end if  
 end repeat  
 if updates is not "" then  
      tell application "Finder"  
           set answer to button returned of (display dialog "Software Update available:" & return & updates with title "Software Update available" buttons {"Cancel", "Launch Terminal"} default button {"Launch Terminal"} cancel button {"Cancel"} with icon file ":System:Library:CoreServices:Software Update.app:Contents:Resources:SoftwareUpdate.icns")  
           if answer is equal to "Launch Terminal" then  
                tell application "Terminal"  
                     do script "sudo softwareupdate -i -a"  
                     activate  
                end tell  
           end if  
      end tell  
 end if  
... e copiá-lo para ~/AppleScripts

5.- Criar o ficheiro de.anderson.sven.updateCheck.plist
 ~$ nano ~/Library/LaunchAgents/de.anderson.sven.updateCheck.plist
 <?xml version="1.0" encoding="UTF-8"?>  
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
 <plist version="1.0">  
 <dict>  
      <key>Label</key>  
      <string>de.anderson.sven.updateCheck</string>  
      <key>LowPriorityIO</key>  
      <true/>  
      <key>Nice</key>  
      <integer>1</integer>  
      <key>ProgramArguments</key>  
      <array>  
           <string>osascript</string>  
           <string>/Users/username/AppleScripts/updateChecker.scpt</string>  
      </array>  
      <key>RunAtLoad</key>  
      <true/>  
      <key>StartInterval</key>  
      <integer>86400</integer>  
 </dict>  
 </plist>  
Nota 1: Substituir 'username' pelo nome do utilizador. (Atenção: Não funciona se metermos '~'. É mesmo preciso pôr a path toda...).
(ex: /Users/paulo_/AppleScripts/updateChecker.scpt)

Nota 2: A directoria "AppleScripts" é, obviamente, apenas uma sugestão. Se decidirem copiar para outra directoria, não se esqueçam de fazer a respectiva alteração no ficheiro.

6.- Sair da sessão e voltar a entrar.
Ou executar no terminal:
~$ launchctl load ~/Library/LaunchAgents/de.anderson.sven.updateCheck.plist

# edit 23/07/2013