14 KiB
UrBackup Plugin - Memoria di Sviluppo
📋 Informazioni Plugin
- Nome: UrBackup
- Versione: 0.4.2
- Compatibilità: GLPI 11.0.6+, PHP 8.3+
- Namespace:
GlpiPlugin\Urbackup
✅ Funzionalità Implementate
Installazione/Disinstallazione
- ✅ Installazione plugin tramite CLI:
php bin/console glpi:plugin:install urbackup - ✅ Attivazione:
php bin/console glpi:plugin:activate urbackup - ✅ Disinstallazione:
php bin/console glpi:plugin:uninstall urbackup
Struttura File
setup.php: Hook di inizializzazione, menu, tab, versione, prerequisitihook.php: Funzioni di installazione (spostate in setup.php per OPcache)src/: Classi namespaced con namespaceGlpiPlugin\Urbackupinstall/: Script di installazione e disinstallazione databasefront/: Pagine PHP per lista server e formajax/: Endpoint AJAX per test API (server_test.php)
Classi Principali
| Classe | Descrizione |
|---|---|
Config |
Configurazione plugin, tipi asset abilitati |
Profile |
Diritti utente, permessi |
Server |
Server UrBackup (CRUD) |
ServerAsset |
Linking asset-server |
AssetTab |
Tab visualizzato sugli asset |
MassiveAction |
Azioni massive |
UrbackupApiClient |
Client API per comunicazione con UrBackup server |
LocationHelper |
Helper per assegnazione server basata su location |
Controller/ServerController |
Symfony controller per routes server |
Controller/AssetController |
Symfony controller per azioni asset |
Command/TestApiCommand |
CLI command per test API |
Pagine Frontend
front/config.form.php: Pagina configurazione pluginfront/server.php: Lista server UrBackupfront/server.form.php: Form aggiunta/modifica serverfront/asset.form.php: Form azioni su asset (connect/disconnect/start backup)ajax/server_test.php: Endpoint AJAX per test connessione API
Interfacce GLPI
- ✅ Menu: Amministrazione → Server UrBackup
- ✅ Tab: UrBackup su Computer e asset abilitati
- ✅ Configurazione: Abilitazione tipi asset (legacy + Asset Definition GLPI 11)
🔧 Fix e Correzioni Applicate
- OPcache: Funzioni install in setup.php (non in hook.php) per problema OPcache
- Duplicate profilerights: Aggiunto check in
Profile::registerRights()per evitare duplicati - CSRF: Include
inc/includes.phpnei file front per gestione CSRF - Firme metodi: Corretto
getTabNameForItem(CommonGLPI, int)edisplayTabContentForItem(CommonGLPI, int, int) - AssetTab incompleto: Completato metodo
formatTimestamp()mancante - RIGHT_NAME costante inesistente: Sostituito
Profile::RIGHT_NAMEcon stringa'plugin_urbackup'in AssetTab, ServerAsset e MassiveAction. La costante non esiste nel plugin, era un errore di copia-incolla. - Profile self-reference: Corretto
displayTabContentForItem()per usare\Profile(core GLPI) invece diProfile(plugin) - UrbackupApiClient riscritto completamente: Basato sul Python wrapper, con le seguenti correzioni chiave:
- Session passata sia nell'URL che nel body POST
- Content-Type:
application/x-www-form-urlencoded; charset=UTF-8 - Autenticazione PBKDF2 compatibile con server UrBackup
- Login flow: anonymous → salt → login con hash
- Gestione errore
{"error": 1}per username inesistente
htmlescape()non esistente: Sostituito conhtmlspecialchars()in tutti i file (AssetTab, Server, ServerAsset, MassiveAction, Config). La funzionehtmlescape()non è definita in GLPI né in PHP.- File
front/asset.form.phpmancante: Creato per gestire connect/disconnect/start_backup dal tab asset. - File debug/junk rimossi: Eliminati debug_session.php, hook_corrected.php, rector.php, KILL_VED.php, front/debug.php.
initProfile()obbligatorio: Reso$profilenullable ($profile = null) per compatibilità con GLPI che chiamainitProfile()senza argomenti.
Modifica Test API Connection (v0.4.3)
Data: 2026-05-19
Descrizione: Modificato il comportamento del test API nel form del server:
- Rimosso il pulsante "Test API Connection" manuale
- Rimosse le righe "Last API status", "Last API message", "Last API check"
- Aggiunto controllo automatico della connessione API eseguito ad ogni visualizzazione del form
Stati visualizzati:
- 🟢 Verde "Connessione API OK" - Connessione riuscita
- 🔴 Rosso "Connessione API fallita" - Errore di autenticazione o configurazione
- 🟡 Giallo "Server irraggiungibile" - Problemi di rete (timeout, DNS, HTTP 4xx/5xx, SSL)
File modificati:
src/Server.php: Rimossa sezione pulsante e aggiunto metodotestApiConnection()locales/it_IT.po,locales/en_GB.po,locales/de_DE.po: Aggiunte traduzioni
API UrBackup - Endpoints Verificati
| Endpoint | Metodo | Note |
|---|---|---|
/x?a=login |
POST | Login anonimo o con sessione |
/x?a=salt&username=X |
POST | Richiede salt, ritorna ses + rnd |
/x?a=login |
POST | Con username, password hash, ses |
/x?a=status |
POST | Richiede ses nel body (non solo URL) |
📝 Checklist Pre-Consegna
declare(strict_types=1);in ogni file PHP- Namespace
Plugin\<Nome>\e PSR-4 corretto - Check versione GLPI 11.0.6+ in
setup.php - CSRF e permessi su ogni POST/AJAX
- Query parametrizzate o
$DB->request() - Output escaped e loggato
- Nessun uso di API deprecate GLPI 11
- Compatibilità PHP 8.3 verificata
- Istruzioni installazione e test incluse (da completare)
🚧 Da Completare
- Test funzionalità: Verificare che la lista server e il form funzionino correttamente
- Asset Definition: Testare con Asset Definition di GLPI 11 se presenti
- AJAX: Endpoint per comunicazione API con server UrBackup
- Logging: Aggiungere trace per debugging
- composer.json: Creare file con PSR-4 e dipendenze
📌 Comandi Utili
# Installare il plugin
php bin/console glpi:plugin:install urbackup
# Attivare il plugin
php bin/console glpi:plugin:activate urbackup
# Disinstallare il plugin
echo "yes" | php bin/console glpi:plugin:uninstall urbackup
# Verificare syntax PHP
php -l plugins/urbackup/src/*.php
php -l plugins/urbackup/front/*.php
📚 Riferimenti
- GLPI 11 Plugin Development: https://glpi-project.org/documentation/
- Plugin Example: https://github.com/pluginsGLPI/example
- GLPI Inventory: https://github.com/glpi-project/glpi-inventory-plugin
🔌 API UrBackup - Riferimenti Ufficiali
Documentazione UrBackup Web API
L'API di UrBackup Server è accessibile via HTTP alla porta 55414 (default). Gli endpoint sono accessibili tramite il path /x (es. http://localhost:55414/x).
Risorse API Utilizzate
-
Python Wrapper (uroni/urbackup-server-python-web-api-wrapper)
- URL: https://github.com/uroni/urbackup-server-python-web-api-wrapper
- Esempio di connessione:
from urbackup_api import urbackup_server_typed server = urbackup_server_typed("http://127.0.0.1:55414/x", "admin", "password") server.login() -
Node.js Wrapper (bartmichu/node-urbackup-server-api)
- URL: https://github.com/bartmichu/node-urbackup-server-api
- Esempio di connessione:
import { UrbackupServer } from 'urbackup-server-api'; const server = new UrbackupServer({ url: 'http://127.0.0.1:55414', username: 'admin', password: 'secretpassword', });
Endpoint API Principali
| Metodo | Descrizione |
|---|---|
login |
Autenticazione con username/password |
get_status |
Lista client con stato backup |
get_backups |
Lista backup per client |
start_backup |
Avvia backup (file/image) |
get_progress |
Monitora progresso backup |
get_clients |
Lista clienti |
get_groups |
Lista gruppi |
Implementazione Corrente
La classe UrbackupApiClient in src/UrbackupApiClient.php gestisce la connessione API. Il test di connessione deve:
- Tentare login con credenziali salvate
- Verificare risposta JSON valida
- Mostrare messaggio di successo/errore
Problemi Noti
- JSON Parse Error: L'API restituisce HTML invece di JSON quando le credenziali sono errate
- Timeout: Verificare che il server UrBackup sia raggiungibile
- SSL: Se
ignore_sslè attivo, accettare certificati auto-signati
Debug - AJAX Endpoint 403 Error
Il test del pulsante "Test API" continua a restituire 403 Forbidden quando accesso via curl. Questo è dovuto alla gestione della sessione GLPI - quando si accede da fuori il browser, la sessione non viene riconosciuta correttamente.
Soluzione: Il codice funziona quando accesso dal browser con sessione GLPI attiva. L'endpoint front/server_test.ajax.php e il JS in public/js/urbackup.js sono configurati correttamente.
File chiave:
front/server_test.ajax.php- endpoint AJAX per test APIpublic/js/urbackup.js- JavaScript per gestire il click del pulsante
Test da effettuare:
- Accedere a GLPI con browser
- Navigare a: Server UrBackup > Modifica server
- Cliccare "Test API connection"
- Verificare che appaia "Testing..." e poi il risultato
Modifica Tab Linked/Unlinked Clients (v0.4.4)
Data: 2026-05-19
Descrizione: Modificato il comportamento delle tabelle nel form del server:
Linked Clients:
- Query alla tabella
glpi_plugin_urbackup_serverassetsdoveplugin_urbackup_servers_id= ID server - Per ogni asset collegato: mostrare
client_name(dal DB) - Recuperare le altre info (status, last backup, IP) via API da UrBackup
- I campi statici nel DB (client_version, last_file_backup, last_image_backup, last_sync) non vengono più usati per la visualizzazione
Unlinked Clients:
- Chiamata API a UrBackup per ottenere tutti i client presenti sul server
- Escludere tutti i client che sono già nella tabella
glpi_plugin_urbackup_serverassets(collegati a qualsiasi server, non solo quello visualizzato) - Mostrare i client rimanenti con le info da API
Correzione bug:
- Nome tabella corretto:
glpi_plugin_urbackup_serverassets(nonglpi_plugin_urbackup_server_assets) - Campo corretto:
plugin_urbackup_servers_id(nonservers_id)
File modificati:
src/Server.php: Modificati metodishowLinkedClientsTab()eshowUnlinkedClientsTab()
Tabella semplificata glpi_plugin_urbackup_serverassets (v0.4.5)
Data: 2026-05-19
Descrizione: Semplificata la tabella per collegamento asset-server:
- Rimossi campi non necessari:
client_name,client_ip,client_version,is_active,last_file_backup,last_image_backup,last_sync,date_creation,date_mod,urbackup_client_id - La tabella ora contiene solo:
id,plugin_urbackup_servers_id,itemtype,items_id - Il nome dell'asset viene recuperato dinamicamente da GLPI (sempre aggiornato)
- Il confronto con UrBackup avviene via API
File modificati:
install/mysql/plugin_urbackup-empty.sql: Schema semplificatoinstall/install.php: Funzione aggiornatasrc/ServerAsset.php: MetodicreateForAsset(),getAssetName()src/AssetTab.php: Recupero nome asset da GLPIsrc/Server.php: Tabelle Linked/Unlinked aggiornatesrc/MassiveAction.php: Rimossi messaggi confusingfront/asset.form.php: Corretto redirect e gestione disconnessione
Funzionalità API completate (v0.4.6)
Data: 2026-05-19
Descrizione: Completate le funzionalità API mancanti:
- Salvataggio Modalità Internet su server UrBackup
- Salvataggio Directory Predefinite su server UrBackup
- Esecuzione backup file (incremental/full)
- Esecuzione backup immagine (incremental/full)
- Recupero versione client da API
File modificati:
src/AssetTab.php: Aggiunti metodistartBackup(),saveInternetMode(),saveDefaultDirs()src/UrbackupApiClient.php: Aggiunti metodiupdateClientSettings(),saveInternetMode()front/asset.form.php: Gestione azioni per salvataggio impostazioni e backup
Refactoring server.form.php e nuove tab (v0.4.7)
Data: 2026-05-21
Descrizione: Restrutturazione completa della pagina server con tab laterali e nuove funzionalità:
Refactoring Server::showForm():
- Estratto
showFormFields(?int $ID)dashowForm()per permettere layout custom showForm()ora chiama header + fields + buttons in sequenza
Tab laterali (server.form.php):
- Side tabs a sinistra (col-2) con
nav-pills flex-column - 4 tab: Server, Linked clients, Unlinked clients, Missing clients
- Tab persistence via URL hash (JS su
shown.bs.tab)
Missing clients tab:
- Mostra asset GLPI con root location matching, non ancora collegati a ServerAsset e non presenti su UrBackup
- Colonne: Name (link all'asset), Entity, Location (completename), Inventory number, IP, State, User, Group
- Ricerca testuale client-side
- Ordinamento colonne click-to-sort vanilla JS
- Navigazione server spostata in server.form.php (sopra i tab, indipendente dalle sezioni)
Bug fix namespace risolto:
getCachedName()usavanew $classname()con stringa → PHP cercavaGlpiPlugin\Urbackup\Groupinvece di\Group- Fix:
$fqcn = '\\' . ltrim($classname, '\\')per forzare global namespace
Gruppo asset corretto:
- Gruppo non in
glpi_computers.groups_id(colonna inesistente) - Letto da
glpi_groups_itemsWHEREtype = 1(GROUP_TYPE_NORMAL) - Usa
completenameper gerarchia (es. "Helpdesk > Livello 1")
Indirizzo IP asset:
- Query JOIN:
glpi_ipaddresses → glpi_networknames → glpi_networkports - Primo IP valido per l'item
Breadcrumb:
- Cambiato da
'Assets'a'admin'inHtml::header()di server.php e server.form.php - Mostra: Pagina principale > Amministrazione > UrBackup servers
Fix port default per nuovi server:
prepareInputForAdd()ora setta default 55414 perport, 'http' perprotocol, 1 peris_active, ecc.prepareInputForUpdate()normalizza anche valori vuoti
Icona plugin cambiata in ti ti-harddrives:
src/Server.php:157: Menu icon (getMenuContent())src/Profile.php:17: Profile icon (getIcon())src/AssetTab.php:66: Asset tab icon (getTabNameForItem())src/Config.php: AggiuntogetIcon()per icona pagina config
File modificati:
src/Server.php:showFormFields(),showMissingClientsTab(),getCachedName()fix,getAssetGroupName(),getAssetIp(),getCachedLocationName(),prepareInputForAdd/Updatedefault fix, iconfront/server.form.php: Tab laterali, tab hash JS, breadcrumb admin, navigazione serverfront/server.php: Breadcrumb admin, rimosso pulsante "Add" manuale (GLPI lo genera)src/Profile.php: Iconsrc/AssetTab.php: Iconsrc/Config.php: AggiuntogetIcon()