remontée d'informations

c@rtc@rt Membre
07:59 modifié dans API AppKit #1
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 ++

Réponses

  • BruBru Membre
    07:59 modifié #2
    Que veux tu savoir au juste ?
    Comment récupérer la MAC address ?

    .
  • c@rtc@rt Membre
    07:59 modifié #3
    salut, en fait j'ai besoin oui deja de recup l'adresse Mac, ensuite de savoir si un processus ( celui de mon navigateur en l'occurence est lancé : au passage comment le relancer automatiquement s'il se plante ? ), de faire de la synchro avec un ftp donc je cherche un ftp gratui si possible et en ligne de commande ( j'ai entendu parler de lftp ) et c deja pas mal pour l'instant
    merci ++
  • Eddy58Eddy58 Membre
    07:59 modifié #4
    dans 1143744736:

    ensuite de savoir si un processus ( celui de mon navigateur en l'occurence est lancé : au passage comment le relancer automatiquement s'il se plante ? )

    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. :)
  • BruBru Membre
    07:59 modifié #5
    dans 1143744736:

    salut, en fait j'ai besoin oui deja de recup l'adresse Mac


    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.

    .
  • c@rtc@rt Membre
    07:59 modifié #6
    Eddy : ok merci ca a l'air sympa ta methode donc je cree un process qui surveille et averti qd ca plante. Comment tu ferai ca, cocoa ou autre chose et si tu as un exemple ca m'aiderai
    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 ++
  • Eddy58Eddy58 Membre
    mars 2006 modifié #7
    dans 1143794305:

    Eddy : ok merci ca a l'air sympa ta methode donc je cree un process qui surveille et averti qd ca plante. Comment tu ferai ca, cocoa ou autre chose et si tu as un exemple ca m'aiderai

    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.
  • c@rtc@rt Membre
    07:59 modifié #8
    super merci je me lance dessus lundi et je te tiens au courant de l'evolution de la chose.
    bon week ++
  • c@rtc@rt Membre
    07:59 modifié #9
    salut, je susi en train de faire des tests et j'essaie de savoir si une appli est lancé et au cas ou elle ne le serait pas je la lance.
    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 ++
  • BruBru Membre
    07:59 modifié #10
    dans 1144142441:

    aTask = [[NSTask alloc] init];
    [aTask setLaunchPath:@/Users/SynapseViewer.app];
    if ([aTask isRunning])


    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.

    .
  • c@rtc@rt Membre
    07:59 modifié #11
    je vais expliquer un peu mieux alors :)
    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 ++
  • Eddy58Eddy58 Membre
    avril 2006 modifié #12
    La méthode isRunning n'est pas significative dans de tels cas, si ton processus est planté elle ne t'avance à  rien car il peut très bien être encore actif pour le système. Je t'ai donné une marche à  suivre (enfin celle que moi je suivrais) plus haut avec NSDistributedNotificationCenter... :o
  • c@rtc@rt Membre
    07:59 modifié #13
    alors si j'ai bien compris tes histoires de notifications :
    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:@&quot;/Users/SynapseViewer.app/Contents/MacOS/Synapse2&quot;];<br />[aTask setArguments:[NSArray arrayWithObjects:@&quot;-foreground&quot;,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 ?
  • c@rtc@rt Membre
    07:59 modifié #14
    et aussi doit y avoir un bug dans le guardian car au bout de 30 sec il se stop avec synapseGuardian has exited due to signal 11 (SIGSEGV)
  • Eddy58Eddy58 Membre
    avril 2006 modifié #15
    Tu m'étonnes que ça plante...;)
    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. :)
  • c@rtc@rt Membre
    07:59 modifié #16
    alors j'ai pas tout compris ton truc :(
    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
  • Eddy58Eddy58 Membre
    07:59 modifié #17
    Oui, c'est à  mettre dans le guard, et ensuite il faut reproduire le même schéma dans synapse pour relancer le guard au cas où il aurait un problème. Mais déjà  il faut bien le faire pour le guard, ensuite tu verras.
    "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@rtc@rt Membre
    07:59 modifié #18
    re, alors j'ai peut etre trouve plus simple pour faire ce que je veux et cela se passe dans le main.m :
    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 ++
Connectez-vous ou Inscrivez-vous pour répondre.