Récupération des données de Drive sur un NAS

Bonjour,

Après avoir parcouru le forum, je n’ai pas trouvé de réponse récente traitant du sujet. (sens Cozy → NAS)

Je voulais savoir si et comment il serait possible de pouvoir récupérer l’ensemble des données présentes dans Cozy Drive directement à partir d’un NAS (ici Synology en l’occurence).

J’ai vu que le protocole WebDav n’était pas à l’ordre du jour, mais il y a peut-être une autre possibilité d’accès ?

J’ai trouvé des packets pour Linux, mais les NAS n’ayant pas de GUI (au sens du système d’exploitation) il faudrait que ceci puisse se faire directement à partir de la CLI.

Merci pour vos retours :slight_smile:

Bonne journée.

Bonjour @MathieuN,

Bienvenue sur le forum :smile_cat:,

Nous n’avons malheureusement pas encore d’interface en CLI, mais tu peux peut-être t’en sortir en passant directement par l’API.

J’avais commis jadis un petit script montrant comment interagir avec le système de fichiers d’un Cozy en shell avec curl.

Quel est ton besoin exact ? Faire une sauvegarde régulière des fichiers de ton Cozy sur ton NAS ?
Si tu ne veux pas récupérer tous les fichiers, mais juste par exemple un dossier, tu peux regarder du côté des méthodes qui permettent de récupérer une archive au format Zip d’un dossier.

Bonjour @Clochix,

Merci pour ton retour rapide !

J’ai une application d’archivage documentaire sur mon NAS et je voulais récupérer les données en provenance de Cozy pour les héberger dessus.

Cela me servira donc de backup de sauvegarde et de consultation.

Merci pour ton script, je vais regarder ça de plus près et l’adapter au projet, je pense que cela pourra faire l’affaire !

Bonne journée.

Si tu as besoin d’aide, n’hésite pas à me demander. Les gens qui utilisent la CLI sont des esthètes à encourager :wink:

Est-ce que tu as un peu de doc sur ton script pour lancer les différentes commandes ?

Pour le moment j’ai juste mis l’URL et je tente de faire récupérer un token mais le script ne renvoie rien :confused:

Par ailleurs, ton script fait appel à un fichier common.sh. Est-ce qu’il est nécessaire ?

Merci pour ton aide !

Malheureusement non, je n’ai pas de documentation. J’essaie de te faire ça dans l’après-midi.

Le fichier common.sh ne sert à rien, il contient juste une fonction logerr() ( echo -e "\033[01;31m$@\033[0m" 1>&2;) qui affiche les erreurs en rouge sur la sortie d’erreur de l’application.

Ton script doit être situé dans le répertoire bin ?

C’est peut être pour cela que lorsque je le lance manuellement (./cozycli.sh) je n’ai aucun retour dans la CLI.

Non, normalement avec ./cozycli.sh ça devrait le lancer quel que soit le dossier dans lequel il est.

Mais le script lui-même n’affiche rien, il définir une fonction cozycli que tu peux ensuite appeler avec des options : cozycli token toto.mycozy.cloud pour récupérer un jeton d’autorisation, qui pourra ensuite être utilisé dans d’autres requêtes.

Ok je te remercie je vais tenter ça.

Je te tiens au courant.

Bon, je crois que je vais devoir mettre ton script dans une image Docker car sur mon NAS cela m’oblige à installer netcat et sur mon Mac certaines commandes comme jq ne fonctionnent pas.

Avec Docker j’aurais un environnement sous contrôle :slight_smile:

Concernant netcat, c’est un peu le bazar car il en existe je crois deux versions qui n’ont pas les même options.

Dans un autre script, j’utilise socat, c’est peut-être plus simple pour toi ?

Pour ce qui est de jq, c’est vraiment la commande indispensable pour manipuler du JSON (toutes nos API utilisent JSON comme format d’échange), donc je te conseille vraiment de l’installer.

Quelques explications sur le fonctionnement du script.

En exécutant le script via source cozycli.sh, tu rends disponible une nouvelle commande, cozycli, qui a plusieurs options :

  • cozycli token URL [périmètre] : pour obtenir une clé d’accès au Cozy. Par défaut, cette clé permet de consulter le système de fichiers (périmètre = io.cozy.files:GET), on peut préciser un périmètre différent pour interagir avec d’autres types de documents ;
  • cozycli revoke pour révoquer la clé, c’est à dire interdire d’accéder au Cozy avec cette clé. C’est surtout utile pour faire le ménage côté serveur dans la liste des applications qui ont le droit de se connecter au Cozy ;
  • cozycli backup chemin : appelle l’API de sauvegarde d’un dossier ;
  • par défaut, l’application permet de faire une requête GET sur n’importe quel point d’entrée de l’API. Par exemple, pour lister les fichiers à la racine du Cozy, on pourra utiliser cozycli /files/io.cozy.files.root-dir. Le résultat étant en JSON, utiliser jq derrière est fortement recommandé. Par exemple cozycli /files/io.cozy.files.root-dir | jq -r '.included?[] | [.attributes.type, .attributes.size//"-", .attributes.created_at, .attributes.updated_at, .id, .attributes.name] | join(";")' | column -s ';' -t. (attention à la pagination, par défaut cette requête ne retourne que les trente premiers documents).

Pour interagir avec le Cozy, il faut commencer par demander une clé : cozycli token toto.mycozy.cloud
Cette commande va afficher une URL à ouvrir dans le navigateur. Laquelle URL ouvre une page du Cozy demandant confirmation de l’autorisation de l’application locale à accéder aux fichiers. Une fois la confirmation faite, l’application locale va récupérer diverses clés qu’elle stockera dans les fichiers token.json et registration.json. Ces clés seront utilisées pour accéder au Cozy dans les requêtes suivantes.

Reste à demander la sauvegarde, par exemple du dossier Chats situé à la racine du Cozy :

cozycli backup "/Chats"

Cette commande télécharge une archive au format Zip du dossier et l’enregistre dans un fichier Backup.zip.

J’espère que c’est un peu plus clair ainsi.

PS : Pour utiliser socat plutôt que netcat, la syntaxe est la suivante :

answer="$(socat -v TCP-LISTEN:8080,crlf,reuseaddr SYSTEM:'echo "OK"' 2>&1 | grep "^GET")";
IFS=";" read -r code state2<<< $(echo "$answer" | sed -E "s/^.*&code=([^&]*)&state=(.*) .*$/\1;\2/")
1 Like

Merci pour ta réponse (très) détaillée.

Je teste tout ça et je reviens vers toi pour te confirmer le fonctionnement !

Hello @Clochix,

J’ai commencé à regarder de plus près le script et je dispose bien de toutes les commandes nécessaires sur le Syno (installées via OPKG), notamment pour ce qui est de la commande socat et jq.

Je bloque sur la partie où on doit ouvrir l’URL sur le navigateur.

En effet, le clientID renvoyé est à null et je pense que c’est parce qu’il manque des éléments à donner sur la commande jq au dessus.

Du coup quand j’ouvre cette URL sur Cozy il me répond logiquement qu’il a rencontré une erreur. (Asset not found)

Que dois-je remplir tout en haut ?

À ce jour j’ai rempli ceci uniquement :

server=‘moncozy-home.mycozy.cloud/’
token=’’
tokenpath=‘token.json’
registrationpath=‘registration.json’
verbose=’-s’
lastcode=’’
lastres=’’

Merci de ton retour !

En fait en creusant un peu plus, cela ne vient pas de là.

Dans le fichier registration.json se trouve ceci :

   {
      "error": "Method POST not allowed",
      "server": "moncozy-home.mycozy.cloud"
   }

Comment puis-je activer ceci dans les paramètres de Cozy ?

As-tu essayé avec moncozy.mycozy.cloud ? moncozy-home.mycozy.cloud est l’URL de l’application home mais l’URL de ton serveur est moncozy.mycozy.cloud.

Oui je viens de m’en rendre compte selon un autre post du forum. J’ai essayé et ça fonctionne j’ai bien la bonne URL !

Reste à résoudre le problème du fait que je sois en CLI et que j’ouvre la requête à partir du NAS en direct.

Je vais tenter de mettre l’IP du NAS dans le redirect_uris

Oui, le redirect_uri doit être une URL qui, ouverte dans ton navigateur, pointe vers le socat qui écoute sur son NAS.

Pour tester, sur ton NAS lance socat -v TCP-LISTEN:8080,crlf,reuseaddr SYSTEM:'echo "OK"' 2>&1 et ouvre dans ton navigateur http://ip_du_nas:8080. Tu devrais avoir juste une page affichant OK, et socat rendra la main en affichant la requête envoyé par le brouteur.

Oui je viens de réussir à faire marcher la requête ! J’ai bien récupéré le token et un cozycli /files/io.cozy.files.root-dir me permet bien de lister les dossiers :slight_smile:

Me reste à gérer comment faire une synchro complète de tous les dossiers situés sous Administratif facilement.

Idéalement si je pouvais afficher la liste des nouveaux fichiers créés à partir de la date n ce serait parfait !

1 Like

Merci pour ton aide @Clochix !

À partir de là je vais me faire une boucle récursive où je vais checker chaque répertoire et prendre tous les fichiers à l’intérieur.

Je vais stocker les ID des fichiers récupérés dans un cache et ça fera l’affaire.

Quand mon script sera terminé je le publierais ici afin que cela puisse servir à d’autres.

1 Like