<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tamkovich.com: Телеком/VoIP блог &#187; snmp</title>
	<atom:link href="http://tamkovich.com/tag/snmp/feed/" rel="self" type="application/rss+xml" />
	<link>http://tamkovich.com</link>
	<description>Телеком, ИТ и все все все</description>
	<lastBuildDate>Sun, 05 Sep 2010 14:15:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Расширение NET SNMP</title>
		<link>http://tamkovich.com/2009/10/custom-net-snmp/</link>
		<comments>http://tamkovich.com/2009/10/custom-net-snmp/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 12:18:51 +0000</pubDate>
		<dc:creator>sergee</dc:creator>
				<category><![CDATA[Мониторинг]]></category>
		<category><![CDATA[snmp]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=458</guid>
		<description><![CDATA[По умолчанию, агент NET-SNMP предоставляет доступ к огромному количеству параметров. Здесь и различные счётчики с интерфейсов, и загрузка процессора, памяти и объём с жесткого диска. Пакет lm_sensors добавляет показания различных датчиков &#8211; термометры, измерители оборотов и т.д. Зачастую, наибольший интерес представляет мониторинг нестандартного оборудования или программного обеспечения, поддержки для которого в NET SNMP нет. Самостоятельно [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
По умолчанию, агент NET-SNMP предоставляет доступ к огромному количеству параметров. Здесь и различные счётчики с интерфейсов, и загрузка процессора, памяти и объём с жесткого диска. Пакет lm_sensors добавляет показания различных датчиков &#8211; термометры, измерители оборотов и т.д. Зачастую, наибольший интерес представляет мониторинг нестандартного оборудования или программного обеспечения, поддержки для которого в NET SNMP нет.
</p>
<p align=justify>
Самостоятельно расширить NET SNMP можно несколькими способами
</p>
<p><span id="more-458"></span></p>
<h2>Создание сабагента AgentX (AgentX subagent)</h2>
<p align=justify>
Subagent это независимое приложение которое осуществляет обработку специфических параметров и предоставляет их SNMP агенту по протоколу AgentX (RFC 2741). Многие производители программного обеспечения, распространяют сабагент в комплекте со своим ПО, например Sybase предоставляет <a href=http://manuals.sybase.com/onlinebooks/group-asarc/srg1100e/snmpug/@Generic__BookView>SQL Server SNMP Subagent</a> вместе со своим сервером БД. Если сабагента нет, его можно создать самому. Проще всего сделать это с помощью библиотеки libnetsnmpagent (AgentX Library). Сгенерировать скелет агента можно с помощью программы mib2c, для этого надо иметь MIB файл, описывающий параметры которые нам предстоит мониторить. В состав пакета net-snmp входит скрипт net-snmp-config. Этот скрипт, запущенный с параметром &#8211;compile-subagent, позволяет легко скомпилировать вашу программу-сабагент.</p>
<pre>
% net-snmp-config --compile-subagent mysubagent nstAgentSubagentObject.c
generating the tmporary code file: netsnmptmp.12259.c
checking for init_nstAgentSubagentObject in nstAgentSubagentObject.c
init_nstAgentSubagentObject(void)
running: gcc  -Dlinux -I. -I/usr/local/include -o nstAgentSubagentObject
 netsnmptmp.12259.c  nstAgentSubagentObject.c -L/usr/local/lib
 -lnetsnmpagent -lnetsnmphelpers -lnetsnmpmibs -lnetsnmp
netsnmptmp.12259.c: In function `main':
netsnmptmp.12259.c:26: warning: implicit declaration
 of function `init_nstAgentSubagentObject'
removing the tmporary code file: netsnmptmp.12259.c
subagent program nstAgentSubagentObject created
</pre>
<p>В результате компиляции получится программа mysubagent. Эту программу следует запускать после старта snmpd. Для того что бы включить поддержку протокола AgentX в snmpd.conf следует добавить строку &laquo;master agentx&raquo;. Функционал сабагента, можно вынести в отдельную программу, а можно сделать частью вашей программы, как сделано, например, в <a href=http://tamkovich.com/asterisk/ >Asterisk</a>. Модуль, выполняющий функции сабагента в <a href=http://tamkovich.com/asterisk/ >Asterisk</a>, называется res_snmp.
</p>
<h2>Создание модуля DLO (Dynamically Loadable Object)</h2>
<p align=justify>
Другой вариант расширения net-snmp &#8211; написание модуля, который будет динамически подгружаться во время запуска snmpd. Данный подход имеет свои преимущества и недостатки. К преимуществам можно отнести: доступность всего API snmpd внутри модуля, возможность использовать общие конфигурационные файлы, отсутствие необходимости следить за порядком запуска приложений (сначала snmpd, затем сабагент). Самый явный недостаток &#8211; ошибки в модуле могут скомпрометировать весь сервис snmpd.
</p>
<p align=justify>
Модуль DLO это программа, скомпилированная как разделяемый объект (SO). Существует ряд требований, которые должна удовлетворять данная программа. В программе должны присутствовать функции:</p>

<div class="wp_syntax"><div class="code"><pre class="c c" style="font-family:monospace;"><span style="color: #993333;">void</span> init_nstAgentPluginObject <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p>и обратная ей</p>

<div class="wp_syntax"><div class="code"><pre class="c c" style="font-family:monospace;"><span style="color: #993333;">void</span> deinit_nstAgentPluginObject <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p>Эти функции вызываются автоматически после загрузки и перед выгрузкой модуля. nstAgentPluginObject &#8211; это имя загружаемого модуля, будет различаться от модуля к модулю. Загрузить модуль можно двумя способами: через командную строку -</p>
<pre>
snmpd -f -L -DnstAgentPluginObject,dlmod
</pre>
<p>Или же с помощью специальной записи в snmpd.conf</p>
<pre>
dlmod nstAgentPluginObject /path/to/nstAgentPluginObject.so
</pre>
<p>Здесь второе поле &#8211; имя модуля. Для того что бы snmpd мог загрузить модуль, имя модуля должно быть корректным (совпадать с именами функций init_ и deinit_)
</p>
<h2>Расширение SNMPD с помощью скриптов</h2>
<p align=justify >
Пожалуй, самый распространённый способ представления собственных данных через snmpd &#8211; расширение с помощью скриптов. Для подключения скрипта к snmpd, в файл snmpd.conf необходимо добавить следующую строку:</p>
<pre>
pass .1.3.6.1.4.1.2021.255 /bin/sh /usr/local/bin/passtest
</pre>
<p>Данная строка состоит из 3х полей. 1 поле &#8211; ключевое слово &laquo;pass&raquo;, оно указывает snmpd на то, что все запросы, адресованные к веткам входящим в указанное дерево, передавать внешней программе. 2ое поле позволяет указать дерево, контроль над которым мы передаём. 3е поле, это программа и её параметры. Внешняя программа может быть написана на любом языке &#8211; это не имеет никакого значения. Единственное требование, предъявляемое к программе, &#8211; возможность принимать параметры из командной строки, и выводить результаты на стандартный вывод в определённом формате. SNMPd передает программе 2 параметра, 1ый может принимать значения &laquo;-s&raquo; или &laquo;-n&raquo;. Параметр &laquo;-s&raquo; означает, что никаких действий предпринимать не надо, параметр &laquo;-n&raquo; говорит о том, что за ним следует запрашиваемый OID. Рассмотрим логику работы и формат вывода на примере shell скрипта passtest, распространяемого вместе с net-snmp.</p>

<div class="wp_syntax"><div class="code"><pre class="bash bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh -f</span>
&nbsp;
<span style="color: #007800;">PATH</span>=<span style="color: #007800;">$path</span>:<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ucb
&nbsp;
<span style="color: #007800;">PLACE</span>=<span style="color: #ff0000;">&quot;.1.3.6.1.4.1.2021.255&quot;</span>
<span style="color: #007800;">REQ</span>=<span style="color: #ff0000;">&quot;$2&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;$1&quot;</span> = <span style="color: #ff0000;">&quot;-s&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$*</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>passtest.log
  <span style="color: #7a0874; font-weight: bold;">exit</span> 0
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;$1&quot;</span> = <span style="color: #ff0000;">&quot;-n&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;$REQ&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
    <span style="color: #007800;">$PLACE</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>      <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.1 ;;
    <span style="color: #007800;">$PLACE</span>.1<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.2.1 ;;
    <span style="color: #007800;">$PLACE</span>.2.1<span style="color: #7a0874; font-weight: bold;">&#41;</span>  <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.2.2 ;;
    <span style="color: #007800;">$PLACE</span>.2.2<span style="color: #7a0874; font-weight: bold;">&#41;</span>  <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.3 ;;
    <span style="color: #007800;">$PLACE</span>.3<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.4 ;;
    <span style="color: #007800;">$PLACE</span>.4<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.5 ;;
    <span style="color: #007800;">$PLACE</span>.5<span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #007800;">RET</span>=<span style="color: #007800;">$PLACE</span>.6 ;;
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>           <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
  <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">else</span>
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;$REQ&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
    <span style="color: #007800;">$PLACE</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>    <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>         <span style="color: #007800;">RET</span>=<span style="color: #007800;">$REQ</span> ;;
  <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;$RET&quot;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;$RET&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
  <span style="color: #007800;">$PLACE</span>.1<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;string&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;life the universe and everything&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
  <span style="color: #007800;">$PLACE</span>.2.1<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;integer&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;42&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
  <span style="color: #007800;">$PLACE</span>.2.2<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;objectid&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;.1.3.6.1.4.42.42.42&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
  <span style="color: #007800;">$PLACE</span>.3<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;timeticks&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;363136200&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
  <span style="color: #007800;">$PLACE</span>.4<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;ipaddress&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;127.0.0.1&quot;</span> ;;
  <span style="color: #007800;">$PLACE</span>.5<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;counter&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;42&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
  <span style="color: #007800;">$PLACE</span>.6<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;gauge&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;42&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
  <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;string&quot;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;ack... $RET $REQ&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> 0 ;;
<span style="color: #000000; font-weight: bold;">esac</span></pre></div></div>

<p>Пример работы данного скрипта:</p>
<pre>
<b># /usr/local/bin/passtest -n .1.3.6.1.4.1.2021.255.1</b>
.1.3.6.1.4.1.2021.255.2.1
integer
42
</pre>
<p>Вывод скрипта, ожидаемый snmpd, состоит из 3х строк. Первая строка содержит следующий OID, причём она может содержать несуществующий, главное, что бы не зацикливалась. Вторая строка содержит тип возвращаемого значения, в нашем случае это integer (целое число), а всего возможно 7 типов: string, objectid, integer, timeticks, ipaddress, counter и gauge. Третья строка содержит значение, возвращенное для OID указанного при запуске скрипта. Расширение NET-SNMP с помощью внешних программ и директивы pass &#8211; самый простой и быстрый способ. Однако не стоит забывать об эффективности, для каждого отдельного OID, SNMPd вызовет указанный скрипт, такой подход может быть неприемлем для высоконагруженных систем.
</p>
<ul>
<li> <a href=http://net-snmp.sourceforge.net/wiki/index.php/TUT:Writing_a_Subagent >Tutorial: Writing a Subagent</a>
<li> <a href=http://openhpi.sourceforge.net/subagent-manual/c167.html >Understanding the sub-agent</a>
<li> <a href=http://net-snmp.sourceforge.net/wiki/index.php/TUT:Writing_a_Dynamically_Loadable_Object >Tutorial: Writing a Dynamically Loadable Object</a>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2009/10/custom-net-snmp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cisco SNMP &#8211; основные параметры</title>
		<link>http://tamkovich.com/2008/12/cisco-snmp-general-oids/</link>
		<comments>http://tamkovich.com/2008/12/cisco-snmp-general-oids/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 13:05:46 +0000</pubDate>
		<dc:creator>sergee</dc:creator>
				<category><![CDATA[Cisco]]></category>
		<category><![CDATA[snmp]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=174</guid>
		<description><![CDATA[Ключевой задачей в эксплуатации VoIP сети является её качественный мониторинг. Основным средством мониторинга, на сегодняшний день, является протокол SNMP. Оборудование Cisco поддерживает колоссальный набор параметров, доступных для чтения и записи через SNMP. Что бы не потеряться во всём этом многообразии, предлагаю файл-шпоргалку, содержащую список часто используемых OID. Cisco: Часто используемые SNMP OID-ы]]></description>
			<content:encoded><![CDATA[<p align=justify>
Ключевой задачей в эксплуатации VoIP сети является её качественный мониторинг. Основным средством мониторинга, на сегодняшний день, является протокол SNMP. Оборудование <a href=http://tamkovich.com/cisco/ >Cisco</a> поддерживает колоссальный набор параметров, доступных для чтения и записи через SNMP. Что бы не потеряться во всём этом многообразии, предлагаю файл-шпоргалку, содержащую список часто используемых OID.
</p>
<ul>
<li> <a href=/wp-content/uploads/2008/12/cisco_oids.txt>Cisco: Часто используемые SNMP OID-ы</a>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2008/12/cisco-snmp-general-oids/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
