Taches CRON administrées via PHP?

Coucoutte :smiley:

Serveur : Debian 12 sur un VPS OVH.
Installés : Nginx + Module RTMP + PHP
Rôle : Serveur vidéo
But : Programmer la diffusion de vidéos de manière autonome avec ffmpeg

Depuis la console SSH, je peux lancer manuellement une vidéo à streamer, précédemment placée sur le serveur :

ffmpeg -re -i ".../videos/test.mp4" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

J’arrive à programmer la diffusion en créant une tache cron avec crontab -e

Je voudrais pouvoir lister, modifier, ajouter, supprimer des taches cron mais via PHP.

A priori, les taches « utilisateur » (ici « debian », nom d’utilisateur fourni par le VPS) sont stockées dans le fichier suivant
/var/spool/cron/crontabs/debian
(Je ne puis le modifier même en sudo … ?).

Je pense qu’il doit y avoir moyen de lire/écrire ce fichier depuis php mais je ne trouve pouint :frowning:

La décomposition/recomposition des lignes du fichier (pour modifier les taches cron de manière plus intuitive) ne devraient pas être un problème mais pour le moment je cale juste sur comment on peut accéder au fichier.

Si quelqu’un a une piste :slight_smile:

Merkouiiinnnn

Bonjour,

Pourquoi veux-tu le faire en PHP?
Webmin permet de gérer les tâches CRON et bien d’autres choses d’ailleurs.

Plop !

Car ce sera administré via le panneau d’admin d’un autre site (pas que par moi) et pas sous forme :

0 21 20 8 * ffmpeg -re -i ".../videos/test.mp4" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

pour diffuser la vidéo « test.mp4 » le 20 août à 21H00, mais plutôt sous forme plus intuitive (jour mois heure minute et on choisit la vidéo à diffuser).

Et à terme, pour certaines vidéos, ce serait juste un ON/OFF pour d’autres qu’administrateur (donc par exemple animateurs).

Bonjour @CouinCouin.

Pour te montrer un exemple, un fichier « php » pour la crontab (tu peut faire mieux) :

vim /root/mycrontabs/php/scripts.cron.php

#!/usr/bin/php -q
<?php

$loadavg = linux_loadavg();
if($loadavg > 5)
{
        exit();
}

$v = shell_exec('ps ax');

$found_proc1 = 0;
#$found_proc2 = 0;

if(preg_match('@/your/script/hors_repertoire_html/your_script.php@', $v))
{
        $found_proc1 = 1;
#       echo 'NOOK'."\n";
}

if(!$found_proc1)
{
        exec('/your/script/hors_repertoire_html/your_script.php 1>>/var/log/php/your_script.log 2>/dev/null 2>&1');
}

?>

Puis ton script « your_script.php » lancé avec exec() :

#!/usr/bin/php -q
<?php

 # un truc à la c** :
 $_GET['code'] = isset($_GET['code']) ? $_GET['code'] : 'ma_super_protection_HDdsehaziuedshdkdqdhqdhqkd';

 include "/var/pro/web_sites/domain_tld/www/web/your_script_inwebdir.php";

?>

Si tu as besoin d’avoir les script dans ton répertoire web d’un site :

<?php
#phpinfo();
# on vérifie que le script n'est pas lancé depuis https://www.domain.tld/your_script_inwebdir.php
if($_SERVER['SCRIPT_NAME'] == '/your_script_inwebdir.php') exit;

# on vérifie que le script a bien la bonne valeur "code" envoyé/configuré hors répertoire web
if(isset($_GET['code']) && $_GET['code'] == 'ma_super_protection_HDdsehaziuedshdkdqdhqdhqkd'):

    echo "your script";

endif;

?>

Et ta crontab :

0 21 20 8    php -q /root/mycrontabs/php/scripts.cron.php 1>>/var/log/syslog 2>&1

:wink:

Dans mon arborescence, des sites pour m’y retrouver facilement par exemple :

# les pages web (le service Web (apache, nginx) pointe ici)
/var/pro/web_sites/domain_1.tld/www/web/ 
# les documents "cachés"
/var/pro/web_sites/domain_1.tld/www/docs/ 
# les script "cachés"
/var/pro/web_sites/domain_1.tld/www/scripts/ 
# les PSD/AI "cachés" pour les graphistes...
/var/pro/web_sites/domain_1.tld/www/psd/ 
[...]

Puis l’utilisateur/développeur FTP à accès à, disons-nous :

/var/pro/web_sites/domain_1.tld/www/

Bon courage.
Romain

Rappelles nous, quelques heures avant le « 20 août à 21H00 » quand tu as « finis » ton script…

Pour que l’on voit le résultat.

Bon job @CouinCouin !

Attends je vais me faire une « alerte » (je plaisante).

Romain

Coucou Romain :slight_smile:

lol pour la notif :stuck_out_tongue:

Mais je ne suis pas sur de comprendre, j’ai l’impression que ton code permet de lancer un script le 20 aout a 21H, si c’est le cas, ce n’est pas exactemet ce que je cherche à faire, mais plutôt modifier/supprimer/ajouter la liste des taches cron que l’on trouve en faisait crontab -e dans la console.

En gros, je voudrais pouvoir lire par un script php, le fichier /var/spool/cron/crontabs/debian .
De là après extraire la liste des taches cron comme on épluche un fichier text avec un while puis des explode etc etc pour décomposer chaque ligne (et faire une petite interface pour que ce soit plus compréhensible pour la prog des taches), ça je pense que ce ne sera pas un problème.
Puis pouvoir écrire (écraser quoi) ce fichier , là aussi via php. Le 20 aout à 21H n’était qu’un exemple pour la forme d’écriture .

Ah oui oOOps, pour tester les crontabs toutes les minutes.

*/1 * * * *    php -q /root/mycrontabs/php/scripts.cron.php 1>>/var/log/syslog 2>&1

Et dans tes scripts tu cherche le timestamp actuel et timestamp voulu et du démarre le script au timestamp voulu.

Exemple :

<?php
$timestamp_actual = mktime();
$timestamp_script_tostart = mktime($hour, $min, $sec, $month, $day, $year);

if($timestamp_actual  >= $timestamp_script_tostart ):

    echo "ton script";

endif; 

?>

Bon un truc du genre… parce que là il va se lancer tout le temps si la date est dépassée ce n’est pas bon.

Et ce n’est pas ce que tu souhaites faire.

:wink:


Bon courage, tu vas y arriver :wink:

Plutôt que de vouloir réinventer la roue, ou de faire une usine à gaz, tu devrais plutôt utiliser des interfaces qui existent déjà. Et le site web que tu citais n’a plus qu’à rediriger vers cette interface quand tu as besoin de faire un nouveau cron.

Tu peux utiliser crontab-ui, usermin/webmin, ou https://dkron.io/
liste non exhaustive.

1 J'aime

L’interface graphique n’est pas le problème, le problème c’est de pouvoir lire et écrire le fichier qui liste les taches cron.
Je ne serais pas seul à programmer des vidéos, donc je ferais une interface intuitive et exclusivement limitée à la programmation de vidéos.

@Romain : je ne comprends pas la démarche, je ne veux pas lancer un script php (toutes les minutes ou autres) mais pouvoir modifier/ajouter/supprimer les taches cron :slight_smile:

Ilk y a un élément que je ne comprends pas . Pourquoi vouloir diffuser la vidéo à une heure précise donnée? Quelle en est l’utilité, d’autant, si plusieurs personnes peuvent faire ces « programmations » ?
Est-ce de la vidéo à la demande? Car pour ça tu as Plex, tu as OpenLEec qui est carrément une distribution, ou Streamio.

Il est difficile de comprendre ton objectif (fonctionnel et non technique) .

Reu !

C’est pour une webradio avec plusieurs animateurs.
Historiquement, certains animateurs faisaient leur live sur la webradio ET en vidéo sur la page facebook de la radio.
Mais entre coupures de son ou carrément éjection du live FB pour cause de droits d’auteurs, le propriétaire de la webradio a loué un service de diffusion vidéo (RTMP) et j’ai intégré le player vidéo sur le tchat de la radio même.
Mais fin juin, le prestataire du service vidéo stoppé la gamme de prestation.
Donc étant donné qu’il y en a marre des trucs externes plus ou moins fiable, j’ai monté un serveur vidéo sur un VPS. J’ai testé tout un tas de trucs vidéos mais entre ceux qui ne marchaient pas, ceux en docker (jamais rien piné à c’truc là…), etc etc, seul à ce jour nginx + module rtmp est ok et sera conservé (j’ai déjà codé pour que le pop up vidéo apparaisse sur le tchat lors d’un live et disparaisse une fois le live terminé).
Le précédent système vidéo permettait de programmer la diffusion de fichiers vidéo. On utilisait cette fonction pour les animateurs qui avaient des émissions pré-enregistrées (donc pas live) et qui voulaient qu’il y ait aussi une vidéo lorsque leur émission passait.
Sur l’ancien système, seul le propriétaire de la radio et moi même avions accès au service pour programmer les vidéos.

  • A ce jour, le live est OK avec le VPS (objectif premier).
  • Le plus, serait que le propriétaire de la werbradio et moi même puissions programmer les vidéos que les animateurs nous font parvenir (avec l’ancien système, chaque animateur pouvait envoyer sa vidéo sur le site de la webradio, et le script d’envoi transférait en arrière plan, la vidéo sur le serveur vidéo via FTP (les animateurs n’ayant ainsi pas l’accès ftp à avoir).
    C’est donc pour cela qu’il faille que je puisse lire le fichier des taches cron puis l’écrire avec les taches crons modifiées/ajoutées/supprimées.
    Un peu comme file_get_content et fwrite.
  • Le plus plus, serait que chaque animateur puisse activer ou désactiver la programmation de SA vidéo (et uniquement SA vidéo), mais ça ce n’est juste que des if etc etc, le problème reste le même : lire et écrire le fichier des taches cron.

Oui c’est bien ce que je pensais. Ton système, tu vas te le faire défoncer plus vite que tu ne vas pouvoir l’utiliser.
Les pirates se font une joie de pirater ce genre d’interface.

Il existe des plateformes qui existent déjà pour ça. j’en avais cité une d’ailleurs:

  • Plex
  • Kodi
  • Jellyfin
  • Universal Media Server
  • Stremio

Je ne connais (qu’un peu) Plex , et de loin Stremio, pour les avoir étudié (Plex surtout) dans le cadre d’un projet de lieu loisir/culturel/bar .
J’avais donc besoin à la fois pour l’"ambiance mais aussi pour les gens à l’extérieur d’y avoir accès.

Le tout sur une plateforme auto-hébergée.

Dans ton cas, je pense que Plex et Stremio me semble les plus adaptés.
Je ne connais pas assez les autres pour pouvoir mieux te conseiller.

Mais ce (l’interface de prog) ne sera pas un truc ouvert au public.
Je pense que l’on tourne en rond sur la compréhension du système, ce n’est pas un média center que je veux faire.

Ils serait bon de bien relire les besoins de CouinCouin avant de répondre, il ne demande pas la mise en place d’un media center ou autre mais simplement faciliter la modification de tâches cron.

Un début de réponse peut-être (je n’aime pas le php :confused: ) :

J’en profite pour déplacer dans la partie programmation ta demande CouinCouin :wink:

Coucoutte Clochette,

Merci pour le déplacement , j’hésitais entre les deux rubriques à vrai dire :slight_smile:

Merci aussi pour le lien ,j’irais voir tout à l’heure car là je me tire bosser lol

Bon aprèm’ :slight_smile:

Tu parle d’un truc ouvert à des utilisateurs. Seront-ils toujours en réseau local? y accèdent-ils à distance? Si l’accès se fait via internet c’est ouvert au public par définition.

@Almtesh l’idée ici c’est que nous sommes peut être en présence d’un problème XY. Rien de personnel là dedans, c’est malheureusement devenu très fréquent.
Pour rappel un media center c’est un système dont la fonction est de diffuser un média (son, images, videos etc…)

Après, j’ai pour habitude de penser tout système à l’aulne de la sécurité. Car les problèmes de piratages sont d’abord du à tous les systèmes qui permettent d’être utilisés comme bots. Linux ou pas.

et je ne parle pas des usines à gaz qui sont là aussi malheureusement devenu la norme ces dernières années.

Pas la peine d’argumenter, ce n’est pas se que CouinCouin demande à la base mais simplement comment en php gérer des tâches CRON :wink:

peut etre ça ( je n’ai pas essayé )

1 J'aime

Ne t’inquiète pas, je ne le prends pas mal.

Coucoutte !

Désolé, eu quelques contretemps m’empêchant de répondre, mais malheureusement les diverses commandes et scripts y compris les pistes données ici ( merciii :blush: ) que j’ai testé ne donnent rien.
Je pense donc faire autrement et ça doit certainement rejoindre l’idée de ZW3B, une tache cron unique, toutes les minutes, qui lance un script php qui ira interroger une DB pour savoir si il y a une vidéo à envoyer. Si toutefois j’arrive à commander ffmpeg depuis php.