File.Time.Change() как тоже самое смотреть у папок?

Started by Akira, April 09, 2015, 09:36:21 AM

Previous topic - Next topic

Akira

У меня есть папка, где каждый день создаются подпапки и мне надо проверять, что самая новая подпапка не старее 1 дня.
Пробовал с File.Time.Change(), не получилось.

kozlov_ao

Насколько мне известно, только своим скриптом...

Akira

Quote from: kozlov_ao on April 13, 2015, 12:29:41 PM
Насколько мне известно, только своим скриптом...

Так и сделал в конечном итоге.
Но осадочек остался...

Victor Kirhenshtein

В 2.0-M5 добавуил параметр агента File.FolderCount - аналогичен File.Count, только считает папки, а не файлы. Теперь получить кол-во папок новее одного дня можно так:

File.FolderCount(C:\Install,*,0,,-86400)

возможность использования File.Time.Change() похоже зависит от операционки - на Windows меняется после создания подпапки.

hsvt

В продолжение https://www.netxms.org/forum/oe-oo/lmsenors/msg18643/#new

ExternalList = EtcFiles:/bin/ls /etc

Parametr:
File.Time.Change(/etc/{instance})

Listname:
EtcFiles

Script:
if ($1 == "/apache/httpd.conf")
{
return %(true, $1);
}
return false;


Как можно сделать, чтобы не плодить ExternalList на каждую нужную директорию в которой снимаются File.Time.Change ?

Пример выше работает, если в ExternalList указывать конкретно /bin/ls /etc/apache, то есть nxget дальше рекурсивно не видит, ну или как то несколько ls передавать в command ? Или может я не в том направлении смотрю и здесь нужен ExternalParametersProvider ?

Мне нужно в нескольких DCI instance (File.Time.Modify(*), File.Time.Change(*), File.Time.Access(*)) смотреть разные файлы в разных путях. /etc /home /usr/local и т.д. и нужный путь с файлом фильтровать в скрипте.

kozlov_ao

Тут вопросов к NX нет вообще..
Если хочется одним листом перекрыть всю файловую систему, то нужно что бы что-то передало в лист не просто список файлов, в файлы с полными путями до них. Например так:
find /*
Учтите, что эта команда вернет рекурсивно все файлы со всех разделов :)

тогда в настройках DCI будете использовать:
File.Time.Change({instance})

Но по мне, так лучше сделать несколько листов, чем загонять такой массив данных. Ну или как минимум фильтрануть нужно на входе.

Quoteздесь нужен ExternalParametersProvider
Если кол-во файлов может меняться - то не подойдет. Если оно постоянное, то может быть. Но я бы не стал.

hsvt

Quote from: kozlov_ao on December 18, 2015, 06:23:32 AM
Тут вопросов к NX нет вообще..
Если хочется одним листом перекрыть всю файловую систему, то нужно что бы что-то передало в лист не просто список файлов, в файлы с полными путями до них. Например так:
find /*
Учтите, что эта команда вернет рекурсивно все файлы со всех разделов :)

тогда в настройках DCI будете использовать:
File.Time.Change({instance})

Но по мне, так лучше сделать несколько листов, чем загонять такой массив данных. Ну или как минимум фильтрануть нужно на входе.

Quoteздесь нужен ExternalParametersProvider
Если кол-во файлов может меняться - то не подойдет. Если оно постоянное, то может быть. Но я бы не стал.

Да, уже подумал про find :))) с этим буду думать, может и листы "наплодю".

Я хоть убей не могу заставить в LastValues отображать нормальные разделители в дате (File.Last.Change) которая преобразуется из timestamp таким скриптом:

t = localtime($1);

return t->mday.t->mon+1.t->year.t->hour.t->min.t->sec;

//return t->mday.".".t->mon+1.".".t->year.".".t->hour.":".t->min.":".t->sec;


Вот в каком виде мне приходит дата: Time of last status change of file unbound.conf = 1712201519295

При этом если раскомментировать с разделителями и сделать Тест - ВСЁ ОК. Что я опять не так делаю, не пойму... и на скриншоте с красной стрелочкой он возвращает в G или в T, а хотелось бы тоже видеть там дату нормальную.


hsvt

Разобрался, у меня же должна быть String а не Integer.

hsvt

Quote from: kozlov_ao on December 18, 2015, 06:23:32 AM

Но по мне, так лучше сделать несколько листов, чем загонять такой массив данных. Ну или как минимум фильтрануть нужно на входе.

Несколько листов для нужной директории делать - опять плодить DCI instance (ведь TableList будут разные)? Я бы хотел в один DCI instance запихнуть любой нужный мне файл который я укажу в фильтре. И на каждый нужный сервер накладывать свой необходимый шаблон с нужными DCI instance и файлами.

ExternalList = EtcFiles:/bin/ls /etc/ && ls /etc/ssh вот такой костыль кстати не прокатывает :)

kozlov_ao

Ну почему же не прокатывает. Вот так все работает:
ExternalList = Test:/bin/ls -1  /etc/ && ls -1  /etc/ssh

Только вопрос: как передать полный путь в параметр? Вот так: File.Time.Change({instance})
Не получится, т.к. нужен полный путь, а ls его не даст.

Тогда уж используйте примерно такое: find /etc/ -maxdepth 1 && find /etc/ssh

hsvt

Теперь не могу с event разобраться DC_FILE_CHANGE.

File "%6" was changed (Parameter: %1; Threshold value: %3; Actual value: %4)

Custom data collection threshold event.
Parameters:
   1) Parameter name
   2) Item description
   3) Threshold value
   4) Actual value
   5) Data collection item ID
   6) Instance
   7) Repeat flag


На почту приходит в таком виде:

File "sshd_config" was changed (Parameter: File.Time.Change(/etc/ssh/sshd_config); Threshold value: 0; Actual value: 18446744073709551608)

Threshold сделал через Diff with previous value > greater then 0, может здесь что-то другое нужно? Нужно по идее сравнивать предыдущие значение и если изменилось то true;

Threshold value приходит правильный = 0, а вот что за число в Actual value не понятно.

hsvt

Сделал так в threshold script: return $1 == GetDCIValue($node, $dci->id);