remontée d'informations
c@rt
Membre
Salut a tous,
Je dois faire une remontée d'informations d'un MacMini distant, connecté a internet, sur un serveur en php.
En gros je dois recupérer l'adresse Mac, s'il s'est bien mis a jour...
Mon probleme est que je ne sais pas en quoi le faire : appleScript, COCOA en local et envoyer le resultat dans un fichier et le traiter en php sur le serveur ou directement en php depuis le serveur ?
je ne sais pas ce qui est le mieux merci pour vos reponses ++
Je dois faire une remontée d'informations d'un MacMini distant, connecté a internet, sur un serveur en php.
En gros je dois recupérer l'adresse Mac, s'il s'est bien mis a jour...
Mon probleme est que je ne sais pas en quoi le faire : appleScript, COCOA en local et envoyer le resultat dans un fichier et le traiter en php sur le serveur ou directement en php depuis le serveur ?
je ne sais pas ce qui est le mieux merci pour vos reponses ++
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Comment récupérer la MAC address ?
.
merci ++
Surveiller un processus implique d'avoir un autre processus dédié à cela, enfin c'est ainsi que je ferais. Le "guard" processus scrute périodiquement la liste des processus pour voir si le ou les processus surveillés sont toujours actifs, et en fonction les relance ou pas. Bien sûr les processus surveillés doivent aussi surveiller périodiquement le "guard" processus pour voir si lui est pas planté ou arrêté, et donc le relancer le cas échéant.
Va falloir que tu te plonges dans le IOKit pour parcourir le IORegistry afin de récupérer la MAC address de la première interface ethernet trouvée.
.
merci
Bru : en fait j'ai trouvé plus simple en commande Unix: ifconfig -a | awk ....
mais bon apres fo chercher la bonne interface et recup l'adresse.
merci a vous 2 ++
Je n'ai pas d'exemple, mais voici ce que je ferais, en utilisant NSWorkSpace, NSTask et NSDistributedNotification :
Déjà , le guard processus doit bien sûr être lancé en premier.
* Dans le guard processus :
- Lors de son initialisation, celui-ci va déjà envoyer une notification au processus a surveiller afin de savoir s'il est actif ou pas. Si celui-ci répond, c'est qu'il est actif. Si ça ne répond pas, il faut alors le lancer (méthode launchedTaskWithLaunchPath de NSTask). Ensuite il faut que le guard processus transmette son pid (récupéré avec la méthode launchedApplications de NSWorkSpace, il faut récupérer le bon process parmis ceux dans la liste) au processus surveillé via une notification.
- Il doit appeler périodiquement une routine qui surveillera si le processus surveillé est toujours lancé. Dans cette routine, il faut récupérer la liste des applications lancées (toujours avec la méthode launchedApplications de NSWorkSpace), et comparer le pid renvoyé par le processus surveillé à son initialisation avec les pids de la liste. Si il est dans cette liste c'est bon, sinon relancer le processus surveillé.
* Dans le processus a surveiller :
- Lors de son initialisation, il va renvoyer son pid au guard processus via une notification.
- Il doit appeler périodiquement une routine qui surveillera si le guard processus est toujours lancé. Dans cette routine, il faut récupérer la liste des applications lancées (méthode launchedApplications de NSWorkSpace), et comparer le pid renvoyé par le guard processus à son initialisation avec les pids de la liste. Si il est dans cette liste c'est bon, sinon relancer le guard processus.
Sinon, en complément, dans les méthodes appelées périodiquement, il faudrait rajouter une notification qui demande à l'autre processus s'il est toujours actif, car launchedApplications va fournir une liste des processus lancés, mais un processus peut-être lancé et planté en même temps. Si une réponse arrive en retour de notification (via une notification de retour, je sais pas si tu me suis ), c'est que le processus est bien lancé et actif, sinon c'est qu'il est planté, donc un kill() de celui-ci suivi d'un relancement est nécessaire.
Remarque, plutôt que de vérifier la présence des pids, ce seul échange de notifications devrait être suffisant.
bon week ++
Voici mon code :
- (void)awakeFromNib
{
// [super init];
aTask = [[NSTask alloc] init];
[aTask setLaunchPath:@/Users/SynapseViewer.app];
if ([aTask isRunning])
{
NSLog(@ok);
}
else
{
NSLog(@pas ok);
[aTask launch];
}
}
Mais j'ai cette erreur :
006-04-04 11:19:44.535 SynapseGuardian[13874] *** NSTask: Task create for path /Users/SynapseViewer.app failed: 13, "Permission denied".
je sais pas si ca a un rapport mais je suis connecté en admin.
merci ++
isRunning ne peut pas fonctionner, puisque tant que tu n'auras pas fait [aTask launch], forcément, ce n'est pas running.
D'autre part, ton appli est un .app, c'est donc un bundle, non ?
Donc, tu tentes d'exécuter le répertoire nommé "SynapseViewer.app", ce qui n'est pas possible bien sûr.
Le code exécutable se trouve dans "SynapseViewer.app/Content/Macos/SynapseViewer".
Et pour exécuter des .app, il est préférable de passer par le LaunchManager (va voir dans la classe NSWorkSpaceManager).
De toute façon, je ne sais pas trop ce que tu veux faire, mais il est clair que tu es franchement sur la mauvaise voie.
.
en fait j'ai besoin d'un programme qui se lance avant ou apres mon navigateur et qui regarde si son process est lancé et au cas ou lance l'appli navigateur. Et ensuite il surveille le navigateur et s'il s'arrete ou plante il le kill et le relance.
voila j'espere que vus avez plus de detail
merci ++
j'ai une premiere appli synapseGuardian qui se lance en premier et lance synapse2
j'ai mis un ecouteur de notification sur synapseGuardian :
- (void)awakeFromNib
{
aTask= NSTask alloc] init]; <br />[aTask setLaunchPath:@"/Users/SynapseViewer.app/Contents/MacOS/Synapse2"];<br />[aTask setArguments:[NSArray arrayWithObjects:@"-foreground",nil;
[aTask launch];
NSResponder *logger;
[[NSDistributedNotificationCenter defaultCenter] addObserver:logger selector:@selector(log name:nil object:nil];
}
je lance synapseGuardian et ensuite il lance synapse2 et qd je le quitte ?+Q il met :
2006-04-05 15:17:07.209 Synapse2[414] L'application s'est termin?©e normalement
donc la il faut que je recup le nom de l'appli qui envoi une notification ( ici synapse2 ) et le code ( 414 ) qui doit correspondre a une fin normale du programme ou au n° du processus ?
Jusque la c bon ?
donc il me reste a recuperer le code de fin de programme et a lui associer la bonne action selon le code ?
Regardes ci-dessous comment implémenter correctement une notification. Bien sûr il faut que la notification soit correctement postée par l'autre appli pour que ça fonctionne :
[tt]
-(void)dealloc
{
   //...
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
   //...
}
-(void)awakeFromNib
{
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationRecue name:@com.MonAppli.Synapse2IsOkNotification object:nil];
}
-(void)notificationRecue:(NSNotification *)notification
{
  NSLog(@OK);
}
[/tt]
Ca n'est bien sur qu'une partie, déjà il faut que le guard poste une notification périodiquement (via un timer par exemple) afin de demander son état à synapse, qui lui postera la notification reçue ci-dessus. Et en fonction de cette réception tu relances ou pas synapse.
en fait cette fonction est a mettre dans le guardian ?
Sinon le name:@com.Synapse2.IsOkNotification je ne vois pas a quoi il correspond et ce champ c'est a synapse2 de le remplir ?
je suis un peu perdu dsl
"com.Synapse.IsOkNotification" est le nom de ta notification, en faites tu mets ce que tu veux, pour les notifications distribuées il faut juste faire attention que le nom ne rentre pas en conflit avec d'autres noms de notification. Il faut que ta notification postée dans synapse porte bien sûr ce même nom. Mais ça m'a l'air vraiment flou pour toi, aussi je ne peux que te conseiller d'étudier attentivement la doc sur les notifications, tu trouveras aussi un article dans la rubrique dédiée sur OC et pleins d'autres sur le net.
Et puis si tu as des questions n'hésite pas.
c'est avec la commande fork() qui permet de dupliquer le process et de lancer le 2° si le premier plante.
#import <Cocoa/Cocoa.h>
#import <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t child_pid;
pid_t wait_pid;
int wait_status;
int result;
// On duplique le processus
child_pid = fork();
if ( (int)child_pid == -1 ) {
// Erreur dans la creation du processus fils
exit(EXIT_FAILURE);
}
else if ( child_pid == 0 ) {
// On lance l'application comme processus fils
result = NSApplicationMain(argc, (const char **) argv);
exit(EXIT_FAILURE);
}
else {
// Le processus p?®re continue ici
// Et attend la fin du processus fils
wait_pid = wait(&wait_status);
if ( (int)wait_pid == -1 ) {
// Au cas o??
exit(EXIT_FAILURE);
}
if ( WIFEXITED(wait_status) ) {
// Fin normale du processus fils (l'application)
NSLog(@L'application s'est termin?©e normalement);
}
else if (WIFSIGNALED(wait_status)) {
// Fin forc?©e du processus fils
//NSLog(@L'application a ?©t?© stopp?©e avec le signal : %d, WTERMSIG(wait_status));
result = NSApplicationMain(argc, (const char **) argv);
}
else {
// Fin non d?©finie du processus fils
//NSLog(@L'application s'est arr??t?©e);
result = NSApplicationMain(argc, (const char **) argv);
}
}
return 0;
}
ok jusque la
Mais j'ai 2 soucis :
- quand le second processus se lance ( apres avoir quitter l'appli avec Alt + Pomme + Esc ) il n'est pas activer. Je m'explique en fait l'appli est bien lance mais je dois la sélectionner en cliquant dessus et ainsi masquer le pointeur de la souris. Une solution ?
- le second c'est que quand je compile mon appli avec XCode et qu'il la lance si je quitte (avec Alt + Pomme + Esc) l'appli se relance ( mais on observe le premier pb). Mais si je lance le .app qui se trouve dans build/debug si je quitte mon appli elle ne revient pas
J'espere que vous me suivez et que vous pourrez (encore) m'aider
merci ++