Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1500 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Serveur : Envoyer des commandes "screen" via une page web (php ?)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Serveur : Envoyer des commandes "screen" via une page web (php ?)

n°1361283
rorogeek
Geek one day, geek everyday !
Posté le 23-07-2014 à 09:10:52  profilanswer
 

Salut à vous maîtres geeks !  :bounce:  
Euh, comment on dit déjà ? Au secours ?!!  
 
PRESENTATION
Je suis jeune admin d'une communauté multi-gaming, et ça fait des mois que je voulais faire un script pour relancer notre serv gmod qui crash 10x par jour via une page web... Evidemment, quand il crashe, c'est sans fermer sa session "screen" et en répondant encore au ping... Et là je bloque un peu n'ayant aucune base en PHP et ayant du mal à saisir le fonctionnement avancé de screen, donc j'aurais besoin d'un bon gros tips pour me faliciter la vie, et celle de la communauté
Le serv est évidemment un dédié et tourne sous Debian (via ESXI, en virtuel donc, mais ça ne change rien à l'affaire).
 
OBJECTIF
Rendre le reboot du serveur de jeu plus simple et surtout, permettre à d'autres co admins de pouvoir le relancer quand je ne suis pas là. Pour ce-faire, j'ai pensé à une page web (php) où l'on puisse voir le statut de la session screen et avoir un bouton démarrer/redémarrer.
Si possible, il faut que la solution reste secure... (déjà la page admin que j'ai crée est protégée par .htaccess).
 
PROBLEMES
Si je lance un script en PHP, il est rattaché à l'utilisateur PHP... Donc la console n'est pas accessible, or il faut quand même que j'y accède pour diverses raisons.
A l'inverse, l'utilisateur PHP n'a pas non plus accès aux sessions screen d'un autre user. C'est donc là que ça se gâte.
 
DEBUT DE SOLUTION ?
Partager le screen avec l'utilisateur que je souhaite utiliser ? J'ai eu beau chercher, pas trop compris le shmilblik.
 
CE QUI A ETE FAIT
D'abord, j'ai crée un sous domaine et rendu le dossier du jeu accessible pour que certains contenus soient téléchargés plus rapidement (fastDL pour ceux qui connaissent les serveurs "source engine" ).  
J'ai crée au sein de cette arborescence un dossier admin, protégé par .htaccess et .htpasswd dont seul les co-admins auront le mot de passe.
J'ai fait une petite page en HTML, que j'ai finalement renommée en .php pour que des scripts php s'y exécutent (il faudrait sûrement changer les headers pour que ce soit propre mais le PHP et moi...). J'ai aussi fait des débuts de micro scripts. Je vous link tout ça pour que vous puissiez éventuellement me suggérer des modifs.  :love:  
 
Fichier admin.php

Code :
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="utf-8" />
  5.         </head>
  6.         <body bgcolor="black">
  7. <font color="white"><h2>Server Status :</h2></font>
  8. <font color="red"><?php include'status.php'; ?></font>
  9. <form action="startscript.php" method="get">
  10. <input type="submit" value="Start Gmod Server">
  11. </form>
  12. </br>
  13. </br>
  14. <font color="white">PHP WhoAmI ? </br>
  15. <?php echo exec('whoami'); ?></font>
  16.         </body>
  17. </html>


 
status.php

Code :
  1. <?php
  2. $output = shell_exec('screen -ls');
  3. echo "<pre>$output</pre>";
  4. ?>


 
startscript.php

Code :
  1. <?php
  2. echo "Server Started";
  3. exec('/home/gameservers/launcher_gmodconstruct.sh');
  4. ?>


 
Le script du launcher, au cas où il faudrait changer les arguments

Code :
  1. screen -A -m -d -S gmodconstruct /home/gameservers/gmodconstruct/srcds_run -[etc.]


 
 
Au final le plus important c'est : comment s'y prendre pour lancer une session screen qui reste accessible via ce moyen ? Est-ce qu'il y a une autre manière plus judicieuse ?
 
J'espère qu'une âme geek charitable (pléonasme ? :lol: ) et qui en sait plus que moi voudra bien me filer un coup de pouce (pas trop fort quand même, je suis sensible  :whistle: ) !
Cya !


Message édité par rorogeek le 23-07-2014 à 10:03:36

---------------
GLHF !
mood
Publicité
Posté le 23-07-2014 à 09:10:52  profilanswer
 

n°1361346
bardiel
Debian powa !
Posté le 23-07-2014 à 19:02:01  profilanswer
 

Tu ne peux pas "simplement" faire l'export du screen -ls vers un fichier texte que tu affiches par ton PHP ?
Avec un cron tu l'appelles régulièrement, avec l'heure :
Un script bash "classique" status.sh :

Code :
  1. #! /bin/bash
  2. export PATH=$PATH:/usr/bin:/sbin
  3. NOW=$(date +"%d-%m-%Y-%T" )
  4. echo  "$NOW :" & /bin/screen -ls & "\n">> /home/gameservers/gmodconstruct/status.log


Avec un pseudo-logrotate toutes les 24h  logtar.sh:

Code :
  1. #! /bin/bash
  2. export PATH=$PATH:/usr/bin:/sbin
  3. tar -zcvf --file=/home/gameservers/gmodconstruct/archive.`date --rfc-3339=date`.tar /home/gameservers/gmodconstruct/status.log


chmod u+x sur chacun des 2 scripts.
Avec en cron :

*/5 * * * * status.sh
0    0 * * * logtar.sh

 

Côté PHP :

Code :
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="utf-8" />
  5.         </head>
  6.         <body bgcolor="black">
  7. <font color="white"><h2>Server Status :</h2></font>
  8. <font color="red">
  9. <?php
  10. $lines = file('/home/gameservers/gmodconstruct/status.log');
  11. foreach($lines as $line_num => $line) {
  12.     echo "# {$line_num} : ".htmlspecialchars($line)."<br />\n";
  13. }
  14. ?></font>
  15. </body>
  16. </html>
 

Après pour redémarrer la solution la plus sécurisée sera d'utiliser une connexion SSH et d'éviter tout exec/shell_exec !
Sous Windows un bête PuTTY, sous Linux un terminal avec ssh.
Sur le serveur un compte utilisateur avec les droits nécessaires pour lancer le screen sur gmod, et un script bash "reboot-gmod.sh" avec le code de ton launcher [:spamatounet]
PuTTY ça ne prend pas de place, tu mémorises ta connexion dessus, et c'est tout.

 

Après en bricolant un peu de PHP, il est possible de faire un status "temps réel" sur Twitter (même si le lien du script originel est down, l'idée est reprise ailleurs) ou sur Status.net / Identi.ca.


Message édité par bardiel le 23-07-2014 à 22:10:19

---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
n°1361356
rorogeek
Geek one day, geek everyday !
Posté le 23-07-2014 à 21:26:35  profilanswer
 

Ouiii ! Une réponse !  :bounce:  :bounce:  
Après une journée de : :??:
 
Merci bardiel de te pencher sur mon cas !
 
Le log est intéressant;  de la sorte, les autres admins pourront consulter le log du serv et y détecter des anomalies au moment des crahs, plugins défaillants, tentatives de hack, props flooders etc. sans avoir besoin de se connecter en SSH. Car c'est bien une condition que j'ai omis d'évoquer : Personne d'autre que moi ne peut avoir accès au SSH, étant tristement le plus calé, et le moins jeune, et surtout, y'a pas qu'un serveur sur la machine, même si j'ai bien crée différents users, on peut déjà mettre le souk avec un user... En gros eux ils sont modos et je suis webmaster, il faut que ça reste comme ça tant que je n'ai pas un informate de confiance parmi les admins.  
Bon, j'ai pas tout compris à ton code hein, je suis autodidacte en linux et j'ai commencé en avril, mais j'ai saisi l'esprit et ça me semble vraiment bien, donc merci, c'est super gentil de ta part !  
 
Par contre la problématique principale n'est pas celle du log, c'est celle de permettre à des neophytes de rebooter le serveur, et pas de soluce pour l'heure du coup ?
 
J'ai bien trouvé ça, http://ubuntuforums.org/showthread.php?t=299286
Mais je capte pas la partie  
"CTRL-A
:acladd bjones"  
et autres : C'est quoi ? Une commande dans la session screen, une option de lancement, un raccourci clavier et suivi d'une commande à taper ?
Je crains que ce ne soit un raccourci clavier et qu'il faille le faire à chaque fois, ce qui retire toute possibilité de lancement via script... Tant de questions...

Message cité 1 fois
Message édité par rorogeek le 23-07-2014 à 21:36:39

---------------
GLHF !
n°1361358
bardiel
Debian powa !
Posté le 23-07-2014 à 22:09:04  profilanswer
 

rorogeek a écrit :

Par contre la problématique principale n'est pas celle du log, c'est celle de permettre à des neophytes de rebooter le serveur, et pas de soluce pour l'heure du coup ?


A la base de l'exec/shell exec dans du php, je considère ça comme une faille possible... donc "prout à éviter :kaola: "

rorogeek a écrit :


J'ai bien trouvé ça, http://ubuntuforums.org/showthread.php?t=299286
Mais je capte pas la partie
"CTRL-A
:acladd bjones"
et autres : C'est quoi ?


Pour faire court là on te propose de permettre au screen d'être récupéré par un autre accès en SSH ou sur un terminal X distant (donc du Linux, sauf à bricoler avec du cygwin sous Windows). Mais vu que tu souhaites l'éviter c'est pas trop ça donc :whistle:

 

Le premier code, status.sh qui te créé un fichier de log, peut être agrémenté d'autres options suivant ce que tu souhaites avoir comme informations, notamment l'utilisation CPU et RAM.
Ou même ajouter vnstat/vnstati pour générer des graphiques d'utilisation réseau... mais bon ça c'est autre chose.

 

Là la problèmatique principale restant : "comment on redémarre tel truc depuis du PHP".
De base ton code avec le whoami est intéressant, dans le sens où le serveur web est en général exécuté sur l'utilisateur www-data. Or ce qui sera attendu pour pouvoir redémarrer le gmod sera probablement root ou (mieux) un utilisateur dédié.
"Tant pis" tu passeras par du script du même genre que tu avais réalisé pour la partie reboot, à un détail près que tu devras voir : autoriser l'utilisateur www-data a exécuter une commande unique. En l'occurrence via visudo, uniquement "/home/gameservers/launcher_gmodconstruct.sh".
Par la suite ton code "status-reboot.php" à mettre dans ton dossier www (dans un sous-dossier avec un .htaccess) :

<!DOCTYPE html>
<html>
        <head>
                <meta charset="utf-8" />
        </head>
        <body bgcolor="black">
<font color="white"><h2>Server Status :</h2></font>
<font color="red">
<?php
$lines = file('/home/gameservers/gmodconstruct/status.log');
foreach($lines as $line_num => $line) {
    echo "# {$line_num} : ".htmlspecialchars($line)."<br />\n";
}
?></font>
[#FF0E00]<hr>
<?
if (isset($valide)) {
echo "Server Started";
exec('sudo -u www-data /home/gameservers/launcher_gmodconstruct.sh');
}
else
echo "<FORM ACTION=\"$PHP_SELF\"  METHOD=\"POST\">
<INPUT TYPE=\"submit\" NAME=\"valide\" VALUE=\"Valider\">
</FORM>"
?>
[/#FF0E00]</body>
</html>


Et je te conseillerais d'ajouter dans ton launcher_gmodconstruct.sh :

NOW=$(date +"%d-%m-%Y-%T" )
echo "$NOW : reboot serveur GMod\n">>/home/gameservers/gmodconstruct/status.log


Avec donc :
Un script bash status.sh qui te génère les logs (à compléter au besoin, CPU, RAM, réseau) :

#! /bin/bash
export PATH=$PATH:/usr/bin:/sbin
NOW=$(date +"%d-%m-%Y-%T" )
echo  "$NOW :" & /bin/screen -ls & "\n">> /home/gameservers/gmodconstruct/status.log


Le pseudo-logrotate qui va juste compresser le fichier log en cours, logtar.sh:

#! /bin/bash
export PATH=$PATH:/usr/bin:/sbin
tar -zcvf --file=/home/gameservers/gmodconstruct/archive.`date --rfc-3339=date`.tar /home/gameservers/gmodconstruct/status.log
NOW=$(date +"%d-%m-%Y-%T" )
echo  "$NOW : début du log\n" > /home/gameservers/gmodconstruct/status.log


chmod u+x sur chacun des 2 scripts. Et en cron :

*/5 * * * * status.sh
0    0 * * * logtar.sh


ça sera peut être à revoir, mais il s'agit d'une base de travail plus complète que ce que tu avais déjà.


Message édité par bardiel le 23-07-2014 à 22:17:11

---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
n°1361360
rorogeek
Geek one day, geek everyday !
Posté le 23-07-2014 à 22:57:49  profilanswer
 

Je suis full hétéro, mais j'aurais presque envie de te faire un enfant ! :whistle: :lol: :lol:  
 
Je vais examiner ça ! Le serveur a aussi moyen de faire son log directement, plus simple mais moins complet, à explorer, mais du coup la méthode est semble-t-il la même pour le récupérer.
 
Je vais explorer tout ça calmement, dormir peut-être un peu, et bien-sûr je tiendrai au jus !
 
 
En tout cas je découvre de plus en plus grâce à toi que le PHP est vraiment un outil magique, j'aurais dû m'y intéresser plus tôt !
 
J'aurais juste une dernière question : Pourquoi pas secure les exec dans PHP dans la mesure où c'est protégé par .htaccess ?
 
 
Merci encore, infiniment, et à bientôt si jamais tu repasses par là !


---------------
GLHF !
n°1361533
bardiel
Debian powa !
Posté le 27-07-2014 à 20:00:05  profilanswer
 

rorogeek a écrit :

J'aurais juste une dernière question : Pourquoi pas secure les exec dans PHP dans la mesure où c'est protégé par .htaccess ?


Le truc c'est que tu peux envoyer des commandes en tant que root, c'est pas facile à réaliser mais cela peut être une faille possible.
Quand cela s'impose aussi cela passe bien souvent par du script perl ou python exécuté en tant que "CGI" (même si le terme est impropre), avec des droits et possibilité limité, et sur un frond-end (la partie visible) sécurisé aussi par l'IP demandeuse en plus du login/mot de passe.


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
n°1365967
rorogeek
Geek one day, geek everyday !
Posté le 09-10-2014 à 09:11:18  profilanswer
 

Coucou !
 
Alors je réponds avec un temps fou, j'ai eu une vie de dingue ces derniers temps !
 
D'abord encore merci, sachez que j'ai finalement trouvé une autre solution !
 
D'abord, pour faire ce qu'on voulait, la solution était suEXEC et suPHP, avec un bon tuto ici : http://www.tutoriels-video.fr/secu [...] -et-suphp/
 
 
Et ensuite la solution que j'ai trouvé qui a enfin marché, c'est un script de gestion de serveur gmod fait par Daniel Gibbs : http://danielgibbs.co.uk/lgsm/gmodserver/ qui permet avec gsquery de vérifier que le serv répond bien. Fiabilité désormais : 100% de reboot en cas de non réponse du serveur, avec un crontab qui vérifie l'état du serv toutes les 3 minutes et un reboot auto à 5h du mat.
 
En espérant que ça aide quelqu'un un jour :p
J'en profite pour caler un petit tuto sur comment configurer le workshop pour son serveur garry's mod : http://mesnie.org/viewtopic.php?f=49&t=175  (et si vous visitez ce lien dans quelques temps, l'adresse sera sûrement : http://www.mesnie.org/forum/viewto [...] f=49&t=175 )
 
Voilà, bon geekage à tous !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Serveur : Envoyer des commandes "screen" via une page web (php ?)

 

Sujets relatifs
CRON : Executer une page php en CRONAide a la creation d'un serveur pour une PME
Transmission fait monter mon serveur en chargeAide pour créer un serveur LINUX Minecraft PE
problème sur mon serveur tacacs+Aide installation concerto serveur sur debian wheezy
VirtualHost (Apache) avec redirection vers Serveur IISSockets Linux en C - serveur d'applications
Quel serveur email sécurisé ?Serveur LAMP avec virtualhosts et FTP
Plus de sujets relatifs à : Serveur : Envoyer des commandes "screen" via une page web (php ?)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR