# UrBackup Plugin - Memoria di Sviluppo ## Informazioni Plugin - **Nome**: UrBackup - **Versione**: 0.5.0 - **Compatibilità**: GLPI 11.0.6+, PHP 8.3+ - **Namespace**: `GlpiPlugin\Urbackup` ## Struttura File ``` plugin_urbackup/ ├── setup.php # Hook init, menu, tab, versione, prerequisiti ├── hook.php # Install/uninstall, massive actions, class list ├── composer.json # PSR-4 autoloading ├── src/ │ ├── Config.php # Configurazione plugin (Computer sempre attivo, capacità) │ ├── Profile.php # Diritti utente │ ├── Server.php # CRUD server UrBackup │ ├── ServerAsset.php # Linking asset-server │ ├── AssetTab.php # Tab UrBackup su asset GLPI │ ├── MassiveAction.php # Azioni massive connect/disconnect │ ├── UrbackupApiClient.php # Client API UrBackup │ ├── LocationHelper.php # Helper assegnazione server per location │ ├── Capacity/ │ │ └── UrBackupCapacity.php # Capacity per Asset Definition GLPI 11 │ ├── Controller/ │ │ ├── ServerController.php │ │ ├── AssetController.php │ │ └── ConfigController.php │ └── Command/ │ └── TestApiCommand.php ├── install/ │ ├── install.php # Schema DB, migrazioni, capacity migration │ ├── uninstall.php # Drop tabelle, pulizia diritti │ └── mysql/ │ └── plugin_urbackup-empty.sql # Schema iniziale ├── front/ │ ├── config.form.php # Config plugin (Computer info) │ ├── server.php # Lista server │ ├── server.form.php # Form server con tab laterali │ └── asset.form.php # Azioni asset (connect/disconnect/backup) ├── ajax/ │ └── server_test.php # Test connessione API ├── templates/ │ └── config/ │ └── config.html.twig # Config page Twig ├── locales/ # Traduzioni (it, en, de) ├── css/ & js/ # Asset frontend └── MEMORY.md # Questo file ``` ## Classi Principali | Classe | Descrizione | |--------|-------------| | `Config` | Configurazione plugin, isItemtypeEnabled | | `Profile` | Diritti utente, permessi | | `Server` | CRUD server UrBackup | | `ServerAsset` | Linking asset-server | | `AssetTab` | Tab UrBackup su asset | | `MassiveAction` | Azioni massive connect/disconnect | | `UrbackupApiClient` | Client API UrBackup (PBKDF2 auth) | | `LocationHelper` | Assegnazione server per location | | `Capacity/UrBackupCapacity` | Capacity per Asset Definition (cleanup + tracking) | | `Controller/ServerController` | Route Symfony per server | | `Controller/AssetController` | Route Symfony per azioni asset | | `Command/TestApiCommand` | CLI test API | ## Interfacce GLPI - Menu: Amministrazione → Server UrBackup - Tab UrBackup su Computer (sempre) + tutti gli Asset Definition - Config: Computer sempre attivo; Asset Definition gestiti via native Capacities UI ## Architettura Capacities (v0.5.0) ### Flusso ``` Kernel boot: PostBootEvent ├── (110) InitializePlugins → plugin_init_urbackup() │ ├── Plugin::registerClass(AssetTab, ['Computer']) ← Computer legacy │ └── AssetDefinitionManager::registerCapacity() ← UrBackupCapacity registrata │ ├── (100) CustomObjectsBoot → bootDefinitions() │ └── foreach definition con UrBackupCapacity abilitata: │ └── UrBackupCapacity::onClassBootstrap($classname) │ └── CommonGLPI::registerStandardTab($classname, AssetTab::class) │ ↑ Tab registrato QUI, dopo che le definizioni sono caricate dal DB │ Config::isItemtypeEnabled($itemtype) ├── '' → false ├── 'Computer' → true ├── Asset subclass → true ← SEMPRE visibile └── altro → false │ UrBackupCapacity ├── onClassBootstrap() → registra AssetTab sul definition classname ├── onCapacityDisabled() → pulisce ServerAsset entries ├── isUsed() / getCapacityUsageDescription() → UI Capacities ``` ### Separazione responsabilità - **Registrazione tab**: `UrBackupCapacity::onClassBootstrap()` — chiamata da `bootDefinitions()` per ogni definizione con capacità abilitata - **Visibilità tab**: `Config::isItemtypeEnabled()` — sempre true per Asset subclasses - **Pulizia**: `UrBackupCapacity::onCapacityDisabled()` — quando admin disabilita la capacità - **Config**: Computer sempre attivo; Capacities gestite dalla UI nativa GLPI ### Bug risolto: tab non registrato su Asset Definition nuovi - **Causa**: `setup.php` iterava `getDefinitions()` durante `plugin_init_urbackup()`, ma `bootDefinitions()` (che carica le definizioni dal DB) gira DOPO (priority 100 vs 110), quindi `getDefinitions()` tornava sempre array vuoto - **Fix**: La registrazione del tab è stata spostata in `UrBackupCapacity::onClassBootstrap()`, chiamata da `bootstrapDefinition()` durante `bootDefinitions()`, quando le definizioni sono già caricate e la classe dinamica è disponibile - **Rimosso**: loop `foreach ($defs ...)` e debug logging da `setup.php` - **Rimosso**: debug logging da `AssetTab.php` ## Tabella glpi_plugin_urbackup_assettypes - Colonna `is_default` rimossa (non serve più con capacities) - Tabella vestigiale — non più usata per la logica applicativa - Migrazione: `plugin_urbackup_install_convert_assettypes_to_capacities()` abilita capacità su tutte le definizioni ## Comandi Utili ```bash # Installare il plugin php bin/console glpi:plugin:install urbackup # Attivare php bin/console glpi:plugin:activate urbackup # Disinstallare echo "yes" | php bin/console glpi:plugin:uninstall urbackup # Verificare syntax PHP php -l plugins/urbackup/src/*.php plugins/urbackup/front/*.php plugins/urbackup/*.php ``` ## Checklist Pre-Consegna - [x] `declare(strict_types=1);` in ogni file PHP - [x] Namespace `GlpiPlugin\Urbackup\` e PSR-4 corretto - [x] Check versione GLPI 11.0.6+ in `setup.php` - [x] CSRF e permessi su ogni POST/AJAX - [x] Query parametrizzate o `$DB->request()` - [x] Output escaped e loggato - [x] Nessun uso di API deprecate GLPI 11 - [x] Compatibilità PHP 8.3 verificata ## Da Completare 1. Test funzionalità lista server e form 2. AJAX endpoint comunicazione API ### Verifiche Post-Migrazione Capacity - [x] Tab UrBackup appare su Asset Definition nuovo (Computer + Asset) - [ ] Upgrade da v0.4.x converte righe attive - [ ] Colonna `is_default` droppata - [ ] Disabilitazione capacità pulisce ServerAsset (onCapacityDisabled) ## API UrBackup - Riferimenti ### Endpoint API | Metodo | Descrizione | |--------|-------------| | `login` | Autenticazione 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 | ### Problemi Noti - JSON Parse Error: API restituisce HTML invece di JSON con credenziali errate - Timeout: Verificare raggiungibilità server UrBackup - SSL: Se `ignore_ssl` attivo, accettare certificati self-signed - AJAX 403: Funziona solo da browser con sessione GLPI attiva ## Cronologia Modifiche ### v0.4.2 — Refactoring server.form.php e tab laterali - Side tabs a sinistra con nav-pills - 4 tab: Server, Linked, Unlinked, Missing clients - Missing clients con search/sort, location/AIP/group/state - Navigazione server sopra i tab, indipendente - Breadcrumb admin - Fix namespace `getCachedName()`, Gruppo da `glpi_groups_items` - Permessi: READ per accesso form, Connect/API nascosti per READ - i18n: 17 stringhe nuove (it, en, de) - Bug fix: ServerAsset colonne, asset.form.php disconnectAsset(), strict_types in 11 file ### v0.4.6 — Funzionalità API completate - Salvataggio Internet Mode su server UrBackup - Salvataggio Default Dirs - Backup file (incremental/full) - Backup immagine (incremental/full) - Recupero version client da API ### v0.4.5 — Tabella semplificata serverassets - Rimossi campi: client_name, client_ip, client_version, is_active, last_file_backup, last_image_backup, last_sync, date_creation, date_mod, urbackup_client_id - Solo: id, plugin_urbackup_servers_id, itemtype, items_id ### v0.4.4 — Tab Linked/Unlinked Clients - Dati da API UrBackup invece che da DB - Nome tabella corretto: `glpi_plugin_urbackup_serverassets` - Campo: `plugin_urbackup_servers_id` ### v0.4.3 — Test API Connection automatico - Rimosso pulsante manuale - Rimosse righe last status/message/check - Stati: verde OK, rosso fallito, giallo irraggiungibile ### v0.5.0 — Capacity System per Asset Definition GLPI 11 - Rimpiazzata tabella custom `glpi_plugin_urbackup_assettypes` con Capacities native - Computer: legacy (sempre attivo, fuori capacities) - Asset Definition: tab sempre registrato, capacità gestisce cleanup - `isItemtypeEnabled()` = true per tutti gli Asset - `onClassBootstrap()` rimosso (poi reintrodotto in v0.5.1) - File: `src/Capacity/UrBackupCapacity.php` - Migration: auto-enable capacità su tutte le definizioni + drop is_default ### v0.5.1 — Fix registrazione tab su Asset Definition nuovi - **Bug**: Tab UrBackup non appariva su Asset Definition nuovi (es. `testnas`) - **Causa**: `getDefinitions()` tornava 0 in `plugin_init_urbackup()` perché `bootDefinitions()` gira dopo (priority 100 vs 110) - **Fix**: Spostata registrazione tab in `UrBackupCapacity::onClassBootstrap()` — chiamata durante `bootDefinitions()` per ogni definizione con capacità abilitata - Rimossi debug logging superflui da `setup.php` e `AssetTab.php`