3
3 балла

Большинство статей данного рода создаются мной в собственных интересах с целью сохранения информации, которая впоследствии может оказаться полезной. Возможно, эти материалы будут полезны не только мне…

Да, да, да, метод будет не самый изящный, но рабочий 🙂

Настройки LDAP каталоги

Переходим в Настройки > Аутентификация >LDAP каталоги , выбирай свой каталог и переходим на вкладку “Пользователи”.

В моем случае я задействовал поле “Комментарий” и прописал следующее:

[%{lastlogon}] - [%{lastlogontimestamp}]

Сохраняем.

Синхронизируем пользователя

Далее переходим в любого пользователя, вкладка “Синхронизация” и нажимаем “Принудительная синхронизация”.

Передаем данные "LastLogon" и "LastLogonTimestamp" из AD в GLPI

Проверяем данные

Обратно переходим на вкладку “Пользователь” и смотрим поле “Комментарий” приходят ли данные.

Передаем данные "LastLogon" и "LastLogonTimestamp" из AD в GLPI

Данные о дате/времени отображаются в “странном” формате.

Это 64-разрядное значение, представляющее количество 100-наносекундных интервалов, прошедших с 12:00 1 января 1601 г. в формате UTC.

Преобразование даты/времени в удобочитаемый формат

Для преобразования значения формата UTC в более удобочитаемый формат мы добавим свой скрипт.

В процессе написания скрипта была сложность с получением текстовой области:

<textarea class="form-control" id="comment" name="comment">[133385719246785393] - [133516024444364894]</textarea>

Дело в том что данные выводятся так же скриптами. Поэтому важно, чтобы наш скрипт загружался в конце, плюс установлен интервал, который будет периодически проверять наличие текстовой области.

Код скрипта будет следующий:

document.addEventListener("DOMContentLoaded", function() {
    // Устанавливаем интервал проверки каждые 500 миллисекунд
    var checkTextareaInterval = setInterval(checkTextarea, 500);

    function checkTextarea() {
        // Получаем текстовую область
        var textarea = document.getElementById('comment');

        // Проверяем существование текстовой области
        if (textarea) {
            // Отменяем интервал, так как текстовая область найдена
            clearInterval(checkTextareaInterval);

            // Вызываем функцию обработки дат в текстовой области
            handleDateDisplay(textarea);
        }
    }

    function handleDateDisplay(textarea) {
        // Получаем значение из текстовой области
        var commentValue = textarea.value;

        // Используем регулярное выражение для извлечения двух дат из строки
        var dateMatches = commentValue.match(/\[(.*?)\]/g);

        // Проверяем, что есть хотя бы два совпадения
        if (dateMatches && dateMatches.length >= 2) {
            // Преобразуем значения в числа
            var filetime1 = parseInt(dateMatches[0].replace(/\[|\]/g, ''));
            var filetime2 = parseInt(dateMatches[1].replace(/\[|\]/g, ''));

            // Обработка первой даты
            var formattedDateTime1 = formatDateTime(filetime1);

            // Обработка второй даты
            var formattedDateTime2 = formatDateTime(filetime2);

            // Заменяем значение в текстовой области на отформатированные даты
            textarea.value = "[" + formattedDateTime1 + "] - [" + formattedDateTime2 + "]";
        }
    }

    function formatDateTime(filetime) {
        // Разница в 100-наносекундных интервалах между 1601 годом и 1970 годом (началом эпохи Unix)
        var epochDiff = 116444736000000000;

        // Преобразование в секунды с учетом разницы в эпохах
        var timestamp = Math.floor((filetime - epochDiff) / 10000000);

        // Создаем объект Date
        var dateObject = new Date(timestamp * 1000);

        // Получаем отформатированную строку даты и времени
        return dateObject.toLocaleString();
    }
});

Доработки кода

В процессе написания статьи, возникла мысль. Что если потребуется выводить только одно значение… Да, в таком случае код не будет работать.

Доработанный код скрипта будет следующим:

document.addEventListener("DOMContentLoaded", function() {
    // Устанавливаем интервал проверки каждые 500 миллисекунд
    var checkTextareaInterval = setInterval(checkTextarea, 500);

    function checkTextarea() {
        // Получаем текстовую область
        var textarea = document.getElementById('comment');

        // Проверяем существование текстовой области
        if (textarea) {
            // Отменяем интервал, так как текстовая область найдена
            clearInterval(checkTextareaInterval);

            // Вызываем функцию обработки дат в текстовой области
            handleDateDisplay(textarea);
        }
    }

    function handleDateDisplay(textarea) {
        // Получаем значение из текстовой области
        var commentValue = textarea.value;

        // Используем регулярное выражение для извлечения всех дат из строки
        var dateMatches = commentValue.match(/\[(.*?)\]/g);

        // Проверяем, есть ли хотя бы одна дата
        if (dateMatches) {
            // Преобразуем значения в числа и обрабатываем каждую дату
            var formattedDates = dateMatches.map(function(match) {
                var filetime = parseInt(match.replace(/\[|\]/g, ''));
                return formatDateTime(filetime);
            });

            // Заменяем значение в текстовой области на отформатированные даты
            textarea.value = "[" + formattedDates.join("] - [") + "]";
        }
    }

    function formatDateTime(filetime) {
        // Разница в 100-наносекундных интервалах между 1601 годом и 1970 годом (началом эпохи Unix)
        var epochDiff = 116444736000000000;

        // Преобразование в секунды с учетом разницы в эпохах
        var timestamp = Math.floor((filetime - epochDiff) / 10000000);

        // Создаем объект Date
        var dateObject = new Date(timestamp * 1000);

        // Получаем отформатированную строку даты и времени
        return dateObject.toLocaleString();
    }
});

! Примечание

Если требуется вывести одно значение, то необходимо в настройках аутентификации (LDAP каталоги) указать:

[%{lastlogon}]

или

[%{lastlogontimestamp}]

Итог

Проверяем, данные должны быть следующего вида:

Передаем данные "LastLogon" и "LastLogonTimestamp" из AD в GLPI

или

Передаем данные "LastLogon" и "LastLogonTimestamp" из AD в GLPI

На этом все.


Нравится? Поделитесь с друзьями!

3
3 балла

Какова Ваша Реакция?

Конфуз Конфуз
0
Конфуз
Милый Милый
0
Милый
Черт Черт
0
Черт
Провал Провал
0
Провал
Забавно Забавно
0
Забавно
Зануда Зануда
0
Зануда
Хейт Хейт
0
Хейт
lol lol
0
lol
Лайк Лайк
1
Лайк
Любовь Любовь
0
Любовь
OMG OMG
0
OMG
Страшно Страшно
1
Страшно
Тошнота Тошнота
0
Тошнота
Победа Победа
0
Победа
WTF WTF
1
WTF
Счастье Счастье
0
Счастье
Дизлайк Дизлайк
0
Дизлайк
Ржака Ржака
0
Ржака
Пес

0 Комментариев

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Share via