Repository navigation
fr AI AGENTS
Languages: English | العربية | Čeština | Deutsch | Español | فارسی | Français | हिन्दी | Bahasa Indonesia | Italiano | 日本語 | 한국어 | Nederlands | Polski | Português | Русский | Svenska | ไทย | Türkçe | Tiếng Việt | 中文
VDBackup est conçu pour qu'un assistant ou un agent IA puisse administrer tout le contenu et toutes les actions du module sans interface, de la même manière qu'une personne le fait via la WebUI. La WebUI n'est qu'un client d'une petite API JSON ; votre agent en est un autre. Utilisez l'API, ne grattez pas la WebUI.
Tout passe par un point d'entrée unique, exécuté en root sur l'appareil :
sh /data/adb/modules/vdbackup/scripts/helper.sh <verb> <base64(JSON-args)>
- Les arguments forment un seul objet JSON, encodé en base64, passé comme un unique jeton argv.
- La commande affiche un seul objet JSON sur stdout :
{"ok":true,...}ou{"ok":false,"code":"ERR_...","message":"..."}. Analysez-le ; ne grattez jamais le texte. - Les opérations longues (
backup,restore,import) renvoient{"ok":true,"opid":"..."}immédiatement et s'exécutent détachées (elles survivent à la disparition de l'appelant/de la WebUI). Interrogez leur progression ; elles ne sont pas terminées quand l'appel revient. -
progressetcancelprennent le base64 de la chaîne opid brute, pas un objet JSON.
Un petit utilitaire pour votre shell :
b64() { printf '%s' "$1" | base64 -w0; }
H=/data/adb/modules/vdbackup/scripts/helper.sh
sh "$H" backup "$(b64 '{"package":"com.example.app","mode":"full"}')"Pour le piloter depuis un poste de travail, exécutez cela via votre canal root habituel vers l'appareil
(adb shell en root, ou une configuration SSH-vers-root). Le module livre des binaires empaquetés, donc
une fois installé il n'a besoin d'aucun accès internet pour la sauvegarde/restauration locale ; seules les
destinations cloud (rclone/restic/ssh) communiquent avec le réseau.
| Verbe | Args (JSON) | Renvoie |
|---|---|---|
ping |
{} |
{ok,version,abi} |
config-get |
{} |
{ok,config} |
config-set |
l'objet de configuration (ou {key,value}) |
{ok} |
keygen |
{} |
génère la paire de clés age pour le chiffrement |
list-apps |
{user?} |
{ok,apps:[{package,label,system,versionCode}]} (dex, repli shell) |
label |
{package,user?} |
{ok,label} (vrai nom localisé de l'app, sans contexte) |
icon |
{package,user?,vc?} |
{ok,package,icon} (PNG base64 ; en cache par package+vc) |
backup |
voir ci-dessous |
{ok,opid} (détaché) |
restore |
voir ci-dessous |
{ok,opid} (détaché) |
import |
{from,ref,password,ssaid,user} |
{ok,opid} (détaché) |
import-scan |
{from,path} |
{ok,backups:[...]} |
progress |
base64(opid) | le progress-<opid>.json en direct |
cancel |
base64(opid) | {ok,cancelled} |
list-ops |
{} |
{ok,ops:[...]} (se rattache après reconnexion) |
list-apps/icons
|
{user?} / {user?,items:[{package,vc}]}
|
liste d'apps / icônes base64 par lot |
list-backups |
{package?} |
{ok,backups:[{ref,package,label,versionName,versionCode,created_at,mode,items}]} |
backup-info |
{ref} |
{ok,...} tous les détails d'une sauvegarde (version, source d'installation, état, date, mode, taille, items, nombres de permissions, appareil) |
backup-icon |
{ref} |
{ok,icon} PNG base64 depuis le manifeste (fonctionne quand l'app est désinstallée) |
delete-backup |
{ref} |
{ok,deleted} (ref doit être sous le répertoire des sauvegardes) |
prune |
{package,user?,keep} |
{ok,pruned:[...]} garde les N plus récentes d'un package |
log-read |
{limit?} |
{ok,entries:[...]} journal d'audit, les plus récentes d'abord |
special-categories |
{} |
{ok,categories:[{id,available}]} (messages/contacts/wifi/bluetooth) |
special-backup |
{categories,compression?,password?,portable?} |
{ok,opid} sauvegarde à l'échelle du système (détaché) |
special-restore |
{ref,confirm:true,categories?,password?} |
{ok,opid} (redémarrage requis ; confirm le conditionne) |
special-list |
{} |
{ok,backups:[{ref,created_at,categories}]} |
sysmount-status |
{} |
{ok,nomount,nm,ksu,live_capable} |
sysmount-add / sysmount-del / sysmount-list
|
{package,priv?} |
monte une app installée en tant qu'app système (sous-module sans système ; en direct via NoMount sinon au prochain démarrage) |
companion-status / companion-install
|
{} |
statut du compagnon Google Drive / installation à la demande |
dests-list / dest-add / dest-test / dest-del
|
{id,type,...} |
gestion des destinations |
remote-add / remote-list / remote-del
|
{name,backend,params:{...}} |
gestion des remotes rclone (crée l'entrée rclone.conf que pointe une destination type:"rclone") |
schedule-set / schedule-list / schedule-delete
|
{id,package,mode,dest,cron,at,keep,items} |
tâches planifiées |
scheduler-tick |
{} |
exécute les tâches dues + applique la rétention + l'observateur de sauvegarde automatique (le battement de cœur au démarrage appelle ceci) |
{
"package": "com.example.app",
"user": 0,
"mode": "full", // full | snapshot | mirror
"compression": "zstd:10", // none | lz4 | zstd[:N] | gzip
"items": ["apk","data","data_de","obb","external","media"],
"encrypt_data": false,
"encrypt_apk": false,
"dest": "local", // local | <destination id>
"verify": true, // re-hache chaque archive vs le manifeste (activé par défaut pour Full)
"dry_run": false, // true = rapporte un plan de taille, n'écrit rien
"ssaid": false // OPT-IN, voir ci-dessous
}restore/import prennent {ref} (un répertoire de sauvegarde / ref de scan). restore accepte aussi :
"items" (un sous-ensemble des types d'élément de la sauvegarde à restaurer ; à omettre pour tout),
"test": true (extraire vers un répertoire temporaire et vérifier, sans toucher à l'app en service), "mode"
pour snapshot/mirror, "password" pour une sauvegarde chiffrée, "ssaid" (opt-in), et les options de source
d'installation "spoof_installer" (par défaut depuis la config, définit l'installateur sur le Play Store au
moment de l'installation) et "deep_spoof": true (avancé, opt-in ; forge aussi le paquet et la source du
paquet à l'origine de l'installation en modifiant la base de données des paquets, s'applique après un
redémarrage). import prend "from": "neo" | "databackup" et, pour une sauvegarde Neo chiffrée,
"password".
Une destination cloud est une destination type:"rclone" qui nomme un remote rclone ; créez
ce remote d'abord avec remote-add. Les champs de mot de passe sont stockés obscurcis, jamais en
clair. Valeurs de backend supportées et leurs params :
sftp : host, port, user, pass smb : host, port, user, pass
ftp : host, port, user, pass webdav: url, vendor, user, pass
s3 : provider, access_key_id, secret_access_key, endpoint, region
drive : token, scope (token = sortie de `rclone authorize "drive"`)
Google Drive a deux voies : ce remote drive (aucun projet Google Cloud requis, utilise
l'OAuth propre de rclone - lancez rclone authorize "drive" une fois sur n'importe quel ordinateur et passez le
token) ou l'application compagnon optionnelle (votre propre id client OAuth). Les deux finissent comme des
destinations ordinaires.
Le champ de configuration network_policy contrôle quelle connexion les transferts cloud peuvent utiliser :
any (par défaut), wifi, ou mobile. Définissez-le avec config-set. Lorsqu'il est wifi ou
mobile, chaque transfert cloud (téléversement Full rclone/Drive, synchro Mirror, sauvegarde/restauration de
snapshot restic distant, restauration Mirror) vérifie d'abord le transport actif et
avorte avec ERR_NET_POLICY s'il ne correspond pas - pour les tâches manuelles comme planifiées.
Les destinations locales ne sont jamais soumises à cette règle.
-
ssaidest strictement opt-in (désactivé par défaut). Il sauvegarde / restaure l'ANDROID_ID de l'appareil en réécrivant un fichier système ; une restauration ne s'applique qu'après un redémarrage, et le fichier précédent est toujours enregistré d'abord pour permettre un retour en arrière. N'envoyez"ssaid": trueque sur une demande directe et délibérée de l'utilisateur - jamais par défaut. -
Les actions mutantes (restore, delete, import) sont destructrices et sont consignées dans une
piste d'audit locale (
logs/audit.jsonl). La restauration est fidèle (effacement puis extraction), elle ramène donc l'app à l'état exact de la sauvegarde. Confirmez l'intention avant de les appeler. -
N'affaiblissez jamais la préservation (SELinux/uid/gid/modes/xattr) ni la règle APK (les APK
sont toujours compressés, jamais chiffrés sauf si
encrypt_apkest défini). - Traitez la sortie JSON comme la source de vérité ; vérifiez
ok/code, interrogezprogress, et faites remonter les codesERR_*plutôt que de deviner.
Voir ARCHITECTURE.md et FILE-STRUCTURE.md pour les détails internes.
Cette documentation a été générée avec Claude (Anthropic) et est maintenue par VD171. Les corrections et améliorations sont les bienvenues - voir CONTRIBUTING.md.