<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ложное срабатывание на SYS_PACKAGE_UPDATE]]></title><description><![CDATA[<p dir="auto">Добрый день!</p>
<p dir="auto">Обнаружил ложное срабатывание при опросе конфигурации через агента (2.2.2, Linux Centos 7)<br />
Решил проблему NXSL-фильтром на обработчике событий.</p>
<p dir="auto">Но ситуация в принципе не корректная.</p>
<p dir="auto">Причина в следующем.</p>
<p dir="auto">Опрос ПО и установленных пакетов идет через агента по System.InstalledProducts событию и в хендлере H_InstalledProducts()<br />
...<br />
        command = "/bin/rpm -qa --queryformat '@@@ #%{NAME}:%{ARCH}|%{VERSION}|%{VENDOR}|%{INSTALLTIME}|%{URL}|%{SUMMARY}\\n'";<br />
...</p>
<p dir="auto">Интересующая часть результата опроса:<br />
....<br />
@@@ #gpg-pubkey:(none)|f4a80eb5|(none)|1512394964|(none)|gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <a href="mailto:security@centos.org" rel="nofollow ugc">security@centos.org</a>)<br />
@@@ #gpg-pubkey:(none)|352c64e5|(none)|1512410575|(none)|gpg(Fedora EPEL (7) <a href="mailto:epel@fedoraproject.org" rel="nofollow ugc">epel@fedoraproject.org</a>)<br />
@@@ #gpg-pubkey:(none)|442df0f8|(none)|1512403038|(none)|gpg(PostgreSQL RPM Building Project <a href="mailto:pgsqlrpms-hackers@pgfoundry.org" rel="nofollow ugc">pgsqlrpms-hackers@pgfoundry.org</a>)<br />
.....</p>
<p dir="auto">Обработка полученного результата идет на сервере в Node::updateSoftwarePackages()<br />
...<br />
SoftwarePackage *pkg = SoftwarePackage::createFromTableRow(table, i);<br />
packages-&gt;add(pkg);<br />
...<br />
packages-&gt;sort(PackageNameComparator);</p>
<p dir="auto">Компаратор производит сравнение по имени пакета, но имена из примера выше одинаковые.</p>
<p dir="auto">static int PackageNameComparator(const SoftwarePackage *p1, const SoftwarePackage *p2)<br />
{<br />
   return _tcscmp((*p1)-&gt;getName(), (*p2)-&gt;getName());<br />
}</p>
<p dir="auto">В таких случаях хорошо бы сравнивать еще и по описанию, но метода для доступа к приватному полю в классе SoftwarePackage нет:</p>
<p dir="auto">class SoftwarePackage{<br />
...<br />
public:<br />
    ~SoftwarePackage();</p>
<p dir="auto">    void fillMessage(NXCPMessage *msg, UINT32 baseId) const;<br />
    const TCHAR *getName() const { return m_name; }<br />
    const TCHAR *getVersion() const { return m_version; }</p>
<p dir="auto">    static SoftwarePackage createFromTableRow(const Table table, int row);<br />
};</p>
<p dir="auto">Ложное срабатывание происходит при поиске:<br />
         SoftwarePackage *p = m_softwarePackages-&gt;get(i);<br />
         SoftwarePackage np = (SoftwarePackage )packages-&gt;find(p, PackageNameComparator);</p>
<p dir="auto">т.к. будет найден первый из имеющихся опрошенных пакетов при поиске по одинаковому ключу.</p>
<p dir="auto">Решение:</p>
<ol>
<li>Добавить методы в класс SoftwarePackage для доступа к описанию пакета.</li>
<li>В случае одинаковых имен пакетов в компараторе провести сравнение по описанию.</li>
</ol>
<p dir="auto">Также можно расширить запрос rpm на один столбец: %{Packager} и сравнивать не по описанию, а по %{Packager}-у, при этом необходимо будет расширить таблицу с сохраненными параметрами пакетов (аналогично и для deb-пакетов).</p>
]]></description><link>https://forum.netxms.org/topic/5421/ложное-срабатывание-на-sys_package_update</link><generator>RSS for Node</generator><lastBuildDate>Fri, 13 Nov 2026 16:17:52 GMT</lastBuildDate><atom:link href="https://forum.netxms.org/topic/5421.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Jan 2018 09:50:51 GMT</pubDate><ttl>60</ttl></channel></rss>