Repository navigation
it 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 è costruito in modo che un assistente o un agente IA possa amministrare ogni contenuto e azione del modulo senza interfaccia, allo stesso modo in cui una persona lo fa tramite la WebUI. La WebUI è solo uno dei client di una piccola API JSON ; il tuo agente ne è un altro. Usa l'API, non raschiare la WebUI.
Tutto passa attraverso un unico punto di ingresso, eseguito come root sul dispositivo :
sh /data/adb/modules/vdbackup/scripts/helper.sh <verb> <base64(JSON-args)>
- Gli argomenti sono un singolo oggetto JSON, codificato in base64, passato come un unico token argv.
- Il comando stampa un solo oggetto JSON su stdout :
{"ok":true,...}o{"ok":false,"code":"ERR_...","message":"..."}. Analizzalo ; non raschiare mai il testo. - Le operazioni lunghe (
backup,restore,import) restituiscono{"ok":true,"opid":"..."}immediatamente e vengono eseguite staccate (sopravvivono alla scomparsa del chiamante/della WebUI). Interroga il loro avanzamento ; non sono terminate quando la chiamata ritorna. -
progressecancelprendono il base64 della stringa opid grezza, non un oggetto JSON.
Un piccolo helper per la tua 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"}')"Per pilotarlo da una workstation, esegui quel comando tramite il tuo canale root abituale verso il dispositivo
(adb shell come root, o una configurazione SSH-verso-root). Il modulo include binari impacchettati, quindi
una volta installato non necessita di alcun accesso a internet per il backup/ripristino locale ; solo le
destinazioni cloud (rclone/restic/ssh) comunicano con la rete.
| Verbo | Args (JSON) | Restituisce |
|---|---|---|
ping |
{} |
{ok,version,abi} |
config-get |
{} |
{ok,config} |
config-set |
l'oggetto di configurazione (o {key,value}) |
{ok} |
keygen |
{} |
genera la coppia di chiavi age per la cifratura |
list-apps |
{user?} |
{ok,apps:[{package,label,system,versionCode}]} (dex, ripiego shell) |
label |
{package,user?} |
{ok,label} (vero nome localizzato dell'app, senza contesto) |
icon |
{package,user?,vc?} |
{ok,package,icon} (PNG base64 ; in cache per package+vc) |
backup |
vedi sotto |
{ok,opid} (staccato) |
restore |
vedi sotto |
{ok,opid} (staccato) |
import |
{from,ref,password,ssaid,user} |
{ok,opid} (staccato) |
import-scan |
{from,path} |
{ok,backups:[...]} |
progress |
base64(opid) | il progress-<opid>.json in tempo reale |
cancel |
base64(opid) | {ok,cancelled} |
list-ops |
{} |
{ok,ops:[...]} (si riaggancia dopo la riconnessione) |
list-apps/icons
|
{user?} / {user?,items:[{package,vc}]}
|
elenco app / icone base64 in batch |
list-backups |
{package?} |
{ok,backups:[{ref,package,label,versionName,versionCode,created_at,mode,items}]} |
backup-info |
{ref} |
{ok,...} tutti i dettagli di un backup (versione, origine di installazione, stato, data, modalità, dimensione, items, conteggi di permessi, dispositivo) |
backup-icon |
{ref} |
{ok,icon} PNG base64 dal manifest (funziona quando l'app è disinstallata) |
delete-backup |
{ref} |
{ok,deleted} (ref deve essere sotto la directory dei backup) |
prune |
{package,user?,keep} |
{ok,pruned:[...]} mantiene gli N più recenti di un package |
log-read |
{limit?} |
{ok,entries:[...]} log di audit, dal più recente |
special-categories |
{} |
{ok,categories:[{id,available}]} (messages/contacts/wifi/bluetooth) |
special-backup |
{categories,compression?,password?,portable?} |
{ok,opid} backup a livello di sistema (staccato) |
special-restore |
{ref,confirm:true,categories?,password?} |
{ok,opid} (richiede riavvio ; confirm lo abilita) |
special-list |
{} |
{ok,backups:[{ref,created_at,categories}]} |
sysmount-status |
{} |
{ok,nomount,nm,ksu,live_capable} |
sysmount-add / sysmount-del / sysmount-list
|
{package,priv?} |
monta un'app installata come app di sistema (sottomodulo systemless ; a caldo tramite NoMount altrimenti al boot successivo) |
companion-status / companion-install
|
{} |
stato del companion Google Drive / installazione su richiesta |
dests-list / dest-add / dest-test / dest-del
|
{id,type,...} |
gestione delle destinazioni |
remote-add / remote-list / remote-del
|
{name,backend,params:{...}} |
gestione dei remote rclone (crea la voce rclone.conf a cui punta una destinazione type:"rclone") |
schedule-set / schedule-list / schedule-delete
|
{id,package,mode,dest,cron,at,keep,items} |
lavori pianificati |
scheduler-tick |
{} |
esegue i lavori dovuti + applica la ritenzione + l'osservatore di backup automatico (il battito all'avvio chiama questo) |
{
"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, // ri-calcola l'hash di ogni archivio vs il manifesto (attivo per default per Full)
"dry_run": false, // true = riporta un piano di dimensioni, non scrive nulla
"ssaid": false // OPT-IN, vedi sotto
}restore/import prendono {ref} (una directory di backup / ref di scansione). restore accetta anche :
"items" (un sottoinsieme dei tipi di item del backup da ripristinare ; omettilo per tutti), "test": true
(estrarre in una directory temporanea e verificare, senza toccare l'app in uso), "mode" per
snapshot/mirror, "password" per un backup cifrato, "ssaid" (opt-in), e le opzioni di
origine di installazione "spoof_installer" (predefinito dalla config, imposta l'installer sul
Play Store al momento dell'installazione) e "deep_spoof": true (opt-in avanzato ; forgia anche il
pacchetto e l'origine iniziatori modificando il database dei pacchetti, si applica dopo un riavvio).
import prende "from": "neo" | "databackup" e, per un backup Neo cifrato, "password".
Una destinazione cloud è una destinazione type:"rclone" che nomina un remote rclone ; crea
prima quel remote con remote-add. I campi di password sono memorizzati offuscati, mai in
chiaro. Valori di backend supportati e i loro 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 = output di `rclone authorize "drive"`)
Google Drive ha due vie : questo remote drive (nessun progetto Google Cloud necessario, usa
l'OAuth proprio di rclone - esegui rclone authorize "drive" una volta su qualsiasi computer e passa il
token) o l'app compagna opzionale (il tuo id client OAuth). Entrambe finiscono come destinazioni
ordinarie.
Il campo di configurazione network_policy controlla quale connessione i trasferimenti cloud possono usare :
any (predefinito), wifi, o mobile. Impostalo con config-set. Quando è wifi o
mobile, ogni trasferimento cloud (caricamento Full rclone/Drive, sincronizzazione Mirror, backup/ripristino di
snapshot restic remoto, ripristino Mirror) verifica prima il trasporto attivo e
si interrompe con ERR_NET_POLICY se non corrisponde - sia per i lavori manuali che pianificati.
Le destinazioni locali non sono mai soggette a questo controllo.
-
ssaidè rigorosamente opt-in (disattivato per default). Esegue il backup / il ripristino dell'ANDROID_ID del dispositivo riscrivendo un file di sistema ; un ripristino si applica solo dopo un riavvio, e il file precedente viene sempre salvato prima per consentire il rollback. Invia"ssaid": truesolo su una richiesta diretta e deliberata dell'utente - mai per default. -
Le azioni mutanti (restore, delete, import) sono distruttive e vengono registrate in una
traccia di audit locale (
logs/audit.jsonl). Il ripristino è fedele (cancella-poi-estrai), quindi riporta l'app allo stato esatto del backup. Conferma l'intenzione prima di chiamarle. -
Non indebolire mai la preservazione (SELinux/uid/gid/modi/xattr) né la regola APK (gli APK
sono sempre compressi, mai cifrati a meno che
encrypt_apknon sia impostato). - Tratta l'output JSON come la fonte di verità ; controlla
ok/code, interrogaprogress, e fai emergere i codiciERR_*invece di tirare a indovinare.
Vedi ARCHITECTURE.md e FILE-STRUCTURE.md per i dettagli interni.
Questa documentazione è stata generata con Claude (Anthropic) ed è mantenuta da VD171. Correzioni e miglioramenti sono benvenuti - vedi CONTRIBUTING.md.