Stable
This commit is contained in:
@@ -0,0 +1,193 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* -------------------------------------------------------------------------
|
||||
* UrBackup plugin for GLPI
|
||||
* -------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace GlpiPlugin\Urbackup\Controller;
|
||||
|
||||
use GlpiPlugin\Urbackup\Config;
|
||||
use GlpiPlugin\Urbackup\Profile;
|
||||
use GlpiPlugin\Urbackup\Server;
|
||||
use GlpiPlugin\Urbackup\ServerAsset;
|
||||
use GlpiPlugin\Urbackup\UrbackupApiClient;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use CommonDBTM;
|
||||
use Html;
|
||||
use Session;
|
||||
|
||||
class AssetController
|
||||
{
|
||||
#[Route('/plugin/urbackup/asset/action', name: 'urbackup_asset_action', methods: ['POST'])]
|
||||
public function assetAction(Request $request): void
|
||||
{
|
||||
Session::checkLoginUser();
|
||||
Session::checkCSRF($_POST);
|
||||
|
||||
$itemtype = (string) $request->request->get('itemtype', '');
|
||||
$items_id = (int) $request->request->get('items_id', 0);
|
||||
|
||||
if ($itemtype === '' || $items_id <= 0 || !class_exists($itemtype)) {
|
||||
Session::addMessageAfterRedirect(
|
||||
__('Invalid asset reference.', 'urbackup'),
|
||||
true,
|
||||
ERROR
|
||||
);
|
||||
Html::back();
|
||||
}
|
||||
|
||||
if (!Config::isItemtypeEnabled($itemtype)) {
|
||||
Session::addMessageAfterRedirect(
|
||||
__('UrBackup is not enabled for this asset type.', 'urbackup'),
|
||||
true,
|
||||
ERROR
|
||||
);
|
||||
Html::back();
|
||||
}
|
||||
|
||||
$item = new $itemtype();
|
||||
|
||||
if (!$item instanceof CommonDBTM || !$item->getFromDB($items_id)) {
|
||||
Session::addMessageAfterRedirect(
|
||||
__('Asset not found.', 'urbackup'),
|
||||
true,
|
||||
ERROR
|
||||
);
|
||||
Html::back();
|
||||
}
|
||||
|
||||
$action = (string) $request->request->get('urbackup_action', '');
|
||||
|
||||
switch ($action) {
|
||||
case 'connect':
|
||||
$server_id = (int) $request->request->get('plugin_urbackup_servers_id', 0);
|
||||
if (ServerAsset::connectAssetToServer($itemtype, $items_id, $server_id)) {
|
||||
Session::addMessageAfterRedirect(
|
||||
__('Asset connected to UrBackup server.', 'urbackup'),
|
||||
true,
|
||||
INFO
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'disconnect':
|
||||
if (ServerAsset::disconnectAsset($itemtype, $items_id)) {
|
||||
Session::addMessageAfterRedirect(
|
||||
__('Asset disconnected from UrBackup server.', 'urbackup'),
|
||||
true,
|
||||
INFO
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'set_internet_mode':
|
||||
if (Profile::canCurrentUser(UPDATE)) {
|
||||
$internet_mode = (int) $request->request->get('internet_mode', 0);
|
||||
$serverAsset = new ServerAsset();
|
||||
$link = ServerAsset::getLinkForAsset($itemtype, $items_id, true);
|
||||
if ($link) {
|
||||
$server = new Server();
|
||||
if ($server->getFromDB((int) $link['plugin_urbackup_servers_id'])) {
|
||||
$api = new UrbackupApiClient($server);
|
||||
$client_name = (string) ($item->fields['name'] ?? '');
|
||||
$setting_key = $api->getInternetModeSettingKey();
|
||||
$api->changeClientSetting($client_name, $setting_key, $internet_mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'create_client':
|
||||
if (Profile::canCurrentUser(CREATE)) {
|
||||
$serverAsset = new ServerAsset();
|
||||
$link = ServerAsset::getLinkForAsset($itemtype, $items_id, true);
|
||||
if ($link) {
|
||||
$server = new Server();
|
||||
if ($server->getFromDB((int) $link['plugin_urbackup_servers_id'])) {
|
||||
$api = new UrbackupApiClient($server);
|
||||
$client_name = (string) ($item->fields['name'] ?? '');
|
||||
$api->addClient($client_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'incremental_file_backup':
|
||||
case 'full_file_backup':
|
||||
case 'incremental_image_backup':
|
||||
case 'full_image_backup':
|
||||
if (Profile::canCurrentUser(UPDATE)) {
|
||||
$serverAsset = new ServerAsset();
|
||||
$link = ServerAsset::getLinkForAsset($itemtype, $items_id, true);
|
||||
if ($link) {
|
||||
$server = new Server();
|
||||
if ($server->getFromDB((int) $link['plugin_urbackup_servers_id'])) {
|
||||
$api = new UrbackupApiClient($server);
|
||||
$client_name = (string) ($item->fields['name'] ?? '');
|
||||
switch ($action) {
|
||||
case 'incremental_file_backup':
|
||||
$api->startIncrementalFileBackup($client_name);
|
||||
break;
|
||||
case 'full_file_backup':
|
||||
$api->startFullFileBackup($client_name);
|
||||
break;
|
||||
case 'incremental_image_backup':
|
||||
$api->startIncrementalImageBackup($client_name);
|
||||
break;
|
||||
case 'full_image_backup':
|
||||
$api->startFullImageBackup($client_name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'delete_client':
|
||||
if (Profile::canCurrentUser(PURGE)) {
|
||||
$serverAsset = new ServerAsset();
|
||||
$link = ServerAsset::getLinkForAsset($itemtype, $items_id, true);
|
||||
if ($link) {
|
||||
$server = new Server();
|
||||
if ($server->getFromDB((int) $link['plugin_urbackup_servers_id'])) {
|
||||
$api = new UrbackupApiClient($server);
|
||||
$client_name = (string) ($item->fields['name'] ?? '');
|
||||
$api->removeClient($client_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Html::back();
|
||||
}
|
||||
|
||||
#[Route('/plugin/urbackup/api/clients', name: 'urbackup_api_clients', methods: ['GET'])]
|
||||
public function getClients(Request $request): JsonResponse
|
||||
{
|
||||
Session::checkLoginUser();
|
||||
|
||||
$server_id = (int) $request->query->get('server_id', 0);
|
||||
|
||||
if ($server_id <= 0) {
|
||||
return new JsonResponse([]);
|
||||
}
|
||||
|
||||
$server = new Server();
|
||||
|
||||
if (!$server->getFromDB($server_id)) {
|
||||
return new JsonResponse([]);
|
||||
}
|
||||
|
||||
$api = new UrbackupApiClient($server);
|
||||
$clients = $api->getStatus();
|
||||
|
||||
return new JsonResponse($clients);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* -------------------------------------------------------------------------
|
||||
* UrBackup plugin for GLPI
|
||||
* -------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace GlpiPlugin\Urbackup\Controller;
|
||||
|
||||
use GlpiPlugin\Urbackup\Config;
|
||||
use GlpiPlugin\Urbackup\Profile;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Html;
|
||||
use Session;
|
||||
|
||||
class ConfigController extends AbstractController
|
||||
{
|
||||
#[Route('/plugin/urbackup/config', name: 'urbackup_config', methods: ['GET', 'POST'])]
|
||||
public function configure(Request $request): Response
|
||||
{
|
||||
Session::checkRight('config', UPDATE);
|
||||
|
||||
if ($request->isMethod('POST') && $request->request->has('update')) {
|
||||
Config::saveConfiguration($request->request->all());
|
||||
Html::back();
|
||||
}
|
||||
|
||||
$configurableTypes = Config::getConfigurableAssetTypes();
|
||||
$enabledTypes = [];
|
||||
foreach ($configurableTypes as $itemtype => $label) {
|
||||
$enabledTypes[$itemtype] = Config::isItemtypeEnabled($itemtype);
|
||||
}
|
||||
|
||||
return $this->render('config/config.html.twig', [
|
||||
'configurable_types' => $configurableTypes,
|
||||
'enabled_types' => $enabledTypes,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* -------------------------------------------------------------------------
|
||||
* UrBackup plugin for GLPI
|
||||
* -------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace GlpiPlugin\Urbackup\Controller;
|
||||
|
||||
use GlpiPlugin\Urbackup\Server;
|
||||
use GlpiPlugin\Urbackup\Profile;
|
||||
use GlpiPlugin\Urbackup\UrbackupApiClient;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Html;
|
||||
use Session;
|
||||
use Search;
|
||||
|
||||
class ServerController extends AbstractController
|
||||
{
|
||||
#[Route('/plugin/urbackup/servers', name: 'urbackup_server_list', methods: ['GET'])]
|
||||
public function listServers(): void
|
||||
{
|
||||
if (!Server::canView()) {
|
||||
Html::displayRightError();
|
||||
}
|
||||
|
||||
Html::header(
|
||||
Server::getTypeName(Session::getPluralNumber()),
|
||||
$_SERVER['PHP_SELF'],
|
||||
'admin',
|
||||
Server::class
|
||||
);
|
||||
|
||||
Search::show(Server::class);
|
||||
|
||||
Html::footer();
|
||||
}
|
||||
|
||||
#[Route('/plugin/urbackup/server/{id}', name: 'urbackup_server_show', methods: ['GET'], requirements: ['id' => '\d+'])]
|
||||
public function showServer(int $id): void
|
||||
{
|
||||
$server = new Server();
|
||||
|
||||
if ($id > 0) {
|
||||
$server->check($id, READ);
|
||||
} else {
|
||||
$server->check(-1, CREATE);
|
||||
$server->getEmpty();
|
||||
}
|
||||
|
||||
$server->display(['id' => $id]);
|
||||
}
|
||||
|
||||
#[Route('/plugin/urbackup/server/test/{id}', name: 'urbackup_server_test', methods: ['POST', 'GET'])]
|
||||
public function testConnection(int $id = 0): JsonResponse
|
||||
{
|
||||
if (!Profile::canCurrentUser(READ)) {
|
||||
return new JsonResponse([
|
||||
'success' => false,
|
||||
'message' => 'No permission',
|
||||
], 403);
|
||||
}
|
||||
|
||||
if ($id <= 0) {
|
||||
$id = (int) ($_POST['id'] ?? $_GET['id'] ?? 0);
|
||||
}
|
||||
|
||||
if ($id <= 0) {
|
||||
return new JsonResponse([
|
||||
'success' => false,
|
||||
'message' => 'Invalid server ID',
|
||||
], 400);
|
||||
}
|
||||
|
||||
$server = new Server();
|
||||
|
||||
if (!$server->getFromDB($id)) {
|
||||
return new JsonResponse([
|
||||
'success' => false,
|
||||
'message' => 'Server not found',
|
||||
], 404);
|
||||
}
|
||||
|
||||
try {
|
||||
$client = new UrbackupApiClient($server);
|
||||
$result = $client->testConnection();
|
||||
|
||||
$server->update([
|
||||
'id' => $id,
|
||||
'last_api_status' => $result['success'] ? 1 : 0,
|
||||
'last_api_message' => $result['message'],
|
||||
'last_api_check' => date('Y-m-d H:i:s'),
|
||||
]);
|
||||
|
||||
return new JsonResponse($result);
|
||||
} catch (Throwable $e) {
|
||||
return new JsonResponse([
|
||||
'success' => false,
|
||||
'message' => $e->getMessage(),
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user