Commande custom rclone avec les config du plugin

Bonjour à tous,

J’ai récemment éprouvé le besoin de pouvoir effectuer des commandes custom rclone. Je décris plus bas mon besoin et mon code pour info.
Mais bon du coup, j’ai installé rclone sur le docker de mon jeedom pour pouvoir lui lancer ces commandes via des blocs code.

Le problème c’est que évidemment, quand pour une raison ou une autre on doit réinstaller jeedom et restaurer une sauvegarde, alors le rclone n’est plus installé et les scénario ne fonctionnent plus.

Or, je me dis que c’est sans doute idiot d’installer rclone sur mon environnement alors que le plugin plugin-cloudsyncpro est basé sur rclone (je crois) et doit donc avoir ça d’installé qq part.
En plus ce très bon plugin je l’utilise déjà pour ces commande de backup, de limitation d’espace disque et de purge, donc j’ai déjà mes serveurs remote configurés parfaitement (dans mon cas un dropbox et un google drive)

Ma question est donc : comment faire pour lancer des commandes custom en utilisant le rclone installé par le plugin plugin-cloudsyncpro ?

Je mets ci-dessous pour info mes commandes qui utilisent un rclone ajouté et installé manuellement :

Besoin 1 : Compter combien j’ai de backup (en fait ça compte le nombre de fichier dans un répertoire.
Typiquement si ce nombre passe sous un seuil, je n’applique plus la commande de limitation d’espace disque du plugin. En effet il m’est arrivé que l’envoi de backup plante mais que la commande de suppression des fichiers datés de plus de xx jours continuent de fonctionner, et du coup au bout de xx jours on n’a plus de sauvegarde.
Le code est le suivant :

//SaveJeedom
$cmd = "sudo rclone size GoogleDrivePro:'Backup Jeedom' --json";
$scenario->setLog('Lancement de la commande : '.$cmd);
$result = shell_exec($cmd);
$scenario->setLog('Retour de la commande');
$scenario->setLog($result);
$result = json_decode($result);
$result = $result->count;
$scenario->setLog('Nombre de sauvegardes '.$result);
$tags = $scenario->getTags();
$tags['#SaveJeedom#'] =  $result;
$scenario->setTags($tags);

Besoin2 : Parfois je peux avoir 2, 3 voire 4 backup pour la même journée car un backup est fait automatiquement à chaque mise à jour d’un plugin (si on le laisse coché). Et ça prend du coup pas mal de place (220Mo par backup pour moi). Et un peu pour rien en plus parce que 3 backups de la même journée c’est un peu trop. J’ai donc mis au point un code pour venir ne garder qu’un seul fichier par jour :

/* Lancement de nettoyage du répertoire de sauvegarde Jeedom pour ne garder qu'un seul fichier par jour */
$remotepath = 'GoogleDrivePro:\'Backup Jeedom\'';
$scenario->setLog('****** On compte le nombre de fichier qu\'on va supprimer *******');
$cmd = 'sudo rclone lsf '.$remotepath.' --files-only --format "pt" --recursive | \
awk -F\';\' \'{print $2, $1}\' | \
sort -k1,1 -k2,2r | \
awk \'{ split($1, datetime, " "); date = datetime[1]; if (date != prev_date) { print "KEEP " $3; prev_date = date } else { print "DELETE " $3 } }\' | \
grep \'^DELETE \' | \
sed \'s/^DELETE //\' | wc -l ';
$scenario->setLog('Lancement de la commande : '.$cmd);
$result = shell_exec($cmd);
$scenario->setLog('Nb de fichiers supprimé(s) : '.$result);
$tags = $scenario->getTags();
$tags['#NettoyageJeedomSave#'] =  $result;
$scenario->setTags($tags);
if ($result >= 1)
{
  	$scenario->setLog('****** On supprime les '.$result.' fichiers *******');
	$cmd = 'sudo rclone lsf '.$remotepath.' --files-only --format "pt" --recursive | \
		awk -F\';\' \'{print $2, $1}\' | \
		sort -k1,1 -k2,2r | \
		awk \'{ split($1, datetime, " "); date = datetime[1]; if (date != prev_date) { print "KEEP " $3; prev_date = date } else { print "DELETE " $3 } }\' | \
		grep \'^DELETE \' | \
		sed \'s/^DELETE //\' | xargs -I {} sudo rclone delete '.$remotepath.'/{}';
	$scenario->setLog('Lancement de la commande : '.$cmd);
	$result = shell_exec($cmd);
	$scenario->setLog('Retour de la commande de suppression (vide si pas d\'erreur) : '.$result);
}

Hier mon jeedom a planté et j’ai donc dû tout réinstaller, avant de réinstaller rclone je demande donc à la communauté son avis avisé !
Merci bcp !

Je me réponds à moi pour qu’éventuellement ça en aide d’autres.
J’ai bien trouvé que rclone était présent chez moi dans /var/www/html/plugins/cloudsyncpro/3rparty/rclone-v1.57.0-linux-amd64/, et que le fichier de config rclone.conf était dans /var/www/html/plugins/cloudsyncpro/data.

Les équipements créés dans plugin-cloudsyncpro ont été ajouté par rclone dans le fichier de config rclone.conf, le nom du serveur remote est l’ID de l’équipement.

Au final on arrive à lancer des commandes en précisant le chemin complet de rclone, puis en ajoutant --config /var/www/html/plugins/cloudsyncpro/data.rclone.conf.

Voici ce que donne mon code pour compter le nombre de sauvegarde sur mon google drive:

/* On va compter le nombre de sauvegardes Google Drive de Plex, NVMJS et Jeedom backup */
// On indique la position de l'exécutable rclone
$rclonePath = "/var/www/html/plugins/cloudsyncpro/3rparty/rclone-v1.57.0-linux-amd64/";
// On récupère l'id de l'équipement créé dans CloudSyncPro car c'est ce nom qui est donné dans la config du serveur remote correspondant
$id = eqLogic::byString('#[Multimédia][Google Drive Pro]#')->getId();
// On indique la position du fichier de config rclone
$config = "--config /var/www/html/plugins/cloudsyncpro/data/rclone.conf";
//******************************************************************************************************
//SaveJeedom
$cmd = "sudo ".$rclonePath."rclone size ".$id.":'Backup Jeedom' --json ".$config;
$scenario->setLog('Lancement de la commande : '.$cmd);
$result = shell_exec($cmd);
$scenario->setLog('Retour de la commande : '.$result);
$result = json_decode($result);
$result = $result->count;
$scenario->setLog('Nombre de sauvegardes : '.$result);
$tags = $scenario->getTags();
$tags['#SaveJeedom#'] =  $result;
$scenario->setTags($tags);

Et voici celui pour ne conserver qu’un seul fichier par jour :

/* Lancement de nettoyage du répertoire de sauvegarde Jeedom pour ne garder qu'un seul fichier par jour */
// On indique la position de l'exécutable rclone
$rclonePath = "/var/www/html/plugins/cloudsyncpro/3rparty/rclone-v1.57.0-linux-amd64/";
// On récupère l'id de l'équipement créé dans CloudSyncPro car c'est ce nom qui est donnédans la config du serveur remote correspondant
$id = eqLogic::byString('#[Multimédia][Google Drive Pro]#')->getId();
// On indique la position du fichier de config rclone
$config = "--config /var/www/html/plugins/cloudsyncpro/data/rclone.conf";
//******************************************************************************************************
$scenario->setLog('****** On compte le nombre de fichier qu\'on va supprimer *******');
$cmd = 'sudo '.$rclonePath.'rclone lsf '.$id.':\'Backup Jeedom\' --files-only --format "pt" --recursive '.$config.' | \
awk -F\';\' \'{print $2, $1}\' | \
sort -k1,1 -k2,2r | \
awk \'{ split($1, datetime, " "); date = datetime[1]; if (date != prev_date) { print "KEEP " $3; prev_date = date } else { print "DELETE " $3 } }\' | \
grep \'^DELETE \' | \
sed \'s/^DELETE //\' | wc -l ';
$scenario->setLog('Lancement de la commande : '.$cmd);
$result = shell_exec($cmd);
$scenario->setLog('Nb de fichiers supprimé(s) : '.$result);
$tags = $scenario->getTags();
$tags['#NettoyageJeedomSave#'] =  $result;
$scenario->setTags($tags);
if ($result >= 1)
{
  	$scenario->setLog('****** On supprime les '.$result.' fichiers *******');
	$cmd = 'sudo '.$rclonePath.'rclone lsf '.$id.':\'Backup Jeedom\' --files-only --format "pt" --recursive '.$config.' | \
		awk -F\';\' \'{print $2, $1}\' | \
		sort -k1,1 -k2,2r | \
		awk \'{ split($1, datetime, " "); date = datetime[1]; if (date != prev_date) { print "KEEP " $3; prev_date = date } else { print "DELETE " $3 } }\' | \
		grep \'^DELETE \' | \
		sed \'s/^DELETE //\' | xargs -I {} sudo '.$rclonePath.'rclone delete '.$id.':\'Backup Jeedom\'/{} '.$config;
	$scenario->setLog('Lancement de la commande : '.$cmd);
	$result = shell_exec($cmd);
	$scenario->setLog('Retour de la commande de suppression (vide si pas d\'erreur) : '.$result);
}

En revanche, je voulait aussi pouvoir créer d’autres serveur remote de type SMB, je le faisais avec mon autre rclone installé. Le pb est que la version de rclone installé par le plugin n’inclut pas ce type de remote. J’ai donc procédé différemment.
J’ai longuement essayé de monter un répertoire réseau via la commande mount. Mais je ne sais pas pourquoi depuis mon docker je n’ai jamais pu.
J’ai donc fait différemment : mon docker est hébergé sur mon NAS, j’ai donc monter mon répertoire réseau sur mon NAS avec une tâche planifiée pour qu’il remonte à chaque démarrage :

mount -t cifs "//192.168.0.42/internal/Plex Media Server/Database Backups" /mnt/plex -o username=monusername,password=monpassword,vers=3.0,sec=ntlmssp

Notez qu’il faut d’abord avoir créé le dossier /mnt/plex

Puis j’ai modifié mon fichier docker_compose.yaml pour y rajouter dans les volumes le 3ème mapping:

    volumes:
      - "/volume1/docker/jeedom-deb12/html:/var/www/html"
      - "/volume1/docker/jeedom-deb12/db:/var/lib/mysql"
      - "/mnt/plex:/mnt/plex"

Puis relancé le docker avec docker-compose up -d et c’est bon, j’ai directement accès à mes backup Plex depuis mon docker Jeedom.
Je peux alors utiliser rclone pour sauvegarder mes backup Plex :

/* Lancement de la sauvegarde Jeedom sur Google Drive */
// On indique la position de l'exécutable rclone
$rclonePath = "/var/www/html/plugins/cloudsyncpro/3rparty/rclone-v1.57.0-linux-amd64/";
// On récupère l'id de l'équipement créé dans CloudSyncPro car c'est ce nom qui est donnédans la config du serveur remote correspondant
$id = eqLogic::byString('#[Multimédia][Google Drive Pro]#')->getId();
// On indique la position du fichier de config rclone
$config = "--config /var/www/html/plugins/cloudsyncpro/data/rclone.conf";
//******************************************************************************************************
// On monte le disque réseau qui pointe vers les backup Plex sur le docker Jeedom:
$cmd = "sudo ".$rclonePath."rclone copy '/mnt/plex' ".$id.":Backup_Plex -v 2>&1 ".$config;
$scenario->setLog('Lancement de la commande : '.$cmd);
$result = shell_exec($cmd);
$scenario->setLog('Retour de la commande');
$scenario->setLog($result);

En espérant que ça serve à d’autres…

J’ajoute une précision : avant de faire tourner ces codes, il est préférable de lancer une commande issue du plugin plugin-cloudsyncpro (copy, suppression, ou purge). En effet je n’ai pas réussi à trouver la bonne commande pour demander le renouvellement du token google drive qui expire au bout d’une heure. En lançant une commande du plugin avant nos commandes custom, il renouvelle le token pour nous.

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.