From 15713e70a4b49b52ebf05f6ae11f56543f7356b7 Mon Sep 17 00:00:00 2001 From: test Date: Wed, 2 Sep 2026 13:14:19 +0200 Subject: [PATCH] fix server --- MEMORY.md | 17 ++++++++++++++-- README.md | 1 + install/uninstall.php | 46 ++++++++++++++++++++++++++++++++++++++++++ locales/de_DE.mo | Bin 14508 -> 14625 bytes locales/de_DE.po | 3 +++ locales/en_GB.mo | Bin 13545 -> 13659 bytes locales/en_GB.po | 3 +++ locales/it_IT.mo | Bin 14229 -> 14351 bytes locales/it_IT.po | 9 ++++++--- src/Server.php | 2 ++ 10 files changed, 76 insertions(+), 5 deletions(-) diff --git a/MEMORY.md b/MEMORY.md index 37bea8f..fc9478d 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -1,9 +1,21 @@ # MEMORY.md - Stato del Plugin UrBackup -## Ultima modifica: 31/08/2026 +## Ultima modifica: 02/09/2026 + +## 02/09/2026 — Pulizia capacity all'uninstall (nessun bump versione) +- **`install/uninstall.php`**: nuova `plugin_urbackup_uninstall_cleanup_capacities(Migration, DBmysql)` — rimuove il riferimento `GlpiPlugin\Urbackup\Capacity\UrBackupCapacity` dalla colonna JSON `capacities` di `glpi_assetdefinitions` (query builder `$DB->request()/update()`, idempotente, filtrata sulle righe con `capacities <> '[]'`). Invocata in `plugin_urbackup_uninstall_process()` con `global $DB`. +- Motivo: altrimenti resta una reference orfana dopo la disinstallazione. Il core GLPI la ignora in sicurezza (`AssetDefinition::decodeCapacities()`/`AssetDefinition.php:698-701`, "May be a previously enabled capacity from a disabled plugin"), ma ora il DB resta pulito. +- i18n: nuova stringa "UrBackup capacity removed from asset definitions" (it "Capacità UrBackup rimossa dalle definizioni di asset", de "UrBackup-Kapazität aus Asset-Definitionen entfernt", en identica), `.po`+`.mo` ricompilati (msgfmt OK 3/3). +- Doc aggiornate: README Changelog 0.7.3, MEMORY. Verifiche IA: `php -l` OK, msgfmt OK, git diff OK. **NESSUN bump versione** (regola 6: non tocca schemi DB del plugin). La pulizia si attiva in UI solo alla disinstallazione (azione utente, regola 7). + +## TODO / BLOCKED (da sbloccare su PROD/SEMI-PROD — richiede output utente) +1. **Crash globale dopo logoff su prod** (disins "uninstall" TOGLIE GLPI; riattivando il plugin torna tutto funzionante). NON riproducibile localmente, codice locale sano. Serve da prod/semi-prod: + - `find plugins/urbackup/src plugins/urbackup/front plugins/urbackup/install -name "*.php" -exec php -l {} \; | grep -v "No syntax errors"` + - `tail -100 files/_log/php-errors.log` + `tail -100 files/_log/php.log` (+ log Apache/PHP-FPM) +2. **Log client mancanti su semi-prod/prod** (locali OK su localhost:55414). Fattore più probabile: verificare che l'utente API UrBackup usato dal plugin abbia il diritto **`logs`** (scope `all` o per client) — fonte backend `livelog.cpp:117-122` (i log per-client sono restituiti SOLO se l'utente API ha il diritto logs con scope all/attinente). Il parametro `clientid` è CORRETTO (confermato empiricamente + wrapper `_legacy.py:296-299` + `livelog.cpp:88-93`). ## 31/08/2026 — Rinominate le tab della scheda Server + grafica Missing (solo UI/testi) -- **Rinominazione tab** (`front/server.form.php:118,123,128`): "Linked clients"→**"Managed clients" / Clienti gestiti** (asset GLPI con agent installato e collegamento attivo); "Unlinked clients"→**"Linkable clients" / Clienti Collegabili** (asset con agent installato ma non collegato a un asset GLPI); "Missing clients"→**"Clients to manage" / Clienti da gestire** (asset GLPI nella sede del server SENZA agent installato — "Connect" crea il link ma va poi installato il client). Aggiornate le traduzioni it/de/en (`.po`+`.mo` ricompilati con msgfmt) e rimosse le vecchie stringhe "Linked/Unlinked/Missing clients" dal catalogo. +- **Rinominazione tab** (`front/server.form.php:118,123,128`): "Linked clients"→**"Managed clients" / Elementi gestiti (it)** (asset GLPI con agent installato e collegamento attivo); "Unlinked clients"→**"Linkable clients" / Elementi collegabili (it)** (asset con agent installato ma non collegato a un asset GLPI); "Missing clients"→**"Clients to manage" / Elementi da gestire (it)** (asset GLPI nella sede del server SENZA agent installato — "Connect" crea il link ma va poi installato il client). Aggiornate le traduzioni it/de/en (`.po`+`.mo` ricompilati con msgfmt) e rimosse le vecchie stringhe "Linked/Unlinked/Missing clients" dal catalogo. - **Grafica tab Missing** (`src/Server.php` `showMissingClientsTab`): rimossi il campo di ricerca `#missing-search`, gli header `class="sortable"`+`` (stile non definito in CSS), l'id `missing-table` e tutto il blocco JS ordinamento/filtro → la tabella ora usa lo stesso `` delle tab Linked/Unlinked. - **Redirect "Connect"** (`front/server.form.php:31`): dopo il link_asset la pagina riapre sulla scheda "Clienti non collegati" (Unlinked/Clients to manage) aggiungendo `#tab-unlinked` al redirect (il JS già presente riattiva la tab dall'hash). - Nessun bump versione (nessuna modifica DB, regola 6). Verifiche IA: `php -l` OK, msgfmt OK, git diff autorevisione OK. **Verifica UI utente OBBLIGATORIA**: controllare etichette traduczione, grafica Missing uniforme, redirect su scheda corretta. @@ -292,6 +304,7 @@ La colonna `users_id` non esisteva nella tabella `glpi_plugin_urbackup_servers`. 2. **Form server**: riga "Hardware host" con dropdown tipo (`Dropdown::showItemTypes`) + dropdown elementi AJAX (`$.get` su `front/dropdown_host.ajax.php`, vedi sezione Fix del 07/08/2026). 3. **AssetTab**: blocco "This asset hosts the UrBackup server" (sempre visibile, anche se client). 4. **Validazione** in `prepareInputForUpdate()` + helper `getHostAsset()` / `getServersHostingAsset()` (guard `fieldExists`). +5. **Pulizia capacity all'uninstall**: `plugin_urbackup_uninstall_cleanup_capacities()` in `install/uninstall.php` rimuove il riferimento `GlpiPlugin\Urbackup\Capacity\UrBackupCapacity` dalla colonna JSON `capacities` di `glpi_assetdefinitions` (il core GLPI ignora in sicurezza tali capacity orfane via `decodeCapacities()`/`AssetDefinition.php:698-701`, ma ora vengono pulite). Nuova stringa i18n "UrBackup capacity removed from asset definitions" (it/de/en, `.mo` ricompilati). NESSUN bump di versione (non tocca schemi DB del plugin). ## 0.7.2 — Toggle Computer configurabile + lista Asset custom con capacità attiva 1. **`enable_computer` in `glpi_plugin_urbackup_configs`** (default '1') letto da `Config::getEnableComputer()`; registrazione tab su Computer condizionale in setup.php; `isItemtypeEnabled`/`getEnabledItemtypes` rispettano il toggle. diff --git a/README.md b/README.md index 258dd3d..e645837 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,7 @@ plugin_urbackup/ - Made the missing/unlinked clients queries server-scoped (`plugin_urbackup_servers_id`) and the API data session cache key unique per asset (itemtype+id) - `server_test.ajax.php`: entity-aware `check()` authorization; added `public/js/urbackup.js` (registered via `ADD_JAVASCRIPT`) that sends the `X-Glpi-Csrf-Token` header on plugin AJAX POSTs; `dropdown_host.ajax.php` now requires READ right - Renamed the server form client tabs to be clearer: "Linked clients" → "Managed clients", "Unlinked clients" → "Linkable clients", "Missing clients" → "Clients to manage"; removed the sort/search on the missing clients table to match the other tab layouts; updated it_IT/de_DE/en_GB translations and recompiled locales +- **Uninstall cleanup**: the UrBackup capacity reference (`GlpiPlugin\Urbackup\Capacity\UrBackupCapacity`) is now removed from the `capacities` JSON column of `glpi_assetdefinitions` so the database keeps no stale reference to the disinstalled plugin (GLPI core safely ignores such orphaned capacities, but they are now cleaned up) ### 0.7.2 - UrBackup on Computer is now configurable: new `enable_computer` setting on the plugin configuration page (previously always enabled, hardcoded) diff --git a/install/uninstall.php b/install/uninstall.php index dcd455d..9b47cee 100644 --- a/install/uninstall.php +++ b/install/uninstall.php @@ -16,6 +16,49 @@ if (!defined('GLPI_ROOT')) { require_once __DIR__ . '/install.php'; +/** + * Remove the UrBackup capacity reference from Asset Definitions. + * + * When the plugin is uninstalled, the `UrBackupCapacity` class no longer exists, + * but its reference may remain stored in the `capacities` JSON column of + * `glpi_assetdefinitions`. GLPI core safely ignores such orphaned capacities, + * but we clean them up so the database does not keep stale references. + * + * @param Migration $migration Migration instance + * + * @return void + */ +function plugin_urbackup_uninstall_cleanup_capacities(Migration $migration, \DBmysql $db): void +{ + $capacity_class = \GlpiPlugin\Urbackup\Capacity\UrBackupCapacity::class; + $table = 'glpi_assetdefinitions'; + + if (!$db->tableExists($table)) { + return; + } + + foreach ($db->request(['FROM' => $table, 'WHERE' => ['capacities' => ['<>' => '[]']]]) as $row) { + $decoded = json_decode((string) $row['capacities'], true); + if (!is_array($decoded)) { + continue; + } + + $filtered = array_values(array_filter($decoded, static function ($spec) use ($capacity_class): bool { + return is_array($spec) && (string) ($spec['name'] ?? '') !== $capacity_class; + })); + + if (count($filtered) === count($decoded)) { + continue; + } + + $db->update($table, [ + 'capacities' => json_encode($filtered), + ], ['id' => (int) $row['id']]); + } + + $migration->displayMessage(__('UrBackup capacity removed from asset definitions', 'urbackup')); +} + /** * Uninstall plugin. * @@ -29,6 +72,9 @@ function plugin_urbackup_uninstall_process(): bool Profile::uninstallRights(); + global $DB; + plugin_urbackup_uninstall_cleanup_capacities($migration, $DB); + plugin_urbackup_migration_drop_table($migration, 'glpi_plugin_urbackup_profiles'); plugin_urbackup_migration_drop_table($migration, 'glpi_plugin_urbackup_serverassets'); plugin_urbackup_migration_drop_table($migration, 'glpi_plugin_urbackup_servers'); diff --git a/locales/de_DE.mo b/locales/de_DE.mo index e91829f67b186a19f3a081d6ba0e035b3793ee77..ae9cd99f5d727671fc17a378db7b34f22bf993f7 100644 GIT binary patch delta 3357 zcmYk-eN5F=9LMo<5d`!CiUL=(_rpqWptnGc|$(L{m7;+k;NiPn{HYPy_y z=gNoCum>fiR7BKK>eOsuX3l(=%!j7V(&1)hE8Xh-;hsObyTAK7zwt-4TpWnwu^h{gueoIFe?GvK>QZz!?d9~x^A!EL8Ug7 z{42mH9EM5AB{S3d2F7!~5=Y_=R6jqVH;KY!3Vrck)WCfSUwdIJDrK+XTwI8(j%h;; z*p3RY1GQAYV;KI83M@E=<-kaOl+mH6{<3WSxES&uOT`>2bb|*KsTbAJc2s8SQ3JN3 z0yv8b^g3#Z0_a3*-xD=Je^k3vq>0Hv-9Hogng#r*U3Dz^A41^+Dl~%@)Qw-G0yt}J zN6qv%)Y?5j4H(OUYV8N30!>G?8;6?lBzvBZ0i4f9^8qe zhx};wJ86`G>8K7$F&USl0{z&YH=+Xh8K1_xsDXQvRs|Z1T6-6&A8#@RrDznU<5bix zuePp3WyXh^*;Z7_Yf*tVqB?BB{`d{5-3@#Fw!QuUHQ*zAJ($@p(ev-5pc`sX5wAsc z*o=y}6$|ks7T^FLYPDN|iCB;Q@GQEp1C^NwcC`Ap-TDlq}DP|7_>-j%TK?DAX zn)yX!EOQ+-qbH~V`tmafb1)B!Q8PM>%G~$J#y5{q0YL_S49YaNS4z>38P&Wh-g$7DMwM#>Fn1d;pkIGavYR2zl7u0@PB>Lj~{-X5kvtk{m^?@g;jbke#J9 z4M$BV1(lHkRK^x!F0QoKk6{q!9bVhu4-BEA8`CC>rWXcd7An$Q9EMX+fxU~ogUnWB zSnHS;*sp26Wg(~r85oL_ zP#sQ3Wn=+5u^hW%m94Kv1+p5)<92l6O;n%(te@^nL@n`fOk;eLPhldiLOu6qkgvJJ zj{=Ei0Y~5vRLWn)vFO17Jc!yWhfx6?#~%0{YExdpG582O_tbFz#B$NA6i=q06cu7P z&PQ#=3hQ$0d}E<9QfF;I4cLszP%G-b^SBc@?0|1L&j zt+m-}8=SGWV+;-M<7f=zg{>6kpk^=uwdOD5M4XP=Y};@Q-arRxAL+A)L;WcI8#y*` zv~cJV){;7Q`L1+NaeUzma;7+T`-VG{9Syz$XMDmDF8=?sn3IDX3g(b+lXGC|=k{`u z)ngT3adbWdwr-#ArgORDOJ8Bw495ZAzOZ4A&wMw-dC-^ zyra?A7#`zj@|_BwmC#J>7LG}}%x5*n;m#8OVNIhW*7q1x^j6XQGS4zsMM?RhB_+kK z(uzgpuA<7y5|696q_oUk<|$j`ZaUPjI691`Rb`$NpL$$HZ&z+ki3%xkdrC_x+@7YM IncD;Y0~m^I?f?J) delta 3291 zcmXxm4NR3)9LMo<5d`(#3nBuEi3S+4C{lV#u=lPuH?VSJl|IhPi-HQ4O zr!79R#_&7AHjwSdC}TRYz7IQoJ7bN>z+E^MKgM3zJIV>HKM>}iZ+nrQUn#3!f$E}Mw{opPxkjlW9!jNDnMTMYpq?*5{>*H4y00Rc{AbeG$O+Bh0P4X8Q~)QfXHhe~f~wtB z)POM*RJBh=1sXuzmyeq9ID1@-5gb2)>VG;G;(Uk302+HyDQ`lp=F7;RxyDYb{|**l zfSc99EDYjeRG`)Ncn>O&Q<#O9Q3FSjRs|Y^s(l=)A18^1QZx)lVhFX$E3E5Lnc0Gx z*;Z7_t5AXNL3MZl2V*1ZzOU`|7JL0FYQUfD_1m~w@BbZpVkOg8#A{I8Z_%i0;s0?G)-~!b1 zt*HKfMrE=+gZ%43A1g*PNJf=nFe-ovI2KD#CE0|k@hkTFr>L5qL(S+{R7R3nY06k8 zPQ;0*>kdX?gS{Tsi5O0tL9%4N!DwtpMS2f&(MMVo*h9#-$IM2`X(~_yxTyOtq5`~z zBQbV3S-=qTXI8S)m+y64ht44y>Nt%Rp_)xZEvC7sNXt>FTZFxF6)F=BYAw8KeG}Es zVN^e7QJJ`bRKs+j`WZxYDs^_Zj+sP5k(VNqHH%RH+Et^zWN+B($L#r2sF}B-I_gB$ zt%)PQN_jqx#;K?YY_jKHMD@2D)qg|Rb?V~DW?@ep zZ_kHNffQpgmSF(*q5^G3J$D^d;y;i-lR#Z3GrlRJq4&NLRqK816ln{pb~jKdPobcN zn2!i$Uu6SOTb&_nnPdQj^}zqi@ckJ7%Kt%~g!n_gX&az7hyeAjOpd-tC{ z13d@b{@xLu18$)==sDy*?M+ENVQ=}L3K~b*6xwmO&O0=FpS`rey2>gV*%V~04*0$6 z-tunnG`P!rPk6#^voF_U+*>|3^)T1;X3S(`UR@=90rh*!t@EdN>fI0hNuKxI7Jq5# k5zf}IP0?k3FR{Jf)#Cr|;i<8eap9=I?8NYnG20{l13q0*l>h($ diff --git a/locales/de_DE.po b/locales/de_DE.po index be13f82..b6bb695 100644 --- a/locales/de_DE.po +++ b/locales/de_DE.po @@ -532,6 +532,9 @@ msgstr "" "Die UrBackup-API gab eine Nicht-JSON-Antwort (HTML) zurück. Server-URL und " "Authentifizierung prüfen." +msgid "UrBackup capacity removed from asset definitions" +msgstr "UrBackup-Kapazität aus Asset-Definitionen entfernt" + msgid "UrBackup Servers" msgstr "UrBackup-Server" diff --git a/locales/en_GB.mo b/locales/en_GB.mo index 40d6a26db36e85b10e186ebf0e64e6a21327372b..f0fa4795f4266ac6de381abc43d14a1e4b54f6bf 100644 GIT binary patch delta 3374 zcmb8xeN5F=9LMo!n_K2SE@%v!xa-t$NQcE`D|bAG>b&-tG3Iltey zTXt=+`$kCbEr!oA$}q}(Ut^wOYk$7@>zHQHkZow^)Ebqkb@ns1(RF)P%2KUtDah!hy8cpjK3m z$+#5<<2g*k8^}tHKb?nQFpk7T3}AjUiwbj^VobqmjKQ7Q8_yzRm^RcvUG{!ADz*OP zUjYupRE$S%nc3DQ7(x3T9E+c##<_^@cq&(@MBzWEiK7T#XCVufvR83FE=G38w4o-v zjtcN0YODUh0DOuH%rA`Xz!1Ka(L~gE8TNX182Jz9!aOeM2i2%Z-Kc@Kp)%8eny?iW zKszeXF4PwJFo^bk0BVBasD8;v7n6zl{cPmVEaFT3YQo9?C@LRtK`UrM{qQ&{fOhM3 z)JlIv?OhLQ!f-ZJdp{BtXd0?tHfqIFZ95-*XwOBBUxZm$;ifW_N)syOZK%_H2l+FP z_|oZj(rFx~p$1rp3HT-|(9dkU5fw-$j>bEvi3gEZ1saapdlzaPcLEiqXgsFjOw=i_ zv93pD#)DefR#eKjqXKP24cLOi@dT>hPxk(8d%p)Y;S+n`kJYZ!^Y5ghAJn2Eu0suY z7!`3V7U5}}gE2hR>bC}Cu>qs89bNbkm6;$;w8qWAT%3g3x>_VDW|!%)=7YijJZ(cOE(T<{2u$5SRDOI2m<4AC>7hP~*RcQEn=q zQ_*2MiHht3YVYr%e&9$#IdR&uFw`MS zM?IEvQIF#y)T@0pl4P?Nd*gR*DoRlYYM^f0;Q=bO!HlK=BQO<{QGpd%mm^PBvjcEWm!a8WreT)Hq)tnQ@yYDw^;VDu7N@in>vU#h)Xty$?rCFcQ^o zEGmE;)bEQ>6INn>tV3cpAE6d-0`j%l_Y@qLu!RWXn83O&C4eyZ5Q6Jz3E2Q~39PL>}=qxL=lHBJgDLz6KL3$QQNS?kfQ)O2qqc56D&@_n3EEK;UP7(>N7PnyqZZU_4Efgtabvvi z_8iQky##~tBr>PDhhE;( z&}yPsRL60s0dtUZXbMp)sY9i5GxowQs6)0Dm4R!hcY6%~Bsfr$=(C?Pfs#$xOxZ|j zq4c9DP{)^^tNoK4dp*9+B*z|4x--GC&ojpv5qXT8|NShZafG5^zVXyMMhq=0iGF7+vtfd@%UgM}VPYBu&99O)w`1P{tw_M9h%PUuwmbex! kuPk>JS5=i(yGlwImQ|EhmsM6YZyYnvr#Uoc-T&$TFL~c?-2eap delta 3296 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 F{{b>rhHd}= delta 3323 zcmYM$4NR3)9LMo<5xAh2i!bO!ki4c|6nPO5g>p?Jn51G9VPdH*jaec(%~|T6vX_Y# z*dD0}tz5pOB9(}WD5$ANSdM#&bXCJTK?`&;OirFI9`H z%dL*Sq1A??iE|L=r7&au!Ma|2aJ&_5OaN;zACF=r_Uvs;AB@5N7{I%6f>U3C9_p3Y z6KkFNc63v3z;I(M(@dcs7mlMkXh$#lX`NV18VDV{~i@k7ZRIs_YLa9 z1nP;XKyp!IdeCt;-berDDGI~5@gdH@?@%u!6O{tVMs+wDBe2Br35=n>5H+F~Fa;}c z03N_3{0bSVxrqZ&FO7gWjG}*&LxDa`A*SLyyc2B<#r?>;rWw^xt8>2{mD-!A07IFF zG#r3jGI@@(FrNBi9E-1_+Bt?+fWj#Xci=Tt$6mtMT1ZEwtN`a?2{JpT8P(xwRDd0* zsrm_{@E25IH_(S6d?=%FsP+<3*E4+NKbFE2YIN>_EM^2Nghz<7w1L&!Oh- z0;&}HpSj3~R{t%` zL_ZI!fnrR=QdFQ-PJJ^fkWVog&!RdGBdrQF0yX!&QSDeh3QExk9E}rEt9*&$bEwR` zh#FZ1D&>`^KsTcr+<`-|9`)QA=YE@W{{pJRpPlqUintCR z!+kgt`?9I^+(I0NH8>bs(2pIc%-lu=lE})=!(`OdEk%-IHlbVl{{RJb_z7y{pCNsj zR@8{DqB`*MF&tB|2#Zi7+KDW5a|jjK*T_aP|2o%W{J{*5LbaQNG->8yv_-+9popqa zbG{2TB_~iFoJTFT-%uTO;V6tDI%Q}gYNV5~2TsFDScn?AjahgOXJJ3KP5{f%(n#K* zpzZf7YVrJu3Luh|Hx-AVMzjb$_!4UFUq=O2i^||`$Gyk~F-=&E-=GFElKIkFx(k)b ziNnbMY6?$sK^29o zSE1UeK=oG>Ape^4IxfgY)W};_kO)9K-M=>I>#eR0@AU{TN+FrSg_@-NTC1 z`vXy{d<^!)>Bzb>C8z~K;EJn@ITvSGuV-&7LjjRGg za3d;^H?aWgQ6ug`7QPwG0`OoCYTrMA%z`P$Z0-LV3Toh6)LdOb1rkSPEGD787v^9V zK8xyjFKUF17>-9!BRhe5z75CWHB`WX(LvKui*^E9YM_XM7av89{AtH$a4>ZXwHDsR z2;7G1upTufjZXa(uA|aZj|81Q`5`|qIM--@-u0O5t(T zuDFDnB6mh`Dl)K;dKS`_S%(VrF!sXpsE#f>cB0nI->50@kyf=kZY=pH+h!&g6v$eP z#@|sX(%$186N}n*QyoiD_t&5TeH*pi4x`@x5!GQQYAU?UgX$wt_j6Ghf7qg+Z8HxQ z$ZAyNb*L0JVh=ouId}qdF=Bl1yS)Hi)YXZO-JIE+dUgY6CFg!lwWR>Ib0%@>n8IoQ z)oYMzr`_K(%C*CuJ0g$o)w0{4bTQkcJJ*#du#os=@C Q`|@ik2i*-TGdG6(2lW?S$p8QV diff --git a/locales/it_IT.po b/locales/it_IT.po index b6f70a1..5f286fe 100644 --- a/locales/it_IT.po +++ b/locales/it_IT.po @@ -307,7 +307,7 @@ msgid "Linked assets" msgstr "Asset collegati" msgid "Managed clients" -msgstr "Clienti gestiti" +msgstr "Elementi gestiti" msgid "Linked server" msgstr "Server collegato" @@ -325,7 +325,7 @@ msgid "Method not allowed" msgstr "Metodo non consentito" msgid "Clients to manage" -msgstr "Clienti da gestire" +msgstr "Elementi da gestire" msgid "Name" msgstr "Nome" @@ -506,7 +506,7 @@ msgid "Unknown" msgstr "Sconosciuto" msgid "Linkable clients" -msgstr "Clienti Collegabili" +msgstr "Elementi collegabili" msgid "Update" msgstr "Aggiorna" @@ -533,6 +533,9 @@ msgstr "" "L'API UrBackup ha restituito una risposta non-JSON (HTML). Controllare URL " "del server e autenticazione." +msgid "UrBackup capacity removed from asset definitions" +msgstr "Capacità UrBackup rimossa dalle definizioni di asset" + msgid "UrBackup Servers" msgstr "Server UrBackup" diff --git a/src/Server.php b/src/Server.php index 1ef6032..0f78cb2 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1374,6 +1374,7 @@ class Server extends CommonDBTM $formAction = PLUGIN_URBACKUP_WEB_DIR . '/front/server.form.php'; + echo '
'; echo '
'; echo ''; echo ''; @@ -1430,6 +1431,7 @@ class Server extends CommonDBTM echo ''; echo '
' . htmlspecialchars(__('Name')) . '
'; + echo ''; } private static function getCachedName(string $classname, int $id, array &$cache): string