<?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>IT and me</title>
	<atom:link href="http://www.it2k.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.it2k.ru</link>
	<description>Взгляд изнутри ...</description>
	<lastBuildDate>Thu, 24 Nov 2011 13:09:14 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Javascript определение ip адреса</title>
		<link>http://www.it2k.ru/2011/11/javascript-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-ip-%d0%b0%d0%b4%d1%80%d0%b5%d1%81%d0%b0/</link>
		<comments>http://www.it2k.ru/2011/11/javascript-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-ip-%d0%b0%d0%b4%d1%80%d0%b5%d1%81%d0%b0/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 13:06:51 +0000</pubDate>
		<dc:creator>Егор Зюскин</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.it2k.ru/?p=259</guid>
		<description><![CDATA[Определение ip адреса java скриптом как известно не получится. Но есть пара хитростей которые могут помочь. Я приведу один пример наиболее понравившейся мне. В шапку html кода вставляем следующее: &#60;script type=&#34;text/javascript&#34; src=&#34;http://localhost/user_info.js.php&#34;&#62;&#60;/script&#62; И в корень сервера на localhost ложем скрипт на php следующего содержания: &#60;?php &#160; /*отключаем кеширование*/ header&#40;&#34;Last-Modified: &#34;.gmdate&#40;&#34;D, d M Y H:i:s&#34;&#41;.&#34; GMT&#34;&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>Определение ip адреса java скриптом как известно не получится. Но есть пара хитростей которые могут помочь. Я приведу один пример наиболее понравившейся мне.</p>
<p>В шапку html кода вставляем следующее:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="xml"><span class="sc3"><span class="re1">&lt;script</span> <span class="re0">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="re0">src</span>=<span class="st0">&quot;http://localhost/user_info.js.php&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;/script<span class="re2">&gt;</span></span></span></pre></div></div>

<p></code></p>
<p>И в корень сервера на localhost ложем скрипт на php следующего содержания:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php"><span class="kw2">&lt;?php</span>
&nbsp;
<span class="coMULTI">/*отключаем кеширование*/</span>
<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Last-Modified: &quot;</span><span class="sy0">.</span><a href="http://www.php.net/gmdate"><span class="kw3">gmdate</span></a><span class="br0">&#40;</span><span class="st0">&quot;D, d M Y H:i:s&quot;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot; GMT&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: no-cache, must-revalidate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: post-check=0,pre-check=0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: max-age=0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Pragma: no-cache&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="coMULTI">/*Заголовок о том что это java script (необязательно) (для красоты)*/</span>
<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Content-type: text/javascript&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span>
&nbsp;
var glUserIpAdderss = &quot;<span class="sy1">&lt;?=</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REMOTE_ADDR'</span><span class="br0">&#93;</span><span class="sy0">;</span><span class="sy1">?&gt;</span>&quot;;
var glUSerLang      = &quot;<span class="sy1">&lt;?=</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_ACCEPT_LANGUAGE'</span><span class="br0">&#93;</span><span class="sy0">;</span><span class="sy1">?&gt;</span>&quot;;
var glUserAgent     = &quot;<span class="sy1">&lt;?=</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_USER_AGENT'</span><span class="br0">&#93;</span><span class="sy0">;</span><span class="sy1">?&gt;</span>&quot;;</pre></div></div>

<p></code></p>
<p>И теперь в js скриптах можно использовать переменные glUserIpAdderss, glUSerLang, glUserAgent. Только этими переменными фантазия не ограничивается, можно делать сложные выборки данных из БД и т.д.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it2k.ru/2011/11/javascript-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-ip-%d0%b0%d0%b4%d1%80%d0%b5%d1%81%d0%b0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mac mini микрофон</title>
		<link>http://www.it2k.ru/2011/11/mac-mini-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%84%d0%be%d0%bd/</link>
		<comments>http://www.it2k.ru/2011/11/mac-mini-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%84%d0%be%d0%bd/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 05:17:43 +0000</pubDate>
		<dc:creator>Егор Зюскин</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[mac mini]]></category>
		<category><![CDATA[микрофон]]></category>

		<guid isPermaLink="false">http://www.it2k.ru/?p=233</guid>
		<description><![CDATA[Как известно в mac mini нет входа для подключения внешнего микрофона и это создает массу проблем. Выход как всегда очевиден либо usb микрофон, либо bluetooth гарнитура или web камера с микрофоном. Но есть ещё и четвертый путь открывшийся мне совершенно случайно. Оказывается к mac mini можно подключить проводную гарнитуру от iphone и на ней микрофон [...]]]></description>
			<content:encoded><![CDATA[<p>Как известно в mac mini нет входа для подключения внешнего микрофона и это создает массу проблем.</p>
<p>Выход как всегда очевиден либо usb микрофон, либо bluetooth гарнитура или web камера с микрофоном. Но есть ещё и четвертый путь открывшийся мне совершенно случайно. Оказывается к mac mini можно подключить проводную гарнитуру от iphone и на ней микрофон работает на ура.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it2k.ru/2011/11/mac-mini-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%84%d0%be%d0%bd/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Как удалить Xcode?</title>
		<link>http://www.it2k.ru/2011/10/%d0%ba%d0%b0%d0%ba-%d1%83%d0%b4%d0%b0%d0%bb%d0%b8%d1%82%d1%8c-xcode/</link>
		<comments>http://www.it2k.ru/2011/10/%d0%ba%d0%b0%d0%ba-%d1%83%d0%b4%d0%b0%d0%bb%d0%b8%d1%82%d1%8c-xcode/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 12:06:21 +0000</pubDate>
		<dc:creator>Егор Зюскин</dc:creator>
				<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[mac os]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://www.it2k.ru/?p=225</guid>
		<description><![CDATA[Все очень просто: sudo /Developer/Library/uninstall-devtools –mode=all]]></description>
			<content:encoded><![CDATA[<p>Все очень просто:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="kw2">sudo</span> <span class="sy0">/</span>Developer<span class="sy0">/</span>Library<span class="sy0">/</span>uninstall-devtools –<span class="re2">mode</span>=all</pre></div></div>

<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.it2k.ru/2011/10/%d0%ba%d0%b0%d0%ba-%d1%83%d0%b4%d0%b0%d0%bb%d0%b8%d1%82%d1%8c-xcode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Developer Studio Mac OS</title>
		<link>http://www.it2k.ru/2011/10/oracle-developer-studio-mac-os/</link>
		<comments>http://www.it2k.ru/2011/10/oracle-developer-studio-mac-os/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 12:11:03 +0000</pubDate>
		<dc:creator>Егор Зюскин</dc:creator>
				<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[crossover]]></category>
		<category><![CDATA[mac os]]></category>
		<category><![CDATA[oracle developer studio]]></category>
		<category><![CDATA[wine]]></category>

		<guid isPermaLink="false">http://www.it2k.ru/?p=214</guid>
		<description><![CDATA[Для запуска Oracle Developer Studio на Mac os, нам понадобится wine или crossover. Все компоненты developer studio прекрасно работают под wine/crossover, а вот инсталлятор нет. При запуске инсталлятор проверяет систему на нужные ему параметры, такие как: место на жёстком диске, физическая память, файл подкачки и т.д. Дело в том, что в wine по умолчанию нет [...]]]></description>
			<content:encoded><![CDATA[<p>Для запуска Oracle Developer Studio на Mac os, нам понадобится wine или crossover.</p>
<p>Все компоненты developer studio прекрасно работают под wine/crossover, а вот инсталлятор нет. При запуске инсталлятор проверяет систему на нужные ему параметры, такие как: место на жёстком диске, физическая память, файл подкачки и т.д. Дело в том, что в wine по умолчанию нет файла подкачки, соответственно эту проблему приходится решать.</p>
<p>Для того чтоб wine/crossover, а соответственно и инсталлятор знал о существовании файла подкачки, ему нужно сказать об этом соответствующим параметром в реестре. Запускаем <code></p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="kw2">wine</span> regedit</pre></div></div>

<p></code> находим ветку: <code>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\MemoryManagement</code> и добавляем &laquo;мультистроковый&raquo; параметр с названием <code>PagingFiles</code> и значением <code>C:\pagefile.sys 768 1536</code>. Затем необходимо перезагрузить wine/crosover машину и запустить инсталлятор снова.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it2k.ru/2011/10/oracle-developer-studio-mac-os/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Переход на WordPress</title>
		<link>http://www.it2k.ru/2011/03/%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4-%d0%bd%d0%b0-wordpress/</link>
		<comments>http://www.it2k.ru/2011/03/%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4-%d0%bd%d0%b0-wordpress/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 17:21:10 +0000</pubDate>
		<dc:creator>Егор Зюскин</dc:creator>
				<category><![CDATA[Работа блога]]></category>
		<category><![CDATA[it2k]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.it2k.ru/wpres/?p=31</guid>
		<description><![CDATA[31.03.2011 дата начала перехода домена it2k.ru с самописного &#171;движка&#187; на бесплатный opensource &#171;движок&#187; WordPress. Причиной перехода стало отсутствие в старом &#171;движке&#187; скриптов для создания / редактирования статей. Дописывать нужный функционал, нет ни времени, ни особого желания. Нужно отдать должное старому &#171;движку&#187; &#8212; он отработал верой и правдой, c 2009 года ни разу не подвел. План перехода на [...]]]></description>
			<content:encoded><![CDATA[<p>31.03.2011 дата начала перехода домена it2k.ru с самописного &laquo;движка&raquo; на бесплатный opensource &laquo;движок&raquo; WordPress. Причиной перехода стало отсутствие в старом &laquo;движке&raquo; скриптов для создания / редактирования статей. Дописывать нужный функционал, нет ни времени, ни особого желания. Нужно отдать должное старому &laquo;движку&raquo; &#8212; он отработал верой и правдой, c 2009 года ни разу не подвел.</p>
<p>План перехода на WordPress:</p>
<ul>
<li><del>Русификация дизайна &#8212; необходимо найти и исправить как можно больше не русифицированных мест</del></li>
<li><del>Доработка дизайна &#8212; привидение к более удобному виду</del></li>
<li><del>Перенос проектов, как отдельных страниц</del></li>
<li><del>Перенос сервисов (точнее одного сервиса), также на страницы</del></li>
<li><del>Перенос в блог статей, написанных в разное время на разных блогах</del></li>
<li>Заимствование статей у друзей</li>
</ul>
<p>Ну вот мы и перешли на новый движок.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it2k.ru/2011/03/%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4-%d0%bd%d0%b0-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Управляем сервером посредством СМС</title>
		<link>http://www.it2k.ru/2011/02/%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80%d0%be%d0%bc-%d0%bf%d0%be%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be%d0%bc-%d1%81%d0%bc%d1%81/</link>
		<comments>http://www.it2k.ru/2011/02/%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80%d0%be%d0%bc-%d0%bf%d0%be%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be%d0%bc-%d1%81%d0%bc%d1%81/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 06:15:27 +0000</pubDate>
		<dc:creator>Егор Зюскин</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[e1550]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[smstools]]></category>
		<category><![CDATA[usb модем]]></category>
		<category><![CDATA[смс]]></category>

		<guid isPermaLink="false">http://www.it2k.ru/wpres/?p=169</guid>
		<description><![CDATA[Началось все с того, что я откопал в полке с железками USB модем huaweiE1550, купленный мной прошлым летом для организации резервного канала Интернет. Проработал он тогда недолго и за ненадобностью был убран в «закрома» до лучших времен. Первое что сделал, разлочил его для работы с МТС (так уж сложилось исторически, что я предпочитаю именно этого [...]]]></description>
			<content:encoded><![CDATA[<p>Началось все с того, что я откопал в полке с железками USB модем huaweiE1550, купленный мной прошлым летом для организации резервного канала Интернет. Проработал он тогда недолго и за ненадобностью был убран в «закрома» до лучших времен. Первое что сделал, разлочил его для работы с МТС (так уж сложилось исторически, что я предпочитаю именно этого оператора). Изначально в голову пришла идея отправки смс с предупреждениями от Nagios, вместо почты. Бегло пробежавшись по Интернетам, наткнулся на smsd демона для отправки/приемки смс-ок из пакета smstools. После прочтения документации по этому зверю, в голову пришла идея о том, что можно принимать сообщения с нужных телефонов, с командами для сервера. Так и родилась идея «Управлять сервером посредством СМС», которая может применяться для чего угодно: перезагрузить сервер, выключить его, перезапустить демона, сбросить кеш, открыть порт на фаерволе для удаленного подключения по ssh.<br />
<span id="more-169"></span></p>
<h4>Настраиваем модем</h4>
<p>Для начала необходимо подружить наш модем и Linux (кстати, я использую Centos 5.5). Втыкаем модем в один из свободных usb-портов. Первое, с чем приходится столкнуться, это то что модем определяется как CD-ROM, а с CD-ROM-а как известно смс-ки не отправишь и тем более не получишь. Для того чтоб это дело нам поправить, необходимо всего лишь скормить модему эту команду: <strong>AT^U2DIAG=0</strong> (0 – только modem, 1 – modem + cd-rom, 255 – modem + cd-rom + cardreader, 256 – modem + cardreader). Если у вас есть под рукой компьютер, с установленной Windows, то открывайте HyperTerminal, подключайтесь к модему, вводите команду: <strong>AT^U2DIAG=0</strong> и пропускайте следующий шаг.</p>
<p>Итак, заставляем модем быть модемом, а не каким-то CD-ROM-ом под Linux. Для начала необходимо поставить пакеты <span style="text-decoration: underline;">usb_modeswitch</span> и <span style="text-decoration: underline;">minicom</span></p>

<div class="wp_syntax"><div class="code"><pre class="bash">yum <span class="re5">--enablerepo</span>=rpmforge <span class="kw2">install</span> usb_modeswitch minicom</pre></div></div>

<p>, затем создаем/правим <strong>/etc/usb-modeswitch.conf</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="text">DefaultVendor = 0x12d1
DefaultProduct = 0x1446
MessageEndPoint = &quot;0x01&quot;
MessageContent = &quot;55534243000000000000000000000011060000000000000000000000000000&quot;</pre></div></div>

<p>И перетыкаем модем в другой порт, необходимо подождать 5-10 секунд (необходимо чтоб модем определился как CD-ROM) и от root-а запускаем <code>usb_modeswitch</code> и видим примерно следующие:</p>

<div class="wp_syntax"><div class="code"><pre class="text">Looking for target devices ...
No devices in target mode or class found
Looking for default devices ...
Found default devices (1)
Accessing device 004 on bus 007 ...
Using endpoints 0x01 (out) and 0x81 (in)
Inquiring device details; driver will be detached ...
Looking for active driver ...
OK, driver found (&quot;usb-storage&quot;)
OK, driver &quot;usb-storage&quot; detached</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="text">SCSI inquiry data (for identification)
-------------------------
Vendor String: HUAWEI
Model String: Mass Storage
Revision String: 2.31
-------------------------
&nbsp;
&lt;code&gt;USB description data (for identification)
-------------------------
Manufacturer: HUAWEI Technology
Product: HUAWEI Mobile
Serial No.: not provided
-------------------------
Setting up communication with interface 0 ...
Trying to send the message to endpoint 0x01 ...
OK, message successfully sent
Device is gone, skipping any further commands
-&amp;gt; Run lsusb to note any changes. Bye.&lt;/code&gt;</pre></div></div>

<p><code>Должны появится новые устройства ttyUSB</code></p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="kw2">ls</span> <span class="sy0">/</span>dev <span class="sy0">|</span> <span class="kw2">grep</span> ttyUSB:
ttyUSB0
ttyUSB1
ttyUSB2</pre></div></div>

<p>Запускаем <code>minicom –s</code> настраиваем последовательный порт на работу с /dev/ttyUSB0,<br />
Выходим из настроек, запускается терминал, затем необходимо отдать команду <strong>AT^U2DIAG=0</strong> и получить в ответ <strong>ok</strong></p>
<p>Процедура превращения модема в модем закончена, преступаем к установке/настройке smstools.<br />
<span style="font-weight: bold;">Smstools</span><br />
Как ни странно, в огромных репозитариях rpmforge не нашлось места такому наиполезнейшему пакету как smstools. Но не беда, на просторах Интернета и на <a href="http://smstools3.kekekasvi.com/">сайте производителя</a> её достаточно. Я нашел пакет: smstools-3.0.10-4.el5.i386.rpm и «воспользовался» им rpm –i smstools-3.0.10-4.el5.i386.rpm. Настраиваем smstools, файл <strong>/etc/sms.conf</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="text">devices = huaweiE1550
logfile = /var/log/smsd.log
loglevel = 2
&nbsp;
[huaweiE1550]
device = /dev/ttyUSB0
baudrate = 115200
rtscts = no
init = at+cpms=&quot;sm&quot;,&quot;sm&quot;,&quot;&quot;
incoming = yes
incoming = high</pre></div></div>

<p>настройки примерно понятные, запускаем демона, <code>service smsd start</code> и проверяем сие чудо: <code>smssend 9128141111 ‘test message’</code> (не понимает кириллицу, необходимо конвертировать в <a href="http://en.wikipedia.org/wiki/UTF-16/UCS-2">UCS-2BE</a>, в рамках этой статьи рассматривать не буду) и ждать смс-ки на мобильник. Если заветное сообщение не пришло, ставим в конфиге <strong>loglevel = 7</strong> и идем за бубном. У меня поднялось все с первого раза.<br />
<span style="font-weight: bold;">smsctrl daemon</span><br />
Итак разговаривать мы умеем, необходимо научиться слушать!<br />
Если отправить смс-ку на номер симки в модеме, через некоторое время smsd создаст файл в /var/spool/sms/incoming/huaweiE1550.* примерно следующего содержания:</p>

<div class="wp_syntax"><div class="code"><pre class="text">From: 79128141111
From_TOA: 91 international, ISDN/telephone
From_SMSC: 79126313431
Sent: 11-03-02 08:05:46
Received: 11-03-02 08:08:09
Subject: huaweiE1550
IMSI: 2500XXXXXXXXXXX
Report: no
Alphabet: ISO
UDH: false
&nbsp;
Test message</pre></div></div>

<p>Соответственно эти файлики мы и будем проверять на наличие команд для управления сервером. Для этого два способа 1-й небольшой демон на bash-е, 2-й встроеный обработчик событий в smsd.</p>
<h5>1-й способ</h5>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="co0">#!/bin/sh</span>
<span class="co0"># SMSCtrl</span>
<span class="co0"># chkconfig: - 55 45</span>
<span class="co0"># description: Sms control, Egor N. Zuskin, 2011, http://www.it2k.ru/projects/smsctrl</span>
&nbsp;
. <span class="sy0">/</span>etc<span class="sy0">/</span>rc.d<span class="sy0">/</span>init.d<span class="sy0">/</span>functions
&nbsp;
<span class="re2">DAEMON</span>=smsctrl
<span class="re2">REFRESH_TIME</span>=<span class="nu0">15</span>
&nbsp;
<span class="re2">COMMAND_CHAR</span>=<span class="st0">&quot;#&quot;</span>
<span class="re2">INCOMING_DIR</span>=<span class="sy0">/</span>var<span class="sy0">/</span>spool<span class="sy0">/</span>sms<span class="sy0">/</span>incoming
<span class="re2">ALLOW_PHONES</span>=<span class="st0">&quot;79128141111 79128141112&quot;</span>
<span class="re2">SEND_BACK_REPORT</span>=YES
&nbsp;
to_log<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="re2">text</span>=<span class="re4">$1</span>
        <span class="kw3">export</span> <span class="re2">LANG</span>=en_EN
        <span class="re2">log_date</span>=<span class="sy0">`</span><span class="kw2">date</span> <span class="st0">&quot;+%b %d %H:%M:%S &quot;</span><span class="sy0">`</span>
        <span class="re2">log_host</span>=<span class="sy0">`</span><span class="kw2">hostname</span> -s<span class="sy0">`</span>
        <span class="kw3">echo</span> <span class="st0">&quot;<span class="es2">$log_date</span> <span class="es2">$log_host</span> <span class="es2">$DAEMON</span>: <span class="es2">$text</span>&quot;</span> <span class="sy0">&amp;</span>gt;<span class="sy0">&amp;</span>gt; <span class="sy0">/</span>var<span class="sy0">/</span>log<span class="sy0">/</span><span class="re1">$DAEMON</span>.log
<span class="br0">&#125;</span>
&nbsp;
start<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw3">echo</span> <span class="re5">-n</span> <span class="st0">&quot;Starting <span class="es2">$DAEMON</span>: &quot;</span>
        <span class="re4">$0</span> <span class="re5">--daemon</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; success <span class="sy0">||</span> failure
        <span class="re2">RETVAL</span>=<span class="re4">$?</span>
        <span class="kw3">echo</span>
        <span class="br0">&#91;</span> <span class="re1">$RETVAL</span> = <span class="nu0">0</span> <span class="br0">&#93;</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; <span class="kw2">touch</span> <span class="sy0">/</span>var<span class="sy0">/</span>lock<span class="sy0">/</span>subsys<span class="sy0">/</span><span class="re1">$DAEMON</span>
        to_log <span class="st0">&quot;Starting ...&quot;</span>
        <span class="kw3">return</span> <span class="re1">$RETVAL</span>
<span class="br0">&#125;</span>
&nbsp;
stop<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="co0"># Stop daemon.</span>
        <span class="kw3">echo</span> <span class="re5">-n</span> <span class="st0">&quot;Shutting down <span class="es2">$DAEMON</span>: &quot;</span>
        killproc <span class="re4">$0</span>
        <span class="re2">RETVAL</span>=<span class="re4">$?</span>
        to_log <span class="st0">&quot;Stopping ...&quot;</span>
        <span class="kw3">echo</span>
        <span class="br0">&#91;</span> <span class="re1">$RETVAL</span> = <span class="nu0">0</span> <span class="br0">&#93;</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; <span class="kw2">rm</span> <span class="re5">-f</span> <span class="sy0">/</span>var<span class="sy0">/</span>lock<span class="sy0">/</span>subsys<span class="sy0">/</span><span class="re1">$DAEMON</span>
<span class="br0">&#125;</span>
&nbsp;
run<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">for</span> File <span class="kw1">in</span> $<span class="br0">&#40;</span><span class="kw2">ls</span> <span class="re1">$INCOMING_DIR</span><span class="br0">&#41;</span>; <span class="kw1">do</span>
        <span class="re2">Allow</span>=<span class="nu0">0</span>
        <span class="kw1">for</span> Phone <span class="kw1">in</span> <span class="re1">$ALLOW_PHONES</span>; <span class="kw1">do</span>
            <span class="kw2">cat</span> <span class="re1">$INCOMING_DIR</span><span class="sy0">/</span><span class="re1">$File</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;From: <span class="es2">$Phone</span>&quot;</span> <span class="sy0">&amp;</span>gt; <span class="sy0">/</span>dev<span class="sy0">/</span>null <span class="nu0">2</span><span class="sy0">&amp;</span>gt;<span class="sy0">&amp;</span>amp;<span class="nu0">1</span>
            <span class="br0">&#91;</span> <span class="re4">$?</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">&#93;</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; <span class="re2">Allow</span>=<span class="nu0">1</span>
        <span class="kw1">done</span>;
        <span class="br0">&#91;</span> <span class="re1">$Allow</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">&#93;</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; <span class="kw3">continue</span>
&nbsp;
        <span class="kw2">cat</span> <span class="re1">$INCOMING_DIR</span><span class="sy0">/</span><span class="re1">$File</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;<span class="es2">$COMMAND_CHAR</span>&quot;</span>
        <span class="br0">&#91;</span> <span class="re4">$?</span> <span class="re5">-ne</span> <span class="nu0">0</span> <span class="br0">&#93;</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; <span class="kw3">continue</span>
&nbsp;
        <span class="re2">FromPhone</span>=<span class="sy0">`</span><span class="kw2">cat</span> <span class="re1">$INCOMING_DIR</span><span class="sy0">/</span><span class="re1">$File</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;From:&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> <span class="re5">-d</span> <span class="st0">&quot; &quot;</span> -f2<span class="sy0">`</span>
&nbsp;
        <span class="re2">command</span>=<span class="sy0">`</span><span class="kw2">cat</span> <span class="re1">$INCOMING_DIR</span><span class="sy0">/</span><span class="re1">$File</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;<span class="es2">$COMMAND_CHAR</span>&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> <span class="re5">-d</span> <span class="st0">&quot;<span class="es2">$COMMAND_CHAR</span>&quot;</span> -f2<span class="sy0">`</span>
        to_log <span class="st0">&quot;Incoming command: <span class="es2">$command</span> from <span class="es2">$FromPhone</span>&quot;</span>
        <span class="re2">out</span>=<span class="sy0">`</span><span class="re1">$command</span><span class="sy0">`</span>
&nbsp;
        <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="st0">&quot;<span class="es2">$SEND_BACK_REPORT</span>&quot;</span> = <span class="st0">&quot;YES&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span>
            smssend <span class="re1">$FromPhone</span> <span class="st0">&quot;<span class="es2">$out</span>&quot;</span>
            to_log <span class="st0">&quot;Send sms to <span class="es2">$FromPhone</span>: <span class="es2">$out</span>&quot;</span>
        <span class="kw1">fi</span>
        <span class="kw2">rm</span> <span class="re5">-f</span> <span class="re1">$INCOMING_DIR</span><span class="sy0">/</span><span class="re1">$File</span>
        to_log <span class="st0">&quot;Deleting file <span class="es2">$INCOMING_DIR</span>/<span class="es2">$File</span>&quot;</span>
    <span class="kw1">done</span>
<span class="br0">&#125;</span>
&nbsp;
daemon<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw3">exec</span> <span class="sy0">&amp;</span>gt;<span class="sy0">/</span>dev<span class="sy0">/</span>null
        <span class="kw3">exec</span> <span class="nu0">2</span><span class="sy0">&amp;</span>gt;<span class="sy0">/</span>dev<span class="sy0">/</span>null
        <span class="br0">&#40;</span>
        <span class="kw3">trap</span> <span class="st0">&quot;&quot;</span> TERM
        <span class="kw1">while</span> <span class="br0">&#91;</span> <span class="kw2">true</span> <span class="br0">&#93;</span>; <span class="kw1">do</span>
            run
            <span class="kw2">sleep</span> <span class="re1">$REFRESH_TIME</span>;
        <span class="kw1">done</span>;
        <span class="br0">&#41;</span><span class="sy0">&amp;</span>amp;
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">case</span> <span class="st0">&quot;$1&quot;</span> <span class="kw1">in</span>
    --daemon<span class="br0">&#41;</span>
          daemon
          <span class="sy0">;;</span>
    run<span class="br0">&#41;</span>
          run
          <span class="sy0">;;</span>
    start<span class="br0">&#41;</span>
          start
          <span class="sy0">;;</span>
    stop<span class="br0">&#41;</span>
          stop
          <span class="sy0">;;</span>
    restart<span class="br0">&#41;</span>
          <span class="re4">$0</span> stop
          <span class="re4">$0</span> start
          <span class="kw3">exit</span> <span class="re4">$?</span>
          <span class="sy0">;;</span>
    status<span class="br0">&#41;</span>
          status <span class="re1">$DAEMON</span>
          <span class="kw3">echo</span>
          <span class="sy0">;;</span>
    <span class="sy0">*</span><span class="br0">&#41;</span>
          <span class="kw3">echo</span> <span class="st0">&quot;Usage: <span class="es2">$DAEMON</span> {start|stop|restart|status|run}&quot;</span>
          <span class="kw3">exit</span> <span class="nu0">1</span>
  <span class="kw1">esac</span>
&nbsp;
  <span class="kw3">exit</span> <span class="nu0">0</span></pre></div></div>

<p><code>COMMAND_CHAR="#" – Признак команды<br />
INCOMING_DIR=/var/spool/sms/incoming – Директория для входящих смс-ок<br />
ALLOW_PHONES="79128141111 79128141112" – Номера с которых разрешены команды<br />
SEND_BACK_REPORT=YES – Отправлять вывод смс-ой обратно</code></p>
<p>Чтобы не заморачиваться всякими пас фразами и т.д. было принято решение принимать команды только от определенных номеров (не проверял как будут выглядеть смс-ки от подменных номеров) и делать проверку на наличие спец символа перед командой, дабы отгородить от случайной смс-ки.</p>
<p>Сохраняем демона в <strong>/etc/init.d/smsctrl</strong>, <code>chkconfig --add smsctrl</code>, <code>service smsctrl start</code><br />
<span style="font-weight: bold;">2-й способ</span></p>
<p>Дописываем в <strong>/etc/smsd.conf</strong>:<br />
<code>eventhandler = /root/bin/sms_event.sh</code><br />
создаем <strong>/root/bin/sms_events.sh</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="co0">#!/bin/bash</span>
&nbsp;
<span class="re2">COMMAND_CHAR</span>=<span class="st0">&quot;#&quot;</span>
<span class="re2">ALLOW_PHONES</span>=<span class="st0">&quot;79128141111 79128141112&quot;</span>
<span class="re2">SEND_BACK_REPORT</span>=YES
&nbsp;
<span class="br0">&#91;</span> <span class="st0">&quot;$1&quot;</span> = <span class="st0">&quot;RECEIVED&quot;</span> <span class="br0">&#93;</span> <span class="sy0">||</span> <span class="kw3">exit</span> <span class="nu0">0</span>
&nbsp;
to_log<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="re2">text</span>=<span class="re4">$1</span>
    <span class="kw3">export</span> <span class="re2">LANG</span>=en_EN
    <span class="re2">log_date</span>=<span class="sy0">`</span><span class="kw2">date</span> <span class="st0">&quot;+%b %d %H:%M:%S &quot;</span><span class="sy0">`</span>
    <span class="re2">log_host</span>=<span class="sy0">`</span><span class="kw2">hostname</span> -s<span class="sy0">`</span>
    <span class="kw3">echo</span> <span class="st0">&quot;<span class="es2">$log_date</span> <span class="es2">$log_host</span> <span class="es2">$text</span>&quot;</span> <span class="sy0">&amp;</span>gt;<span class="sy0">&amp;</span>gt; <span class="sy0">/</span>var<span class="sy0">/</span>log<span class="sy0">/</span>smsctrl.log
<span class="br0">&#125;</span>
&nbsp;
<span class="re2">File</span>=<span class="re4">$2</span>
&nbsp;
<span class="re2">Allow</span>=<span class="nu0">0</span>
<span class="kw1">for</span> Phone <span class="kw1">in</span> <span class="re1">$ALLOW_PHONES</span>; <span class="kw1">do</span>
    <span class="kw2">cat</span> <span class="re1">$File</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;From: <span class="es2">$Phone</span>&quot;</span> <span class="sy0">&amp;</span>gt; <span class="sy0">/</span>dev<span class="sy0">/</span>null <span class="nu0">2</span><span class="sy0">&amp;</span>gt;<span class="sy0">&amp;</span>amp;<span class="nu0">1</span>
    <span class="br0">&#91;</span> <span class="re4">$?</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">&#93;</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; <span class="re2">Allow</span>=<span class="nu0">1</span>
<span class="kw1">done</span>;
&nbsp;
<span class="br0">&#91;</span> <span class="re1">$Allow</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">&#93;</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; <span class="kw3">exit</span> <span class="nu0">0</span>
&nbsp;
<span class="kw2">cat</span> <span class="re1">$INCOMING_DIR</span><span class="sy0">/</span><span class="re1">$File</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;<span class="es2">$COMMAND_CHAR</span>&quot;</span>
<span class="br0">&#91;</span> <span class="re4">$?</span> <span class="re5">-ne</span> <span class="nu0">0</span> <span class="br0">&#93;</span> <span class="sy0">&amp;</span>amp;<span class="sy0">&amp;</span>amp; <span class="kw3">exit</span> <span class="nu0">0</span>
&nbsp;
<span class="re2">FromPhone</span>=<span class="sy0">`</span><span class="kw2">cat</span> <span class="re1">$File</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;From:&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> <span class="re5">-d</span> <span class="st0">&quot; &quot;</span> -f2<span class="sy0">`</span>
&nbsp;
<span class="re2">command</span>=<span class="sy0">`</span><span class="kw2">cat</span> <span class="re1">$File</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;<span class="es2">$COMMAND_CHAR</span>&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> <span class="re5">-d</span> <span class="st0">&quot;<span class="es2">$COMMAND_CHAR</span>&quot;</span> -f2<span class="sy0">`</span>
to_log <span class="st0">&quot;Incoming command: <span class="es2">$command</span> from <span class="es2">$FromPhone</span>&quot;</span>
<span class="re2">out</span>=<span class="sy0">`</span><span class="re1">$command</span><span class="sy0">`</span>
&nbsp;
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="st0">&quot;<span class="es2">$SEND_BACK_REPORT</span>&quot;</span> = <span class="st0">&quot;YES&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span>
    smssend <span class="re1">$FromPhone</span> <span class="st0">&quot;<span class="es2">$out</span>&quot;</span>
    to_log <span class="st0">&quot;Send sms to <span class="es2">$FromPhone</span>: <span class="es2">$out</span>&quot;</span>
<span class="kw1">fi</span>
<span class="kw2">rm</span> <span class="re5">-f</span> <span class="re1">$File</span>
to_log <span class="st0">&quot;Deleting file <span class="es2">$File</span>&quot;</span></pre></div></div>

<h4>Проверка</h4>
<p>Создаем файлик <strong>/root/bin/test.sh</strong> следующего содержания:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="co0">#!/bin/bash</span>
&nbsp;
<span class="kw2">ls</span> –la <span class="sy0">/</span>etc <span class="sy0">|</span> <span class="kw2">grep</span> <span class="re4">$1</span></pre></div></div>

<p>Затем берем в руки телефон и посылаем смс с текстом <code>#/root/bin/test.sh sms</code> на заветный номер и смотрим в лог <code>tail –f /var/log/smsctrl.log</code>, если все хорошо — в ответ прилетит смс-ка вида: <code>smsd.conf</code><br />
<span style="font-weight: bold;">Заключение</span><br />
У меня данное решение, по смс-ке открывает ssh порт для входящих подключений. Я думаю, это не единственное применение, достаточно включить немного воображения.</p>
<p>Полезные ссылки для настройки huaweiE1550 и smsd<br />
1: <a href="http://www.lissyara.su/articles/freebsd/programms/smstools_3/">SMSTools 3 — шлюз для отправки SMS</a><br />
2: <a href="http://forum.lissyara.su/viewtopic.php?f=14&amp;t=27612">Нужна статья про смс-центр с модемом Huawei E1550?</a><br />
3: <a href="http://rus-linux.net/nlib.php?name=/MyLDP/internet/modem-ru.html">Как «приручить» МТС-модем Huawei E1550</a></p>
<p>Спасибо за внимание, с нетерпением жду Ваших комментариев.</p>
<p>UPD По замечанию моего хорошего друга, дополнил реализацию обработки водящих смс сообщений средствами smsd.</p>
<p></code></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it2k.ru/2011/02/%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80%d0%be%d0%bc-%d0%bf%d0%be%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be%d0%bc-%d1%81%d0%bc%d1%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nagios мониторинг баланса мобильного телефона</title>
		<link>http://www.it2k.ru/2011/02/nagios-%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80%d0%b8%d0%bd%d0%b3-%d0%b1%d0%b0%d0%bb%d0%b0%d0%bd%d1%81%d0%b0-%d0%bc%d0%be%d0%b1%d0%b8%d0%bb%d1%8c%d0%bd%d0%be%d0%b3%d0%be-%d1%82%d0%b5%d0%bb%d0%b5/</link>
		<comments>http://www.it2k.ru/2011/02/nagios-%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80%d0%b8%d0%bd%d0%b3-%d0%b1%d0%b0%d0%bb%d0%b0%d0%bd%d1%81%d0%b0-%d0%bc%d0%be%d0%b1%d0%b8%d0%bb%d1%8c%d0%bd%d0%be%d0%b3%d0%be-%d1%82%d0%b5%d0%bb%d0%b5/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 19:40:16 +0000</pubDate>
		<dc:creator>Егор Зюскин</dc:creator>
				<category><![CDATA[Мониторинг]]></category>
		<category><![CDATA[mrtg]]></category>
		<category><![CDATA[nagios]]></category>
		<category><![CDATA[мобильная связь]]></category>
		<category><![CDATA[мониторинг]]></category>

		<guid isPermaLink="false">http://www.it2k.ru/wpres/?p=144</guid>
		<description><![CDATA[Для чего это нужно Когда в семье число мобильных телефонов становится более 3-х, назревает вопрос мониторинга баланса и оповещения, когда баланс приближается к критической отметке. Есть много средств для мониторинга баланса, но зачем городить огород, когда под рукой есть незаменимый Nagios (так получилось что и дома у меня есть свой мониторинговый сервер, его основная задача [...]]]></description>
			<content:encoded><![CDATA[<h4>Для чего это нужно</h4>
<p>Когда в семье число мобильных телефонов становится более 3-х, назревает вопрос мониторинга баланса и оповещения, когда баланс приближается к критической отметке. Есть много средств для мониторинга баланса, но зачем городить огород, когда под рукой есть незаменимый Nagios (так получилось что и дома у меня есть свой мониторинговый сервер, его основная задача наблюдать за состоянием серверов организаций которые я администрирую в нерабочее время). Данное решение также подойдет для мониторинга баланса корпоративного лицевого счета.</p>
<p><span id="more-144"></span></p>
<h4>Небольшое отступление</h4>
<p>Осуществлять мониторинг, будем посредством http/https запросов к серверам операторов мобильной связи. Для этого нам понадобится php с подключенной библиотекой curl. Для мониторинга будет использоваться Nagios, а для построения графиков Mrtg. В данной версии, реализована работа с двумя операторами мобильной связи, МТС и Билайн. Как ни странно с Билайном оказалось меньше всего проблем: делаем запрос на авторизацию, затем делаем запрос баланса, затем парсим HTML вывод. С МТС-ом оказалось интересней, для каждого региона они используют свое доменное имя «Интернет помощника», что добавляет пару незапланированных действий в алгоритм. Проблема решилась вычислением региона по префиксу номера телефона, в этом помог Интернет ресурс <a href="http://www.mtt.ru/info/def/index.wbp">МТТ</a>, который предоставляет доступ к базе данных префиксов операторов связи. После получения региона, мы получаем доменное имя «Интернет помощника» путем разбора <a href="http://static.mts.ru/upload/images/design/js/mts.regions.ru.js">java-скрипта</a> с сайта МТС, затем авторизация и парсинг HTML-вывода. Сюда также можно прикрутить Мегафон, но пока не до него.</p>
<h4>Итак, от теории к практике</h4>
<p><span style="font-weight: normal;">Я не буду заострять внимание на настройке Nagios, я думаю, у обитателей хабра с этим не возникнет проблем, и перейду, так сказать, к самому вкусному. Качаем последнюю версию скриптов <a href="http://www.it2k.ru/projects/mobile-balance-api/files/">отсюда</a>, распаковываем. получаем 3 файла, mobile-api.php, nagios-check-mobile-balance.php, mrtg-mobile-balance.php. Из названия понятны назначения файлов, плагин к Nagios, скрипт к MRTG и файл с функциями для получения баланса (я постарался как можно подробней его раскомментировать). </span></p>
<h4>Копируем файлы по местам и назначаем права</h4>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="kw2">cp</span> .<span class="sy0">/</span>mobile-balance-api.php <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>lib<span class="sy0">/</span>
<span class="kw2">cp</span> .<span class="sy0">/</span>nagios-check-mobile-balance.php <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>nagios<span class="sy0">/</span>plugins<span class="sy0">/</span>check_mobile_balance.php
<span class="kw2">cp</span> .<span class="sy0">/</span>mrtg-check-mobile-balance.php <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>mrtg2<span class="sy0">/</span>check_mobile_balance.php
<span class="kw2">chmod</span> +x <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>nagios<span class="sy0">/</span>plugins<span class="sy0">/</span>check_mobile_balance.php
<span class="kw2">chmod</span> +x <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>mrtg2<span class="sy0">/</span>check_mobile_balance.php</pre></div></div>

<h4>Проверяем работоспособность</h4>
<p>Для начала, необходимо исправить константы в /usr/local/lib/mobile-balance-api.php</p>

<div class="wp_syntax"><div class="code"><pre class="php"><a href="http://www.php.net/define"><span class="kw3">DEFINE</span></a><span class="br0">&#40;</span><span class="st0">&quot;CACHE_PATH&quot;</span><span class="sy0">,</span> <span class="st0">&quot;/var/cache/balance&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co2"># Директория для сохранения данных
</span><a href="http://www.php.net/define"><span class="kw3">DEFINE</span></a><span class="br0">&#40;</span><span class="st0">&quot;COOKIE_FILE_NAME&quot;</span><span class="sy0">,</span> CACHE_PATH <span class="sy0">.</span> <span class="st0">&quot;/cookie.txt&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="co2"># Имя файла для хранения cookie
</span><a href="http://www.php.net/define"><span class="kw3">DEFINE</span></a><span class="br0">&#40;</span><span class="st0">&quot;OPERATOR_AUTO_DETECT&quot;</span><span class="sy0">,</span> <span class="kw4">True</span><span class="br0">&#41;</span><span class="sy0">;</span>  <span class="co2"># Автоматическое определение оператора
</span><a href="http://www.php.net/define"><span class="kw3">DEFINE</span></a><span class="br0">&#40;</span><span class="st0">&quot;AUTO_SAVE_DATA&quot;</span><span class="sy0">,</span> <span class="kw4">True</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co2"># Сохранять ли данные после автоматического определения оператора
</span><a href="http://www.php.net/define"><span class="kw3">DEFINE</span></a><span class="br0">&#40;</span><span class="st0">&quot;BAD_ATTEMPTS_COUNT&quot;</span><span class="sy0">,</span> <span class="nu0">3</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co2"># Количество неудачных попыток, актуально для МТС</span></pre></div></div>

<p>Затем необходимо исправить путь в константе «MOBILE_API», в файле /usr/lib/nagios/plugins/check_mobile_balance.php</p>

<div class="wp_syntax"><div class="code"><pre class="php"><a href="http://www.php.net/define"><span class="kw3">DEFINE</span></a><span class="br0">&#40;</span><span class="st0">&quot;MOBILE_API&quot;</span><span class="sy0">,</span> <span class="st0">&quot;/usr/local/lib/mobile-balance-api.php&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>

<p>Если у Вас ещё нет пароля для доступа к «Интернет помощнику», то делаем следующие:</p>
<ul>
<li>Для пользователей МТС: со своего мобильного телефона (или в программе МТС-Коннект) наберите:*111*25# или позвоните по номеру 111 5 (при нахождении в домашней сети) и следуйте инструкции автоинформатора.</li>
<li>Для пользователей Билайна: позвоните со своего телефона на бесплатный номер *110*9# и получите SMS с паролем к системе.</li>
</ul>
<p>Тестовый запуск скрипта</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>nagios<span class="sy0">/</span>plugins<span class="sy0">/</span>check_mobile_balance.php <span class="re5">-w</span> <span class="nu0">20</span> <span class="re5">-c</span> <span class="nu0">10</span> <span class="re5">-n</span> <span class="nu0">9128141111</span> <span class="re5">-p</span> <span class="nu0">123456</span></pre></div></div>

<p>Ответ</p>

<div class="wp_syntax"><div class="code"><pre class="text">BALANCE OK- +79128141111 = 55 rub</pre></div></div>

<p>Если неверный пароль, или хост МТС-а is down (такое очень часто бывает, с Билайном лучше) скрипт вернет 0-й баланс.</p>
<h4>Настраиваем Nagios</h4>
<p>Правим файл /etc/nagios/objects/commands.cfg, добавляем новую команду «check_mobile_balance»</p>

<div class="wp_syntax"><div class="code"><pre class="text">define command{
command_name check_mobile_balance
command_line $USER1$/check_mobile_balance.php -w 30 -c 10 -n $ARG1$ -p $ARG2$
}</pre></div></div>

<p>-w 30 — это порог warning/предупреждение в рублях<br />
-c 10 — это порог critical/критично в рублях</p>
<p>Затем правим /etc/nagios/objects/localhost.cfg добавляем проверки</p>

<div class="wp_syntax"><div class="code"><pre class="text">define service{
use local-service
host_name localhost
service_description Balance +79128141111
check_command check_mobile_balance!9128141111!123456
}</pre></div></div>

<p>Где 9128141111 — номер телефона, 123456 — пароль к мобильному помощнику.</p>
<p>Затем перечитываем настройки Nagios: <code>service nagios reload</code> и идем в веб-интерфейс наслаждаться результатом:<br />
<a title="Хабрэффект.ру" href="http://habreffect.ru/503/22f2cff16/scr-nagios-mobile-balance.png"><img src="http://habreffect.ru/files/503/22f2cff16/scr-nagios-mobile-balance.png" alt="" width="575" height="141" /></a></p>
<h4>Графики</h4>
<p>Для вывода графиков я предпочитаю использовать MRTG. Это легкое, простое в настройках приложение. Подразумеваем, что MRTG у Вас установлен, настроен и работает. Проверяем константу «MOBILE_API», в файле /usr/lib/nagios/plugins/check_mobile_balance.php. Правим /etc/mrtg/mrtg.cfg добавляем следующие строки:</p>

<div class="wp_syntax"><div class="code"><pre class="text">Target[mb]: `/usr/lib/mrtg2/check_mobile_balance.php 9128141111 123456`
MaxBytes[mb]: 500
MaxBytes2[mb]: 75
Title[mb]: Mobile balance +79218141111
Options[mb]: unknaszero,gauge,growright,nopercent,transparent,noborder,pngdate,noinfo
AbsMax[mb]: 500
YLegend[mb]: Rub
ShortLegend[mb]: R
Legend1[mb]: Rub
Legend2[mb]: Rub
LegendI[mb]: Rub
LegendO[mb]: Rub
PageTop[mb]: Mobile balance +79218141111</pre></div></div>

<p>Тестируем,</p>

<div class="wp_syntax"><div class="code"><pre class="text">env LANG=C mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log &gt; /dev/null 2&gt;&amp;1</pre></div></div>

<p>Смотрим, что получилось.<br />
<a title="Хабрэффект.ру" href="http://habreffect.ru/847/1101aea31/scr-mrtg-mobile-balance.png"><img src="http://habreffect.ru/files/847/1101aea31/scr-mrtg-mobile-balance.png" alt="" /></a></p>
<p>Листинги скриптов приводить думаю смысла нет, ибо много строк. На всякий случай продублирую ссылку на них, <a href="http://www.it2k.ru/projects/mobile-balance-api/files/">здесь</a>.</p>
<h4>Nano MRTG HowTo для Windows</h4>
<p>Качаем:<br />
<a href="http://windows.php.net/download/">windows.php.net/download/</a> &#8212; php 5.3.5<br />
<a href="http://www.activestate.com/store/activeperl/download/">www.activestate.com/store/activeperl/download/</a> &#8212; perl 5.12.3<br />
<a href="http://oss.oetiker.ch/mrtg/pub/">oss.oetiker.ch/mrtg/pub/</a> &#8212; mrtg 2.17</p>
<p>Устанавливаем/Распаковываем:<br />
perl в c:\perl<br />
mrtg в c:\mrtg<br />
php5 в c:\php<br />
mobile-balance-api.php и mrtg-check-mobile-balance.php в c:\mrtg\bin\</p>
<p>Включаем вывод ошибок в php.ini <code>display_errors = On</code> и <code>error_reporting = E_ALL &amp; ~E_NOTICE</code> на всякий пожарный.</p>
<p>Правим константы:<br />
mobile-balance-api.php</p>

<div class="wp_syntax"><div class="code"><pre class="php"><a href="http://www.php.net/define"><span class="kw3">DEFINE</span></a><span class="br0">&#40;</span>«CACHE_PATH»<span class="sy0">,</span> «c<span class="sy0">:</span>\Tmp»<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>

<p>mrtg-check-mobile-balance.php</p>

<div class="wp_syntax"><div class="code"><pre class="php"><a href="http://www.php.net/define"><span class="kw3">DEFINE</span></a><span class="br0">&#40;</span>«MOBILE_API»<span class="sy0">,</span> «c<span class="sy0">:</span>\mrtg\bin\mobile<span class="sy0">-</span>balance<span class="sy0">-</span>api<span class="sy0">.</span>php»<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>

<p>Проверяем:</p>

<div class="wp_syntax"><div class="code"><pre class="text">c:\php\php c:\mrtg\bin\mrtg-check-mobile-balance.php 9128141111 123456</pre></div></div>

<p>Если есть ошибки, смотрим разбираемся.</p>
<p>Настраиваем MRTG:</p>

<div class="wp_syntax"><div class="code"><pre class="text">mkdir c:\mrtg\www</pre></div></div>

<p>Редактируем/создаем c:\mrtg\mrtg.cfg</p>

<div class="wp_syntax"><div class="code"><pre class="text">EnableIPv6: no
WorkDir: c:\mrtg\www
Target[mb]: `c:\php\php c:\mrtg\bin\mrtg-check-mobile-balance.php 9128141111 123456`
MaxBytes[mb]: 500
MaxBytes2[mb]: 75
Title[mb]: Mobile balance +79218141111
Options[mb]: unknaszero,gauge,growright,nopercent,transparent,noborder,pngdate,noinfo
AbsMax[mb]: 500
YLegend[mb]: Rub
ShortLegend[mb]: R
Legend1[mb]: Rub
Legend2[mb]: Rub
LegendI[mb]: Rub
LegendO[mb]: Rub
PageTop[mb]: Mobile balance +79218141111</pre></div></div>

<p>Проверяем:</p>

<div class="wp_syntax"><div class="code"><pre class="text">c:\perl\bin\perl c:\mrtg\bin\mrtg c:\mrtg\bin\mrtg.cfg</pre></div></div>

<p>В директории c:\mrtg\www должны появится файлы mb*.png и mb.html. Команду</p>

<div class="wp_syntax"><div class="code"><pre class="text">c:\perl\bin\perl c:\mrtg\bin\mrtg c:\mrtg\bin\mrtg.cfg</pre></div></div>

<p>в «Планировщик задач». Все.</p>
<h4>Итого</h4>
<p>На самом деле скрипт является универсальным решением, и им можно мониторить не только баланс мобильного телефона, но и например рейтинг на rutracker или карму на Хабре.</p>
<p>Спасибо за внимание.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it2k.ru/2011/02/nagios-%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80%d0%b8%d0%bd%d0%b3-%d0%b1%d0%b0%d0%bb%d0%b0%d0%bd%d1%81%d0%b0-%d0%bc%d0%be%d0%b1%d0%b8%d0%bb%d1%8c%d0%bd%d0%be%d0%b3%d0%be-%d1%82%d0%b5%d0%bb%d0%b5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

