# Script d'avertissement d'uptime



## Bassman (11 Septembre 2009)

Hello,

Voilà, je cherche à écrire un script pour que mes chers utilisateurs soient averti que leur uptime dépasse les limites de l'entendement.

Mais mes connaissances dans ce domaine sont limitées, j'ai regardé du côté d'automator, qui me permet bien de récupérer la variable équivalente à "uptime" dans le terminal, mais je ne sais pas comment l'exploiter.

Mettre en place le launchd pour que le script se lance régulièrement, aucun soucis, mais ce script en lui même&#8230; je sais pas faire.

Quelqu'un pour me donner un coup de main (applescript, shell, automator) peut m'importe la méthode, du moment que je puisse la lancer dans mon daemon derrière.

Merci d'avance


----------



## ceslinstinct (11 Septembre 2009)

Bassman a dit:


> Hello,
> 
> Voilà, je cherche à écrire un script pour que mes chers utilisateurs soient averti que leur uptime dépasse les limites de l'entendement.
> 
> ...


Bonjour


```
on idle
	set UT to (do shell script "uptime") as string -- Lecture des données
	set {myTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {space}}
	set msg to word 4 of UT -- Nombre de jours
	set AppleScript's text item delimiters to "up"
	set UpT to words 1 thru 4 of text item 2 of UT -- Les données à afficher
	tell UpT to set temps to item 1 & space & " Jours" & " " & item 3 & " heures et " & item 4 & " minutes."
	-- Alerte
	tell me to activate
	-- Si plus d'un jour alors alerte
	if msg > 1 then display dialog temps as string buttons {"OK"} default button 1 with title "Alerte Uptime" giving up after 15
	set AppleScript's text item delimiters to myTID
	return 5
end idle
```

Fait à la va-vite, testé sur Léopard 10.5.8 En progiciel en tache de fond.

A toi de voir ci cela peut être utile et le modifier suivant ta convenance.

@+


----------



## Bassman (11 Septembre 2009)

Ah ouais&#8230; 

Merci beaucoup ! J'essaye ça lundi au boulot


----------



## ceslinstinct (11 Septembre 2009)

Bassman a dit:


> Ah ouais
> 
> Merci beaucoup ! J'essaye ça lundi au boulot


Bonsoir

Teste le code tel qu'il est pour voir si cela correspond à tes attentes.

Copier-Coller ce code dans Applications/AppleScript/Éditeur de sripts.
Bouton compiler, si le texte prend des couleurs c'est bon.

Barre des menus/Fichiers/Enregistrer sous
Donner un nom

Sélectionner le bureau comme dossier de réception (pour le test).
Format de fichier = Progiciel (pour être compatible PPC et intel).
Option = rester en arrière plan seulement de coché.

Un double clic sur cette application et si plus d'un jours Uptime donc alerte.

Bon test.

Cordialement


----------



## Clarusad (12 Septembre 2009)

J'en profite : que veut dire "on idle" ?
Merci.


----------



## ceslinstinct (12 Septembre 2009)

Clarusad a dit:


> J'en profite : que veut dire "on idle" ?
> Merci.


Bonjour

Option = rester en arrière plan seulement de coché permet de ne rien voir lorsque cette application fait ses contrôles.

*on idle* est la commande qui fait tourner en boucle cette application.
Il faut la fermer pour l'arrêter.

*return 5* est la temporisation (en secondes) avant de passer au contrôle suivant, donc à régler par l'utilisateur.

Donc *on idle*  n'est utilisé qu'avec les applications travaillant en tache de fond (invisible)

@+


----------



## Bassman (12 Septembre 2009)

ok, dans la mesure ou je ferais appel à ce script par un launchd, tous les mardi à priori, je pourrais supprimer la boucle qui l'exécute en permanence en tâche de fond.


----------



## Clarusad (12 Septembre 2009)

Pour voir si j'ai bien compris : dans ce cas, est-ce juste de dire que "on idle" permet de faire d'une application un démon "daemon" tournant en tâche de fond ?


----------



## ceslinstinct (12 Septembre 2009)

Bassman a dit:


> ok, dans la mesure ou je ferais appel à ce script par un launchd, tous les mardi à priori, je pourrais supprimer la boucle qui l'exécute en permanence en tâche de fond.


Bonjour

On idle utilisé juste pour voir le fonctionnement sur mon ordinateur, puisque toi tu en as pas besoin.

Il suffit qu'un quelconque programme démarre ce code.

Normalement iCal devrais pouvoir te le lancer tous les Mardi (j'utilise pas iCal donc non testé).

Tu supprime:
*On idle
return 5
end idle*



Clarusad a dit:


> Pour voir si j'ai bien compris : dans ce cas, est-ce juste de dire que "on idle" permet de faire d'une application un démon "daemon" tournant en tâche de fond ?


Tu as tout compris.

@+


----------



## Clarusad (12 Septembre 2009)

Merci ! J'aurai appris quelque-chose de super intéressant, et me coucherai moins bête ce soir.


----------



## ceslinstinct (12 Septembre 2009)

*Bassman* Pourquoi au bas de tes messages tu as les 3 boutons  citer, etc en double et que la commande Citer du haut envoie sur http://www.vesoul.fr/

Je ne trouve ça qu'avec toi, simple curiosité.

@+


----------



## Bassman (12 Septembre 2009)

Héhé 

C'est un piège


----------



## ceslinstinct (13 Septembre 2009)

Bonsoir

Ce que j'ai oublié de dire, c'est une application si l'on supprime ces 3 lignes du code.

*On idle
return 5
end idle*

@+


----------



## Bassman (14 Septembre 2009)

Je suis en train de tester tout ça.

Mon macpro est à 2j 17h56 et des bananes d'uptime.
Si je laisse "if msg > 1", j'ai bien la boite de dialogue qui apparaît. En revanche, si je mets "if msg > 2", il n'apparaît plus&#8230; Quelque chose que je n'ai pas compris ?

Même chose sur un serveur avec 122j d'uptime 

Cela fonctionne si je mets 1, 10 ou 100, mais pas avec d'autres chiffres


----------



## ceslinstinct (14 Septembre 2009)

Bassman a dit:


> Je suis en train de tester tout ça.
> 
> Mon macpro est à 2j 17h56 et des bananes d'uptime.
> Si je laisse "if msg > 1", j'ai bien la boite de dialogue qui apparaît. En revanche, si je mets "if msg > 2", il n'apparaît plus Quelque chose que je n'ai pas compris ?
> ...


Bonjour

Teste avec cette façon, il y a sans doute un problème avec un entier et un string.
Tu n'utilise pas les guillemets dans if msg > 2

```
if (msg as integer) > 1 then display dialog temps as string buttons {"OK"} default button 1 with title "Alerte Uptime" giving up after 15
```

Si une erreur c'est que la variable n'est pas un entier.

Tu es en 10.5.6 (je l'ai pas donc non testé?)

Chez moi ça marche très bien en application.

Teste en application et après avec ton démon pour voir si une différence.

Tu me tien au courant?

@+


----------



## Bassman (14 Septembre 2009)

C'était donc bien un problème d'entier, avec 
	
	



```
if (msg as integer) > &#8230;
```
 celà fonctionne parfaitement.

Environnement de test : 10.5.2 à 10.5.8


----------



## ceslinstinct (14 Septembre 2009)

Bassman a dit:


> C'était donc bien un problème d'entier, avec
> 
> 
> 
> ...


Bonjour

J'ai réécrit le code (en application donc utilisable par toi) pour que tu comprenne bien le fonctionnement.


```
on run
	set uptime_ to do shell script "uptime" as string -- Lecture de l'Uptime
	
	-- Mise en mémoire du délimiteur et prise en compte du nouveau Délimiteur espace pour trouver les 2 variables nécessaire au code
	set {myTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {space}}
	-- Initialisation des variables
	set {temps, nbrJours} to {item 1 of text items of uptime_ as text, item 4 of text items of uptime_ as text}
	set AppleScript's text item delimiters to "" -- Retour au délimiteur mis en mémoire
	
	tell me to activate -- Pour être sur que la fenêtre d'alerte seras en premier plan
	-- Alerte
	if (nbrJours as integer) > 1 then display dialog nbrJours & " Jours et " & temps as string buttons {"OK"} default button 1 with title "Alerte Uptime" giving up after 15
end run
```

A toi de tester et faire ton choix.

Excuse moi si trop de commentaires, c'est juste pour expliquer ce que font chaque lignes du code.
Il suffit de les effacer, et le code fonctionne toujours.

Cordialement


----------



## Bassman (14 Septembre 2009)

Merci beaucoup.


Un truc qui chagrine mon collègue, c'est de voir l'icône d'une application passer dans le dock puis disparaître (si l'uptime est inférieur à la valeur limite). Sauver l'applescript en script est suffisant ?


----------



## ceslinstinct (14 Septembre 2009)

Bassman a dit:


> Merci beaucoup.
> 
> 
> Un truc qui chagrine mon collègue, c'est de voir l'icône d'une application passer dans le dock puis disparaître (si l'uptime est inférieur à la valeur limite). Sauver l'applescript en script est suffisant ?


Si tu utilise on idle le code reste ouvert jusqu'à tu le quitte.
C'est lui qui décide de ne pas quitter car avec la temporisation Return il doit faire d'autres contrôles.

Si tu passe par un démon autre que on idle, c'est normal que le code quitte.
Il seras ouvert a la prochaine demande du démon pour contrôle.
C'est ton démon qui décide quand il faut appeler l'application, faire son contrôle si nécessaire t'avertir et quitter.

Si l'application ne doit travailler que le Mardi, c'est pas nécessaire qu'elle reste ouverte.

Donc à utiliser en application (progiciel pour être compatible PPC et intel).

@+


----------



## Bassman (14 Septembre 2009)

Oui et non, on s'est pas compris je crois.

Mon collègue souhaite que le controle soit fait avant et sans qu'une application s'ouvre dans le dock.

Voici le scénario :


```
Daemon qui se lance
                                /\
Uptime trop long                            Uptime correct
         |                                         |
lancer app d'averto                         Ne rien faire
```

Mais là, on sort forcément d'un applescript pour la première partie : le contrôle du temps d'uptime.
(L'affichage, donc le traitement du temps d'uptime reste intéressant pour l'applescript tout de même)

---------- Nouveau message ajouté à 14h26 ---------- Le message précédent a été envoyé à 14h25 ----------

Qu'il est con ce vBulletin&#8230;


----------



## r e m y (14 Septembre 2009)

et c'est quoi un "uptime dépassant les limites de l'entendement"?

Sur mon iMac j'en suis à 10 jours d'uptime (et encore, c'est parce que j'ai voulu faire la mise à jour 10.5.8 que j'ai été contraint de redémarrer)... est-ce raisonnable?

Et si NON, pourquoi devrais-je redémarrer plus souvent mon Mac?


----------



## Bassman (14 Septembre 2009)

Un uptime dépassant l'entendement, c'est un uptime de 6-7 jours, car ici, les applications internes sont d'une lourdeur extrême (ne gèrent pas le multicore et gèrent les allocations mémoire comme moi je suis vitrier). De plus, les macs sont lié à l'active directory, et le réseau n'étant pas ultra performant, on a constaté qu'un grand temps d'uptime favorisait des pertes de synchro avec l'AD.

J'ai redémarré un poste d'un des utilisateurs  hier qui n'avait pas redémarré depuis le 16/05 dernier, et l'utilisateur n'a même pas senti combien la machine était devenue lente - et c'est rien de le dire.

Le redémarrage d'un poste doit être fonction de son utilisation, de sa ram. Plus tu utilises de softs lourds (ouvert/fermé/ouvert/fermé) et moins tu as de ram, plus il est important de redémarrer souvent.


----------



## ceslinstinct (14 Septembre 2009)

Bassman a dit:


> Oui et non, on s'est pas compris je crois.
> 
> Mon collègue souhaite que le controle soit fait avant et sans qu'une application s'ouvre dans le dock.
> 
> ...


Le dernier code que j'ai envoyé, que fait-il?

Il est lancé suivant la demande.
Il contrôle si le nombre de jours est dépassé
Non = quitte
Oui = Ajouter les commandes de remises à zéro.

RAZ = pour moi c'est swap et uptime à zéro donc le plus simple c'est un redémarrage.

*Il y a une application qui permet de dire au code de ne pas afficher l'icône dans le Dock.*

Si j'ai bien compris la question, votre copain veut un résultat instantané, sans ouvrir aucunes applications et que tout soit invisible et que le swap et l'uptime soient vides.

Vous lui dite de voir avec des professionnels, car je ne peu répondre à cette question.

Donc votre question été incomplète, mais honnêtement je pense que c'est moi qui l'ai pas compris.

@.


----------



## Bassman (14 Septembre 2009)

Merci pour toutes ces réponses .



ceslinstinct a dit:


> Le dernier code que j'ai envoyé, que fait-il?
> 
> Il est lancé suivant la demande.
> Il contrôle si le nombre de jours est dépassé
> ...



C'est effectivement ce que j'en avais compris.



> RAZ = pour moi c'est swap et uptime à zéro donc le plus simple c'est un redémarrage.
> 
> *Il y a une application qui permet de dire au code de ne pas afficher l'icône dans le Dock.*
> 
> Si j'ai bien compris la question, votre copain veut un résultat instantané, sans ouvrir aucunes applications et que tout soit invisible et que le swap et l'uptime soient vides.



Du tout 
Nous avons l'habitude de fonctionner par scripts. 
De plus les utilisateurs étant des casses burnes patentés, s'ils voient une application non désirée se lancer, ça va être la grosse gueulante (sont fatiguants parfois ces utilisateurs :sleep surtout, si c'est pour ne rien dire (le cas ou l'uptime serait correct).



> Vous lui dite de voir avec des professionnels, car je ne peu répondre à cette question.
> 
> Donc votre question été incomplète, mais honnêtement je pense que c'est moi qui l'ai pas compris.
> 
> @.



Dans tous les cas, merci pour le coup de main sur l'applescript, il me sera très utile lorsque j'aurais réussi à scripter la même première partie que votre applescript, mais en shell (c'est pas gagné).


----------



## ceslinstinct (14 Septembre 2009)

Bassman a dit:


> Merci pour toutes ces réponses .
> 
> 
> 
> ...


Pourquoi tu demande pas que l'icône du script soit invisible dans le Dock (ne s'ouvre pas, cela te ferais gagner quelques jours le temps de trouver une solution).

Je t'avoue que je sais que ce programme existe, mais jamais utilisé.

Peut-être qu'une âme charitable va l'indiquer, pour te faire gagner du temps dans tes recherches.

Cordialement


----------



## Bassman (14 Septembre 2009)

La réponse est même plus simple, sous plusieurs conditions.


En sauvegardant l'applescript que tu m'as fourni en tant qu'application depuis une machine *10.6*, je peux :
- Naviguer à l'intérieur du package appli
- Retoucher le script (dans contents/ressources/script/main.scpt) éventuellement

Mais aussi et surtout ajouter 2 lignes au fichier info.plist du paquet :

```
<key>LSUIElement</key>
   <true/>
```

Ces 2 lignes ajoutées juste avant le dernier <dict> permettent de rendre l'application invisible dans le Dock, ainsi que dans la fenêtre de kill des process du Finder (mais pas dans le moniteur d'activité).


Royal


----------



## ceslinstinct (14 Septembre 2009)

Bassman a dit:


> La réponse est même plus simple, sous plusieurs conditions.
> 
> Mais aussi et surtout ajouter 2 lignes au fichier info.plist du paquet :
> 
> ...


Comment tu fait pour ajouter ces 2 lignes (quel programme pour modifier).

La ces fichiers .plist sont totalement inconnus pour moi.

Jamais encore touché, mes cette commande me serais utile.

@+


----------



## Diablovic (14 Septembre 2009)

L'application la plus adaptée à l'édition des .plist (ça signifie property list), c'est le Property List Editor. Il est installé avec les outils de dev du mac (xcode & cie).
Souvent le property list est enregistré en format texte, donc un simple éditeur de texte peut suffire pour l'éditer, mais parfois on tombe sur des versions au format binaire. Il faudra alors passer par le Property List Editor ou une étape de conversion (avec la commande plutil du terminal) pour pouvoir l'éditer.
Comme ce ne sont que des fichiers de propriété, leurs utilisations est vaste: enregistrement des préférences utilisateurs, paramètrage d'applications et de launchdaemons, etc...
http://developer.apple.com/mac/libr...nceptual/CFPropertyLists/CFPropertyLists.html


----------



## ceslinstinct (14 Septembre 2009)

Diablovic a dit:


> L'application la plus adaptée à l'édition des .plist (ça signifie property list), c'est le Property List Editor. Il est installé avec les outils de dev du mac (xcode & cie).
> Souvent le property list est enregistré en format texte, donc un simple éditeur de texte peut suffire pour l'éditer, mais parfois on tombe sur des versions au format binaire. Il faudra alors passer par le Property List Editor ou une étape de conversion (avec la commande plutil du terminal) pour pouvoir l'éditer.
> Comme ce ne sont que des fichiers de propriété, leurs utilisations est vaste: enregistrement des préférences utilisateurs, paramètrage d'applications et de launchdaemons, etc...
> http://developer.apple.com/mac/libr...nceptual/CFPropertyLists/CFPropertyLists.html


Bonjour

C'est la première fois que j'essaie de comprendre en lecture un info.plist.

J'ai utilisé *Property List Editor* comme conseillé par toi et la commande de *Bassman* et ça marche parfaitement.

Plus d'icône dans le Dock application ouverte.

Merci a vous 2 de m'avoir permis de découvrir une commande intéressante.

Cordialement


----------



## Bassman (14 Septembre 2009)

Pour parfaire l'explication de Diablovic :

Dans le cas ou un plist lu par n'importe quel editeur de texte (ma préférence allant vers Smultron - gratos) ne serait pas génial, il suffit de taper une simple commande dans le terminal très pratique :


```
plutil -convert xml1 fichier_a_convertir.plist
```

Éventuellement avec un sudo devant, si les droits du fichier en question nécéssite d'être super user.

Les fichiers plist n'étant que de simples listes XML contenant les tag préférences et leur valeur, cette commande remet le fichier plist au propre dans un format facilement lisible dans un éditeur de texte, sans l'altérer.


----------



## ceslinstinct (14 Septembre 2009)

Bassman a dit:


> Pour parfaire l'explication de Diablovic :
> 
> Dans le cas ou un plist lu par n'importe quel editeur de texte (ma préférence allant vers Smultron - gratos) ne serait pas génial, il suffit de taper une simple commande dans le terminal très pratique :
> 
> ...


Bonsoir

J'ai lue ton code, j'ai utilisé *Property List Editor* pour lire le .plis j'ai ajouté la ligne manquante et ça fonctionne.

Le petit hic (c'est pas grave) si tu fixe le dock lors de l'ouverture de l'application ce dernier a un sursaut comme si il voulais afficher l'icône mais ne le peu pas.

Le principal c'est que mon code t'est donné une idée pour réaliser le tien.

Peut-être a une prochaine fois.

 Faites en sorte d&#8217;obtenir ce que vous aimez, sinon vous serez forcé d&#8217;aimer ce que vous obtenez.
&#8212; George Bernard Shaw

@+


----------



## ceslinstinct (15 Septembre 2009)

*Bassman*

Bonjour

J'ai ajouté le nombre de pages utilisée par le Swap et le total occupé par ce dernier sur le volume.

Juste en lecture, c'est juste si l'on dépasse l'Uptime on a aussi le Swap.

Si ça t'intéresse tu le dit.

@+


----------

