diff --git a/front/config.form.php b/front/config.form.php index 0cf545a..d4cf6b0 100644 --- a/front/config.form.php +++ b/front/config.form.php @@ -32,11 +32,11 @@ include ('../../../inc/includes.php'); require_once('../inc/config.class.php'); - Session::checkRight("config", UPDATE); $PluginSccmConfig = new PluginSccmConfig(); + if (isset($_POST["update"])) { if (array_key_exists('sccmdb_password', $_POST)) { // Password must not be altered. @@ -44,19 +44,22 @@ } $PluginSccmConfig->update($_POST); - - $sccmDB = new PluginSccmSccmdb(); - if ($sccmDB->connect()) { - Session::addMessageAfterRedirect("Connexion réussie !.", false, INFO, false); - } else { - Session::addMessageAfterRedirect("Connexion incorrecte.", false, ERROR, false); + //test connection + $sccmDB = new PluginSccmSccmdb(); + $sccmDB->testConfiguration($_POST['id']); + Html::back(); +} else if (isset($_POST["add"])) { + if ($PluginSccmConfig->add($_POST)) { + if ($_SESSION['glpibackcreated']) { + Html::redirect($track->getLinkURL()); + } } - - Html::back(); +} else if (isset($_POST["purge"])) { + $PluginSccmConfig->delete($_POST, 1); + $PluginSccmConfig->redirectToList(); } -Html::header(__("Setup - SCCM", "sccm"), $_SERVER["PHP_SELF"], - "plugins", "sccm", "configuration"); -$PluginSccmConfig->showConfigForm($PluginSccmConfig); -Html::footer(); \ No newline at end of file +Html::header(PluginSccmConfig::getTypeName(), $_SERVER["PHP_SELF"], "config", PluginSccmMenu::class, "configuration"); +$PluginSccmConfig->display($_GET); +Html::footer(); diff --git a/front/config.php b/front/config.php new file mode 100644 index 0000000..6d720c8 --- /dev/null +++ b/front/config.php @@ -0,0 +1,36 @@ +. + * ------------------------------------------------------------------------- + * @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(); diff --git a/front/test.php b/front/test.php index 2223883..98c3c4c 100644 --- a/front/test.php +++ b/front/test.php @@ -94,7 +94,7 @@ function viewList() { global $PluginSccmSccm; - $PluginSccmSccm->getDevices(); + $PluginSccmSccm->getDevices(""); echo ""; foreach ($PluginSccmSccm->devices as $device_values) { @@ -106,7 +106,7 @@ function viewList() { function nbPcToInject() { global $PluginSccmSccm; - $PluginSccmSccm->getDevices(); + $PluginSccmSccm->getDevices(""); echo count($PluginSccmSccm->devices); } @@ -117,7 +117,7 @@ function testViewHtml($limit, $where) { $PluginSccmSccm->getDevices($where); foreach ($PluginSccmSccm->devices as $device_values) { - $PluginSccmSccmxml = new PluginSccmSccmxml($device_values); + $PluginSccmSccmxml = new PluginSccmSccmxml($PluginSccmSccm, $device_values); $PluginSccmSccmxml->setAccessLog(); $PluginSccmSccmxml->setAccountInfos(); @@ -128,7 +128,7 @@ function testViewHtml($limit, $where) { $PluginSccmSccmxml->setSoftwares(); $PluginSccmSccmxml->setUsers(); $PluginSccmSccmxml->setNetworks(); - $PluginSccmSccmxml->setDrives(); + $PluginSccmSccmxml->setStorages(); $SXML = $PluginSccmSccmxml->sxml; @@ -144,7 +144,7 @@ function testAdd($where) { $REP_XML = GLPI_PLUGIN_DOC_DIR.'/sccm/xml/'; foreach ($PluginSccmSccm->devices as $device_values) { - $PluginSccmSccmxml = new PluginSccmSccmxml($device_values); + $PluginSccmSccmxml = new PluginSccmSccmxml($PluginSccmSccm, $device_values); $PluginSccmSccmxml->setAccessLog(); $PluginSccmSccmxml->setAccountInfos(); @@ -155,7 +155,7 @@ function testAdd($where) { $PluginSccmSccmxml->setSoftwares(); $PluginSccmSccmxml->setUsers(); $PluginSccmSccmxml->setNetworks(); - $PluginSccmSccmxml->setDrives(); + $PluginSccmSccmxml->setStorages(); $SXML = $PluginSccmSccmxml->sxml; diff --git a/inc/config.class.php b/inc/config.class.php index 35f201b..0898270 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -36,6 +36,7 @@ class PluginSccmConfig extends CommonDBTM { static private $_instance = null; + public $dohistory = true; static function canCreate() { return Session::haveRight('config', UPDATE); @@ -49,27 +50,99 @@ static function canView() { return Session::haveRight('config', UPDATE); } + static function canPurge() { + return Session::haveRight('config', UPDATE); + } + static function getTypeName($nb = 0) { - return __("Setup - SCCM", "sccm"); + return __("SCCM", "sccm"); } function getName($with_comment = 0) { - return __("Interface - SCCM", "sccm"); + return __("Configuration", "sccm"); } 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; + } + + function getAllConfigurations() { + return getAllDataFromTable(self::getTable()); + } + + public function prepareInputForUpdate($input) { + return self::handleInput($input); + } - function prepareInputForUpdate($input) { + public function prepareInputForAdd($input) { + return self::handleInput($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"]); } @@ -81,6 +154,14 @@ function prepareInputForUpdate($input) { return $input; } + 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"); + } + static function install(Migration $migration) { global $CFG_GLPI, $DB; @@ -88,16 +169,21 @@ static function install(Migration $migration) { $default_collation = DBConnection::getDefaultCollation(); $default_key_sign = DBConnection::getDefaultPrimaryKeySignOption(); - $table = 'glpi_plugin_sccm_configs'; + $table = self::getTable(); if (!$DB->tableExists($table)) { + $migration->displayMessage("Installing SCCM plugin ..."); + $migration->displayMessage("Table not exists, creating ..."); + $query = "CREATE TABLE `". $table."`( - `id` int {$default_key_sign} NOT NULL, + `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', @@ -112,20 +198,33 @@ static function install(Migration $migration) { PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET={$default_charset} COLLATE={$default_collation} ROW_FORMAT=DYNAMIC;"; - $DB->queryOrDie($query, __("Error when using glpi_plugin_sccm_configs table.", "sccm") - . "
".$DB->error()); - - $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)"; + $DB->queryOrDie($query, $DB->error()); - $DB->queryOrDie($query, __("Error when using glpi_plugin_sccm_configs table.", "sccm") - . "
" . $DB->error()); + // Update display preferences + $migration->updateDisplayPrefs([PluginSccmConfig::class => [1, 2, 3, 4, 5, 6]]); } else { + $migration->displayMessage("Updating SCCM plugin ..."); + + // 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'); + // 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'"); $migration->migrationOneTable('glpi_plugin_sccm_configs'); @@ -153,23 +252,27 @@ 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'] + $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'], + ] ) - ], - [ - 'id' => 1, - ] - ) - ); + ); + } } $migration->addField("glpi_plugin_sccm_configs", "is_password_sodium_encrypted", "tinyint NOT NULL default '1'"); $migration->migrationOneTable('glpi_plugin_sccm_configs'); @@ -210,58 +313,86 @@ static function install(Migration $migration) { ] ); } + } return true; } - static function uninstall() { + /** @var \DBmysql $DB */ global $DB; - - if ($DB->tableExists('glpi_plugin_sccm_configs')) { - - $query = "DROP TABLE `glpi_plugin_sccm_configs`"; - $DB->queryOrDie($query, $DB->error()); + $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; } + static function searchUrl() { + global $CFG_GLPI; + return $CFG_GLPI['url_base'] . "/plugins/sccm/front/config.php";; + } + + function defineTabs($options = []) { + + $ong = []; + $this->addDefaultFormTab($ong); + $this->addStandardTab(__CLASS__, $ong, $options); + $this->addStandardTab('Log', $ong, $options); + return $ong; + } - static function showConfigForm($item) { + function showForm($ID, $options = []) { global $CFG_GLPI; - $config = self::getInstance(); + if (!$this->getFromDB($ID)) { + $this->getEmpty(); + } + + $this->initForm($ID, $options); + $this->showFormHeader($options); - $config->showFormHeader(); + echo ""; + echo "\n"; echo ""; echo "\n"; echo ""; echo "\n"; echo ""; echo "\n"; echo ""; echo "\n"; - $password = $config->getField('sccmdb_password'); + $password = $this->getField('sccmdb_password'); $password = Html::entities_deep((new GLPIKey())->decrypt($password)); echo ""; echo "\n"; + echo ""; + echo "\n"; + echo ""; echo "\n"; echo ""; echo "\n"; echo ""; echo "\n"; echo ""; echo "\n"; echo ""; echo "\n"; echo ""; echo "\n"; echo ""; echo "\n"; - $config->showFormButtons(['candel'=>false]); - + $this->showFormButtons($options); return false; } + public static function getIcon() { + return "fa-solid fa-dice-d20"; + } } diff --git a/inc/menu.class.php b/inc/menu.class.php index 5179dd7..c5b29d4 100644 --- a/inc/menu.class.php +++ b/inc/menu.class.php @@ -32,26 +32,23 @@ class PluginSccmMenu extends CommonGLPI { static function getTypeName($nb = 0) { - return __('SCCM Connector', 'sccm'); + return __('Menu', 'sccm'); } static function getMenuName() { - return __('SCCM Connector', 'sccm'); + return __('SCCM', 'sccm'); } static function getMenuContent() { - global $CFG_GLPI; - $menu = []; - $menu['title'] = self::getMenuName(); - $menu['page'] = '/' . Plugin::getWebDir('sccm', false) . '/front/config.form.php'; - - if (Session::haveRight('config', UPDATE)) { - - $menu['options']['model']['title'] = self::getTypeName(); - - } - + $menu = [ + 'title' => PluginSccmConfig::getMenuName(), + 'page' => PluginSccmConfig::getSearchURL(false), + 'icon' => PluginSccmConfig::getIcon(), + 'options' => [], + ]; + + $menu['links']['add'] = PluginSccmConfig::getFormURL(false); return $menu; } -} \ No newline at end of file +} diff --git a/inc/sccm.class.php b/inc/sccm.class.php index 4d8e500..c756901 100644 --- a/inc/sccm.class.php +++ b/inc/sccm.class.php @@ -39,6 +39,12 @@ class PluginSccmSccm { var $devices; + public PluginSccmSccmdb $sccmdb; + + public function __construct(PluginSccmSccmdb $sccmdb) { + $this->sccmdb = $sccmdb; + } + static function getTypeName($nb = 0) { return __('SCCM', 'sccm'); } @@ -47,15 +53,11 @@ function showHome() { echo __('Please, read the documentation before using that.', 'footprints'); } - function getDevices($where = 0, $limit = 99999999) { + function getDevices($collection_name, $where = 0, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } + $PluginSccmSccmdb = $this->sccmdb; - $query = self::getcomputerQuery(); + $query = self::getcomputerQuery($collection_name); if ($where!=0) { $query.= " WHERE csd.MachineID = '" . $where . "'"; @@ -74,19 +76,11 @@ function getDevices($where = 0, $limit = 99999999) { $i++; } - - $PluginSccmSccmdb->disconnect(); } function getDatas($type, $deviceid, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } - - $datas = []; + $PluginSccmSccmdb = $this->sccmdb; switch ($type) { case 'processors' : @@ -116,18 +110,12 @@ function getDatas($type, $deviceid, $limit = 99999999) { $i++; } - $PluginSccmSccmdb->disconnect(); - return $data; } function getNetwork($deviceid, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } + $PluginSccmSccmdb = $this->sccmdb; $query = "SELECT NeDa.IPAddress00 as \"ND-IpAddress\", NeDa.MACAddress00 as \"ND-MacAddress\", @@ -159,18 +147,12 @@ function getNetwork($deviceid, $limit = 99999999) { $i++; } - $PluginSccmSccmdb->disconnect(); - return $data; } function getSoftware($deviceid, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } + $PluginSccmSccmdb = $this->sccmdb; $query = "SELECT ArPd_64.DisplayName0 as \"ArPd-DisplayName\", ArPd_64.InstallDate0 as \"ArPd-InstallDate\", @@ -207,18 +189,12 @@ function getSoftware($deviceid, $limit = 99999999) { $i++; } - $PluginSccmSccmdb->disconnect(); - return $data; } function getMemories($deviceid, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } + $PluginSccmSccmdb = $this->sccmdb; $query = "SELECT Capacity0 as \"Mem-Capacity\", @@ -255,20 +231,14 @@ function getMemories($deviceid, $limit = 99999999) { $i++; } - $PluginSccmSccmdb->disconnect(); - return $data; } function getVideos($deviceid, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } + $PluginSccmSccmdb = $this->sccmdb; - $query = " + $query = " SELECT VideoProcessor0 as \"Vid-Chipset\", AdapterRAM0/1024 as \"Vid-Memory\", @@ -297,18 +267,12 @@ function getVideos($deviceid, $limit = 99999999) { $i++; } - $PluginSccmSccmdb->disconnect(); - - return $data; + return $data; } function getSounds($deviceid, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } + $PluginSccmSccmdb = $this->sccmdb; $query = " SELECT distinct @@ -335,18 +299,12 @@ function getSounds($deviceid, $limit = 99999999) { $i++; } - $PluginSccmSccmdb->disconnect(); - return $data; } function getStorages($deviceid, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } + $PluginSccmSccmdb = $this->sccmdb; $query = " SELECT @@ -382,18 +340,12 @@ function getStorages($deviceid, $limit = 99999999) { $i++; } - $PluginSccmSccmdb->disconnect(); - return $data; } function getMedias($deviceid, $limit = 99999999) { - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); - if (!$res) { - die; - } + $PluginSccmSccmdb = $this->sccmdb; $query = " SELECT distinct @@ -423,8 +375,6 @@ function getMedias($deviceid, $limit = 99999999) { $i++; } - $PluginSccmSccmdb->disconnect(); - return $data; } @@ -468,130 +418,189 @@ static function cronInfo($name) { if ($name == "SCCMPush") { return ['description' => __("Interface - SCCMPush", "sccm")]; } - } static function executeCollect($task) { ini_set('max_execution_time', 0); $retcode = -1; - $REP_XML = GLPI_PLUGIN_DOC_DIR.'/sccm/xml/'; - $PluginSccmConfig = new PluginSccmConfig(); - $PluginSccmConfig->getFromDB(1); + $configurations = $PluginSccmConfig->getAllConfigurations(); - $PluginSccmSccm = new PluginSccmSccm(); + if (empty($configurations)) + { + echo __("No SCCM configurations found.", "sccm"); + return $retcode; + } - if ($PluginSccmConfig->getField('active_sync') == 1) { + foreach ($configurations as $config) { - $PluginSccmSccm->getDevices(); - Toolbox::logInFile('sccm', "getDevices OK \n", true); + $configId = $config['id']; + Toolbox::logInFile('sccm', "Init Collect on ". $config['sccm_config_name'] ." \n", true); - Toolbox::logInFile('sccm', "Generate XML start : " - . count($PluginSccmSccm->devices) . " files\n", true); + $PluginSccmConfig->getFromDB($configId); - foreach ($PluginSccmSccm->devices as $device_values) { + $REP_XML = GLPI_PLUGIN_DOC_DIR.'/sccm/xml/'. $PluginSccmConfig->getField('id'); - $PluginSccmSccmxml = new PluginSccmSccmxml($device_values); + if (!is_dir($REP_XML)) { + mkdir($REP_XML); + } - $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(); + 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); - $SXML = $PluginSccmSccmxml->sxml; + Toolbox::logInFile('sccm', "Getting devices ... \n", true); + $PluginSccmSccm->getDevices($PluginSccmConfig->getField('sccm_collection_name')); + Toolbox::logInFile('sccm', "getDevices OK \n", true); - $SXML->asXML($REP_XML.$PluginSccmSccmxml->device_id.".ocs"); + if ($PluginSccmSccm->devices == null){ + Toolbox::logInFile('sccm', "Collect completed, no devices found.\n", true); + continue; + } - Toolbox::logInFile('sccm', "Collect OK for device - ".$PluginSccmSccmxml->device_id." \n", true); - $task->addVolume(1); - } - $retcode = 1; - Toolbox::logInFile('sccm', "Collect completed \n", true); + Toolbox::logInFile('sccm', "Generate XML start : " + . count($PluginSccmSccm->devices) . " files\n", true); + + foreach ($PluginSccmSccm->devices as $device_values) { + + $PluginSccmSccmxml = new PluginSccmSccmxml($PluginSccmSccm, $device_values); + + $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(); + + $SXML = $PluginSccmSccmxml->sxml; + + $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 { - echo __("Collect is disabled by configuration.", "sccm"); + } 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; } - 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 != ''"; + 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; } static function executePush($task) { global $CFG_GLPI; + $retcode = -1; - $PluginSccmSccmdb = new PluginSccmSccmdb(); - $res = $PluginSccmSccmdb->connect(); $PluginSccmConfig = new PluginSccmConfig(); - $PluginSccmConfig->getFromDB(1); - $retcode = -1; + $configurations = $PluginSccmConfig->getAllConfigurations(); + + if (empty($configurations)) + { + echo __("No SCCM configurations found.", "sccm"); + return $retcode; + } + + foreach ($configurations as $config) { + + 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) { - if ($res) { + if ($PluginSccmConfig->getField('active_sync') == 1) { - $query = self::getcomputerQuery(); + $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); @@ -666,15 +675,15 @@ static function executePush($task) { 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', "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 __("Push is disabled by configuration.", "sccm"); } return $retcode; diff --git a/inc/sccmdb.class.php b/inc/sccmdb.class.php index a13b936..b001c23 100644 --- a/inc/sccmdb.class.php +++ b/inc/sccmdb.class.php @@ -37,10 +37,19 @@ class PluginSccmSccmdb { var $dbconn; - function connect() { + 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); + } + } + + function connect($id) { $PluginSccmConfig = new PluginSccmConfig(); - $PluginSccmConfig->getFromDB(1); + $PluginSccmConfig->getFromDB($id); $host = $PluginSccmConfig->getField('sccmdb_host'); $dbname = $PluginSccmConfig->getField('sccmdb_dbname'); @@ -65,34 +74,26 @@ function connect() { return true; } - function disconnect() { - + public function disconnect() { sqlsrv_close($this->dbconn); - } - function exec_query($query) { - + public function exec_query($query) { $result = sqlsrv_query($this->dbconn, $query) or die('Query error : ' . print_r(sqlsrv_errors(), true)); if ($result == false) { die( FormatErrors( sqlsrv_errors())); } return $result; - } - function FormatErrors($errors) { - + public function FormatErrors($errors) { foreach ($errors as $error) { - $debug = ""; $state = "SQLSTATE: ".$error['SQLSTATE']; $code = "Code: ".$error['code']; $message = "Message: ".$error['message']; - - echo $state."
".$code."
".$message."
"; + echo $state . "
" . $code . "
" . $message . "
"; Toolbox::logInFile("sccm", $state.PHP_EOL.$code.PHP_EOL.$message.PHP_EOL); } - } } diff --git a/inc/sccmxml.class.php b/inc/sccmxml.class.php index 94ae02a..a5939ea 100644 --- a/inc/sccmxml.class.php +++ b/inc/sccmxml.class.php @@ -41,7 +41,11 @@ class PluginSccmSccmxml { var $agentbuildnumber; var $username; - function __construct($data) { + public PluginSccmSccm $sccm; + + function __construct(PluginSccmSccm $sccm, $data) { + + $this->sccm = $sccm; $plug = new Plugin(); $plug->getFromDBbyDir("sccm"); @@ -136,9 +140,6 @@ function setOS() { $OPERATINGSYSTEM->addChild('SERVICE_PACK', $this->data['OSD-CSDVersion']); } - - - function setBios() { $CONTENT = $this->sxml->CONTENT[0]; $CONTENT->addChild('BIOS'); @@ -172,12 +173,10 @@ function setBios() { function setProcessors() { - $PluginSccmSccm = new PluginSccmSccm(); - $cpukeys = []; $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($PluginSccmSccm->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]; @@ -198,11 +197,9 @@ function setProcessors() { function setSoftwares() { - $PluginSccmSccm = new PluginSccmSccm(); - $antivirus = []; $inject_antivirus = false; $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($PluginSccmSccm->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]; @@ -246,10 +243,8 @@ function setSoftwares() { } function setMemories() { - $PluginSccmSccm = new PluginSccmSccm(); - - $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($PluginSccmSccm->getMemories($this->device_id) as $value) { + $CONTENT = $this->sxml->CONTENT[0]; $i = 0; + foreach ($this->sccm->getMemories($this->device_id) as $value) { $CONTENT->addChild('MEMORIES'); $MEMORIES = $this->sxml->CONTENT[0]->MEMORIES[$i]; @@ -272,10 +267,8 @@ function setMemories() { } function setVideos() { - $PluginSccmSccm = new PluginSccmSccm(); - - $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($PluginSccmSccm->getVideos($this->device_id) as $value) { + $CONTENT = $this->sxml->CONTENT[0]; $i = 0; + foreach ($this->sccm->getVideos($this->device_id) as $value) { $CONTENT->addChild('VIDEOS'); $VIDEOS = $this->sxml->CONTENT[0]->VIDEOS[$i]; @@ -291,10 +284,8 @@ function setVideos() { } function setSounds() { - $PluginSccmSccm = new PluginSccmSccm(); - $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($PluginSccmSccm->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]; @@ -350,11 +341,9 @@ function determineNetworkType($network_description) { function setNetworks() { - $PluginSccmSccm = new PluginSccmSccm(); - $CONTENT = $this->sxml->CONTENT[0]; - $networks = $PluginSccmSccm->getNetwork($this->device_id); + $networks = $this->sccm->getNetwork($this->device_id); if (count($networks) > 0) { @@ -388,10 +377,9 @@ function setNetworks() { } function setStorages() { - $PluginSccmSccm = new PluginSccmSccm(); $CONTENT = $this->sxml->CONTENT[0]; $i = 0; - foreach ($PluginSccmSccm->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'); @@ -407,7 +395,7 @@ function setStorages() { } $i = 0; - foreach ($PluginSccmSccm->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/setup.php b/setup.php index 9b26604..ef19e6e 100644 --- a/setup.php +++ b/setup.php @@ -47,7 +47,7 @@ function plugin_init_sccm() { if ($plugin->isActivated("sccm") && Session::getLoginUserID()) { if (Session::haveRight("config", UPDATE)) { - $PLUGIN_HOOKS['config_page']['sccm'] = "front/config.form.php"; + $PLUGIN_HOOKS['config_page']['sccm'] = "front/config.php"; $PLUGIN_HOOKS["menu_toadd"]['sccm'] = ['config' => 'PluginSccmMenu']; } }
".__("SCCM configuration name", "sccm")." (Id: ".$this->getField('id').")"; + echo Html::input('sccm_config_name', ['value' => $this->getField('sccm_config_name')]); + echo "
".__("Enable SCCM synchronization", "sccm").""; - Dropdown::showYesNo("active_sync", $config->getField('active_sync')); + Dropdown::showYesNo("active_sync", $this->getField('active_sync')); echo "
".__("Server hostname (MSSQL)", "sccm").""; - echo Html::input('sccmdb_host', ['value' => $config->getField('sccmdb_host')]); + echo Html::input('sccmdb_host', ['value' => $this->getField('sccmdb_host')]); echo "
".__("Database name", "sccm").""; - echo Html::input('sccmdb_dbname', ['value' => $config->getField('sccmdb_dbname')]); + echo Html::input('sccmdb_dbname', ['value' => $this->getField('sccmdb_dbname')]); echo "
".__("Username", "sccm").""; - echo Html::input('sccmdb_user', ['value' => $config->getField('sccmdb_user')]); + echo Html::input('sccmdb_user', ['value' => $this->getField('sccmdb_user')]); echo "
".__("Password", "sccm").""; echo ""; echo "
".__("SCCM collection name", "sccm").""; + echo Html::input('sccm_collection_name', ['value' => $this->getField('sccm_collection_name')]); + echo "
".__("Inventory server base URL", "sccm").""; echo Html::input( @@ -269,47 +400,49 @@ static function showConfigForm($item) { [ 'type' => 'url', 'pattern' => 'https?://.+', - 'value' => $config->getField('inventory_server_url'), + 'value' => $this->getField('inventory_server_url'), 'placeholder' => $CFG_GLPI['url_base'], ] ); - $url = ($config->getField('inventory_server_url') ?: $CFG_GLPI['url_base']) . '/front/inventory.php'; + $url = ($this->getField('inventory_server_url') ?: $CFG_GLPI['url_base']) . '/front/inventory.php'; echo '' . $url . ''; echo "
".__("Verify SSL certificate", "sccm").""; - Dropdown::showYesNo("verify_ssl_cert", $config->getField('verify_ssl_cert')); + Dropdown::showYesNo("verify_ssl_cert", $this->getField('verify_ssl_cert')); echo "
".__("Use NLTM authentication", "sccm").""; - Dropdown::showYesNo("use_auth_ntlm", $config->getField('use_auth_ntlm')); + Dropdown::showYesNo("use_auth_ntlm", $this->getField('use_auth_ntlm')); echo "
".__("Send credentials to other hosts too", "sccm").""; - Dropdown::showYesNo("unrestricted_auth", $config->getField('unrestricted_auth')); + Dropdown::showYesNo("unrestricted_auth", $this->getField('unrestricted_auth')); echo "
".__("Use specific authentication information", "sccm").""; - Dropdown::showYesNo("use_auth_info", $config->getField('use_auth_info')); + Dropdown::showYesNo("use_auth_info", $this->getField('use_auth_info')); echo "
".__("Value for spécific authentication", "sccm").""; - echo Html::input('auth_info', ['value' => $config->getField('auth_info')]); + echo Html::input('auth_info', ['value' => $this->getField('auth_info')]); echo "
".__("Use LastHWScan as GLPI last inventory date", "sccm").""; - Dropdown::showYesNo("use_lasthwscan", $config->getField('use_lasthwscan')); + Dropdown::showYesNo("use_lasthwscan", $this->getField('use_lasthwscan')); echo "