executer un binaire en HTML

executer un binaire en HTML - HTML/CSS - Programmation

Marsh Posté le 12-03-2013 à 15:28:58    

Bonjour,
 
Je souhaite faire une petite page web sur un serveur avec apache et linux permettant d'appeler un binaire avec des paramètres sur ce même serveur.
 
En gros, la page serait une liste toute simple, et devant chaque item un bouton OK, et lorsque je clique dessus, cela appelle l'executable.
 
Dans un premier temps, je ne souhaite pas d'interaction avec la page web, le traitement se ferait en arrière plan ( pour valider la faisabilité ).
 
Dans un 2eme temps, je peux mettre en place une communication entre le serveur web et l'executable pour générer dynamiquement une mise à jour de la page ( par exemple ici , l'executable sert à flasher des appareils, je pourrais afficher une barre de progression ainsi qu'un statut ). La communication entre les 2 n'est pas importante , je pourrais choisir la solution la plus simple : socket , fichier , sortie standard , pipe , etc ...
 
 
Voici mes questions :  
 
 - est-ce simple à réaliser ? en effet, je suis programmeur C / C++ et le monde web m'est totalement étranger.
 - est-ce une bonne approche ? Je n'ai pas besoin d'une page design, le but est simplement d'offrir une interface web pour piloter un executable en ligne de commande distant ( hébergé sur la meme machine qui heberge le serveur apache ).
 - si ce n'est pas la bonne approche, faut-il utiliser d'autres moyens ? Sachant que l'executable en lui même est assez complexe, je ne peux pas le réécrire dans un autre langage.
 
Pour info, l'executable en ligne de commande que j'ai écrit a une syntaxe similaire à celle-ci :  
 


./flash --source http://monchemin/monfichier.hex --cible udp://172.17.255.255:49733 --load-eeprom --load-flash --disable-z1
 
ou bien  
 
./flash --source http://monchemin/monfichier.hex --cible /dev/ttyS0  --load-flash --disable-z1
 


 
Merci par avance  :jap:

Reply

Marsh Posté le 12-03-2013 à 15:28:58   

Reply

Marsh Posté le 12-03-2013 à 16:38:48    

voici un bout de code que j'ai fait pour tester mon principe, ca a l'air de marcher ( je préviens encore une fois , je débute en HTML, donc j'ai surement une mauvaise approche ).
 
2 fichiers :  
 
index.php

Code :
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <form method="GET" action="test.php">
  6. <p>PSB IDCAN = 104
  7. <input type="submit" value ="flash">
  8. </p>
  9. </form>
  10. <form METHOD="GET" action="test.php">
  11. <p>VCU IDCAN = IDA
  12. <input type="submit" value ="flash">
  13. </p>
  14. </form>
  15. </body>
  16. </html>


test.php

Code :
  1. <?php
  2. passthru("./test --source http://172.17.15.205/module1.hex --cible udp://172.17.255.255:56733 --load-flash --load-eeprom" );
  3. ?>


 
 
Alors ce code fonctionne : quand je clique sur le premier bouton ( ou le 2eme qui fait pareil ) , j'appelle le script test.php qui m execute en php la commande voulue avec les paramètres.
 
Seulement :
 
  - le fait d'utiliser une form "m'oblige" à changer de page ( appel du nouveau script ) pour appeler mon code. Ce qui fait que je perds la page précédente, et je ne peux donc pas - dans le futur - mettre une barre de progression et de status a coté de mon bouton OK.
  - comment communiquer entre mon application et la page web pour qu'elle recoive l'en cours de l'exécution de mon programme ? Mon programme , j'en fais ce que je veux, je peux communiquer des infos assez facilement comme je l'ai dit - en ce qui concerne la sortie standard , c'est dangereux car les données ne seront jamais formatées a cause de logs divers - mais comment réceptionner ces infos coté apache d'une part, et comment mettre à jour dynamiquement ma page web d'autre part ?
 

Reply

Marsh Posté le 12-03-2013 à 16:56:38    

xilebo a écrit :

voici un bout de code que j'ai fait pour tester mon principe, ca a l'air de marcher ( je préviens encore une fois , je débute en HTML, donc j'ai surement une mauvaise approche ).
 
2 fichiers :  
 
index.php

Code :
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <form method="GET" action="test.php">
  6. <p>PSB IDCAN = 104
  7. <input type="submit" value ="flash">
  8. </p>
  9. </form>
  10. <form METHOD="GET" action="test.php">
  11. <p>VCU IDCAN = IDA
  12. <input type="submit" value ="flash">
  13. </p>
  14. </form>
  15. </body>
  16. </html>


test.php

Code :
  1. <?php
  2. passthru("./test --source http://172.17.15.205/module1.hex --cible udp://172.17.255.255:56733 --load-flash --load-eeprom" );
  3. ?>


 
 
Alors ce code fonctionne : quand je clique sur le premier bouton ( ou le 2eme qui fait pareil ) , j'appelle le script test.php qui m execute en php la commande voulue avec les paramètres.
 
Seulement :
 
1)  - le fait d'utiliser une form "m'oblige" à changer de page ( appel du nouveau script ) pour appeler mon code. Ce qui fait que je perds la page précédente, et je ne peux donc pas - dans le futur - mettre une barre de progression et de status a coté de mon bouton OK.
2)  - comment communiquer entre mon application et la page web pour qu'elle recoive l'en cours de l'exécution de mon programme ? Mon programme , j'en fais ce que je veux, je peux communiquer des infos assez facilement comme je l'ai dit - en ce qui concerne la sortie standard , c'est dangereux car les données ne seront jamais formatées a cause de logs divers - mais comment réceptionner ces infos coté apache d'une part, et comment mettre à jour dynamiquement ma page web d'autre part ?
 


 
La solution, pour tes deux problèmes, réside dans le javascript. Le javascript est un langage qui s'exécute coté navigateur dans la page web.  
Il peut, notamment, :
    -Modifier à la volée le code HTML de la page sans qu'il soit nécessaire de la recharger depuis le serveur.
    -Interroger le serveur en appelant une URL et en récupérant la réponse (Technologie connue sous le nom d'AJAX).
 
Pour ton premier problème il suffit d'associer au bouton une fonction javascript qui, sur click du bouton, va lancer une requête AJAX sur la page test.php qui va:  
    1) lancer le processus  
    2) retourner un identifiant unique (Exemple le pid de ton programme).
 
Pour ton deuxième problème le seul moyen que je connais en web consiste à passer par du polling. Une fois que le code javascript à reçu l'identifiant, il arme un timer qui, à l'expiration:
    1) Envoie une requête AJAX réclamant l'état de l'avancement du processus lancé (Passage du PID à l'url)
    2) Mets à jour la barre de progression
    2) Se réarme si l'avancement n'est pas terminé


Message édité par Anonymouse le 12-03-2013 à 16:57:55
Reply

Marsh Posté le 12-03-2013 à 17:19:56    

Je te remercie  :jap:  
 
Je vais tenter de regarder des exemples en javascript et en ajax et tenter de faire une mini application pour tester le principe.
 
Ensuite en ce qui concerne la communication, je verrai dans un 2ème temps ce qui est possible de faire.

Reply

Marsh Posté le 12-03-2013 à 17:30:19    

xilebo a écrit :

Je te remercie  :jap:  
 
Je vais tenter de regarder des exemples en javascript et en ajax et tenter de faire une mini application pour tester le principe.
 
Ensuite en ce qui concerne la communication, je verrai dans un 2ème temps ce qui est possible de faire.


 
Et utilise ABSOLUMENT l'extension firebug sur firefox ou equivalent sous Chrome:
-Debogage de Javascript
-Modification à la volée de CSS, HTML
-Analyse des trames réseaux
-Console Javascript...
 
Jette un oeil sur la bibliothèque JQuery simple d'utilisation.
Les méthodes de modification du DOM (i.e du code HTML de ta page) peuvent différer d'un navigateur à l'autre, de même que celle utilisées pour faire de l'AJAX.  
JQuery va masquer les différences existantes et te simplifier grandement la vie en rajoutant tout un tas de méthodes utilitaires fort utiles notamment pour la partie AJAX.
Enfin pour le retour des requêtes AJAX utilise soit du texte, soit du HTML soit du JSON qui est plus facile à parser que le XML.


Message édité par Anonymouse le 12-03-2013 à 17:35:35
Reply

Marsh Posté le 13-03-2013 à 11:51:30    

J'ai suivi tes conseils :)
 
 
Voici ce que j'ai fait pour l'instant, ca fonctionne et c'est prometteur ( c'est juste une maquette ).
 
code de index.php :

Code :
  1. <html>
  2. <head>
  3. <script type="text/javascript" src="jquery-1.9.1.js"></script>
  4. </head>
  5. <body>
  6. <script language = "JavaScript">
  7. function addslashes(ch) {
  8. ch = ch.replace(/\\/g,"\\\\" )
  9. ch = ch.replace(/\'/g,"\\'" )
  10. ch = ch.replace(/\"/g,"\\\"" )
  11. return ch
  12. }
  13. function truc()
  14. {
  15.         var titi =  "source=" + addslashes("http://172.17.15.205/module1.hex" ) +"&cible=" + addslashes("udp://172.17.255.255:56733" ) + "&options=" + addslashes("--load-eeprom --load-flash" ) ;
  16.         alert( titi );
  17.         $.ajax({
  18.         type    : "GET",
  19.         url     : "flash.php",
  20.         data    : titi ,
  21.         success : OnSuccess,
  22.         error   : OnFailed
  23.         });
  24. }
  25. function OnSuccess( result )
  26. {
  27.         $('.container').after('<p>OK</p>');
  28. }
  29. function OnFailed ( result )
  30. {
  31.         $('.container').after('<p>ECHEC</p>');
  32. }
  33. </script>
  34. <div class="container">
  35. <input type="button" value="flash" name="LeBouton" onClick="javascript:truc()">
  36. </div>
  37. </body>
  38. </html>


 
code de flash.php :
 

Code :
  1. <?php
  2. $command =  "./test --source " .  $_GET["source"] . " --cible " . $_GET["cible"] . " " . $_GET["options"] ;
  3. exec ($command);
  4. ?>


 
J'ai utilisé la methode GET et non POST. Je ne comprends toujours pas la différence entre les 2 ( à ceci près qu'on ne voit pas les paramètres dans l'url en mode POST ), et j'y arrive mieux avec GET.
 
Le petit script que j'ai fait me permet d exécuter une requete ajax sur mon serveur , en exécutant un code php qui va lui executer mon programme de flashage.
 
Lorsque la requete ajax se termine, OnSuccess est appelée et me modifie en local ma page web en insérant un OK.
 
C'est exactement ce que je voulais dans un premier temps.
 
Maintenant, ce que je souhaiterais faire, c'est :
 
 - récupérer la valeur de retour de mon programme "test" exécuté par "exec" de mon code php du fichier flash.php. Mon programme test me retourne le statut du flashage ( si ca s est bien passé ou non, et pourquoi ). J'aimerais retransmettre cette valeur via ajax et la récupérer en paramètre de OnSuccess par exemple. Peut-on le faire ?
 
 - comme je l'expliquais précédemment, mon programme peut être en mesure de me donner un statut d'avancement ( pipe, port udp local , fichier  , peu importe, on prend la méthode la plus facile exploitable par apache ). Comment puis-je via ajax (?) récupérer régulièrement un statut afin de mettre à jour un bargraph coté client ?
 
- optionnel : mon programme "test" génère des logs sur la sortie standard. Comment puis-je les retransmettre optionnellement à mon client pour qu'il puisse les afficher dans une fenêtre supplémentaire. Par exemple, au moment de flash, je peux cocher une case qui dit que je veux les logs, et à l'appel de OnSuccess ( ou OnFailed ), j'ouvre une fenetre supplémentaire dans laquelle je colle tout le log recu. "passthru" plutot que "exec" permettrait de récupérer les logs mais comment faire en ajax ?
 
 
Merci en tout cas de ton aide qui m'a été précieuse  :jap:

Reply

Marsh Posté le 13-03-2013 à 12:15:01    

Concernant mon 2ème point, tu avais écrit :  
 

Citation :


Pour ton deuxième problème le seul moyen que je connais en web consiste à passer par du polling. Une fois que le code javascript à reçu l'identifiant, il arme un timer qui, à l'expiration:
    1) Envoie une requête AJAX réclamant l'état de l'avancement du processus lancé (Passage du PID à l'url)
    2) Mets à jour la barre de progression
    2) Se réarme si l'avancement n'est pas terminé


 
Ce qui me semble une bonne idée.
 
Cependant, si je fais ma requête ajax pour réclamer l'état d'avancement de mon processus ( en passant par le pid par exemple ) , le serveur recoit cette requête , mais ile ne connait pas l'avancement de mon processus. En effet, il n'y a pas de communication entre apache et mon processus actuellement. La fonction php "exec" m'exécutant mon processus fait en gros un fork et exécute mon processus dans un shell ( j'ai fait un ps aux sur le serveur, c'est ce qu'il se passe ).  
 
Cependant, je crois que la fonction exec de php est bloquante. Peut être ma solution se trouve au niveau du php. Voir si je peux communiquer entre mon script php qui execute mon programme , et mon programme.

Reply

Marsh Posté le 13-03-2013 à 12:20:58    

Tu peux eviter de faire du polling avec les server side event : https://developer.mozilla.org/en-US [...] ent_events , les websocket ( mais qui sont un peu plus contraignante a mettre en place niveau serveur
 
Pour avoir des infos sur le suivi, est ce que ton app ne peux pas écrire en base ou dans un fichier texte sont état d'avancement ?


---------------

Reply

Marsh Posté le 13-03-2013 à 12:21:27    

xilebo a écrit :

J'ai suivi tes conseils :)
 
 
Voici ce que j'ai fait pour l'instant, ca fonctionne et c'est prometteur ( c'est juste une maquette ).
 
code de index.php :

Code :
  1. <html>
  2. <head>
  3. <script type="text/javascript" src="jquery-1.9.1.js"></script>
  4. </head>
  5. <body>
  6. <script language = "JavaScript">
  7. function addslashes(ch) {
  8. ch = ch.replace(/\\/g,"\\\\" )
  9. ch = ch.replace(/\'/g,"\\'" )
  10. ch = ch.replace(/\"/g,"\\\"" )
  11. return ch
  12. }
  13. function truc()
  14. {
  15.         var titi =  "source=" + addslashes("http://172.17.15.205/module1.hex" ) +"&cible=" + addslashes("udp://172.17.255.255:56733" ) + "&options=" + addslashes("--load-eeprom --load-flash" ) ;
  16.         alert( titi );
  17.         $.ajax({
  18.         type    : "GET",
  19.         url     : "flash.php",
  20.         data    : titi ,
  21.         success : OnSuccess,
  22.         error   : OnFailed
  23.         });
  24. }
  25. function OnSuccess( result )
  26. {
  27.         $('.container').after('<p>OK</p>');
  28. }
  29. function OnFailed ( result )
  30. {
  31.         $('.container').after('<p>ECHEC</p>');
  32. }
  33. </script>
  34. <div class="container">
  35. <input type="button" value="flash" name="LeBouton" onClick="javascript:truc()">
  36. </div>
  37. </body>
  38. </html>


 
code de flash.php :
 

Code :
  1. <?php
  2. $command =  "./test --source " .  $_GET["source"] . " --cible " . $_GET["cible"] . " " . $_GET["options"] ;
  3. exec ($command);
  4. ?>


 
a) J'ai utilisé la methode GET et non POST. Je ne comprends toujours pas la différence entre les 2 ( à ceci près qu'on ne voit pas les paramètres dans l'url en mode POST ), et j'y arrive mieux avec GET.
 
Le petit script que j'ai fait me permet d exécuter une requete ajax sur mon serveur , en exécutant un code php qui va lui executer mon programme de flashage.
 
Lorsque la requete ajax se termine, OnSuccess est appelée et me modifie en local ma page web en insérant un OK.
 
C'est exactement ce que je voulais dans un premier temps.
 
Maintenant, ce que je souhaiterais faire, c'est :
 
b) - récupérer la valeur de retour de mon programme "test" exécuté par "exec" de mon code php du fichier flash.php. Mon programme test me retourne le statut du flashage ( si ca s est bien passé ou non, et pourquoi ). J'aimerais retransmettre cette valeur via ajax et la récupérer en paramètre de OnSuccess par exemple. Peut-on le faire ?
 
c) - comme je l'expliquais précédemment, mon programme peut être en mesure de me donner un statut d'avancement ( pipe, port udp local , fichier  , peu importe, on prend la méthode la plus facile exploitable par apache ). Comment puis-je via ajax (?) récupérer régulièrement un statut afin de mettre à jour un bargraph coté client ?
 
d)- optionnel : mon programme "test" génère des logs sur la sortie standard. Comment puis-je les retransmettre optionnellement à mon client pour qu'il puisse les afficher dans une fenêtre supplémentaire. Par exemple, au moment de flash, je peux cocher une case qui dit que je veux les logs, et à l'appel de OnSuccess ( ou OnFailed ), j'ouvre une fenetre supplémentaire dans laquelle je colle tout le log recu. "passthru" plutot que "exec" permettrait de récupérer les logs mais comment faire en ajax ?
 
Merci en tout cas de ton aide qui m'a été précieuse  :jap:


 
a) La différence entre GET et POST réside dans la façon dont les paramètres sont passés au serveur. On utilise généralement GET pour récupérer une ressource tandis que l'on utuilise POST pour soumettre des données afin d'effectuer un traitement.
 
b) Dans la page "flash.php" si tu effectue un echo "TOTO" tu peut le récupérer en Javascript dans la fonction "OnSuccess()" via l'argument "result". Il faut que tu envoie une identifiant unique pour le processus créé (PID par exemple).
 
c) Faut que tu fasse de l'attente active.  
     -Tu armes un timer en utilisant la fonction window.setInterval
     -Sur déclenchement du timer, tu envoies une requête AJAX pour connaître l'état du processus (Passage de l'id unique)
     -Sur réponse de la requête AJAX si avancement != 100% : MAJ du status && réarmement du timer.
 
d) En a) je t'ai expliqué comment renvoyer des informations à ton callback on success. Si tu veux renvoyer plusieurs informations il faut que tu définisses un format texte que tu pourras parser en Javascript pour récupérer l'id du programme lancé, les logs, ....
Deux format sont couramment utilisés: Le XML et le JSON. Je te conseille d'utiliser le format JSON qui est simple à parser et à comprendre. La fonction PHP json_encode permet de le générer assez simplement.
 
[edit]La solution de flo850 est plus moderne mais n'est pas supportée par IE[/edit]

Message cité 1 fois
Message édité par Anonymouse le 13-03-2013 à 12:26:22
Reply

Marsh Posté le 13-03-2013 à 12:40:07    

xilebo a écrit :

Concernant mon 2ème point, tu avais écrit :  
 

Citation :


Pour ton deuxième problème le seul moyen que je connais en web consiste à passer par du polling. Une fois que le code javascript à reçu l'identifiant, il arme un timer qui, à l'expiration:
    1) Envoie une requête AJAX réclamant l'état de l'avancement du processus lancé (Passage du PID à l'url)
    2) Mets à jour la barre de progression
    2) Se réarme si l'avancement n'est pas terminé


 
Ce qui me semble une bonne idée.
 
Cependant, si je fais ma requête ajax pour réclamer l'état d'avancement de mon processus ( en passant par le pid par exemple ) , le serveur recoit cette requête , mais ile ne connait pas l'avancement de mon processus. En effet, il n'y a pas de communication entre apache et mon processus actuellement. La fonction php "exec" m'exécutant mon processus fait en gros un fork et exécute mon processus dans un shell ( j'ai fait un ps aux sur le serveur, c'est ce qu'il se passe ).  
 
Cependant, je crois que la fonction exec de php est bloquante. Peut être ma solution se trouve au niveau du php. Voir si je peux communiquer entre mon script php qui execute mon programme , et mon programme.


 
A priori PHP dispose de modules pour manipuler les IPC system V mais je ne les ai jamais utilisés.  
1) Ton processus écrit dans un segment de mémoire partagé
2) L'identifiant dudit segment est retourné a ton code javascript lors de l'appel AJAX
3) A chaque appel de MAJ le code javascript passe l'id au serveur PHP qui récupere le segment lit la valeur et la retourne.
 
Bien entendu ce n'est qu'un exemple. Tu peux aussi, si t'as beaucoup plus d'informations à gérer/ si tu veux masque l'implémentation du code serveur, enregistrer chaque processus créé dans une BDD dans laquelle tu stocke l'id du segment de mémoire, toutes les autres infos que tu estimes nécessaires. Ton processus pourrait aussi mettre à jour son état dans la BDD directement à voir le résultat en terme de perfs.

Message cité 1 fois
Message édité par Anonymouse le 13-03-2013 à 12:41:46
Reply

Marsh Posté le 13-03-2013 à 12:40:07   

Reply

Marsh Posté le 13-03-2013 à 13:59:18    

flo850 a écrit :

Tu peux eviter de faire du polling avec les server side event : https://developer.mozilla.org/en-US [...] ent_events , les websocket ( mais qui sont un peu plus contraignante a mettre en place niveau serveur
 
Pour avoir des infos sur le suivi, est ce que ton app ne peux pas écrire en base ou dans un fichier texte sont état d'avancement ?


 
Je te remercie pour cette info, je vais l'étudier également. Comme l'a spécifié plus bas anonymouse, cela ne fonctionne pas avec IE, mais ce n'est pas un problème pour moi, c'est pour faire des outils de maintenance, je peux imposer sans problème le navigateur.
 

Anonymouse a écrit :


 
a) La différence entre GET et POST réside dans la façon dont les paramètres sont passés au serveur. On utilise généralement GET pour récupérer une ressource tandis que l'on utuilise POST pour soumettre des données afin d'effectuer un traitement.
 
b) Dans la page "flash.php" si tu effectue un echo "TOTO" tu peut le récupérer en Javascript dans la fonction "OnSuccess()" via l'argument "result". Il faut que tu envoie une identifiant unique pour le processus créé (PID par exemple).
 
c) Faut que tu fasse de l'attente active.  
     -Tu armes un timer en utilisant la fonction window.setInterval
     -Sur déclenchement du timer, tu envoies une requête AJAX pour connaître l'état du processus (Passage de l'id unique)
     -Sur réponse de la requête AJAX si avancement != 100% : MAJ du status && réarmement du timer.
 
d) En a) je t'ai expliqué comment renvoyer des informations à ton callback on success. Si tu veux renvoyer plusieurs informations il faut que tu définisses un format texte que tu pourras parser en Javascript pour récupérer l'id du programme lancé, les logs, ....
Deux format sont couramment utilisés: Le XML et le JSON. Je te conseille d'utiliser le format JSON qui est simple à parser et à comprendre. La fonction PHP json_encode permet de le générer assez simplement.
 
[edit]La solution de flo850 est plus moderne mais n'est pas supportée par IE[/edit]


 
a) ok merci. Si je comprends bien, dans mon cas, j'aurais du utiliser POST pour envoyer des données au serveur ( les paramètres de mon exécutable ). Cependant avec GET ça fonctionne quand même, bizarre. Je vais continuer mes tests pour comprendre :p
 
b) ok. Je viens de tester, j'avais pas compris un truc : result contient la page complète générée en fait. Donc je peux très bien renvoyer un entier, une string ( echo "toto" ) , le log de mon exe ( passthru au lieu de exec ), ou tout simplement un resultat formaté en json ou xml dans lequel je peux mettre à la fois mes logs, ma valeur de retour, et tout ce dont j'ai envie en fait. Je vais tester le JSON puisque tu me le conseilles ( je connais très bien XML, je m'en sers partout depuis des années, ca me donnera l'occasion d'apprendre un nouveau format ).
 
c) Pour l'attente active ok, je vois bien le principe. Du coup, je vais appeler une page ( en php par exemple ) avec en paramètre le pid. Coté serveur, on execute le script php qui va tenter de communiquer avec mon processus en cours ( identifié par le pid transmis ) pour tenter d'avoir l'état d'avancement ( ex : un fichier dans /tmp/myinfo_pid.txt ) et renvoyer le contenu de ce dit fichier. Ca me parait pas mal.
 
d) ok voir b).
 

Anonymouse a écrit :


 
A priori PHP dispose de modules pour manipuler les IPC system V mais je ne les ai jamais utilisés.  
1) Ton processus écrit dans un segment de mémoire partagé
2) L'identifiant dudit segment est retourné a ton code javascript lors de l'appel AJAX
3) A chaque appel de MAJ le code javascript passe l'id au serveur PHP qui récupere le segment lit la valeur et la retourne.
 
Bien entendu ce n'est qu'un exemple. Tu peux aussi, si t'as beaucoup plus d'informations à gérer/ si tu veux masque l'implémentation du code serveur, enregistrer chaque processus créé dans une BDD dans laquelle tu stocke l'id du segment de mémoire, toutes les autres infos que tu estimes nécessaires. Ton processus pourrait aussi mettre à jour son état dans la BDD directement à voir le résultat en terme de perfs.


 
je souhaite juste pour le moment communiquer 2 informations : le % en cours de transfert, et l'étape en cours. Je peux donc communiquer ca via un fichier ( dans /tmp donc en mémoire en réalité ). Les IPCs sont une bonne idée également, mais je privilégie le code portable dans mes applications système car même si je tourne quasi exclusivement sous linux, je ne veux pas m'interdire de pouvoir le faire sous windows pour par exemple des tests.
 
 
 
Une petite question : existe-t-il un objet graphique standard représentant un bargraph ou dois-je me le fabriquer moi même ?
 
 
Merci en tout cas de votre aide , j'avance très vite  :jap:  

Reply

Marsh Posté le 13-03-2013 à 14:04:58    

Tu peux faire une barre de progression très facilement

Code :
  1. <div style="width:500px; height:20px">
  2.   <div style="height:100%;width:48.5%;background-color:pink">  
  3.   </div>
  4. </div>


Tu peux remplacer le background-color par une image ou un gradient
 
Et je valide aussi le fait que le json est le plus compact, et le plus facile a générer ( pense à l'encoder en utf8 )


---------------

Reply

Marsh Posté le 13-03-2013 à 15:16:11    

xilebo a écrit :


 
Je te remercie pour cette info, je vais l'étudier également. Comme l'a spécifié plus bas anonymouse, cela ne fonctionne pas avec IE, mais ce n'est pas un problème pour moi, c'est pour faire des outils de maintenance, je peux imposer sans problème le navigateur.
 


 

xilebo a écrit :


 
a) ok merci. Si je comprends bien, dans mon cas, j'aurais du utiliser POST pour envoyer des données au serveur ( les paramètres de mon exécutable ). Cependant avec GET ça fonctionne quand même, bizarre. Je vais continuer mes tests pour comprendre :p
 
b) ok. Je viens de tester, j'avais pas compris un truc : result contient la page complète générée en fait. Donc je peux très bien renvoyer un entier, une string ( echo "toto" ) , le log de mon exe ( passthru au lieu de exec ), ou tout simplement un resultat formaté en json ou xml dans lequel je peux mettre à la fois mes logs, ma valeur de retour, et tout ce dont j'ai envie en fait. Je vais tester le JSON puisque tu me le conseilles ( je connais très bien XML, je m'en sers partout depuis des années, ca me donnera l'occasion d'apprendre un nouveau format ).
 
c) Pour l'attente active ok, je vois bien le principe. Du coup, je vais appeler une page ( en php par exemple ) avec en paramètre le pid. Coté serveur, on execute le script php qui va tenter de communiquer avec mon processus en cours ( identifié par le pid transmis ) pour tenter d'avoir l'état d'avancement ( ex : un fichier dans /tmp/myinfo_pid.txt ) et renvoyer le contenu de ce dit fichier. Ca me parait pas mal.
 
d) ok voir b).
 


 
a) Non je me suis mal exprimé. On peut AMHA différencier GET et POST de deux manières:
-La différenciation technique. GET et POST sont deux commandes du protocole HTTP.  
     -GET est la première commande implantée dans le protocole HTTP 0.9. C'est un classique appel d'url avec les arguments passés sous la forme de "?arg1=val1&arg2=val2" exemple: www.google.fr?search?client=ubuntu&channel=fs
     -POST est une commande qui a été introduite après pour tenir compte de certaines contraintes inhérentes à GET : La taille de l'url est limitée par les serveurs WEB à un certain nombres de caractères...
-La différenciation sémantique :
     -On utilise plutôt get pour récupérer une ressource que pour soumettre des infos. Après rien n'empêche techniquement de faire ce que tu fais avec.


Message édité par Anonymouse le 13-03-2013 à 15:16:41
Reply

Marsh Posté le 15-03-2013 à 10:59:23    

Salut :)
 
Bon j'ai bien avancé sur mon sujet, j'arrive à faire quasiment exactement ce que je veux. Il n'y a que le moyen que j'ai employé pour communiquer entre mon appli et php qui ne me plait pas trop ( via un fichier temporaire dans /tmp ). En attendant de trouver mieux, je vais conserver celui-ci, ca me permet de tester le principe.
 
Voici mes sources ( un peu plus mis au propre :
 
index.php
 

Code :
  1. <html>
  2. <head>
  3. <script type="text/javascript" src="jquery-1.9.1.js"></script>
  4. </head>
  5. <body>
  6. <script language = "JavaScript">
  7. function addslashes(ch)
  8. {
  9. ch = ch.replace(/\\/g,"\\\\" )
  10. ch = ch.replace(/\'/g,"\\'" )
  11. ch = ch.replace(/\"/g,"\\\"" )
  12. return ch
  13. }
  14. var mytimer;
  15. function flash()
  16. {
  17.         var opts =  "source=" + addslashes("http://172.17.15.205/module1.hex" ) +"&cible=" + addslashes("udp://172.17.255.255:56733" ) + "&options=" + addslashes("--load-eeprom --load-flash --enable-status" ) ;
  18.         //alert( opts );
  19.         $('.bargraph').width(0);
  20.         $('.status').text('status : En cours');
  21.         $.ajax({
  22.         type    : "GET",
  23.         url     : "flash.php",
  24.         data    : opts ,
  25.         success : OnFlashSuccess,
  26.         error   : OnFlashFailed
  27.         });
  28.         mytimer = window.setInterval(  "Polling()" , 100 );
  29. }
  30. function check()
  31. {
  32.         var opts =  "source=" + addslashes("http://172.17.15.205/module1.hex" ) +"&cible=" + addslashes("udp://172.17.255.255:56733" ) + "&options=" + addslashes("--load-eeprom --disable-z0 --disable-z1-2-3-4-5 --enable-read-id" ) ;
  33.         //alert( opts );
  34.         $.ajax({
  35.         type    : "GET",
  36.         url     : "check.php",
  37.         data    : opts ,
  38.         success : OnCheckSuccess,
  39.         error   : OnCheckFailed
  40.         });
  41. }
  42. function OnCheckSuccess( result )
  43. {
  44.         if ( result == 0 )
  45.         {
  46.                 $('.status').text('status : module present.');
  47.         else
  48.         {
  49.                 $('.status').text('status : module non present.');
  50.         }
  51. }
  52. function OnCheckFailed ( result )
  53. {
  54.         $('.status').text('status : ERROR');
  55. }
  56. function Polling()
  57. {
  58.         $.ajax({
  59.         type    :"GET",
  60.         url     :"get.php",
  61.         data    : "ring=5&canid=16",
  62.         success : OnPollingSuccess
  63.         });
  64. }
  65. function OnPollingSuccess( result )
  66. {
  67.         var value;
  68.         var phrase = result.split("/" );
  69.         var encours = phrase[0];
  70.         var phrase2 = phrase[1].split(":" );
  71.         var total = phrase2[0];
  72.         var step = phrase2[1];
  73.         value = encours / total * 100 + "%";
  74.         if ( total == 0 ) value = 0;
  75.         $('.bargraph').width( value );
  76.         // step
  77.         if ( step == 1 ) color = "pink";
  78.         else if ( step == 2 ) color = "red" ;
  79.         else if ( step == 3 ) color = "yellow";
  80.         else if ( step == 4 ) color = "green";
  81.         else if ( step == 5 ) color = "blue";
  82.         else if ( step == 6 ) color = "gold";
  83.         else if ( step == 7 ) color = "grey";
  84.         else if ( step == 8 ) color = "maroon";
  85.         else if ( step == 9 ) color = "bronze";
  86.         else if ( step == 10 ) color = "aqua";
  87.         //color = "#c0d9d9";
  88.         $('.bargraph').css("background-color" , color );
  89. function OnFlashSuccess( result )
  90. {
  91.         $('.status').text('status : OK');
  92.         clearInterval( mytimer) ;
  93.         alert( result );
  94. }
  95. function OnFlashFailed ( result )
  96. {
  97.         $('.status').after('status : echec');
  98.         clearInterval( mytimer );
  99. }
  100. </script>
  101.         <table>
  102.                 <tr>
  103.                         <td>
  104.                                 <input type="button" value="flash" name="LeBouton" onClick="javascript:flash()">
  105.                         </td>
  106.                         <td>
  107.                                 <input type="button" value="check" name="checkbouton" onClick="javascript:check()">
  108.                         </td>
  109.                         <td>
  110.                                 <div style="width:500px; height:20px;background-color:black">
  111.                                         <div class="bargraph" style="height:100%;width:0%;background-color:pink">
  112.                                         </div>
  113.                                 </div>
  114.                         </td>
  115.                         <td>
  116.                                 <p class="status">status : </p>
  117.                         </td>
  118.                 </tr>
  119.         </table>
  120. </body>
  121. </html>


 
get.php ( qui me permet de communiquer avec mon appli )
 

Code :
  1. <?php
  2. $path = '/tmp/status_' . $_GET["ring"] . '_' . $_GET["canid"] . '.txt';
  3. $tab = file( $path );
  4. echo $tab[0];
  5. ?>


 
flash.php ( permet d appeler mon exe pour flasher mon appareil )

Code :
  1. <?php
  2. $command =  "./test --source " .  $_GET["source"] . " --cible " . $_GET["cible"] . " " . $_GET["options"] ;
  3. passthru ($command);
  4. ?>


 
check.php ( permet de tester la présence de mon appareil. C est la valeur de retour de l exe qui m indique que c est ok ou non )

Code :
  1. <?php
  2. $command =  "./test --source " .  $_GET["source"] . " --cible " . $_GET["cible"] . " " . $_GET["options"] ;
  3. exec ($command , $output , $returnvar);
  4. echo $returnvar;
  5. ?>


 
 
Alors j'ai quelques questions :
 
 - y a-t-il des critiques à faire sur ce que j'ai fait ? Je suis totalement débutant en programmation orienté web. Je viens du C/C++ donc je n'ai pas les mêmes automatismes.
 - ce bout de code est un essai. J'aimerai le généraliser, car en effet je n'ai pas 1 appareil à tester mais une centaine. En gros, j'aimerai créer autant de lignes que d'appareils, et cette information, je l'ai dans un fichier généré en XML par un de nos outils de configuration. J'aimerai donc créer un ensemble de script php qui vont parser ce fichier XML et générer autant de lignes que d'appareil, en dupliquant le code de mon exemple ci-dessus :
      * y a-t-il des fonctions simples pour parser du XML en php ?
      * ou dois-je plutot m'orienter vers XSL + XML pour  générer du HTML ( en effet le fichier index.php n'est en réalité pas du php, c est du HTML + javascript )
      * j'ai remarqué ( et c'est normal ) que quand je recharge la page alors que je suis en cours de traitement, je perds tout ( bien que le traitement continue tout seul coté serveur ). Que devrais-je faire ? interdire de recharger la page ( tant que possible ) ? tenter de mettre un mécanisme de resynchro quand je recharge la page ? ou bien laisser tel quel, tant pis pour l'utilisateur ?
 
 - plus une question HTML : j'ai mis un tableau pour aligner horizontalement mes boutons , car je n'ai pas réussi à le faire avec des div, la barre de progression se mettait toujours en dessous des boutons, ainsi que mon <p></p> qui me sert de texte de status. Comment faire sans tableau ? ou alors ce n'est pas si grave d'utiliser les tableaux ? ( j avais cru entendre qu il fallait éviter les tableaux ).
 
 
 - est-ce que le principe suivant pour générer ma page automatiquement est envisageable ? :  
 
je compte faire autant de <tr> que d'appareil que j'ai , et pour chaque <tr> , les boutons appelleront la même fonction javascript mais avec en plus en paramètre les chemins spécifiques de chaque config d'appareil.
 
je compte générer un "class" spécifique pour chaque "bargraph" et chaque "status" ( genre class="bargraph_id" et class="status_id" ) mais ca ne me semble pas très propre. Dois je plutot garder la même classe pour tous, et plutot mettre une classe parent dans le <tr> ( si c'est possible ) ? Ou bien encore, dois-je utiliser une autre méthode ? En effet, je me suis servi des classes pour identifier mes objets, et je me sers de jquery pour les modifier dynamiquement.
 
Je crois que c'est tout :o
 
Merci pour votre aide précieuse  :jap:  

Reply

Marsh Posté le 16-03-2013 à 20:56:22    

Code :
  1. function addslashes(ch)
  2. {
  3. ch = ch.replace(/\\/g,"\\\\" )
  4. ch = ch.replace(/\'/g,"\\'" )
  5. ch = ch.replace(/\"/g,"\\\"" )
  6. return ch
  7. }


Devient :

Code :
  1. function addslashes(ch)
  2.     return ch.replace(/([\\'"])/g,"\\$1" );
  3. }
 


Et puis ça c'est un peu comment dire... abusé :o

Code :
  1. if ( step == 1 ) color = "pink";
  2.         else if ( step == 2 ) color = "red" ;
  3.         else if ( step == 3 ) color = "yellow";
  4.         else if ( step == 4 ) color = "green";
  5.         else if ( step == 5 ) color = "blue";
  6.         else if ( step == 6 ) color = "gold";
  7.         else if ( step == 7 ) color = "grey";
  8.         else if ( step == 8 ) color = "maroon";
  9.         else if ( step == 9 ) color = "bronze";
  10.         else if ( step == 10 ) color = "aqua";


Les tableaux ça existe pourtant en C :o

Code :
  1. var stepColors = ["pink","red","yellow","green","gold","grey","maroon","bronze","aqua"];
  2. var color = stepColors[step];


Message édité par gatsu35 le 16-03-2013 à 20:58:12

---------------
Blablaté par Harko
Reply

Marsh Posté le 17-03-2013 à 08:41:23    


Et puis ça c'est un peu comment dire... abusé :o

Code :
  1. if ( step == 1 ) color = "pink";
  2.         else if ( step == 2 ) color = "red" ;
  3.         else if ( step == 3 ) color = "yellow";
  4.         else if ( step == 4 ) color = "green";
  5.         else if ( step == 5 ) color = "blue";
  6.         else if ( step == 6 ) color = "gold";
  7.         else if ( step == 7 ) color = "grey";
  8.         else if ( step == 8 ) color = "maroon";
  9.         else if ( step == 9 ) color = "bronze";
  10.         else if ( step == 10 ) color = "aqua";


Les tableaux ça existe pourtant en C :o

Code :
  1. var stepColors = ["pink","red","yellow","green","gold","grey","maroon","bronze","aqua"];
  2. var color = stepColors[step];

[/quotemsg]
 
tout à fait :o En fait, c'était aussi du code de test, ça a également disparu. Je voulais voir si ca avait de l'intérêt d'afficher le status avec la couleur de bargraph, mais ca donne rien. J'ai changé ça en mettant un texte de status à la place. Cela dit, c'est toujours des "if" imbriqué je vais changer ça dès lundi au boulot :o ( rassure toi, je ne fais jamais ça en C )

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed