From e782b91722e36ac9231b33279db347843a199684 Mon Sep 17 00:00:00 2001 From: Javier Ros Date: Fri, 23 Feb 2024 13:34:08 +0100 Subject: [PATCH 01/11] feat(sccm): Works with multiple configurations --- front/config.form.php | 32 ++- front/config.php | 44 ++++ inc/config.class.php | 274 ++++++++++++++++----- inc/menu.class.php | 46 +++- inc/sccm.class.php | 486 ++++++++++++++++++------------------- inc/sccmdb.class.php | 15 +- inc/sccmxml.class.php | 40 +-- templates/config.html.twig | 12 + 8 files changed, 590 insertions(+), 359 deletions(-) create mode 100644 front/config.php diff --git a/front/config.form.php b/front/config.form.php index 84cc52a..4e75dd8 100644 --- a/front/config.form.php +++ b/front/config.form.php @@ -32,21 +32,41 @@ include(__DIR__ . '/../../../inc/includes.php'); require_once(__DIR__ . '/../inc/config.class.php'); +global $CFG_GLPI; Session::checkRight("config", UPDATE); +//$config = new PluginSccmConfig(); $config = new PluginSccmConfig(); +global $DB; if (isset($_POST["update"])) { $config->update($_POST); $sccm_db = new PluginSccmSccmdb(); - if ($sccm_db->connect()) { - Session::addMessageAfterRedirect("Connexion réussie !.", false, INFO, false); - } else { - Session::addMessageAfterRedirect("Connexion incorrecte.", false, ERROR, false); - } + $config->update($_POST); - Html::back(); + Toolbox::logInFile('sccm', "Updating configuration ".$_POST['sccm_config_name']." ".$_POST['id']." ...\n", true); + + $sccmDB = new PluginSccmSccmdb(); + $sccmDB->testConfiguration($_POST['id']); + + Html::redirect(PluginSccmConfig::searchUrl()); +} else if (isset($_POST["add"])) { + Toolbox::logInFile('sccm', "Inserting configuration ".$_POST['sccm_config_name']." ...\n", true); + $insertedId = $config->add($_POST); + + if ($insertedId) { + $sccm_db = new PluginSccmSccmdb(); + $sccm_db->testConfiguration($insertedId); + } else { + Toolbox::logInFile('sccm', "Error inserting configuration ".$_POST['sccm_config_name']." ".$DB->error()." ...\n", true); + Session::addMessageAfterRedirect("Error inserting configuration.", false, ERROR, false); + } + + Html::redirect(PluginSccmConfig::searchUrl()); +} else if (isset($_POST["purge"])) { + $config->delete($_POST, 1); + Html::redirect(PluginSccmConfig::searchUrl()); } $menus = ['config', PluginSccmMenu::class]; diff --git a/front/config.php b/front/config.php new file mode 100644 index 0000000..8f11ce5 --- /dev/null +++ b/front/config.php @@ -0,0 +1,44 @@ +. + * ------------------------------------------------------------------------- + * @author François Legastelois + * @copyright Copyright (C) 2014-2023 by SCCM plugin team. + * @license GPLv3 https://www.gnu.org/licenses/gpl-3.0.html + * @link https://github.com/pluginsGLPI/sccm + * ------------------------------------------------------------------------- + */ + +include ('../../../inc/includes.php'); + +Html::header( + PluginSccmConfig::getTypeName(), + $_SERVER["PHP_SELF"], + "config", + PluginSccmMenu::class, + "configuration" +); + +Search::show('PluginSccmConfig'); + +Html::footer(); \ No newline at end of file diff --git a/inc/config.class.php b/inc/config.class.php index b4617ab..f6e4064 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -63,6 +63,7 @@ class PluginSccmConfig extends CommonDBTM { private static $_instance; + public $dohistory = true; public static function canCreate(): bool { @@ -81,32 +82,101 @@ public static function canView(): bool public static function getTypeName($nb = 0) { - return __s("Setup - SCCM", "sccm"); + return __s("SCCM", "sccm"); } public function getName($options = []) { - return __s("Interface - SCCM", "sccm"); + return __("Configuration", "sccm"); } public static function getInstance() { if (!isset(self::$_instance)) { self::$_instance = new self(); - if (!self::$_instance->getFromDB(1)) { - self::$_instance->getEmpty(); - } } - return self::$_instance; } + public function rawSearchOptions() + { + $tab = []; + $tab[] = [ + 'id' => 'common', + 'name' => self::getTypeName(2) + ]; + + $tab[] = [ + 'id' => '1', + 'table' => $this->getTable(), + 'field' => 'sccm_config_name', + 'name' => __('Config name'), + 'massiveaction' => false, + 'datatype' => 'itemlink' + ]; + + $tab[] = [ + 'id' => '2', + 'table' => $this->getTable(), + 'field' => 'active_sync', + 'name' => __('Enabled'), + 'massiveaction' => false, + 'datatype' => 'bool' + ]; + $tab[] = [ + 'id' => '3', + 'table' => $this->getTable(), + 'field' => 'sccm_collection_name', + 'name' => __('Collection'), + 'massiveaction' => false, + 'datatype' => 'string' + ]; + $tab[] = [ + 'id' => '4', + 'table' => $this->getTable(), + 'field' => 'sccmdb_host', + 'name' => __('Db Host'), + 'massiveaction' => false, + 'datatype' => 'string' + ]; + $tab[] = [ + 'id' => '5', + 'table' => $this->getTable(), + 'field' => 'sccmdb_dbname', + 'name' => __('DB Name'), + 'massiveaction' => false, + 'datatype' => 'string' + ]; + $tab[] = [ + 'id' => '6', + 'table' => $this->getTable(), + 'field' => 'sccmdb_user', + 'name' => __('DB User'), + 'massiveaction' => false, + 'datatype' => 'string' + ]; + return $tab; + } + + public function getAllConfigurations() { + return getAllDataFromTable(self::getTable()); + } + + public function loadFirstConfiguration() { + $configurations = $this->getAllConfigurations(); + if (empty($configurations)) { + return false; + } + $this->getFromDB(array_values($configurations)[0]['id']); + + return true; + } + public function prepareInputForUpdate($input) { if (isset($input["sccmdb_password"]) && !empty($input["sccmdb_password"])) { $input["sccmdb_password"] = (new GLPIKey())->encrypt($input["sccmdb_password"]); } - if (array_key_exists('inventory_server_url', $input) && !empty($input['inventory_server_url'])) { $input['inventory_server_url'] = trim((string) $input['inventory_server_url'], '/ '); } @@ -114,6 +184,29 @@ public function prepareInputForUpdate($input) return $input; } + function prepareInputForAdd($input) { + if (isset($input["sccmdb_password"]) AND !empty($input["sccmdb_password"])) { + $input["sccmdb_password"] = (new GLPIKey())->encrypt($input["sccmdb_password"]); + } + + if (array_key_exists('inventory_server_url', $input) && !empty($input['inventory_server_url'])) { + $input['inventory_server_url'] = trim($input['inventory_server_url'], '/ '); + } + + return $input; + } + + static function isIdAutoIncrement() + { + global $DB; + + $columns = $DB->query("SHOW COLUMNS FROM glpi_plugin_sccm_configs WHERE FIELD = 'id'"); + $data = $columns->fetch_assoc(); + Toolbox::logInFile('sccm', "Auto increment ... " . $data["Extra"] . " \n", true); + return str_contains($data["Extra"], "auto_increment"); + } + + public static function install(Migration $migration) { /** @var array $CFG_GLPI */ @@ -125,15 +218,21 @@ public static function install(Migration $migration) $default_key_sign = DBConnection::getDefaultPrimaryKeySignOption(); $table = 'glpi_plugin_sccm_configs'; + Toolbox::logInFile('sccm', "Installing ...\n", true); + if (!$DB->tableExists($table)) { - $query = "CREATE TABLE `" . $table . "`( - `id` int {$default_key_sign} NOT NULL, + Toolbox::logInFile('sccm', "Table not exists, creating ...\n", true); + + $query = "CREATE TABLE `". $table."`( + `id` int {$default_key_sign} NOT NULL AUTO_INCREMENT, + `sccm_config_name` VARCHAR(255) NULL, `sccmdb_host` VARCHAR(255) NULL, `sccmdb_dbname` VARCHAR(255) NULL, `sccmdb_user` VARCHAR(255) NULL, `sccmdb_password` VARCHAR(255) NULL, + `sccm_collection_name` VARCHAR(255) NULL, `inventory_server_url` VARCHAR(255) NULL, `active_sync` tinyint NOT NULL default '0', `verify_ssl_cert` tinyint NOT NULL default '0', @@ -150,15 +249,29 @@ public static function install(Migration $migration) $DB->doQuery($query); - $query = "INSERT INTO `{$table}` - (id, date_mod, sccmdb_host, sccmdb_dbname, - sccmdb_user, sccmdb_password, inventory_server_url) - VALUES (1, NOW(), 'srv_sccm','bdd_sccm','user_sccm','', - NULL)"; + $query = "INSERT INTO `$table` + (date_mod, sccmdb_host, sccmdb_dbname, + sccmdb_user, sccmdb_password, inventory_server_url) + VALUES (NOW(), 'srv_sccm','bdd_sccm','user_sccm','', + NULL)"; $DB->doQuery($query); } else { + if (!self::isIdAutoIncrement()){ + Toolbox::logInFile('sccm', "Changing to Auto increment ... \n", true); + $migration->changeField("glpi_plugin_sccm_configs", "id", "id", "autoincrement"); + $migration->migrationOneTable('glpi_plugin_sccm_configs'); + } + if (!$DB->fieldExists($table, 'sccm_config_name')) { + $migration->addField("glpi_plugin_sccm_configs", "sccm_config_name", "VARCHAR(255)"); + $migration->migrationOneTable('glpi_plugin_sccm_configs'); + } + + if (!$DB->fieldExists($table, 'sccm_collection_name')) { + $migration->addField("glpi_plugin_sccm_configs", "sccm_collection_name", "VARCHAR(255)"); + $migration->migrationOneTable('glpi_plugin_sccm_configs'); + } if (!$DB->fieldExists($table, 'verify_ssl_cert')) { $migration->addField("glpi_plugin_sccm_configs", "verify_ssl_cert", "tinyint NOT NULL default '0'"); @@ -187,25 +300,28 @@ public static function install(Migration $migration) if (!$DB->fieldExists($table, 'is_password_sodium_encrypted')) { $config = self::getInstance(); - if (!empty($config->fields['sccmdb_password'])) { - $key = new GLPIKey(); - $migration->addPostQuery( - $DB->buildUpdate( - 'glpi_plugin_sccm_configs', - [ - 'sccmdb_password' => $key->encrypt( - $key->decryptUsingLegacyKey( - $config->fields['sccmdb_password'], - ), - ), - ], - [ - 'id' => 1, - ], - ), - ); - } - + $configurations = $config->getAllConfigurations(); + foreach ($configurations as $data) { + $config->getFromDB($data['id']); + if (!empty($config->fields['sccmdb_password'])) { + $key = new GLPIKey(); + $migration->addPostQuery( + $DB->buildUpdate( + 'glpi_plugin_sccm_configs', + [ + 'sccmdb_password' => $key->encrypt( + $key->decryptUsingLegacyKey( + $config->fields['sccmdb_password'] + ) + ) + ], + [ + 'id' => $data['id'], + ] + ) + ); + } + } $migration->addField("glpi_plugin_sccm_configs", "is_password_sodium_encrypted", "tinyint NOT NULL default '1'"); $migration->migrationOneTable('glpi_plugin_sccm_configs'); } @@ -220,31 +336,34 @@ public static function install(Migration $migration) $migration->migrationOneTable('glpi_plugin_sccm_configs'); } - $sccm_config = $DB->request(['FROM' => 'glpi_plugin_sccm_configs'])->current(); - $inventory_server_url = trim($sccm_config['inventory_server_url'] ?? ''); - $url_matches = []; - if ( - $inventory_server_url !== '' - && ( - preg_match('/^(?.+)\/front\/inventory\.php$/', $inventory_server_url, $url_matches) === 1 - || preg_match('/^(?.+)\/(marketplace|plugins)\/(fusioninventory)\//', $inventory_server_url, $url_matches) === 1 - ) - ) { - // Strip script path from base URL. - $inventory_server_url = $url_matches['base_url']; - if ($inventory_server_url === $CFG_GLPI['url_base']) { - $inventory_server_url = ''; + $config = self::getInstance(); + $configurations = $config->getAllConfigurations(); + foreach ($configurations as $sccm_config) { + $inventory_server_url = trim($sccm_config['inventory_server_url'] ?? ''); + $url_matches = []; + if ( + $inventory_server_url !== '' + && ( + preg_match('/^(?.+)\/front\/inventory\.php$/', $inventory_server_url, $url_matches) === 1 + || preg_match('/^(?.+)\/(marketplace|plugins)\/(fusioninventory)\//', $inventory_server_url, $url_matches) === 1 + ) + ) { + // Strip script path from base URL. + $inventory_server_url = $url_matches['base_url']; + if ($inventory_server_url === $CFG_GLPI['url_base']) { + $inventory_server_url = ''; + } + + $sccm_config = $DB->update( + 'glpi_plugin_sccm_configs', + [ + 'inventory_server_url' => $inventory_server_url, + ], + [ + 'id' => $sccm_config['id'], + ], + ); } - - $sccm_config = $DB->update( - 'glpi_plugin_sccm_configs', - [ - 'inventory_server_url' => $inventory_server_url, - ], - [ - 'id' => 1, - ], - ); } } @@ -256,6 +375,7 @@ public static function uninstall() /** @var DBmysql $DB */ global $DB; + Toolbox::logInFile('sccm', "Uninstalling ...\n", true); if ($DB->tableExists('glpi_plugin_sccm_configs')) { $query = "DROP TABLE `glpi_plugin_sccm_configs`"; @@ -295,5 +415,45 @@ public function showForm($ID, array $options = []) return true; } + + public static function configUrl() { + global $CFG_GLPI; + return $CFG_GLPI['url_base'] . "/plugins/sccm/front/config.php";; + } + + public static function searchUrl() { + global $CFG_GLPI; + return $CFG_GLPI['url_base'] . "/plugins/sccm/front/config.php";; + } + + public static function showConfigList() { + global $DB; + + $configUrl = self::configUrl(); + + echo "

SCCM Configuration list:

"; + echo ""; + } + + public function defineTabs($options = []) { + + $ong = []; + $this->addDefaultFormTab($ong); + $this->addStandardTab(__CLASS__, $ong, $options); + $this->addStandardTab('Log', $ong, $options); + return $ong; + } + + + static function canPurge() { + return true; + } } diff --git a/inc/menu.class.php b/inc/menu.class.php index 032f7cf..e777278 100644 --- a/inc/menu.class.php +++ b/inc/menu.class.php @@ -36,18 +36,40 @@ public static function getTypeName($nb = 0) return __s('SCCM', 'sccm'); } - public static function getMenuName() - { - return __s('SCCM', 'sccm'); - } + static function getTypeName($nb = 0) { + return __('Menu', 'sccm'); + } - public static function getMenuContent() - { - return [ - 'title' => self::getMenuName(), - 'page' => '/plugins/sccm/front/config.form.php', - 'icon' => 'ti ti-database-cog', - ]; - } + static function getSearchURL($full = true) + { + $url = Plugin::getWebDir('sccm', false); + return $url . '/front/config.php'; + } + + static function getNewURL($full = true) + { + $url = Plugin::getWebDir('sccm', false); + return $url . '/front/config.form.php'; + } + + static function getMenuName() { + return __('SCCM', 'sccm'); + } + + public static function getIcon() { + return "fa-solid fa-dice-d20"; + } + + static function getMenuContent() { + $menu = [ + 'title' => self::getMenuName(), + 'page' => self::getSearchURL(false), + 'icon' => self::getIcon(), + 'options' => [], + ]; + + $menu['links']['add'] = self::getNewURL(); + return $menu; + } } diff --git a/inc/sccm.class.php b/inc/sccm.class.php index 8498dc4..13f253c 100644 --- a/inc/sccm.class.php +++ b/inc/sccm.class.php @@ -35,8 +35,11 @@ class PluginSccmSccm { public $devices; - public function __construct() + public PluginSccmSccmdb $sccmdb; + + public function __construct(PluginSccmSccmdb $sccmdb) { + $this->sccmdb = $sccmdb; if (!function_exists('curl_init')) { throw new BadRequestHttpException( __s('cURL extension (PHP) is required... !!', 'sccm'), @@ -55,17 +58,10 @@ public static function getTypeName($nb = 0) return __s('SCCM', 'sccm'); } - public function getDevices($where = 0, $limit = 99999999) + public function getDevices($collection_name, $where = 0, $limit = 99999999) { - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } - - $query = self::getcomputerQuery(); + $sccm_db = $this->sccmdb; + $query = self::getcomputerQuery(collection_name); if ($where != 0) { $query .= " WHERE csd.MachineID = '" . $where . "'"; @@ -80,21 +76,14 @@ public function getDevices($where = 0, $limit = 99999999) $tab['MD-SystemName'] = strtoupper((string) $tab['MD-SystemName']); $this->devices[] = $tab; $i++; - } - - $sccm_db->disconnect(); + } } public function getDatas($type, $deviceid, $limit = 99999999) { + $sccm_db = $this->sccmdb; - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } + $datas = []; if ($type == 'processors') { $fields = ['Manufacturer00','Name00','NormSpeed00','AddressWidth00','CPUKey00','NumberOfCores00', 'NumberOfLogicalProcessors00']; @@ -122,23 +111,15 @@ public function getDatas($type, $deviceid, $limit = 99999999) $data[] = $tmp; $i++; } - - $sccm_db->disconnect(); + return $data; } - public function getNetwork($deviceid, $limit = 99999999) + public function getNetwork($deviceid, $limit = 99999999) { + $sccm_db = $this->sccmdb; - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } - - $query = "SELECT NeDa.IPAddress00 as \"ND-IpAddress\", + $query = "SELECT NeDa.IPAddress00 as \"ND-IpAddress\", NeDa.MACAddress00 as \"ND-MacAddress\", NeDa.IPSubnet00 as \"ND-IpSubnet\", NeDa.DefaultIPGateway00 as \"ND-IpGateway\", @@ -166,38 +147,31 @@ public function getNetwork($deviceid, $limit = 99999999) $data[] = $tmp; $i++; } - - $sccm_db->disconnect(); + return $data; } - public function getSoftware($deviceid, $limit = 99999999) + public function getSoftware($deviceid, $limit = 99999999) { - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } + $sccm_db = $this->sccmdb; $query = "SELECT ArPd_64.DisplayName0 as \"ArPd-DisplayName\", - ArPd_64.InstallDate0 as \"ArPd-InstallDate\", - ArPd_64.Version0 as \"ArPd-Version\", - ArPd_64.Publisher0 as \"ArPd-Publisher\" - FROM v_GS_ADD_REMOVE_PROGRAMS_64 ArPd_64 - INNER JOIN v_R_System VrS on VrS.ResourceID=ArPd_64.ResourceID - WHERE ArPd_64.ResourceID = {$deviceid} - AND (ArPd_64.DisplayName0 is not null and ArPd_64.DisplayName0 <> '') - UNION - SELECT ArPd.DisplayName0 as \"ArPd-DisplayName\", - ArPd.InstallDate0 as \"ArPd-InstallDate\", - ArPd.Version0 as \"ArPd-Version\", - ArPd.Publisher0 as \"ArPd-Publisher\" - FROM v_GS_ADD_REMOVE_PROGRAMS ArPd - INNER JOIN v_R_System VrS on VrS.ResourceID=ArPd.ResourceID - WHERE ArPd.ResourceID = {$deviceid} - AND (ArPd.DisplayName0 is not null and ArPd.DisplayName0 <> '')"; + ArPd_64.InstallDate0 as \"ArPd-InstallDate\", + ArPd_64.Version0 as \"ArPd-Version\", + ArPd_64.Publisher0 as \"ArPd-Publisher\" + FROM v_GS_ADD_REMOVE_PROGRAMS_64 ArPd_64 + INNER JOIN v_R_System VrS on VrS.ResourceID=ArPd_64.ResourceID + WHERE ArPd_64.ResourceID = {$deviceid} + AND (ArPd_64.DisplayName0 is not null and ArPd_64.DisplayName0 <> '') + UNION + SELECT ArPd.DisplayName0 as \"ArPd-DisplayName\", + ArPd.InstallDate0 as \"ArPd-InstallDate\", + ArPd.Version0 as \"ArPd-Version\", + ArPd.Publisher0 as \"ArPd-Publisher\" + FROM v_GS_ADD_REMOVE_PROGRAMS ArPd + INNER JOIN v_R_System VrS on VrS.ResourceID=ArPd.ResourceID + WHERE ArPd.ResourceID = {$deviceid} + AND (ArPd.DisplayName0 is not null and ArPd.DisplayName0 <> '')"; $result = $sccm_db->exec_query($query); @@ -219,16 +193,11 @@ public function getSoftware($deviceid, $limit = 99999999) return $data; } + public function getMemories($deviceid, $limit = 99999999) { - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } + $sccm_db = $this->sccmdb; $query = "SELECT Capacity0 as \"Mem-Capacity\", @@ -262,32 +231,24 @@ public function getMemories($deviceid, $limit = 99999999) $data[] = $tmp; $i++; } - - $sccm_db->disconnect(); return $data; } - public function getVideos($deviceid, $limit = 99999999) + public function getVideos($deviceid, $limit = 99999999) { - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } + $PluginSccmSccmdb = $this->sccmdb; $query = " - SELECT - VideoProcessor0 as \"Vid-Chipset\", - AdapterRAM0/1024 as \"Vid-Memory\", - Name0 as \"Vid-Name\", - CONCAT(CurrentHorizontalResolution0, 'x', CurrentVerticalResolution0) as \"Vid-Resolution\", - GroupID as \"Vid-PciSlot\" - FROM v_GS_VIDEO_CONTROLLER - WHERE VideoProcessor0 is not null - AND ResourceID = '" . $deviceid . "' - ORDER BY GroupID"; + SELECT + VideoProcessor0 as \"Vid-Chipset\", + AdapterRAM0/1024 as \"Vid-Memory\", + Name0 as \"Vid-Name\", + CONCAT(CurrentHorizontalResolution0, 'x', CurrentVerticalResolution0) as \"Vid-Resolution\", + GroupID as \"Vid-PciSlot\" + FROM v_GS_VIDEO_CONTROLLER + WHERE VideoProcessor0 is not null + AND ResourceID = '" . $deviceid . "' + ORDER BY GroupID"; $result = $sccm_db->exec_query($query); @@ -305,28 +266,20 @@ public function getVideos($deviceid, $limit = 99999999) $i++; } - $sccm_db->disconnect(); return $data; } public function getSounds($deviceid, $limit = 99999999) { - - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } + $sccm_db = $this->sccmdb; $query = " - SELECT distinct - Description0 as \"Snd-Description\", - Manufacturer0 as \"Snd-Manufacturer\", - Name0 as \"Snd-Name\" - FROM v_GS_SOUND_DEVICE - WHERE ResourceID = '" . $deviceid . "'"; + SELECT distinct + Description0 as \"Snd-Description\", + Manufacturer0 as \"Snd-Manufacturer\", + Name0 as \"Snd-Name\" + FROM v_GS_SOUND_DEVICE + WHERE ResourceID = '" . $deviceid . "'"; $result = $sccm_db->exec_query($query); @@ -339,44 +292,34 @@ public function getSounds($deviceid, $limit = 99999999) foreach ($tab as $key => $value) { $tmp[$key] = $value; } - $data[] = $tmp; - $i++; } - $sccm_db->disconnect(); - - return $data; - } + return $data; + } public function getStorages($deviceid, $limit = 99999999) { - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } + $sccm_db = $this->sccmdb; $query = " - SELECT - md.SystemName00, - gld.ResourceID as \"gld-ResourceID\", - gld.Description0 as \"gld-Description\", - gld.DeviceID0 as \"gld-Partition\", - gld.FileSystem0 as \"gld-FileSystem\", - gld.Size0 as \"gld-TotalSize\", - gld.FreeSpace0 as \"gld-FreeSpace\", - gld.VolumeName0 as \"gld-MountingPoint\", - gdi.Caption0 as \"gdi-Caption\" - FROM v_GS_LOGICAL_DISK as gld - INNER JOIN v_gs_Disk as gdi on gdi.ResourceID = gld.ResourceID - LEFT JOIN Motherboard_DATA as md on gld.ResourceID = md.MachineID - WHERE gld.GroupID = gdi.GroupID - AND gld.ResourceID = '" . $deviceid . "'"; + SELECT + md.SystemName00, + gld.ResourceID as \"gld-ResourceID\", + gld.Description0 as \"gld-Description\", + gld.DeviceID0 as \"gld-Partition\", + gld.FileSystem0 as \"gld-FileSystem\", + gld.Size0 as \"gld-TotalSize\", + gld.FreeSpace0 as \"gld-FreeSpace\", + gld.VolumeName0 as \"gld-MountingPoint\", + gdi.Caption0 as \"gdi-Caption\" + FROM v_GS_LOGICAL_DISK as gld + INNER JOIN v_gs_Disk as gdi on gdi.ResourceID = gld.ResourceID + LEFT JOIN Motherboard_DATA as md on gld.ResourceID = md.MachineID + WHERE gld.GroupID = gdi.GroupID + AND gld.ResourceID = '" . $deviceid . "'"; $result = $sccm_db->exec_query($query); @@ -395,33 +338,23 @@ public function getStorages($deviceid, $limit = 99999999) $i++; } - - $sccm_db->disconnect(); - return $data; } public function getMedias($deviceid, $limit = 99999999) { - - $sccm_db = new PluginSccmSccmdb(); - $res = $sccm_db->connect(); - if (!$res) { - throw new BadRequestHttpException( - __s('Cannot connect to SCCM database', 'sccm'), - ); - } + $sccm_db = $this->sccmdb; $query = " - SELECT distinct - Description0 as \"Med-Description\", - Manufacturer0 as \"Med-Manufacturer\", - Caption0 as \"Med-Model\", - Name0 as \"Med-Name\", - SCSITargetID0 as \"Med-SCSITargetId\", - MediaType0 as \"Med-Type\" - FROM v_GS_CDROM - WHERE ResourceID = '" . $deviceid . "'"; + SELECT distinct + Description0 as \"Med-Description\", + Manufacturer0 as \"Med-Manufacturer\", + Caption0 as \"Med-Model\", + Name0 as \"Med-Name\", + SCSITargetID0 as \"Med-SCSITargetId\", + MediaType0 as \"Med-Type\" + FROM v_GS_CDROM + WHERE ResourceID = '" . $deviceid . "'"; $result = $sccm_db->exec_query($query); @@ -441,8 +374,6 @@ public function getMedias($deviceid, $limit = 99999999) $i++; } - $sccm_db->disconnect(); - return $data; } @@ -476,6 +407,67 @@ public static function install() ); } + public static function getcomputerQuery($collection_name) { + + $result = "SELECT csd.Description00 as \"CSD-Description\", + csd.Domain00 as \"CSD-Domain\", + csd.Manufacturer00 as \"CSD-Manufacturer\", + csd.Model00 as \"CSD-Model\", + csd.Roles00 as \"CSD-Roles\", + csd.SystemType00 as \"CSD-SystemType\", + csd.UserName00 as \"CSD-UserName\", + csd.MachineID as \"CSD-MachineID\", + csd.TimeKey as \"CSD-TimeKey\", + md.SystemName00 as \"MD-SystemName\", + osd.BuildNumber00 as \"OSD-BuildNumber\", + osd.Caption00 as \"OSD-Caption\", + osd.CSDVersion00 as \"OSD-CSDVersion\", + osd.BootDevice00 as \"OSD-BootDevice\", + osd.InstallDate00 as \"OSD-InstallDate\", + osd.LastBootUpTime00 as \"OSD-LastBootUpTime\", + osd.Manufacturer00 as \"OSD-Manufacturer\", + osd.Name00 as \"OSD-Name\", + osd.Organization00 as \"OSD-Organization\", + osd.RegisteredUser00 as \"OSD-RegisteredUser\", + osd.TotalVirtualMemorySize00 as \"OSD-TotalVirtualMemory\", + osd.TotalVisibleMemorySize00 as \"OSD-TotalVisibleMemory\", + osd.Version00 as \"OSD-Version\", + pbd.SerialNumber00 as \"PBD-SerialNumber\", + pbd.ReleaseDate00 as \"PBD-ReleaseDate\", + pbd.Name00 as \"PBD-Name\", + pbd.SMBIOSBIOSVersion00 as \"PBD-BiosVersion\", + pbd.Version00 as \"PBD-Version\", + pbd.Manufacturer00 as \"PBD-Manufacturer\", + sdi.User_Name0 as \"SDI-UserName\", + sd.SMSID0 as \"SD-UUID\", + sd.SystemRole0 as \"SD-SystemRole\", + VrS.User_Name0 as \"VrS-UserName\", + vWD.LastHWScan as \"vWD-LastScan\" + FROM Computer_System_DATA csd + LEFT JOIN Motherboard_DATA md ON csd.MachineID = md.MachineID + LEFT JOIN Operating_System_DATA osd ON csd.MachineID = osd.MachineID + LEFT JOIN v_GS_WORKSTATION_STATUS vWD ON csd.MachineID = vWD.ResourceID + LEFT JOIN PC_BIOS_DATA pbd ON csd.MachineID = pbd.MachineID + LEFT JOIN System_DISC sdi ON csd.MachineID = sdi.ItemKey + LEFT JOIN System_DATA sd ON csd.MachineID = sd.MachineID + INNER JOIN v_R_System VrS ON csd.MachineID = VrS.ResourceID + WHERE csd.MachineID is not null and csd.MachineID != '' + "; + + if (!empty($collection_name)) + { + $result .= " AND md.SystemName00 in ( + SELECT FCM.Name + FROM v_FullCollectionMembership FCM INNER JOIN v_Collection COL + ON FCM.CollectionID = COL.CollectionID + WHERE col.name='" . $collection_name . "' + ) + "; + } + + return $result; + } + public static function uninstall() { CronTask::unregister(self::class); @@ -500,9 +492,7 @@ public static function cronInfo($name) if ($name == "SCCMPush") { return ['description' => __s("Interface - SCCMPush", "sccm")]; } - return null; - } public static function executeCollect($task) @@ -513,125 +503,117 @@ public static function executeCollect($task) $REP_XML = GLPI_PLUGIN_DOC_DIR . '/sccm/xml/'; $PluginSccmConfig = new PluginSccmConfig(); - $PluginSccmConfig->getFromDB(1); + $configurations = $PluginSccmConfig->getAllConfigurations(); + + if (empty($configurations)) + { + echo __("No SCCM configurations found.", "sccm"); + return $retcode; + } - $PluginSccmSccm = new PluginSccmSccm(); + foreach ($configurations as $config) { - if ($PluginSccmConfig->getField('active_sync') == 1) { + $configId = $config['id']; + Toolbox::logInFile('sccm', "Init Collect on ". $config['sccm_config_name'] ." \n", true); - $PluginSccmSccm->getDevices(); - Toolbox::logInFile('sccm', "getDevices OK \n", true); + $PluginSccmConfig->getFromDB($configId); - Toolbox::logInFile('sccm', "Generate XML start : " - . count($PluginSccmSccm->devices) . " files\n", true); + $REP_XML = GLPI_PLUGIN_DOC_DIR.'/sccm/xml/'. $PluginSccmConfig->getField('id'); - foreach ($PluginSccmSccm->devices as $device_values) { + if (!is_dir($REP_XML)) { + mkdir($REP_XML); + } - $PluginSccmSccmxml = new PluginSccmSccmxml($device_values); + if ($PluginSccmConfig->getField('active_sync') == 1) { + $PluginSccmSccmdb = new PluginSccmSccmdb(); + if (!$PluginSccmSccmdb->connect($config['id'])) { + Toolbox::logInFile('sccm', "Error connecting to database on config ". $config['sccm_config_name'] ." \n", true); + continue; + } + $PluginSccmSccm = new PluginSccmSccm($PluginSccmSccmdb); - $PluginSccmSccmxml->setAccessLog(); - $PluginSccmSccmxml->setAccountInfos(); - $PluginSccmSccmxml->setHardware(); - $PluginSccmSccmxml->setOS(); - $PluginSccmSccmxml->setBios(); - $PluginSccmSccmxml->setProcessors(); - $PluginSccmSccmxml->setSoftwares(); - $PluginSccmSccmxml->setMemories(); - $PluginSccmSccmxml->setVideos(); - $PluginSccmSccmxml->setSounds(); - $PluginSccmSccmxml->setUsers(); - $PluginSccmSccmxml->setNetworks(); - $PluginSccmSccmxml->setStorages(); + Toolbox::logInFile('sccm', "Getting devices ... \n", true); + $PluginSccmSccm->getDevices($PluginSccmConfig->getField('sccm_collection_name')); + Toolbox::logInFile('sccm', "getDevices OK \n", true); - $SXML = $PluginSccmSccmxml->sxml; + if ($PluginSccmSccm->devices == null){ + Toolbox::logInFile('sccm', "Collect completed, no devices found.\n", true); + continue; + } - $SXML->asXML($REP_XML . $PluginSccmSccmxml->device_id . ".ocs"); + Toolbox::logInFile('sccm', "Generate XML start : " + . count($PluginSccmSccm->devices) . " files\n", true); - Toolbox::logInFile('sccm', "Collect OK for device - " . $PluginSccmSccmxml->device_id . " \n", true); - $task->addVolume(1); - } + foreach ($PluginSccmSccm->devices as $device_values) { - $retcode = 1; - Toolbox::logInFile('sccm', "Collect completed \n", true); + $PluginSccmSccmxml = new PluginSccmSccmxml($PluginSccmSccm, $device_values); - } else { - echo __s("Collect is disabled by configuration.", "sccm"); - } + $PluginSccmSccmxml->setAccessLog(); + $PluginSccmSccmxml->setAccountInfos(); + $PluginSccmSccmxml->setHardware(); + $PluginSccmSccmxml->setOS(); + $PluginSccmSccmxml->setBios(); + $PluginSccmSccmxml->setProcessors(); + $PluginSccmSccmxml->setSoftwares(); + $PluginSccmSccmxml->setMemories(); + $PluginSccmSccmxml->setVideos(); + $PluginSccmSccmxml->setSounds(); + $PluginSccmSccmxml->setUsers(); + $PluginSccmSccmxml->setNetworks(); + $PluginSccmSccmxml->setStorages(); - return $retcode; - } + $SXML = $PluginSccmSccmxml->sxml; - public static function getcomputerQuery() - { - return "SELECT csd.Description00 as \"CSD-Description\", - csd.Domain00 as \"CSD-Domain\", - csd.Manufacturer00 as \"CSD-Manufacturer\", - csd.Model00 as \"CSD-Model\", - csd.Roles00 as \"CSD-Roles\", - csd.SystemType00 as \"CSD-SystemType\", - csd.UserName00 as \"CSD-UserName\", - csd.MachineID as \"CSD-MachineID\", - csd.TimeKey as \"CSD-TimeKey\", - md.SystemName00 as \"MD-SystemName\", - osd.BuildNumber00 as \"OSD-BuildNumber\", - osd.Caption00 as \"OSD-Caption\", - osd.CSDVersion00 as \"OSD-CSDVersion\", - osd.BootDevice00 as \"OSD-BootDevice\", - osd.InstallDate00 as \"OSD-InstallDate\", - osd.LastBootUpTime00 as \"OSD-LastBootUpTime\", - osd.Manufacturer00 as \"OSD-Manufacturer\", - osd.Name00 as \"OSD-Name\", - osd.Organization00 as \"OSD-Organization\", - osd.RegisteredUser00 as \"OSD-RegisteredUser\", - osd.TotalVirtualMemorySize00 as \"OSD-TotalVirtualMemory\", - osd.TotalVisibleMemorySize00 as \"OSD-TotalVisibleMemory\", - osd.Version00 as \"OSD-Version\", - pbd.SerialNumber00 as \"PBD-SerialNumber\", - pbd.ReleaseDate00 as \"PBD-ReleaseDate\", - pbd.Name00 as \"PBD-Name\", - pbd.SMBIOSBIOSVersion00 as \"PBD-BiosVersion\", - pbd.Version00 as \"PBD-Version\", - pbd.Manufacturer00 as \"PBD-Manufacturer\", - sdi.User_Name0 as \"SDI-UserName\", - sd.SMSID0 as \"SD-UUID\", - sd.SystemRole0 as \"SD-SystemRole\", - VrS.User_Name0 as \"VrS-UserName\", - vWD.LastHWScan as \"vWD-LastScan\" - FROM Computer_System_DATA csd - LEFT JOIN Motherboard_DATA md ON csd.MachineID = md.MachineID - LEFT JOIN Operating_System_DATA osd ON csd.MachineID = osd.MachineID - LEFT JOIN v_GS_WORKSTATION_STATUS vWD ON csd.MachineID = vWD.ResourceID - LEFT JOIN PC_BIOS_DATA pbd ON csd.MachineID = pbd.MachineID - LEFT JOIN System_DISC sdi ON csd.MachineID = sdi.ItemKey - LEFT JOIN System_DATA sd ON csd.MachineID = sd.MachineID - INNER JOIN v_R_System VrS ON csd.MachineID = VrS.ResourceID - WHERE csd.MachineID is not null and csd.MachineID != ''"; - } + $SXML->asXML($REP_XML."/".$PluginSccmSccmxml->device_id.".ocs"); + + Toolbox::logInFile('sccm', "Collect OK for device - ".$PluginSccmSccmxml->device_id." \n", true); + $task->addVolume(1); + } + $retcode = 1; + Toolbox::logInFile('sccm', "Collect completed on ". $config['sccm_config_name'] .", " . count($PluginSccmSccm->devices) . " devices found \n", true); + $PluginSccmSccmdb->disconnect(); + } else { + Toolbox::logInFile('sccm', "Collect is disabled by configuration on ". $config['sccm_config_name']." \n", true); + echo __("Collect is disabled by configuration on ". $config['sccm_config_name'] .".", "sccm"); + } + } + return $retcode; + } - public static function executePush($task) + public static function executePush($task) { - /** @var array $CFG_GLPI */ global $CFG_GLPI; + $retcode = -1; - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); $PluginSccmConfig = new PluginSccmConfig(); - $PluginSccmConfig->getFromDB(1); + $configurations = $PluginSccmConfig->getAllConfigurations(); - $retcode = -1; + if (empty($configurations)) + { + echo __("No SCCM configurations found.", "sccm"); + return $retcode; + } - if ($PluginSccmConfig->getField('active_sync') == 1) { - if ($res) { + foreach ($configurations as $config) { - $query = self::getcomputerQuery(); - $result = $PluginSccmSccmdb->exec_query($query); + Toolbox::logInFile('sccm', "Init Push on ". $config['sccm_config_name'] ." \n", true); + + $PluginSccmSccmdb = new PluginSccmSccmdb(); + if (!$PluginSccmSccmdb->connect($config['id'])) { + Toolbox::logInFile('sccm', "Error connecting to database on config ". $config['sccm_config_name'] ." \n", true); + continue; + } + $PluginSccmConfig->getFromDB($config['id']); + + if ($PluginSccmConfig->getField('active_sync') == 1) { + $query = self::getcomputerQuery($PluginSccmConfig->getField('sccm_collection_name')); + $result = $PluginSccmSccmdb->exec_query($query); $tab = []; while ($tab = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) { - - $REP_XML = realpath(GLPI_PLUGIN_DOC_DIR . '/sccm/xml/' . $tab['CSD-MachineID'] . '.ocs'); + $REP_XML = realpath(GLPI_PLUGIN_DOC_DIR.'/sccm/xml/'. $PluginSccmConfig->getField('id')."/".$tab['CSD-MachineID'].'.ocs'); if ($REP_XML === false) { Toolbox::logInFile('sccm', "There is a problem with the path, realpath function return false.\nPath : " . $REP_XML . "\n", true); @@ -670,10 +652,10 @@ public static function executePush($task) curl_setopt($ch, CURLOPT_REFERER, $CFG_GLPI['url_base']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $ch_result = curl_exec($ch); + if ($ch_result === false) { Toolbox::logInFile('sccm', curl_error($ch) . "\n", true); } else { - $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpcode != 200) { $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); @@ -696,31 +678,25 @@ public static function executePush($task) } } } - Toolbox::logInFile('sccm', "Push OK - " . $tab['CSD-MachineID'] . " \n", true); } - } - curl_close($ch); } else { $errors = ""; foreach (libxml_get_errors() as $error) { $errors = $errors . $error->message . "\n"; } - Toolbox::logInFile('sccm', "Can't load the file with the path : " . $REP_XML . "\n\n" . $errors . "\n", true); } } - - Toolbox::logInFile('sccm', "Push completed \n", true); + Toolbox::logInFile('sccm', "Push completed on ".$config['sccm_config_name']."\n", true); $PluginSccmSccmdb->disconnect(); $retcode = 1; + } else { + echo __("Push is disabled by configuration on ".$config['sccm_config_name'].".", "sccm"); } - } else { - echo __s("Push is disabled by configuration.", "sccm"); } - return $retcode; } diff --git a/inc/sccmdb.class.php b/inc/sccmdb.class.php index 1648faa..8a443f3 100644 --- a/inc/sccmdb.class.php +++ b/inc/sccmdb.class.php @@ -64,10 +64,21 @@ class PluginSccmSccmdb { public $dbconn; - public function connect() + public function testConfiguration($id) { + if ($this->connect($id)) { + Toolbox::logInFile('sccm', "Success connecting to new configuration ".$_POST['sccm_config_name']." ...\n", true); + Session::addMessageAfterRedirect("Connexion réussie !.", false, INFO, false); + $this->disconnect(); + } else { + Toolbox::logInFile('sccm', "Error connecting to new configuration ".$_POST['sccm_config_name']." ...\n", true); + Session::addMessageAfterRedirect("Connexion incorrecte.", false, ERROR, false); + } + } + + public function connect($id) { $config = new PluginSccmConfig(); - $config->getFromDB(1); + $config->getFromDB($id); $host = $config->getField('sccmdb_host'); $dbname = $config->getField('sccmdb_dbname'); diff --git a/inc/sccmxml.class.php b/inc/sccmxml.class.php index 2b9510e..f5dc176 100644 --- a/inc/sccmxml.class.php +++ b/inc/sccmxml.class.php @@ -33,15 +33,15 @@ class PluginSccmSccmxml { public $device_id; - public $sxml; - public $agentbuildnumber; - public $username; - public function __construct(public $data) + public PluginSccmSccm $sccm; + + public function __construct(PluginSccmSccm $sccm, public $data) { + $this->sccm = $sccm; $plug = new Plugin(); $plug->getFromDBbyDir("sccm"); @@ -172,13 +172,10 @@ public function setBios() public function setProcessors() { - $sccm = new PluginSccmSccm(); - $cpukeys = []; - $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($sccm->getDatas('processors', $this->device_id) as $value) { + foreach ($this->sccm->getDatas('processors', $this->device_id) as $value) { if (!in_array($value['CPUKey00'], $cpukeys)) { $CONTENT->addChild('CPUS'); $CPUS = $this->sxml->CONTENT[0]->CPUS[$i]; @@ -199,13 +196,11 @@ public function setProcessors() public function setSoftwares() { - $sccm = new PluginSccmSccm(); - $antivirus = []; $inject_antivirus = false; $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($sccm->getSoftware($this->device_id) as $value) { + foreach ($this->sccm->getSoftware($this->device_id) as $value) { $CONTENT->addChild('SOFTWARES'); $SOFTWARES = $this->sxml->CONTENT[0]->SOFTWARES[$i]; @@ -250,11 +245,9 @@ public function setSoftwares() public function setMemories() { - $sccm = new PluginSccmSccm(); - $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($sccm->getMemories($this->device_id) as $value) { + foreach ($this->sccm->getMemories($this->device_id) as $value) { $CONTENT->addChild('MEMORIES'); $MEMORIES = $this->sxml->CONTENT[0]->MEMORIES[$i]; @@ -277,11 +270,9 @@ public function setMemories() public function setVideos() { - $sccm = new PluginSccmSccm(); - $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($sccm->getVideos($this->device_id) as $value) { + foreach ($this->sccm->getVideos($this->device_id) as $value) { $CONTENT->addChild('VIDEOS'); $VIDEOS = $this->sxml->CONTENT[0]->VIDEOS[$i]; @@ -298,11 +289,9 @@ public function setVideos() public function setSounds() { - $sccm = new PluginSccmSccm(); - $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($sccm->getSounds($this->device_id) as $value) { + foreach ($this->sccm->getSounds($this->device_id) as $value) { $CONTENT->addChild('SOUNDS'); $SOUNDS = $this->sxml->CONTENT[0]->SOUNDS[$i]; @@ -362,11 +351,9 @@ public function determineNetworkType($network_description) public function setNetworks() { - $sccm = new PluginSccmSccm(); - $CONTENT = $this->sxml->CONTENT[0]; - $networks = $sccm->getNetwork($this->device_id); + $networks = $this->sccm->getNetwork($this->device_id); if (count($networks) > 0) { @@ -400,11 +387,10 @@ public function setNetworks() } public function setStorages() - { - $sccm = new PluginSccmSccm(); + { $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($sccm->getStorages($this->device_id) as $value) { + foreach ($this->sccm->getStorages($this->device_id) as $value) { $value['gld-TotalSize'] = intval($value['gld-TotalSize']) * 1024; $value['gld-FreeSpace'] = intval($value['gld-FreeSpace']) * 1024; $CONTENT->addChild('DRIVES'); @@ -420,7 +406,7 @@ public function setStorages() } $i = 0; - foreach ($sccm->getMedias($this->device_id) as $value) { + foreach ($this->sccm->getMedias($this->device_id) as $value) { $CONTENT->addChild('STORAGES'); $STORAGES = $this->sxml->CONTENT[0]->STORAGES[$i]; $STORAGES->addChild('DESCRIPTION', $value['Med-Description']); diff --git a/templates/config.html.twig b/templates/config.html.twig index 4920e95..5397b34 100644 --- a/templates/config.html.twig +++ b/templates/config.html.twig @@ -36,6 +36,12 @@ + {{ fields.textField( + 'sccm_config_name', + item.fields['sccm_config_name'], + __('SCCM configuration name', 'sccm') + ) }} + {{ fields.checkboxField( 'active_sync', item.fields['active_sync'], @@ -67,6 +73,12 @@ {'autocomplete': 'off'} ) }} + {{ fields.textField( + 'sccm_collection_name', + item.fields['sccm_collection_name'], + __('SCCM collection name', 'sccm') + ) }} + {% set alert %} {{ url }} {% endset %} From 6054203a493bc450400460c8aa76bb2d680c96d3 Mon Sep 17 00:00:00 2001 From: stonebuzz Date: Tue, 12 Mar 2024 09:27:49 +0100 Subject: [PATCH 02/11] fix config.form.php --- front/config.form.php | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/front/config.form.php b/front/config.form.php index 4e75dd8..4c8be54 100644 --- a/front/config.form.php +++ b/front/config.form.php @@ -36,37 +36,23 @@ Session::checkRight("config", UPDATE); -//$config = new PluginSccmConfig(); $config = new PluginSccmConfig(); -global $DB; if (isset($_POST["update"])) { $config->update($_POST); - $sccm_db = new PluginSccmSccmdb(); - $config->update($_POST); - - Toolbox::logInFile('sccm', "Updating configuration ".$_POST['sccm_config_name']." ".$_POST['id']." ...\n", true); - - $sccmDB = new PluginSccmSccmdb(); - $sccmDB->testConfiguration($_POST['id']); - - Html::redirect(PluginSccmConfig::searchUrl()); + $sccmDB = new PluginSccmSccmdb(); + $sccmDB->testConfiguration($_POST['id']); + $PluginSccmConfig->redirectToList(); } else if (isset($_POST["add"])) { - Toolbox::logInFile('sccm', "Inserting configuration ".$_POST['sccm_config_name']." ...\n", true); - $insertedId = $config->add($_POST); - - if ($insertedId) { - $sccm_db = new PluginSccmSccmdb(); - $sccm_db->testConfiguration($insertedId); - } else { - Toolbox::logInFile('sccm', "Error inserting configuration ".$_POST['sccm_config_name']." ".$DB->error()." ...\n", true); - Session::addMessageAfterRedirect("Error inserting configuration.", false, ERROR, false); + if ($PluginSccmConfig->add($_POST)) { + if ($_SESSION['glpibackcreated']) { + Html::redirect($track->getLinkURL()); + } } - - Html::redirect(PluginSccmConfig::searchUrl()); -} else if (isset($_POST["purge"])) { + Html::back(); +} else if (isset($_POST["purge"])) { $config->delete($_POST, 1); - Html::redirect(PluginSccmConfig::searchUrl()); + $PluginSccmConfig->redirectToList(); } $menus = ['config', PluginSccmMenu::class]; From b98c569e9f540ceabd2653e6087704cab985db05 Mon Sep 17 00:00:00 2001 From: stonebuzz Date: Tue, 12 Mar 2024 09:28:28 +0100 Subject: [PATCH 03/11] fix config.php --- front/config.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/front/config.php b/front/config.php index 8f11ce5..6d720c8 100644 --- a/front/config.php +++ b/front/config.php @@ -31,14 +31,6 @@ include ('../../../inc/includes.php'); -Html::header( - PluginSccmConfig::getTypeName(), - $_SERVER["PHP_SELF"], - "config", - PluginSccmMenu::class, - "configuration" -); - +Html::header(PluginSccmConfig::getTypeName(), $_SERVER["PHP_SELF"], "config", PluginSccmMenu::class, "configuration"); Search::show('PluginSccmConfig'); - -Html::footer(); \ No newline at end of file +Html::footer(); From 79b42ea918ebae63340fb6d1b4705ec9a6752f85 Mon Sep 17 00:00:00 2001 From: Javier Ros Date: Wed, 13 Mar 2024 10:06:54 +0100 Subject: [PATCH 04/11] fix: review changes --- front/config.form.php | 6 +-- inc/config.class.php | 98 +++++++++++++++++++++++++++---------------- inc/sccmdb.class.php | 16 ++++--- 3 files changed, 71 insertions(+), 49 deletions(-) diff --git a/front/config.form.php b/front/config.form.php index 4c8be54..6fe77ab 100644 --- a/front/config.form.php +++ b/front/config.form.php @@ -45,9 +45,9 @@ $PluginSccmConfig->redirectToList(); } else if (isset($_POST["add"])) { if ($PluginSccmConfig->add($_POST)) { - if ($_SESSION['glpibackcreated']) { - Html::redirect($track->getLinkURL()); - } + if ($_SESSION['glpibackcreated']) { + Html::redirect($track->getLinkURL()); + } } Html::back(); } else if (isset($_POST["purge"])) { diff --git a/inc/config.class.php b/inc/config.class.php index f6e4064..1ad15bc 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -227,7 +227,7 @@ public static function install(Migration $migration) $query = "CREATE TABLE `". $table."`( `id` int {$default_key_sign} NOT NULL AUTO_INCREMENT, - `sccm_config_name` VARCHAR(255) NULL, + `sccm_config_name` VARCHAR(255) NULL, `sccmdb_host` VARCHAR(255) NULL, `sccmdb_dbname` VARCHAR(255) NULL, `sccmdb_user` VARCHAR(255) NULL, @@ -360,10 +360,40 @@ public static function install(Migration $migration) 'inventory_server_url' => $inventory_server_url, ], [ - 'id' => $sccm_config['id'], - ], - ); - } + 'id' => $data['id'], + ] + ) + ); + } + } + $migration->addField("glpi_plugin_sccm_configs", "is_password_sodium_encrypted", "tinyint NOT NULL default '1'"); + $migration->migrationOneTable('glpi_plugin_sccm_configs'); + } + + if (!$DB->fieldExists($table, 'use_lasthwscan')) { + $migration->addField("glpi_plugin_sccm_configs", "use_lasthwscan", "tinyint NOT NULL default '0'"); + $migration->migrationOneTable('glpi_plugin_sccm_configs'); + } + + if (!$DB->fieldExists($table, 'fusioninventory_url')) { + $migration->changeField("glpi_plugin_sccm_configs", "fusioninventory_url", "inventory_server_url", "string"); + $migration->migrationOneTable('glpi_plugin_sccm_configs'); + } + + $sccm_config = $DB->request(['FROM' => 'glpi_plugin_sccm_configs'])->current(); + $inventory_server_url = trim($sccm_config['inventory_server_url'] ?? ''); + $url_matches = []; + if ( + $inventory_server_url !== '' + && ( + preg_match('/^(?.+)\/front\/inventory\.php$/', $inventory_server_url, $url_matches) === 1 + || preg_match('/^(?.+)\/(marketplace|plugins)\/(fusioninventory)\//', $inventory_server_url, $url_matches) === 1 + ) + ){ + // Strip script path from base URL. + $inventory_server_url = $url_matches['base_url']; + if ($inventory_server_url === $CFG_GLPI['url_base']) { + $inventory_server_url = ''; } } @@ -416,44 +446,38 @@ public function showForm($ID, array $options = []) return true; } - public static function configUrl() { - global $CFG_GLPI; - return $CFG_GLPI['url_base'] . "/plugins/sccm/front/config.php";; - } - - public static function searchUrl() { - global $CFG_GLPI; - return $CFG_GLPI['url_base'] . "/plugins/sccm/front/config.php";; - } - - public static function showConfigList() { - global $DB; + public static function searchUrl() { + global $CFG_GLPI; + return $CFG_GLPI['url_base'] . "/plugins/sccm/front/config.php";; + } - $configUrl = self::configUrl(); + public static function showConfigList() { + global $DB; - echo "

SCCM Configuration list:

"; - echo "
    "; + $configUrl = self::configUrl(); - $configs = $DB->query("select * from glpi_plugin_sccm_configs"); - while ($data = $configs->fetch_assoc()) { - echo "
  • ".$data['sccm_config_name'].""; - } - echo "
  • Add new ..."; - echo "
"; - } + echo "

SCCM Configuration list:

"; + echo "
    "; - public function defineTabs($options = []) { + $configs = $DB->query("select * from glpi_plugin_sccm_configs"); + while ($data = $configs->fetch_assoc()) { + echo "
  • ".$data['sccm_config_name'].""; + } + echo "
  • Add new ..."; + echo "
"; + } - $ong = []; - $this->addDefaultFormTab($ong); - $this->addStandardTab(__CLASS__, $ong, $options); - $this->addStandardTab('Log', $ong, $options); - return $ong; - } + public function defineTabs($options = []) { + $ong = []; + $this->addDefaultFormTab($ong); + $this->addStandardTab(__CLASS__, $ong, $options); + $this->addStandardTab('Log', $ong, $options); + return $ong; + } - static function canPurge() { - return true; - } + public static function canPurge() { + return Session::haveRight('config', UPDATE); + } } diff --git a/inc/sccmdb.class.php b/inc/sccmdb.class.php index 8a443f3..346db05 100644 --- a/inc/sccmdb.class.php +++ b/inc/sccmdb.class.php @@ -64,15 +64,13 @@ class PluginSccmSccmdb { public $dbconn; - public function testConfiguration($id) { - if ($this->connect($id)) { - Toolbox::logInFile('sccm', "Success connecting to new configuration ".$_POST['sccm_config_name']." ...\n", true); - Session::addMessageAfterRedirect("Connexion réussie !.", false, INFO, false); - $this->disconnect(); - } else { - Toolbox::logInFile('sccm', "Error connecting to new configuration ".$_POST['sccm_config_name']." ...\n", true); - Session::addMessageAfterRedirect("Connexion incorrecte.", false, ERROR, false); - } + function testConfiguration($id) { + if ($this->connect($id)) { + Session::addMessageAfterRedirect(__("Connection successfull!", 'sccm'), false, INFO, false); + $this->disconnect(); + } else { + Session::addMessageAfterRedirect(__("Connection failed!", 'sccm'), false, ERROR, false); + } } public function connect($id) From f3c5eb6973af38d1d7ef0a9f4140d9eca4a53f2a Mon Sep 17 00:00:00 2001 From: stonebuzz Date: Fri, 5 Apr 2024 10:01:49 +0200 Subject: [PATCH 05/11] refactor / fix some code --- front/config.form.php | 8 ++-- inc/config.class.php | 102 +++++++++++++++++------------------------- inc/menu.class.php | 26 +++-------- inc/sccmdb.class.php | 6 +-- 4 files changed, 52 insertions(+), 90 deletions(-) diff --git a/front/config.form.php b/front/config.form.php index 6fe77ab..cee539c 100644 --- a/front/config.form.php +++ b/front/config.form.php @@ -39,10 +39,10 @@ $config = new PluginSccmConfig(); if (isset($_POST["update"])) { - $config->update($_POST); - $sccmDB = new PluginSccmSccmdb(); - $sccmDB->testConfiguration($_POST['id']); - $PluginSccmConfig->redirectToList(); + $config->update($_POST); + $sccmDB = new PluginSccmSccmdb(); + $sccmDB->testConfiguration($_POST['id']); + Html::back(); } else if (isset($_POST["add"])) { if ($PluginSccmConfig->add($_POST)) { if ($_SESSION['glpibackcreated']) { diff --git a/inc/config.class.php b/inc/config.class.php index 1ad15bc..cc3d233 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -85,6 +85,10 @@ public static function getTypeName($nb = 0) return __s("SCCM", "sccm"); } + public static function canPurge() { + return Session::haveRight('config', UPDATE); + } + public function getName($options = []) { return __("Configuration", "sccm"); @@ -172,19 +176,15 @@ public function loadFirstConfiguration() { return true; } - public function prepareInputForUpdate($input) - { - if (isset($input["sccmdb_password"]) && !empty($input["sccmdb_password"])) { - $input["sccmdb_password"] = (new GLPIKey())->encrypt($input["sccmdb_password"]); - } - if (array_key_exists('inventory_server_url', $input) && !empty($input['inventory_server_url'])) { - $input['inventory_server_url'] = trim((string) $input['inventory_server_url'], '/ '); - } + public function prepareInputForUpdate($input) { + return self::handleInput($input); + } - return $input; + public function prepareInputForAdd($input) { + return self::handleInput($input); } - function prepareInputForAdd($input) { + public static function handleInput($input) { if (isset($input["sccmdb_password"]) AND !empty($input["sccmdb_password"])) { $input["sccmdb_password"] = (new GLPIKey())->encrypt($input["sccmdb_password"]); } @@ -192,17 +192,14 @@ function prepareInputForAdd($input) { if (array_key_exists('inventory_server_url', $input) && !empty($input['inventory_server_url'])) { $input['inventory_server_url'] = trim($input['inventory_server_url'], '/ '); } - return $input; } - static function isIdAutoIncrement() + public static function isIdAutoIncrement() { global $DB; - $columns = $DB->query("SHOW COLUMNS FROM glpi_plugin_sccm_configs WHERE FIELD = 'id'"); - $data = $columns->fetch_assoc(); - Toolbox::logInFile('sccm', "Auto increment ... " . $data["Extra"] . " \n", true); + $data = $columns->fetch_assoc(); return str_contains($data["Extra"], "auto_increment"); } @@ -217,13 +214,12 @@ public static function install(Migration $migration) $default_collation = DBConnection::getDefaultCollation(); $default_key_sign = DBConnection::getDefaultPrimaryKeySignOption(); - $table = 'glpi_plugin_sccm_configs'; - Toolbox::logInFile('sccm', "Installing ...\n", true); - + $table = self::getTable(); if (!$DB->tableExists($table)) { - Toolbox::logInFile('sccm', "Table not exists, creating ...\n", true); + $migration->displayMessage("Installing SCCM plugin ..."); + $migration->displayMessage("Table not exists, creating ..."); $query = "CREATE TABLE `". $table."`( `id` int {$default_key_sign} NOT NULL AUTO_INCREMENT, @@ -246,32 +242,33 @@ public static function install(Migration $migration) `comment` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET={$default_charset} COLLATE={$default_collation} ROW_FORMAT=DYNAMIC;"; - $DB->doQuery($query); + + - $query = "INSERT INTO `$table` - (date_mod, sccmdb_host, sccmdb_dbname, - sccmdb_user, sccmdb_password, inventory_server_url) - VALUES (NOW(), 'srv_sccm','bdd_sccm','user_sccm','', - NULL)"; + // Update display preferences + $migration->updateDisplayPrefs([PluginSccmConfig::class => [1, 2, 3, 4, 5, 6]]); - $DB->doQuery($query); + } else { + $migration->displayMessage("Updating SCCM plugin ..."); - } else { - if (!self::isIdAutoIncrement()){ - Toolbox::logInFile('sccm', "Changing to Auto increment ... \n", true); + // Need to move ID column to auto increment. + if (!self::isIdAutoIncrement()) { $migration->changeField("glpi_plugin_sccm_configs", "id", "id", "autoincrement"); - $migration->migrationOneTable('glpi_plugin_sccm_configs'); + $migration->migrationOneTable('glpi_plugin_sccm_configs'); + // Update display preferences + $migration->updateDisplayPrefs([PluginSccmConfig::class => [1, 2, 3, 4, 5, 6]]); } + if (!$DB->fieldExists($table, 'sccm_config_name')) { $migration->addField("glpi_plugin_sccm_configs", "sccm_config_name", "VARCHAR(255)"); $migration->migrationOneTable('glpi_plugin_sccm_configs'); - } + } if (!$DB->fieldExists($table, 'sccm_collection_name')) { $migration->addField("glpi_plugin_sccm_configs", "sccm_collection_name", "VARCHAR(255)"); $migration->migrationOneTable('glpi_plugin_sccm_configs'); - } + } if (!$DB->fieldExists($table, 'verify_ssl_cert')) { $migration->addField("glpi_plugin_sccm_configs", "verify_ssl_cert", "tinyint NOT NULL default '0'"); @@ -380,39 +377,21 @@ public static function install(Migration $migration) $migration->migrationOneTable('glpi_plugin_sccm_configs'); } - $sccm_config = $DB->request(['FROM' => 'glpi_plugin_sccm_configs'])->current(); - $inventory_server_url = trim($sccm_config['inventory_server_url'] ?? ''); - $url_matches = []; - if ( - $inventory_server_url !== '' - && ( - preg_match('/^(?.+)\/front\/inventory\.php$/', $inventory_server_url, $url_matches) === 1 - || preg_match('/^(?.+)\/(marketplace|plugins)\/(fusioninventory)\//', $inventory_server_url, $url_matches) === 1 - ) - ){ - // Strip script path from base URL. - $inventory_server_url = $url_matches['base_url']; - if ($inventory_server_url === $CFG_GLPI['url_base']) { - $inventory_server_url = ''; - } - } - return true; } public static function uninstall() { - /** @var DBmysql $DB */ + /** @var \DBmysql $DB */ global $DB; - - Toolbox::logInFile('sccm', "Uninstalling ...\n", true); - if ($DB->tableExists('glpi_plugin_sccm_configs')) { - - $query = "DROP TABLE `glpi_plugin_sccm_configs`"; - $DB->doQuery($query); + $table = self::getTable(); + if ($DB->tableExists($table)) { + $DB->queryOrDie("DROP TABLE IF EXISTS `" . self::getTable() . "`") or die($DB->error()); + $displayPref = new DisplayPreference(); + foreach ($displayPref->find(['itemtype' => PluginSccmConfig::class]) as $pref) { + $displayPref->delete($pref); + } } - - return true; } public function getFormFields(): array @@ -475,9 +454,8 @@ public function defineTabs($options = []) { $this->addStandardTab('Log', $ong, $options); return $ong; } - - - public static function canPurge() { - return Session::haveRight('config', UPDATE); + public static function getIcon() { + return "fa-solid fa-dice-d20"; } + } diff --git a/inc/menu.class.php b/inc/menu.class.php index e777278..4c390a1 100644 --- a/inc/menu.class.php +++ b/inc/menu.class.php @@ -40,36 +40,20 @@ static function getTypeName($nb = 0) { return __('Menu', 'sccm'); } - static function getSearchURL($full = true) - { - $url = Plugin::getWebDir('sccm', false); - return $url . '/front/config.php'; - } - - static function getNewURL($full = true) - { - $url = Plugin::getWebDir('sccm', false); - return $url . '/front/config.form.php'; - } - static function getMenuName() { return __('SCCM', 'sccm'); } - public static function getIcon() { - return "fa-solid fa-dice-d20"; - } - static function getMenuContent() { $menu = [ - 'title' => self::getMenuName(), - 'page' => self::getSearchURL(false), - 'icon' => self::getIcon(), + 'title' => PluginSccmConfig::getMenuName(), + 'page' => PluginSccmConfig::getSearchURL(false), + 'icon' => PluginSccmConfig::getIcon(), 'options' => [], ]; - $menu['links']['add'] = self::getNewURL(); - return $menu; + $menu['links']['add'] = PluginSccmConfig::getFormURL(false); + return $menu; } } diff --git a/inc/sccmdb.class.php b/inc/sccmdb.class.php index 346db05..90ee74c 100644 --- a/inc/sccmdb.class.php +++ b/inc/sccmdb.class.php @@ -65,12 +65,12 @@ class PluginSccmSccmdb public $dbconn; function testConfiguration($id) { - if ($this->connect($id)) { + if ($this->connect($id)) { Session::addMessageAfterRedirect(__("Connection successfull!", 'sccm'), false, INFO, false); $this->disconnect(); - } else { + } else { Session::addMessageAfterRedirect(__("Connection failed!", 'sccm'), false, ERROR, false); - } + } } public function connect($id) From 7abb79f89a894e533d5bb310be7247ca8ec985a5 Mon Sep 17 00:00:00 2001 From: Javier Ros Date: Mon, 18 May 2026 12:31:05 +0200 Subject: [PATCH 06/11] fix front --- front/config.form.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/front/config.form.php b/front/config.form.php index cee539c..00056ec 100644 --- a/front/config.form.php +++ b/front/config.form.php @@ -32,8 +32,6 @@ include(__DIR__ . '/../../../inc/includes.php'); require_once(__DIR__ . '/../inc/config.class.php'); -global $CFG_GLPI; - Session::checkRight("config", UPDATE); $config = new PluginSccmConfig(); @@ -44,7 +42,7 @@ $sccmDB->testConfiguration($_POST['id']); Html::back(); } else if (isset($_POST["add"])) { - if ($PluginSccmConfig->add($_POST)) { + if ($config->add($_POST)) { if ($_SESSION['glpibackcreated']) { Html::redirect($track->getLinkURL()); } @@ -52,7 +50,7 @@ Html::back(); } else if (isset($_POST["purge"])) { $config->delete($_POST, 1); - $PluginSccmConfig->redirectToList(); + $config->redirectToList(); } $menus = ['config', PluginSccmMenu::class]; From f32e01a2ae87de9b06c626243dac7ae392ab8428 Mon Sep 17 00:00:00 2001 From: Javier Ros Date: Tue, 19 May 2026 07:45:06 +0200 Subject: [PATCH 07/11] fix: replace query uses --- inc/config.class.php | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/inc/config.class.php b/inc/config.class.php index cc3d233..a9f4415 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -85,7 +85,7 @@ public static function getTypeName($nb = 0) return __s("SCCM", "sccm"); } - public static function canPurge() { + public static function canPurge(): bool { return Session::haveRight('config', UPDATE); } @@ -197,10 +197,17 @@ public static function handleInput($input) { public static function isIdAutoIncrement() { - global $DB; - $columns = $DB->query("SHOW COLUMNS FROM glpi_plugin_sccm_configs WHERE FIELD = 'id'"); - $data = $columns->fetch_assoc(); - return str_contains($data["Extra"], "auto_increment"); + global $DB; + + $fields = $DB->listFields('glpi_plugin_sccm_configs'); + if (isset($fields['id'])) { + $fieldData = $fields['id']; + + $extra = is_object($fieldData) ? ($fieldData->Extra ?? $fieldData->extra ?? '') : ($fieldData['Extra'] ?? $fieldData['extra'] ?? ''); + + return str_contains(strtolower($extra), "auto_increment"); + } + return false; } @@ -242,7 +249,7 @@ public static function install(Migration $migration) `comment` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET={$default_charset} COLLATE={$default_collation} ROW_FORMAT=DYNAMIC;"; - $DB->doQuery($query); + $DB->rawQuery($query); @@ -359,8 +366,7 @@ public static function install(Migration $migration) [ 'id' => $data['id'], ] - ) - ); + ); } } $migration->addField("glpi_plugin_sccm_configs", "is_password_sodium_encrypted", "tinyint NOT NULL default '1'"); @@ -430,22 +436,6 @@ public static function searchUrl() { return $CFG_GLPI['url_base'] . "/plugins/sccm/front/config.php";; } - public static function showConfigList() { - global $DB; - - $configUrl = self::configUrl(); - - echo "

SCCM Configuration list:

"; - echo ""; - } - public function defineTabs($options = []) { $ong = []; From dd9420b2125dbb2667dbaab045168a1c365ebb2c Mon Sep 17 00:00:00 2001 From: Javier Ros Date: Tue, 19 May 2026 07:53:12 +0200 Subject: [PATCH 08/11] fix update configuration --- inc/config.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/config.class.php b/inc/config.class.php index a9f4415..d6b3c53 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -364,9 +364,9 @@ public static function install(Migration $migration) 'inventory_server_url' => $inventory_server_url, ], [ - 'id' => $data['id'], + 'id' => $sccm_config['id'], ] - ); + ); } } $migration->addField("glpi_plugin_sccm_configs", "is_password_sodium_encrypted", "tinyint NOT NULL default '1'"); From b1de9b699a336ee53a5ec747d5eda22fb3ecb33f Mon Sep 17 00:00:00 2001 From: Javier Ros Date: Tue, 19 May 2026 07:56:12 +0200 Subject: [PATCH 09/11] fix menu --- inc/menu.class.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/inc/menu.class.php b/inc/menu.class.php index 4c390a1..d047c2e 100644 --- a/inc/menu.class.php +++ b/inc/menu.class.php @@ -31,12 +31,7 @@ class PluginSccmMenu extends CommonGLPI { - public static function getTypeName($nb = 0) - { - return __s('SCCM', 'sccm'); - } - - static function getTypeName($nb = 0) { + public static function getTypeName($nb = 0) { return __('Menu', 'sccm'); } @@ -44,7 +39,7 @@ static function getMenuName() { return __('SCCM', 'sccm'); } - static function getMenuContent() { + public static function getMenuContent() { $menu = [ 'title' => PluginSccmConfig::getMenuName(), 'page' => PluginSccmConfig::getSearchURL(false), From 6f179864ae09bd75c9125aeb1d79d68482eb355a Mon Sep 17 00:00:00 2001 From: Javier Ros Date: Tue, 19 May 2026 08:50:30 +0200 Subject: [PATCH 10/11] fix config form and password load --- inc/config.class.php | 24 ++++++++++++++++++------ templates/config.html.twig | 4 ---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/inc/config.class.php b/inc/config.class.php index d6b3c53..6c45508 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -412,18 +412,30 @@ public function showForm($ID, array $options = []) */ global $CFG_GLPI; - $config = self::getInstance(); - $password = $config->getField('sccmdb_password'); - $password = (new GLPIKey())->decrypt($password); - $config->fields['sccmdb_password'] = $password; + if ($ID > 0 && $this->isNewItem()) { + $this->getFromDB($ID); + } + + $storedPassword = $this->getField('sccmdb_password'); + if (!empty($storedPassword)) { + $glpiKey = new GLPIKey(); + // Try sodium decryption first (GLPI 11+). If the password was stored + // with the legacy key (GLPI 10), decrypt() returns an empty string and + // logs a warning instead of throwing — fall back to the legacy method. + $decrypted = $glpiKey->decrypt($storedPassword); + if ($decrypted === '') { + $decrypted = $glpiKey->decryptUsingLegacyKey($storedPassword); + } + $this->fields['sccmdb_password'] = $decrypted; + } - $url = ($config->getField('inventory_server_url') ?: "Ex : " . $CFG_GLPI['url_base']) . '/front/inventory.php'; + $url = ($this->getField('inventory_server_url') ?: "Ex : " . $CFG_GLPI['url_base']) . '/front/inventory.php'; TemplateRenderer::getInstance()->display( '@sccm/config.html.twig', [ 'action' => Toolbox::getItemTypeFormURL(self::class), - 'item' => $config, + 'item' => $this, 'url' => $url, ], ); diff --git a/templates/config.html.twig b/templates/config.html.twig index 5397b34..63e4433 100644 --- a/templates/config.html.twig +++ b/templates/config.html.twig @@ -32,10 +32,6 @@ {% block more_fields %} -
- - - {{ fields.textField( 'sccm_config_name', item.fields['sccm_config_name'], From d7602bfa723cd7e65252268c364c9d3b58322db6 Mon Sep 17 00:00:00 2001 From: Javier Ros Date: Tue, 19 May 2026 09:12:02 +0200 Subject: [PATCH 11/11] fix: meging issues --- inc/sccm.class.php | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/inc/sccm.class.php b/inc/sccm.class.php index 13f253c..e996350 100644 --- a/inc/sccm.class.php +++ b/inc/sccm.class.php @@ -61,7 +61,7 @@ public static function getTypeName($nb = 0) public function getDevices($collection_name, $where = 0, $limit = 99999999) { $sccm_db = $this->sccmdb; - $query = self::getcomputerQuery(collection_name); + $query = self::getcomputerQuery($collection_name); if ($where != 0) { $query .= " WHERE csd.MachineID = '" . $where . "'"; @@ -189,7 +189,6 @@ public function getSoftware($deviceid, $limit = 99999999) $i++; } - $sccm_db->disconnect(); return $data; } @@ -236,7 +235,7 @@ public function getMemories($deviceid, $limit = 99999999) public function getVideos($deviceid, $limit = 99999999) { - $PluginSccmSccmdb = $this->sccmdb; + $sccm_db = $this->sccmdb; $query = " SELECT @@ -599,15 +598,14 @@ public static function executePush($task) Toolbox::logInFile('sccm', "Init Push on ". $config['sccm_config_name'] ." \n", true); - $PluginSccmSccmdb = new PluginSccmSccmdb(); - if (!$PluginSccmSccmdb->connect($config['id'])) { - Toolbox::logInFile('sccm', "Error connecting to database on config ". $config['sccm_config_name'] ." \n", true); - continue; - } - $PluginSccmConfig->getFromDB($config['id']); if ($PluginSccmConfig->getField('active_sync') == 1) { + $PluginSccmSccmdb = new PluginSccmSccmdb(); + if (!$PluginSccmSccmdb->connect($config['id'])) { + Toolbox::logInFile('sccm', "Error connecting to database on config ". $config['sccm_config_name'] ." \n", true); + continue; + } $query = self::getcomputerQuery($PluginSccmConfig->getField('sccm_collection_name')); $result = $PluginSccmSccmdb->exec_query($query); $tab = [];