OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

225_mdm_connections.sql

5 KB
-- ============================================================
-- MDM: mehrere Relution-Instanzen nebeneinander
-- ============================================================
-- Server-Adresse und Zugriffstoken lagen einmalig in `system_settings`; damit
-- war genau eine Instanz möglich. Wer mehrere Kunden oder Mandanten betreut,
-- braucht mehrere nebeneinander – jede mit eigenen Zugangsdaten, eigenen
-- Filtern und erkennbarer Herkunft am Gerät.
--
-- Der heikle Punkt ist dieselbe Stelle wie beim Verzeichnis: Der Abgleich
-- mustert Geräte aus, die er nicht mehr sieht. Ohne Eingrenzung auf die
-- Instanz würde bei zwei Anbindungen jeder Lauf die Geräte der jeweils
-- anderen ausmustern – lautlos, denn der Lauf meldet Erfolg. Deshalb trägt
-- jedes Gerät die Instanz, aus der es stammt.

CREATE TABLE IF NOT EXISTS `mdm_connections` (
    `id`            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name`          VARCHAR(120) NOT NULL COMMENT 'Erkennbarer Name, erscheint am Geraet',
    `type`          ENUM('relution') NOT NULL DEFAULT 'relution',
    `settings_json` TEXT         NULL COMMENT 'Adresse, Filter und Kategorien; Token darin verschluesselt',
    `enabled`       TINYINT(1)   NOT NULL DEFAULT 1,
    `sort_order`    INT          NOT NULL DEFAULT 0,
    `last_run_at`   DATETIME     NULL,
    `last_status`   ENUM('ok','error') NULL,
    `last_message`  VARCHAR(1000) NULL,
    `created_at`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    UNIQUE KEY `uq_mdmconn_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Herkunft am Geraet. NULL bleibt fuer alles, was nicht aus einer Relution-
-- Instanz stammt (von Hand angelegt, Intune, Inventaragent).
ALTER TABLE `assets`
    ADD COLUMN `mdm_connection_id` INT UNSIGNED NULL DEFAULT NULL
        COMMENT 'MDM-Instanz, aus der das Geraet stammt (NULL = keine)'
        AFTER `mdm_source`;

ALTER TABLE `assets`
    ADD INDEX `idx_assets_mdm_connection` (`mdm_connection_id`);

-- Die bestehende Instanz übernehmen. Anders als beim Verzeichnis stehen die
-- Einstellungen hier bereits in der Datenbank, die Übernahme läuft also
-- vollständig hier – ohne Zutun und ohne dass etwas neu einzutragen wäre.
-- Das Token wandert verschlüsselt mit, wie es ist.
--
-- `relution_platforms` und `relution_statuses` sind bereits JSON-Zeichenketten
-- und bleiben es: Der Abgleich liest sie unverändert weiter so.
INSERT IGNORE INTO `mdm_connections` (`name`, `type`, `enabled`, `sort_order`, `settings_json`)
SELECT 'Relution',
       'relution',
       CASE WHEN COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_sync_enabled'), '0') = '1'
            THEN 1 ELSE 0 END,
       1,
       JSON_OBJECT(
           'server_url',               COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_server_url'), ''),
           'access_token',             COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_access_token'), ''),
           'platforms',                COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_platforms'), '[]'),
           'platforms_all',            COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_platforms_all'), '0'),
           'statuses',                 COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_statuses'), '[]'),
           'default_category_id',      COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_default_category_id'), '0'),
           'decommission_missing',     COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_decommission_missing'), '0'),
           'category_smartphone',      COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_category_smartphone'), '0'),
           'category_tablet',          COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_category_tablet'), '0'),
           'category_other',           COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_category_other'), '0'),
           'decommission_grace_days',  COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_decommission_grace_days'), '0'),
           'decommission_max_percent', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_decommission_max_percent'), '20')
       )
  FROM DUAL
 WHERE EXISTS (
       SELECT 1 FROM `system_settings`
        WHERE `key` = 'relution_server_url' AND `value` <> ''
 );

-- Vorhandene Geräte der übernommenen Instanz zuordnen. Wirkt nur auf Zeilen
-- ohne Zuordnung; zu diesem Zeitpunkt gibt es höchstens eine Instanz.
UPDATE `assets` a
  JOIN `mdm_connections` c ON c.`type` = 'relution'
   SET a.`mdm_connection_id` = c.`id`
 WHERE a.`mdm_connection_id` IS NULL
   AND a.`mdm_source` = 'relution';