<?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>Unix Admin</title>
	<atom:link href="http://nixadm.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://nixadm.ru</link>
	<description>FreeBSD, MacOSX, Programming.</description>
	<lastBuildDate>Fri, 06 Apr 2012 15:49:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>FreeBSD: загрузка процессора</title>
		<link>http://nixadm.ru/archives/948</link>
		<comments>http://nixadm.ru/archives/948#comments</comments>
		<pubDate>Fri, 06 Apr 2012 15:19:53 +0000</pubDate>
		<dc:creator>Dmitriy Kalinin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[stathz]]></category>
		<category><![CDATA[top]]></category>

		<guid isPermaLink="false">http://nixadm.ru/?p=948</guid>
		<description><![CDATA[Все, кто знаком с *NIX-подобными системами знает про прекрасную команду &#171;top&#187;, которая показывает текущее состояние системы: загруженность процессора, распределение оперативной памяти, нагрузку, процессы и так далее. В этой статье хотелось бы сделать обзор загруженности процесса на ОС FreeBSD, а именно &#8212; какие этапы проходят от набора команды &#171;top -P&#187; (вывод нагрузки по процессорам) до вывода [...]]]></description>
			<content:encoded><![CDATA[<p>Все, кто знаком с *NIX-подобными системами знает про прекрасную команду &#171;top&#187;, которая показывает текущее состояние системы: загруженность процессора, распределение оперативной памяти, нагрузку, процессы и так далее.</p>
<p>В этой статье хотелось бы сделать обзор загруженности процесса на ОС FreeBSD, а именно &#8212; какие этапы проходят от набора команды &#171;top -P&#187; (вывод нагрузки по процессорам) до вывода данных на экран.</p>
<p><a href="http://nixadm.ru/wp-content/uploads/2012/04/1.png"><img class="aligncenter size-full wp-image-949" title="top -P" src="http://nixadm.ru/wp-content/uploads/2012/04/1.png" alt="" width="714" height="135" /></a></p>
<p>Как видно на скриншоте &#8212; есть информация по 4 процессорам (или ядрам), с разбивкой по нагрузке: user, nice, system, interrupt, idle. Попробуем получить эти данные из ядра самостоятельно.<br />
<span id="more-948"></span></p>
<p>Для доступа к данным ядра в FreeBSD используется библиотека libkvm, от нее и будем отталкиваться. Данные ядра доступны через устройство &#171;/dev/mem&#187;, поэтому к нему во время экспериментов потребуется доступ на чтении. Можно добавить себя в группу kmem, или экспериментировать от суперпользователя (root).</p>
<p>Прежде, чем определять загруженность процессоров &#8212; надо определить, а сколько их вообще в системе? Для этого существует функция:</p>
<pre>int kvm_getmaxcpu(kvm_t *kd);</pre>
<p>Функция вернет количество процессоров, поддерживаемое системой, или &#171;-1&#8243; если случилась какая-либо ошибка. Количество поддерживаемых процессоров не равняется количество установленных процессоров.</p>
<p>Создаем шаблон для работы с ядром:</p>
<pre>
#include &lt;stdio.h&gt;
#include &lt;unistd.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;sys/param.h&gt;
#include &lt;sys/pcpu.h&gt;
#include &lt;kvm.h&gt;

int main()
{
  kvm_t *kd;
  // kvm descriptor
  kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm");
  if (kd)
  {
    // ...
    kvm_close(kd);
  }
}
</pre>
<p>Первым делаем запрашиваем у системы &#8212; сколько процессоров поддерживается:</p>
<pre>
    // Запрашиваем количество поддерживаемых системой процессоров
    maxcpu = kvm_getmaxcpu(kd);
    printf("maxcpu=%d\n", maxcpu);
</pre>
<p>Дальше получаем информация по процессорам:</p>
<pre>
      int n;
      struct pcpu **cpu;
      // Запрашиваем данные по процессорам
      cpu = calloc(sizeof(struct pcpu*), maxcpu);
      for (n = 0; n &lt; maxcpu; n ++)
        cpu[n] = kvm_getpcpu(kd, n);
</pre>
<p>Данные о каждом процессоре FreeBSD бережно передает в &#171;struct pcpu&#187;. Как раз из нее и будем получать информации о загруженности.</p>
<pre>void* kvm_getpcpu(kvm_t *kd, int cpu);</pre>
<p>Возвращает информацию по процессору (если он присутствует под номер &#171;cpu&#187;), или NULL &#8212; если информация недоступна (процессора нет).<br />
В этой структуре нас интересуют &#171;pc_cp_time&#187; &#8212; статистика по процессору:</p>
<pre>long pc_cp_time[CPUSTATES]; /* statclock ticks */</pre>
<p>Обращаем внимание, как заполнен этот массив:</p>
<pre>
#define CP_USER    0
#define CP_NICE    1
#define CP_SYS     2
#define CP_INTR    3
#define CP_IDLE    4
#define CPUSTATES  5
</pre>
<p>То-есть, &#171;cpu[n][CP_SYS]&#187; &#8212; содержит количество тиков процессора, занятых обработкой системных вызовов, &#171;cpu[n][CP_INTR]&#187; &#8212; тики, потраченные на обработку прерываний. Тогда логично предположить &#8212; если через определенный промежуток времени повторно собрать информацию по процессору, и вычесть из нее первую &#8212; можно получить загруженность это процессора в тиках.</p>
<p>Записываем выше сказанное:</p>
<pre>
      // Запрашиваем данные по процессорам
      cpu1 = calloc(sizeof(struct pcpu*), maxcpu);
      for (n = 0; n &lt; maxcpu; n ++)
        cpu1[n] = kvm_getpcpu(kd, n);
      // Ждем одну секунду
      sleep(1);
      // Второй замер
      cpu2 = calloc(sizeof(struct pcpu*), maxcpu);
      for (n = 0; n &lt; maxcpu; n ++)
        cpu2[n] = kvm_getpcpu(kd, n);
      // Расчитываем загруженность
      for (n = 0; n &lt; maxcpu; n ++)
        if (cpu2[n] &#038;&#038; cpu1[n])
        {
          long long total = 0;
          for (i = 0; i &lt; CPUSTATES; i ++)
          {
             cpu2[n]-&gt;pc_cp_time[i] -= cpu1[n]-&gt;pc_cp_time[i];
             total += cpu2[n]-&gt;pc_cp_time[i];
          }
          // Выводим информацию
          printf("CPU #%02d: user=%ld, sys=%ld, nice=%ld, intr=%ld, idle=%ld, total=%lld\n",
            cpu2[n]-&gt;pc_cpuid, cpu2[n]-&gt;pc_cp_time[CP_USER], cpu2[n]-&gt;pc_cp_time[CP_SYS],
            cpu2[n]-&gt;pc_cp_time[CP_NICE], cpu2[n]-&gt;pc_cp_time[CP_INTR],
            cpu2[n]-&gt;pc_cp_time[CP_IDLE], total);
        }
</pre>
<p>Осталось только перевести эти попугаи в понятные проценты. С этим просто &#8212; известно сколько было затрачено тиков всего, и сколько тиков конкретная нагрузка. Высчитываем долю вхождения каждой нагрузки в общую:</p>
<pre>
          // Информация в процентах
          printf("CPU #%02d: user=%0.2f%%, sys=%0.2f%%, nice=%0.2f%%, intr=%0.2f%%, idle=%0.2f%%\n",
            cpu2[n]-&gt;pc_cpuid, cpu2[n]-&gt;pc_cp_time[CP_USER]*100.0/total, cpu2[n]-&gt;pc_cp_time[CP_SYS]*100.0/total,
            cpu2[n]-&gt;pc_cp_time[CP_NICE]*100.0/total, cpu2[n]-&gt;pc_cp_time[CP_INTR]*100.0/total,
            cpu2[n]-&gt;pc_cp_time[CP_IDLE]*100.0/total);
</pre>
<p>Теперь собираем все вместе и смотрим что получилось. Листинг программы:</p>
<pre>
#include &lt;stdio.h&gt;
#include &lt;unistd.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;sys/param.h&gt;
#include &lt;sys/pcpu.h&gt;
#include &lt;kvm.h&gt;

int main()
{
  kvm_t *kd;
  // kvm descriptor
  kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm");
  if (kd)
  {
    int maxcpu;
    // Запрашиваем количество поддерживаемых системой процессоров
    maxcpu = kvm_getmaxcpu(kd);
    printf("maxcpu=%d\n", maxcpu);
    if (maxcpu &gt; 0) {
      int i,n;
      struct pcpu **cpu1;
      struct pcpu **cpu2;
      // Запрашиваем данные по процессорам
      cpu1 = calloc(sizeof(struct pcpu*), maxcpu);
      for (n = 0; n &lt; maxcpu; n ++)
        cpu1[n] = kvm_getpcpu(kd, n);
      // Ждем одну секунду
      sleep(1);
      // Второй замер
      cpu2 = calloc(sizeof(struct pcpu*), maxcpu);
      for (n = 0; n &lt; maxcpu; n ++)
        cpu2[n] = kvm_getpcpu(kd, n);
      // Расчитываем загруженность
      for (n = 0; n &lt; maxcpu; n ++)
        if (cpu2[n] &#038;&#038; cpu1[n])
        {
          long long total = 0;
          for (i = 0; i &lt; CPUSTATES; i ++)
          {
            cpu2[n]-&gt;pc_cp_time[i] -= cpu1[n]-&gt;pc_cp_time[i];
            total += cpu2[n]-&gt;pc_cp_time[i];
          }
          // Выводим информацию
          printf("CPU #%02d: user=%ld, sys=%ld, nice=%ld, intr=%ld, idle=%ld, total=%lld\n",
            cpu2[n]-&gt;pc_cpuid, cpu2[n]-&gt;pc_cp_time[CP_USER], cpu2[n]-&gt;pc_cp_time[CP_SYS],
            cpu2[n]-&gt;pc_cp_time[CP_NICE], cpu2[n]-&gt;pc_cp_time[CP_INTR],
            cpu2[n]-&gt;pc_cp_time[CP_IDLE], total);
          // Информация в процентах
          printf("CPU #%02d: user=%0.2f%%, sys=%0.2f%%, nice=%0.2f%%, intr=%0.2f%%, idle=%0.2f%%\n",
            cpu2[n]-&gt;pc_cpuid, cpu2[n]-&gt;pc_cp_time[CP_USER]*100.0/total, cpu2[n]-&gt;pc_cp_time[CP_SYS]*100.0/total,
            cpu2[n]-&gt;pc_cp_time[CP_NICE]*100.0/total, cpu2[n]-&gt;pc_cp_time[CP_INTR]*100.0/total,
            cpu2[n]-&gt;pc_cp_time[CP_IDLE]*100.0/total);
        }
      // Освобождаем ресурсы
      for (n = 0; n &lt; maxcpu; n ++)
      {
        if (cpu1[n]) free(cpu1[n]);
        if (cpu2[n]) free(cpu2[n]);
      }
      free(cpu1);
      free(cpu2);
    }
    //
    kvm_close(kd);

    return 0;
  }
}
</pre>
<p>Или можно <a href="http://nixadm.ru/files/cpu.c" title="cpu.c">скачать</a></p>
<p>Компилируем и запускаем:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mira<span style="color: #666666; font-style: italic;"># clang cpu.c -o cpu.exe -lkvm</span>
mira<span style="color: #666666; font-style: italic;"># ./cpu.exe</span>
kvm: kvm_nlist: No such <span style="color: #c20cb9; font-weight: bold;">file</span> or directory
kvm: kvm_nlist: No such <span style="color: #c20cb9; font-weight: bold;">file</span> or directory
<span style="color: #007800;">maxcpu</span>=<span style="color: #000000;">64</span>
CPU <span style="color: #666666; font-style: italic;">#00: user=0, sys=0, nice=0, intr=3, idle=124, total=127</span>
CPU <span style="color: #666666; font-style: italic;">#00: user=0.00%, sys=0.00%, nice=0.00%, intr=2.36%, idle=97.64%</span>
CPU <span style="color: #666666; font-style: italic;">#01: user=1, sys=0, nice=0, intr=1, idle=125, total=127</span>
CPU <span style="color: #666666; font-style: italic;">#01: user=0.79%, sys=0.00%, nice=0.00%, intr=0.79%, idle=98.43%</span>
CPU <span style="color: #666666; font-style: italic;">#02: user=0, sys=1, nice=0, intr=1, idle=125, total=127</span>
CPU <span style="color: #666666; font-style: italic;">#02: user=0.00%, sys=0.79%, nice=0.00%, intr=0.79%, idle=98.43%</span>
CPU <span style="color: #666666; font-style: italic;">#03: user=2, sys=1, nice=0, intr=3, idle=121, total=127</span>
CPU <span style="color: #666666; font-style: italic;">#03: user=1.57%, sys=0.79%, nice=0.00%, intr=2.36%, idle=95.28%</span>
mira<span style="color: #666666; font-style: italic;">#</span></pre></div></div>

<p>Наверно обратили внимание, что суммарно тиков на каждом процессоре 127? Дело в том, что ядро собирает статистику с определенной периодичностью. Если вкратце &#8212; то секунда делится на равное число тиков, и каждый тик помечается какой нагрузке он принадлежит. Посмотреть количество тиков в секунду можно в системной переменной &#171;kern.clockrate&#187;, а именно &#171;stathz&#187;:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mira<span style="color: #666666; font-style: italic;"># sysctl kern.clockrate</span>
kern.clockrate: <span style="color: #7a0874; font-weight: bold;">&#123;</span> hz = <span style="color: #000000;">1000</span>, tick = <span style="color: #000000;">1000</span>, profhz = <span style="color: #000000;">8128</span>, stathz = <span style="color: #000000;">127</span> <span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>На этом все :)</p>
<p>PS: Исходя из вышеописанного &#8212; имеет смысл в ядре устанавливать количество поддерживаемых процессоров равное количеству установленных. В моем случае &#8212; система собрана с поддержкой 64 процессов, хотя по факту используется только 4.</p>
<p>PPS: Так-же показания тиков доступны и через системные переменные, &#171;kern.cp_time&#187; и &#171;kern.cp_times&#187;.</p>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/948/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Еще один консольный клиент DirectConnect для *NIX</title>
		<link>http://nixadm.ru/archives/881</link>
		<comments>http://nixadm.ru/archives/881#comments</comments>
		<pubDate>Fri, 09 Dec 2011 13:53:36 +0000</pubDate>
		<dc:creator>Dmitriy Kalinin</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[dc]]></category>
		<category><![CDATA[direct connect]]></category>
		<category><![CDATA[directconnect]]></category>
		<category><![CDATA[microdc]]></category>
		<category><![CDATA[ncdc]]></category>

		<guid isPermaLink="false">http://nixadm.ru/?p=881</guid>
		<description><![CDATA[Недавно появился еще один консольный клиент для P2P-сетей &#8212; ncdc. Почти у всех провайдеров существуют свои DC-хабы, где все желающие могут обмениваться информацией (фильмы, музыка, фото и прочее). В отличии от торрент-трекеров &#8212; обмен максимально упрощен, единственное что требуется &#8212; выбрать каталог с файлами, который нужно расшарить &#8212; и он допуспен всем. На текущий момет [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно появился еще один консольный клиент для P2P-сетей &#8212; <a href="http://dev.yorhel.nl/ncdc">ncdc</a>.</p>
<p>Почти у всех провайдеров существуют свои DC-хабы, где все желающие могут обмениваться информацией (фильмы, музыка, фото и прочее).<br />
В отличии от торрент-трекеров &#8212; обмен максимально упрощен, единственное что требуется &#8212; выбрать каталог с файлами, который нужно расшарить &#8212; и он допуспен всем.</p>
<p>На текущий момет думаю самым популярным консольным клиентом DC для *NIX-систем является является <a href="http://www.nongnu.org/microdc/">microdc</a>. Но этот проект давно не развивается и имеет довольно слабый функционал.</p>
<p>Краткое сравнение microdc и ncdc:<br />
 &#8212; разумеется, главное отличие &#8212; ncdc умеет работать сразу с несколькими хабами;<br />
 &#8212; ncdc поддерживает горячие клавиши;<br />
 &#8212; в ncdc идут работы по поддержке протокол IPv6;<br />
 &#8212; ncdc поддерживает протокол ADC;<br />
 &#8212; ncdc умеет довольно удобный интерфейс для просмотра списка пользователей и их шар;<br />
 &#8212; ncdc смотрится довольно симпатично :)</p>
<p>Так же можно отметить приятный факт &#8212; с автором легко можно связаться.</p>
<p>Процесс сборки смысла описывать нет (configure, make, make install), настройка тоже интуитивно понятно (набираем в окне /help и смотрим параметры).</p>
<p>Ну и на последок немного скриншотов:<br />

<a href='http://nixadm.ru/archives/881/4-2' title='4'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/12/4-150x150.png" class="attachment-thumbnail" alt="4" title="4" /></a>
<a href='http://nixadm.ru/archives/881/3-3' title='3'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/12/3-150x150.png" class="attachment-thumbnail" alt="3" title="3" /></a>
<a href='http://nixadm.ru/archives/881/2-3' title='2'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/12/2-150x150.png" class="attachment-thumbnail" alt="2" title="2" /></a>
<a href='http://nixadm.ru/archives/881/1-3' title='1'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/12/1-150x150.png" class="attachment-thumbnail" alt="1" title="1" /></a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/881/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Раздача IPv6 от Ланты в свою ЛВС</title>
		<link>http://nixadm.ru/archives/870</link>
		<comments>http://nixadm.ru/archives/870#comments</comments>
		<pubDate>Thu, 17 Nov 2011 08:42:09 +0000</pubDate>
		<dc:creator>Dmitriy Kalinin</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Операционные системы.]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[lanta]]></category>
		<category><![CDATA[tambov]]></category>
		<category><![CDATA[Тамбов]]></category>

		<guid isPermaLink="false">https://nixadm.ru/?p=870</guid>
		<description><![CDATA[В нашем захолустном городке наконец-то один из провайдеров (ЛанТа) начал выдавать IPv6 адреса. Адреса выдаются по технологии SLAAC (автоконфигурация). Услуга работает в тестовом режиме, и подключить ее можно, при наличии технической возможности, отправивив письмо на helpdesk@lanta-net.ru следующего содержания: &#171;Прошу предоставить доступ по протоколу ipv6, по dualstack технологии. Номер договора xxxx.&#187; Технически это выглядит так: на порту [...]]]></description>
			<content:encoded><![CDATA[<p>В нашем захолустном городке наконец-то один из провайдеров (ЛанТа) начал выдавать IPv6 адреса. Адреса выдаются по технологии SLAAC (автоконфигурация).</p>
<p>Услуга работает в тестовом режиме, и подключить ее можно, при наличии технической возможности, отправивив письмо на helpdesk@lanta-net.ru следующего содержания: &#171;Прошу предоставить доступ по протоколу ipv6, по dualstack технологии. Номер договора xxxx.&#187;</p>
<p>Технически это выглядит так: на порту провайдера для каждого клиента выделяется префикс /64, из которого он может сконфигурироваться.</p>
<p>Если на порту клиент один &#8212; то и проблем никаких нет, выбрал себе клиент адрес и забыл.</p>
<p>Если клиентов на порту несколько и нет роутера &#8212; то они тоже замечательно сами конфигурируются.</p>
<p>Но что делать, если есть роутер, за которым расположена своя локальная сеть  и есть желание в нее запустить IPv6? Именно про это и хотелось бы порассуждать.<br />
<span id="more-870"></span></p>
<p>Просто повторить префикс на интерфейсе ЛВС &#8212; успеха не принесло, ибо провайдер ничего не знает об этих хостах. Для решения проблемы выбрал вариант через bridge-интерфейс. После недолгих раздумий была собрана такая схема:</p>
<p><a href="https://nixadm.ru/wp-content/uploads/2011/11/net.png"><img class="aligncenter size-full wp-image-871" title="net" src="https://nixadm.ru/wp-content/uploads/2011/11/net.png" alt="" width="299" height="153" /></a>Немного пояснений:</p>
<p>- весь ipv4 трафик идет сквозь роутера;</p>
<p>- весь ipv6 трафик идет через интерфейс bridge0, как-бы в обход роутера.</p>
<p>Теперь осталось решить следующие задачи:</p>
<p>- не пропускать через bridge0 ipv4-трафик (ну не нужен он там)</p>
<p>- фильтровать ipv6-трафик на роутере.</p>
<p>&nbsp;</p>
<p><strong>Приступим к ломанию роутера :)</strong></p>
<p>Первым делом конечно-же потребуется поддержка if_bridge, для этого собираем и подгружаем модули:</p>
<pre>mira# cd /usr/src/sys/modules/if_bridge/
mira# make &amp;&amp; make install &amp;&amp; make cleandir
mira# cd /usr/src/sys/modules/bridgestp/
mira# make &amp;&amp; make install &amp;&amp; make cleandir
mira# kldload if_bridge</pre>
<p>Не забываем добавить загрузку модулей при старте ОС, прописываем модули в /boot/loader.conf:</p>
<pre>if_bridge_load="yes"
bridgestp_load="yes"</pre>
<p>Теперь создаем bridge-интерфейс:</p>
<pre>mira# ifconfig bridge0 addm vlan102 addm vlan1</pre>
<p>И смотрим, что получилось:</p>
<pre>mira# ifconfig bridge0
bridge0: flags=8843 metric 0 mtu 1500
        ether 02:3c:86:82:fc:00
        nd6 options=1
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: vlan1 flags=143
                ifmaxaddr 0 port 6 priority 128 path cost 55
        member: vlan102 flags=143
                ifmaxaddr 0 port 8 priority 128 path cost 55</pre>
<p>Вроде все нормально. Теперь нужно разобраться с фильтрацией пакетов.<br />
Для управления прохождения трафика через bridge-интерфейс существует несколько системных переменных, нам интересны следующие:<br />
- <strong>net.link.bridge.pfil_onlyip</strong> &#8212; фильтровать только IP-трафик;<br />
- <strong>net.link.bridge.pfil_bridge</strong> &#8212; фильтровать трафик на bridge-интерфейсе;<br />
- <strong>net.link.bridge.pfil_member</strong> &#8212; так-же фильтровать трафик и на родительских интерфейсах;<br />
Есть еще и прочие переменные, но мне они пока не требуются.</p>
<p>Разберемся как идет трафик через bridge: при включенном <strong>net.link.bridge.pfil_onlyip</strong> обрабатываются фаерволом только IP-пакеты, соответственно L2-пакеты идут в обход фаервола на всех участках цепи. Если включен <strong>net.link.bridge.pfil_member</strong> &#8212; пакеты будут также обрабатываться правилами на родительских интерфейсах bridge0. При включенном <strong>net.link.bridge.pfil_bridge</strong> пакеты также будут обрабатываться правилами для bridge-интерфейса. Небольшая зарисовка, как лезет пакет:</p>
<p><a href="https://nixadm.ru/wp-content/uploads/2011/11/pfil.png"><img class="aligncenter size-full wp-image-872" title="pfil" src="https://nixadm.ru/wp-content/uploads/2011/11/pfil.png" alt="" width="488" height="341" /></a></p>
<p>В моем задаче нет смысла фильтровать пакеты на родительских интерфейсах, поэтому ставлю <strong>net.link.bridge.pfil_member=0</strong>. Но мне нужно контролировать трафик, для этого его буду фильтровать на bridge-интерфейсе: <strong>net.link.bridge.pfil_bridge=1</strong>. Не IP-пакеты на интерфейсе не интересны, поэтому: <strong>net.link.bridge.pfil_onlyip=1</strong>.<br />
Продублируем это в /etc/sysctl.conf:</p>
<pre>net.link.bridge.pfil_member=0
net.link.bridge.pfil_bridge=1
net.link.bridge.pfil_onlyip=1</pre>
<p>С bridge-интерфейсом разобрались. Теперь осталось написать для него правила фильтрации. С этим очень просто, режем все, что не IPv6:</p>
<pre>if="bridge0"

# ipv6 rules
pass quick on $if inet6 no state

# deny other
block quick on $if no state</pre>
<p>На этом все.</p>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/870/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Подключение ИБП Ippon Back Power Pro 600 к FreeBSD</title>
		<link>http://nixadm.ru/archives/822</link>
		<comments>http://nixadm.ru/archives/822#comments</comments>
		<pubDate>Sat, 15 Oct 2011 06:08:47 +0000</pubDate>
		<dc:creator>Dmitriy Kalinin</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[ippon]]></category>
		<category><![CDATA[nut]]></category>
		<category><![CDATA[ups]]></category>

		<guid isPermaLink="false">http://nixadm.ru/archives/822</guid>
		<description><![CDATA[Есть прекрасный проект по подключению источников питания к *nix системам – NUT (Network UPS Tools) &#8212; http://www.networkupstools.org Позволяет следить и управлять работой ИБП и PDU. &#160; В моем случае – это ИБП Ippon Back Power Pro 600. Подключаться будет к системе: mira# uname -a FreeBSD mira.s25.tmb.local 8.2-STABLE FreeBSD 8.2-STABLE #37 r226374M: Sat Oct 15 08:57:56 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-852" title="Network UPS Tools" src="https://nixadm.ru/wp-content/uploads/2011/10/nut-logo.png" alt="NUT" width="60" height="60" /></p>
<p>Есть прекрасный проект по подключению источников питания к *nix системам – NUT (Network UPS Tools) &#8212; <a href="http://www.networkupstools.org">http://www.networkupstools.org</a></p>
<p>Позволяет следить и управлять работой ИБП и PDU.</p>
<p>&nbsp;</p>
<p>В моем случае – это ИБП Ippon Back Power Pro 600. Подключаться будет к системе:</p>
<blockquote><p>mira# uname -a<br />
FreeBSD mira.s25.tmb.local 8.2-STABLE FreeBSD 8.2-STABLE #37 r226374M: Sat Oct 15 08:57:56 MSD 2011 root@mira.s25.tmb.local:/usr/obj/usr/src/sys/mira amd64</p></blockquote>
<p><span id="more-822"></span></p>
<p>Установка проходит стандартно, из портов:</p>
<blockquote><p>mira# cd /usr/ports/sysutils/nut<br />
mira# make config</p>
<p>[X] USB     USB support<br />
[ ] SNMP    SNMP support<br />
[ ] NEON    NEON XML/HTTP support<br />
[ ] PDU     Powerman PDU support<br />
[ ] HAL     HAL support<br />
[ ] CGI     Web CGI interface<br />
[ ] BASH    Bash Completion support</p>
<p>mira# make install clean</p></blockquote>
<p>Из всего арсенала мне нужна только поддержка USB, прочее убрал. На этом все, пакет установлен.</p>
<p>Теперь надо определить, какой драйвер нужен для ИБП. С этим очень просто, разработчики уже обо всем позаботились, переходим по ссылке <a href="http://www.networkupstools.org/stable-hcl.html">http://www.networkupstools.org/stable-hcl.html</a> и выбираем свой ИБП. Драйвер оказался <strong>blazer_usb (experimental)</strong>.</p>
<p>Можно приступать к настройке NUT. Лирическое отступление – что из себя представляет NUT? Разделить его можно на несколько частей – <strong>upsd</strong>,<strong> upsmon </strong>и<strong> upslog</strong>.</p>
<p>В свою очередь, <strong>upsd</strong> состоит из двух частей, собственно запущенные ИБП (а верней драйверы к ИБП) и сетевой демон, который предоставляет доступ к этим драйверам. Драйверы можно посмотреть здесь:</p>
<blockquote><p>mira# cd /usr/local/libexec/nut/<br />
mira# ls<br />
bcmxcp_usb      blazer_usb      netxml-ups      richcomm_usb    tripplite_usb   upsdrvctl       usbhid-ups</p></blockquote>
<p>&nbsp;</p>
<p>Определяем, на каком USB живет бесперебойник:</p>
<blockquote><p>mira# usbconfig<br />
ugen0.1: &lt;EHCI root HUB Intel&gt; at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE<br />
ugen1.1: &lt;EHCI root HUB Intel&gt; at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE<br />
ugen1.2: &lt;product 0&#215;0024 vendor 0&#215;8087&gt; at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE<br />
ugen0.2: &lt;product 0&#215;0024 vendor 0&#215;8087&gt; at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE<br />
ugen0.3: &lt;USB to Serial Cypress Semiconductor&gt; at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON<br />
ugen0.4: &lt;USB2.0 Hub vendor 0x05e3&gt; at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE<br />
ugen0.5: &lt;product 0&#215;0805 vendor 0x046d&gt; at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON<br />
ugen0.6: &lt;USB 2.0 PC Cam Image Processor&gt; at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON</p></blockquote>
<p>Живет на <strong>ugen0.3</strong> &#8212; <strong>USB to Serial Cypress Semiconductor</strong>.</p>
<p>&nbsp;</p>
<p>Итак, известно где живет бесперебойник и какой драйвер он использует – составляем конфиг <strong>/usr/local/etc/nut/ups.conf</strong>. В этом файле описываются подключенные к системе ИБП:</p>
<blockquote><p>mira# cat /usr/local/etc/nut/ups.conf<br />
[ippon]<br />
driver    = blazer_usb<br />
port      = /dev/ugen0.3<br />
desc      = &#171;Ippon Back Power Pro 600&#8243;</p></blockquote>
<p>&nbsp;</p>
<p>Пробуем стартануть драйвер, сможет ли он увидеть ИБП?</p>
<blockquote><p>mira# /usr/local/libexec/nut/blazer_usb -a ippon<br />
Network UPS Tools &#8212; Megatec/Q1 protocol USB driver 0.03 (2.6.1)<br />
No supported devices found. Please check your device availability with &#8216;lsusb&#8217;<br />
and make sure you have an up-to-date version of NUT. If this does not help,<br />
try running the driver with at least &#8216;subdriver&#8217;, &#8216;vendorid&#8217; and &#8216;productid&#8217;<br />
options specified. Please refer to the man page for details about these options<br />
(man 8 blazer).</p></blockquote>
<p>&nbsp;</p>
<p>Смотрим справку:</p>
<blockquote><p>mira# /usr/local/libexec/nut/blazer_usb -h<br />
Network UPS Tools &#8212; Megatec/Q1 protocol USB driver 0.03 (2.6.1)</p>
<p>usage: blazer_usb -a &lt;id&gt; [OPTIONS]<br />
-a &lt;id&gt;        &#8212; autoconfig using ups.conf section &lt;id&gt;<br />
- note: -x after -a overrides ups.conf settings</p>
<p>-V             &#8212; print version, then exit<br />
-L             &#8212; print parseable list of driver variables<br />
-D             &#8212; raise debugging level<br />
-q             &#8212; raise log level threshold<br />
-h             &#8212; display this help<br />
-k             &#8212; force shutdown<br />
-i &lt;int&gt;       &#8212; poll interval<br />
-r &lt;dir&gt;       &#8212; chroot to &lt;dir&gt;<br />
-u &lt;user&gt;      &#8212; switch to &lt;user&gt; (if started as root)<br />
-x &lt;var&gt;=&lt;val&gt; &#8212; set driver variable &lt;var&gt; to &lt;val&gt;<br />
- example: -x cable=940-0095B</p></blockquote>
<p>Вкратце – если запущен от пользователя <strong>root</strong>, то переключится на пользователя указанного в параметре <strong>–u</strong>. Если пользователь не указан – то переключится на <strong>uucp</strong>, у которого нет прав на доступ к устройству <strong>/dev/ugen0.0</strong> <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://nixadm.ru/wp-content/uploads/2011/10/wlEmoticon-smile.png" alt="Улыбка" /> Ну пока мы настраиваем – пробуем проверить драйвер от <strong>root</strong>:</p>
<blockquote><p>mira# /usr/local/libexec/nut/blazer_usb -a ippon -u root -D<br />
Network UPS Tools &#8212; Megatec/Q1 protocol USB driver 0.03 (2.6.1)<br />
0.000000     debug level is &#8217;1&#8242;<br />
0.393864     Supported UPS detected with megatec protocol<br />
0.777019     Vendor information read 1 failed<br />
0.969022     Vendor information read 2 failed<br />
1.160977     Vendor information read 3 failed<br />
1.161133     Vendor information unavailable<br />
1.161215     Battery runtime will not be calculated (runtimecal not set)<br />
^C   4.164307   Signal 2: exiting</p></blockquote>
<p>Драйвер успешно нашел ИБП.</p>
<p>&nbsp;</p>
<p>Создаем пользователя, от которого будут работать драйверы, и прописываем его <strong>ups.conf</strong>:</p>
<blockquote><p>mira# pw useradd usbd<br />
mira# cat /usr/local/etc/nut/ups.conf<br />
user = upsd<br />
[ippon]<br />
driver    = blazer_usb<br />
port      = /dev/ugen0.3<br />
desc      = &#171;Ippon Back Power Pro 600&#8243;</p></blockquote>
<p>&nbsp;</p>
<p>Даем права на чтение/запись для ugen0.3 этому пользователю:</p>
<blockquote><p>mira# chown upsd /dev/ugen0.3</p></blockquote>
<p>&nbsp;</p>
<p>Чтобы права не слетали после перезагрузки, добавляем строчки в <strong>/etc/devfs.conf</strong>:</p>
<blockquote><p># ugen0.3<br />
own             ugen0.3         upsd:wheel<br />
perm            ugen0.3         660</p></blockquote>
<p>Т.е. при монтировании <strong>/dev</strong> для устройства будет в качестве владельца выставляться <strong>upsd</strong>, в качестве группы <strong>wheel</strong>, права доступа – <strong>660</strong> (<strong>владелец</strong> – чтение/запись, <strong>группа </strong>– чтение/запись, <strong>прочим</strong> – ничего).</p>
<p>Все подготовили, пробуем еще раз запустить драйвер:</p>
<blockquote><p>mira# /usr/local/libexec/nut/blazer_usb -a ippon -D<br />
Network UPS Tools &#8212; Megatec/Q1 protocol USB driver 0.03 (2.6.1)<br />
0.000000     debug level is &#8217;1&#8242;<br />
0.013123     Can&#8217;t chdir to /var/db/nut: Permission denied</p></blockquote>
<p>Как с этим бороться – понятно:</p>
<blockquote><p>mira# chown upsd /var/db/nut<br />
mira# chmod 750 /var/db/nut</p></blockquote>
<p>Владелец папки – <strong>upsd</strong>, права доступа: <strong>владелец</strong> – полный доступ, <strong>группа</strong> – только просмотр, <strong>прочие</strong> – ничего.</p>
<p>&nbsp;</p>
<p>Пробуем еще раз стартануть драйвер:</p>
<blockquote><p>mira# /usr/local/libexec/nut/blazer_usb -a ippon -D<br />
Network UPS Tools &#8212; Megatec/Q1 protocol USB driver 0.03 (2.6.1)<br />
0.000000     debug level is &#8217;1&#8242;<br />
0.372559     Supported UPS detected with megatec protocol<br />
0.756431     Vendor information read 1 failed<br />
0.948408     Vendor information read 2 failed<br />
1.140545     Vendor information read 3 failed<br />
1.140746     Vendor information unavailable<br />
1.140829     Battery runtime will not be calculated (runtimecal not set)<br />
^C   4.135909   Signal 2: exiting</p></blockquote>
<p>Все, с драйвером разобрались. Теперь можно переходить к сетевому демону.</p>
<p>Настройка производится путем редактирования двух файлов: <strong>upsd.conf</strong> и <strong>upsd.users</strong>.</p>
<p>&nbsp;</p>
<p>В <strong>upsd.conf</strong> указываются параметры демона, файл прекрасно документирован, поэтому не вижу смысла описывать параметры. В моем случае он принял такой вид:</p>
<blockquote><p>mira# cat /usr/local/etc/nut/upsd.conf<br />
LISTEN      127.0.0.1 3493</p></blockquote>
<p>Принимать подключения на адресе 127.0.01, порт 3493.</p>
<p>&nbsp;</p>
<p>В <strong>upsd.users</strong> указываются пользователи, и разрешенные действия. У меня 2 пользователя: <strong>root</strong> – который может все, и <strong>upsmon</strong> – который может следить за работой:</p>
<blockquote><p>mira# cat /usr/local/etc/nut/upsd.users<br />
[root]<br />
password          = set_password<br />
actions           = set<br />
instcmds          = all</p>
<p>[upsmon]<br />
password          = upsmon<br />
upsmon            master</p></blockquote>
<p>С разрешениями надо быть поосторожней, ибо фактически этим пользователям предоставляется доступ для управления ИБП.</p>
<p>Пробуем запустить демон:</p>
<blockquote><p>mira# upsd<br />
Network UPS Tools upsd 2.6.1<br />
/usr/local/etc/nut/upsd.conf is world readable<br />
listening on 127.0.0.1 port 3493<br />
Can&#8217;t connect to UPS [ippon] (blazer_usb-ippon): No such file or directory<br />
/usr/local/etc/nut/upsd.users is world readable</p></blockquote>
<p><strong>upsd</strong> предлагает изменить права на файлы <strong>upsd.conf</strong> и <strong>upsd.users</strong>, и не находит бесперебойник.</p>
<p>&nbsp;</p>
<p>Проверяем, запустился демон или нет:</p>
<blockquote><p>mira# ps -axu | grep upsd<br />
uucp       25931  0,0  0,0 11880  2216  ??  Ss   10:58     0:00,03 upsd</p></blockquote>
<p><span style="background-color: #f1f1f1;">Запустился, все тот-же пользователя <strong>uucp</strong> …</span></p>
<p>Небольшое отступление – после запуска драйвера, он создает канал в <strong>/var/db/nut</strong>:</p>
<blockquote><p>mira# ls -l /var/db/nut<br />
total 2<br />
srw-rw&#8212;-  1 upsd  uucp  0 15 окт 11:03 blazer_usb-ippon<br />
-rw-r&#8212;r&#8212;  1 upsd  uucp  6 15 окт 11:03 blazer_usb-ippon.pid</p></blockquote>
<p>Так вот, демон общается с драйвером через этот канал, т.е. у него должны быть права на чтение/запись. Как видно, на <strong>blazer_usb-ippon</strong> права <strong>rw-rw&#8212;-</strong>, владелец – <strong>upsd</strong>, группа – <strong>uucp</strong>. Следовательно, чтобы демон мог успешно общаться с драйвером, он должен работать либо от пользователя <strong>upsd</strong>, либо входить в группу <strong>uucp</strong>.</p>
<p>&nbsp;</p>
<p>Вернемся к разбору ошибок: <strong>Can&#8217;t connect to UPS [ippon] (blazer_usb-ippon): No such file or directory</strong>. Демон не смог подключиться к драйверу – не найдет файл. Выше описывал, где драйверы создают канал. В моем случае драйвер был просто не запущен <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://nixadm.ru/wp-content/uploads/2011/10/wlEmoticon-smile.png" alt="Улыбка" /> Запускаю драйвер:</p>
<blockquote><p>mira# /usr/local/libexec/nut/blazer_usb -a ippon<br />
Network UPS Tools &#8212; Megatec/Q1 protocol USB driver 0.03 (2.6.1)<br />
Supported UPS detected with megatec protocol<br />
Vendor information unavailable<br />
Battery runtime will not be calculated (runtimecal not set)<br />
mira# ps -axu|grep blazer_usb<br />
upsd       26973  0,0  0,0  8032  1412  ??  Ss   11:12     0:00,01 /usr/local/libexec/nut/blazer_usb -a ippon<br />
mira# ls /var/db/nut<br />
blazer_usb-ippon        blazer_usb-ippon.pid</p></blockquote>
<p>&nbsp;</p>
<p>После того, как исправили права на файлы и запустили драйвер &#8212; пробуем еще раз запустить <strong>upsd</strong>:</p>
<blockquote><p>mira# killall upsd<br />
mira# upsd –u upsd<br />
Network UPS Tools upsd 2.6.1<br />
listening on 127.0.0.1 port 3493<br />
Connected to UPS [ippon]: blazer_usb-ippon</p></blockquote>
<p><strong>upsd</strong> запускается с параметром “<strong>–u upsd</strong>” – запуск от указанного пользователя. Демон стартанул успешно, подключился к драйверу, и готов принимать подключения по адресу 127.0.0.1:3493</p>
<p>Чтобы не запускать драйверы и демона руками – существует скрипт <strong>/usr/local/etc/rc.d/nut</strong>. Для его работы вносим в <strong>/etc/rc.conf</strong> следующие строки:</p>
<blockquote><p># nut<br />
nut_enable=&#187;yes&#187;<br />
nut_flags=&#187;-u upsd&#187;</p></blockquote>
<p>параметр <strong>nut_flags=”-u upsd”</strong> говорит, что стартовать <strong>upsd</strong> надо от пользователя <strong>upsd</strong>.</p>
<p>&nbsp;</p>
<p>Останавливаем все, что запустили руками:</p>
<blockquote><p>mira# killall upsd<br />
mira# killall blazer_usb<br />
mira# ps -axu|grep usb<br />
root          13  0,0  0,0     0   128  ??  DL    9:01     0:04,02 [usb]</p></blockquote>
<p>&nbsp;</p>
<p>И пробуем запустить скриптом:</p>
<blockquote><p>mira# /usr/local/etc/rc.d/nut start<br />
Network UPS Tools &#8212; UPS driver controller 2.6.1<br />
Network UPS Tools &#8212; Megatec/Q1 protocol USB driver 0.03 (2.6.1)<br />
Supported UPS detected with megatec protocol<br />
Vendor information unavailable<br />
Battery runtime will not be calculated (runtimecal not set)<br />
Starting nut.<br />
Network UPS Tools upsd 2.6.1<br />
listening on 127.0.0.1 port 3493<br />
Connected to UPS [ippon]: blazer_usb-ippon<br />
mira# ps -axu|grep upsd<br />
upsd       27850  0,0  0,0  8032  1412  ??  Ss   11:25     0:00,02 /usr/local/libexec/nut/blazer_usb -a ippon<br />
upsd       27852  0,0  0,0 11880  2220  ??  Ss   11:25     0:00,01 /usr/local/sbin/upsd -u upsd</p></blockquote>
<p>Все отлично работает.</p>
<p>&nbsp;</p>
<p>Проверяем ИБП:</p>
<blockquote><p>mira# upsc ippon@127.0.0.1<br />
battery.voltage: 13.60<br />
battery.voltage.nominal: 12.0<br />
beeper.status: enabled<br />
device.type: ups<br />
driver.name: blazer_usb<br />
driver.parameter.pollinterval: 2<br />
driver.parameter.port: /dev/ugen0.3<br />
driver.version: 2.6.1<br />
driver.version.internal: 0.03<br />
input.current.nominal: 2.0<br />
input.frequency: 49.9<br />
input.frequency.nominal: 50<br />
input.voltage: 225.4<br />
input.voltage.fault: 225.4<br />
input.voltage.nominal: 220<br />
output.voltage: 225.4<br />
ups.delay.shutdown: 30<br />
ups.delay.start: 180<br />
ups.load: 20<br />
ups.productid: 5161<br />
ups.status: OL<br />
ups.temperature: 25.0<br />
ups.type: offline / line interactive<br />
ups.vendorid: 0665</p></blockquote>
<p>Делаем тоже самое с помощью <strong>telnet</strong>:</p>
<blockquote><p>mira# telnet 127.0.0.1 3493<br />
Trying 127.0.0.1&#8230;<br />
Connected to localhost.<br />
Escape character is &#8216;^]&#8217;.<br />
username upsmon<br />
OK<br />
password upsmon<br />
OK<br />
login ippon<br />
OK<br />
list var ippon<br />
BEGIN LIST VAR ippon<br />
VAR ippon battery.voltage &#171;13.60&#8243;<br />
VAR ippon battery.voltage.nominal &#171;12.0&#8243;<br />
VAR ippon beeper.status &#171;enabled&#187;<br />
VAR ippon device.type &#171;ups&#187;<br />
VAR ippon driver.name &#171;blazer_usb&#187;<br />
VAR ippon driver.parameter.pollinterval &#171;2&#8243;<br />
VAR ippon driver.parameter.port &#171;/dev/ugen0.3&#8243;<br />
VAR ippon driver.version &#171;2.6.1&#8243;<br />
VAR ippon driver.version.internal &#171;0.03&#8243;<br />
VAR ippon input.current.nominal &#171;2.0&#8243;<br />
VAR ippon input.frequency &#171;49.9&#8243;<br />
VAR ippon input.frequency.nominal &#171;50&#8243;<br />
VAR ippon input.voltage &#171;233.3&#8243;<br />
VAR ippon input.voltage.fault &#171;233.3&#8243;<br />
VAR ippon input.voltage.nominal &#171;220&#8243;<br />
VAR ippon output.voltage &#171;233.3&#8243;<br />
VAR ippon ups.delay.shutdown &#171;30&#8243;<br />
VAR ippon ups.delay.start &#171;180&#8243;<br />
VAR ippon ups.load &#171;21&#8243;<br />
VAR ippon ups.productid &#171;5161&#8243;<br />
VAR ippon ups.status &#171;OL&#187;<br />
VAR ippon ups.temperature &#171;25.0&#8243;<br />
VAR ippon ups.type &#171;offline / line interactive&#187;<br />
VAR ippon ups.vendorid &#171;0665&#8243;<br />
END LIST VAR ippon<br />
logout<br />
OK Goodbye<br />
Connection closed by foreign host.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/822/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>FreeBSD, вещание видео с web-камеры в сеть</title>
		<link>http://nixadm.ru/archives/716</link>
		<comments>http://nixadm.ru/archives/716#comments</comments>
		<pubDate>Tue, 12 Apr 2011 12:32:01 +0000</pubDate>
		<dc:creator>Dmitriy Kalinin</dc:creator>
				<category><![CDATA[Операционные системы.]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[ffserver]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[v4l]]></category>
		<category><![CDATA[v4l2]]></category>
		<category><![CDATA[video4linux]]></category>
		<category><![CDATA[video4linux2]]></category>
		<category><![CDATA[web-camera]]></category>
		<category><![CDATA[webcam]]></category>
		<category><![CDATA[webcamd]]></category>
		<category><![CDATA[веб-камера]]></category>
		<category><![CDATA[видео]]></category>
		<category><![CDATA[трансляция]]></category>

		<guid isPermaLink="false">http://nixadm.ru/?p=716</guid>
		<description><![CDATA[Появилась задумка, разместить дома дозиметр, направить на него веб-камеру и снимать таким макаром с него данные. Но с покупкой оного возникли проблемы &#8212; нет нигде в наличии, или цена просто неадекватна. Пока дозиметр в пути &#8212; решил сделать все необходимое для вещания с веб-камеры. Размещать дозиметр решил на балконе, сразу приведу схему &#8212; что где [...]]]></description>
			<content:encoded><![CDATA[<p>Появилась задумка, разместить дома дозиметр, направить на него веб-камеру и снимать таким макаром с него данные.<br />
Но с покупкой оного возникли проблемы &#8212; нет нигде в наличии, или цена просто неадекватна.</p>
<p>Пока дозиметр в пути &#8212; решил сделать все необходимое для вещания с веб-камеры.</p>
<p>Размещать дозиметр решил на балконе, сразу приведу схему &#8212; что где находится. Схема законченная, почему именно такая получилась &#8212; чуть ниже.</p>
<p><a href="http://nixadm.ru/wp-content/uploads/2011/04/schema11.png"><img class="aligncenter size-full wp-image-718" title="schema1" src="http://nixadm.ru/wp-content/uploads/2011/04/schema11.png" alt="" width="556" height="299" /></a></p>
<p>&nbsp;</p>
<p>Итак, в коридоре стоит компьютер, который выполняет функции маршрутизатора/файл-хранилища/тестового полигона. На балконе стоит веб-камера, которая смотрит на улицу и в задумке &#8212; передает изображение на компьютер.</p>
<p><span id="more-716"></span>Изначально, веб-камера была подключена к компьютеру через два usb удлинителя (3м + 5м). Но при таком подключении она ни в какую не хотела определяться. Поэтому было принято решение &#8212; купить usb-хаб (<a title="USB-хаб D-Link DUB-1040" href="http://www.dlink.ru/ru/products/150/1374.html">D-Link DUB-1040</a>), стоимость которого колеблется в районе 250р. в нашем захолустном городке :) После чего она прекрасно распозналась.</p>
<p>Компьютер работает под управлением ОС FreeBSD. Изначально все проверки на ноутбуке с Windows 7. После успешного получения изображения с веб-камеры начался следующий этап &#8212; заставить ее работать под FreeBSD.</p>
<pre>mira# uname -a
FreeBSD mira.s25.tmb.local 8.2-STABLE FreeBSD 8.2-STABLE #15 r220493M: Sat Apr  9 17:14:03 MSD 2011     root@mira.s25.tmb.local:/usr/obj/usr/src/sys/mira  amd64
mira# usbconfig
ugen0.1:  at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen1.1:  at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen1.2:
 at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.2:
 at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.3:  at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.4:
 at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON</pre>
<p><strong>ugen0.3</strong> &#8212; это как раз USB-хаб, а <strong>ugen0.4</strong> &#8212; это камера, которая подключена через него. Все оборудование определилось и готово к работе.</p>
<p>Следующий этап &#8212; это установка драйверов для веб-камеры. Недавно под FreeBSD был портирован набор драйверов для веб-камер из Linux, который входит в порт <strong>multimedia/webcamd</strong>.<br />
Устанавливаем этот порт:</p>
<pre>mira# cd /usr/ports/multimedia/webcamd/
mira# make &amp;&amp; make install &amp;&amp; make clean
...
1) webcamd requires the cuse4bsd kernel module, please load this
by doing

       # kldload cuse4bsd

or adding

       cuse4bsd_load="YES"

to your /boot/loader.conf.

2) Please restart devd as the configuration changed

        # /etc/rc.d/devd restart

*********************************************************************
===&gt; Installing rc.d startup script(s)
===&gt;   Running ldconfig
/sbin/ldconfig -m /usr/local/lib
===&gt;   Registering installation for webcamd-0.1.23
===&gt;  Cleaning for libv4l-0.8.1
===&gt;  Cleaning for webcamd-0.1.23</pre>
<p>Сразу запихиваем в <strong>/boot/loader.conf</strong> загрузку модуля <strong>cuse4bsd</strong> и подгружаем его:</p>
<pre>mira# echo 'cuse4bsd="yes"' &gt;&gt; /boot/loader.conf
mira# kldload cuse4bsd
mira# kldstat -n cuse4bsd
Id Refs Address            Size     Name
12    1 0xffffffff809b7000 5ad0     cuse4bsd.ko</pre>
<p>Родной rc-скрипт для <strong>webcamd</strong> (<em>/usr/local/etc/rc.d/webcamd</em>) никуда не годится, поэтому приводим его к такому виду:</p>
<pre>mira# cat /usr/local/etc/rc.d/webcamd
#!/bin/sh
#
# PROVIDE: webcamd
# REQUIRE: DAEMON
#

name="webcamd"
rcvar=${name}_enable

. /etc/rc.subr

load_rc_config $name
: ${webcamd_enable="no"}
: ${hald_enable="no"}

command=/usr/local/sbin/webcamd
command_args="-B"
start_precmd="${name}_prestart"

webcamd_prestart()
{
  if checkyesno hald_enable ; then
    command_args="$command_args -H"
  fi
}

run_rc_command $1</pre>
<p>и добавляем следующие строки в <em>/etc/rc.conf</em>:</p>
<pre>webcamd_enable="yes"
webcamd_flags="-d ugen0.4 -i 0 -v 0"</pre>
<p><strong>ugen0.4</strong> &#8212; это номер устройства на USB-шине, которое соответсвует веб-камере. В моем случае &#8212; это <strong>ugen0.4</strong>, список устройств на USB-шине можно посмотреть с помощью команды <strong>usbconfig</strong>.</p>
<p>На этом установка webcamd завершена. Запускаем его, и проверяем. В случае успеха должно появится новое устройство <strong>/dev/videoN</strong>:</p>
<pre>mira# /usr/local/etc/rc.d/webcamd start
Starting webcamd.
Attached ugen0.4[0] to cuse unit 0
mira# ls /dev/video*
/dev/video0</pre>
<p>Все в порядке, камера готова к работе.</p>
<p>Следующий этап &#8212; это получить видео с камеры. Существует несколько программ для этого: <strong>pwcbsd</strong>, <strong>pwcview</strong>, <strong>vlc</strong>, <strong>ffmpeg</strong>, <strong>mencoder</strong> &#8230;<br />
Из этого набора &#8212; вещать видео умеют <strong>vlc</strong> и <strong>ffmpeg</strong> (<strong>ffserver</strong>). По списку зависимостей &#8212; <strong>vlc</strong> тянет за собой очень много чего, поэтому решил использовать <strong>ffmpeg</strong>.</p>
<p>Собираем <strong>ffmpeg</strong> (<em>/usr/ports/multimedia/ffmpeg</em>), предварительно отключив в нем все, кроме оптимизации и <strong>ffserver</strong>:</p>
<pre>[X] CPUDETECT         Enable runtime CPU detection
[X] FFSERVER          Build and install ffserver
[X] OPTIMIZED_CFLAGS  Additional optimizations
[X] SSSE3             Use binutils from ports (SSSE3 support)</pre>
<p>Следует обратить внимание &#8212; что по какой-то причине во FreeBSD исключена поддержка video4linux. Для исправления этой ситуации заходим в папку <em>/usr/ports/multimedia/ffmpeg/files</em> и смотрим на файл <em>patch-configure</em>:</p>
<pre>mira# cat /usr/ports/multimedia/ffmpeg/files/patch-configure
--- configure.orig      2010-06-15 21:44:30.000000000 +0200
+++ configure   2010-12-12 22:19:20.533163967 +0100
@@ -1469,7 +1469,7 @@
 nm_opts='-g'

 # machine
-arch_default=$(uname -m)
+arch_default=$(uname -p)
 cpu="generic"

 # OS
@@ -1514,7 +1514,7 @@

 CC_O='-o $@'

-host_cflags='-D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112 -O3 -g -Wall'
+host_cflags='-D_ISOC99_SOURCE -O3 -g -Wall'
 host_libs='-lm'

 target_path='$(CURDIR)'
@@ -2096,7 +2096,7 @@
     die "C compiler test failed."
 fi

-add_cppflags -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112
+add_cppflags -D_ISOC99_SOURCE
 check_cflags -std=c99
 check_cc -D_FILE_OFFSET_BITS=64 &lt;
---> @@ -2678,8 +2678,8 @@
--->  fi
---> fi
--->-check_header linux/videodev.h
--->-check_header linux/videodev2.h
--->+#check_header linux/videodev.h
--->+#check_header linux/videodev2.h
--->check_header sys/videoio.h
--->check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
@@ -2986,7 +2986,7 @@
 SRC_PATH="$source_path"
 SRC_PATH_BARE=$source_path
 BUILD_ROOT="$PWD"
-ARCH=$arch
+FFMPEG_ARCH=$arch
 CC=$cc
 AS=$as
 LD=$ld</pre>
<p>Все, что выделено &#8212; удаляем. Получится что-то вроде этого:</p>
<pre>mira# cat /usr/ports/multimedia/ffmpeg/files/patch-configure
--- configure.orig      2010-06-15 21:44:30.000000000 +0200
+++ configure   2010-12-12 22:19:20.533163967 +0100
@@ -1469,7 +1469,7 @@
 nm_opts='-g'

 # machine
-arch_default=$(uname -m)
+arch_default=$(uname -p)
 cpu="generic"

 # OS
@@ -1514,7 +1514,7 @@

 CC_O='-o $@'

-host_cflags='-D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112 -O3 -g -Wall'
+host_cflags='-D_ISOC99_SOURCE -O3 -g -Wall'
 host_libs='-lm'

 target_path='$(CURDIR)'
@@ -2096,7 +2096,7 @@
     die "C compiler test failed."
 fi

-add_cppflags -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112
+add_cppflags -D_ISOC99_SOURCE
 check_cflags -std=c99
 check_cc -D_FILE_OFFSET_BITS=64 &lt;
@@ -2986,7 +2986,7 @@
 SRC_PATH="$source_path"
 SRC_PATH_BARE=$source_path
 BUILD_ROOT="$PWD"
-ARCH=$arch
+FFMPEG_ARCH=$arch
 CC=$cc
 AS=$as
 LD=$ld</pre>
<p>Собираем и устанавливаем <strong>ffmpeg</strong>:</p>
<pre>mira# cd /usr/ports/multimedia/ffmpeg
mira# make &amp;&amp; make install &amp;&amp; make clean</pre>
<p>И проверяем, что он собран с поддержкой <strong>video4linux</strong>:</p>
<pre>mira# ffmpeg -formats | grep video4linux
 D  video4linux     Video4Linux device grab
 D  video4linux2    Video4Linux2 device grab</pre>
<p>Все в порядке.</p>
<p>Теперь приступаем к настройке <strong>ffserver</strong>. Бегло окинув базовый конфиг для него, пишем свой. Мой приобрел такой вид:</p>
<pre>mira# cat /usr/local/etc/ffserver.conf
Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 200
MaxClients 20
MaxBandwidth 20000
CustomLog /var/log/ffserver.log

    File /tmp/webcam1.ffm
    FileMaxSize 200K
    ACL allow 127.0.0.1

    Format status
    ACL allow localhost
    ACL allow 192.168.25.0 192.168.25.255

    URL http://www.ffmpeg.org/

    Feed webcam1.ffm
    Format swf
    VideoBitRate 1000
    VideoBufferSize 20000
    VideoFrameRate 15
    VideoSize 640x480
    VideoQMin 10
    VideoQMax 20
    PreRoll 3
    NoAudio
    ACL ALLOW 0.0.0.0 255.255.255.255</pre>
<p>Приводим в порядок rc-скрипт <strong>ffserver</strong>:</p>
<pre>mira# cat /usr/local/etc/rc.d/ffserver
#!/bin/sh
# PROVIDE: ffserver
# REQUIRE: NETWORKING
# KEYWORD: shutdown

ffserver_enable="${ffserver_enable-NO}"

. /etc/rc.subr

name=ffserver
rcvar=`set_rcvar`

command="/usr/local/bin/ffserver"
required_files=/usr/local/etc/ffserver.conf

load_rc_config ${name}
run_rc_command "$1"</pre>
<p>и разрешаем его запуск в <em>/etc/rc.conf</em> следующей строкой:</p>
<pre>ffserver_enable="yes"</pre>
<p>Запускаем <strong>ffserver</strong>:</p>
<pre>mira# /usr/local/etc/rc.d/ffserver</pre>
<p>ffserver готов к работе, теперь осталось скормить ему поток &#8212; и он начнет его транслировать. Для этого пишем скрипт, вроде этого:</p>
<pre>mira# cat /root/webcam2ffserver.sh
#!/bin/sh
ffmpeg=/usr/local/bin/ffmpeg

env LD_PRELOAD=/usr/local/lib/libv4l/v4l1compat.so \
    $ffmpeg -f video4linux -s 640x480 -r 15 -i /dev/video0 http://127.0.0.1:8090/webcam1.ffm</pre>
<p>Несколько примечаний: <strong>-f video4linux</strong> &#8212; будем использовать формат <strong>video4linux</strong> для источника <em>/dev/video0</em>, именно на него webcamd смонтировал камеру. Т.к. <em>/dev/video0</em> &#8212; это устройство, а мы собрали <strong>ffmpeg</strong> с поддержкой устройств <strong>video4linux</strong> &#8212; то необходимо сказать устройству, что-же мы от него хотим. Для этого мы говорим, что размер кадра хотим 640&#215;480 (<em>-s 640&#215;480</em>), частота кадров &#8212; 15кадр/сек. (<em>-r 15</em>). Полученный поток с камеры мы передаем <strong>ffserver</strong>-у. Для этого указываем feed нашего <strong>ffserver</strong> &#8212; <em>http://127.0.0.1:8090/webcam1.ffm</em></p>
<p>Запускаем скрипт:</p>
<pre>mira# ./webcam2ffserver.sh
[video4linux @ 0x802e21010] Estimating duration from bitrate, this may be inaccurate
Input #0, video4linux, from '/dev/video0':
  Duration: N/A, start: 1302610062.643770, bitrate: 55296 kb/s
    Stream #0.0: Video: rawvideo, yuv420p, 640x480, 55296 kb/s, 15 tbr, 1000k tbn, 15 tbc
[buffer @ 0x802eb5110] w:640 h:480 pixfmt:yuv420p
Output #0, ffm, to 'http://127.0.0.1:8090/webcam1.ffm':
  Metadata:
    encoder         : Lavf52.103.0
    Stream #0.0: Video: flv, yuv420p, 640x480, q=2-31, 1000 kb/s, 1000k tbn, 15 tbc
Stream mapping:
  Stream #0.0 -&gt; #0.0
Press [q] to stop encoding
[flv @ 0x802e0da10] rc buffer underflow
frame= 8188 fps= 15 q=6.8 size=   67280kB time=545.87 bitrate=1009.7kbits/s dup=3 drop=0</pre>
<p>Все работает, входной поток )<em>Stream #0.0: Video: rawvideo, yuv420p, 640&#215;480, 55296 kb/s, 15 tbr, 1000k tbn, 15 tbc</em>) пережимается в исходящий (<em>Stream #0.0: Video: flv, yuv420p, 640&#215;480, q=2-31, 1000 kb/s, 1000k tbn, 15 tbc</em>). Используется кодек <strong>flv</strong>.<br />
Нижняя строка показывает оперативную информацию, сколько кадров обработано, частота кадров, качество, размер потока, время и прочие &#8230;</p>
<p>Посмотреть, что получилось у меня &#8212; можно <a href="http://78.132.139.126/webcam1.html">здесь</a>.</p>
<p><strong>PS:</strong><br />
ffserver &#8212; довольно сырой продукт, в котором еще существует довольно много косяков. Например постоянная рассинхронизация видео, на что разработчики лаконично отвечают:</p>
<pre>mira# man ffserver
FFSERVER(1)                                                        FFSERVER(1)

NAME
       ffserver - FFserver video server
...

  The audio and video loose sync after a while.

       Yes, they do.
...</pre>
<p>Но тем не менее, проект постоянно развивается и надеюсь в скором времени эти косяки будут устранены.</p>
<p>На текущий момент в стабильной ветке <strong>ffmpeg</strong> под FreeBSD существует косяк с блокировкой сокета, из-за чего процессор загружается на 100%, решение данной проблемы можно посмотреть <a href="http://permalink.gmane.org/gmane.comp.video.ffmpeg.devel/109662">здесь</a>.</p>
<p>Если кому интересно &#8212; могу выложить фото, как все разместилось это вживую :)</p>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/716/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>GSM Терминал APC-868</title>
		<link>http://nixadm.ru/archives/677</link>
		<comments>http://nixadm.ru/archives/677#comments</comments>
		<pubDate>Fri, 25 Mar 2011 16:01:38 +0000</pubDate>
		<dc:creator>rtty</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[Железо]]></category>
		<category><![CDATA[Покупки]]></category>
		<category><![CDATA[apc-868]]></category>
		<category><![CDATA[gsm терминал]]></category>
		<category><![CDATA[обзор]]></category>

		<guid isPermaLink="false">http://nixadm.ru/?p=677</guid>
		<description><![CDATA[Возникла следующая задача: на даче понадобился телефон, с сотовым проблемма состояла в том, что уверенный прием был лишь на 3-ем этаже, было принято решение установить GSM терминал. Погуглив, решил купить APC-868. Заказал его тут. Через 6 дней аппарат был у меня. Обошелся он мне в 3600 руб + 350 руб пересылка. Решил написать небольшой обзорчик [...]]]></description>
			<content:encoded><![CDATA[<p>Возникла следующая задача: на даче понадобился телефон, с сотовым проблемма состояла в том, что уверенный прием был лишь на 3-ем этаже, было принято решение установить GSM терминал. Погуглив, решил купить APC-868. Заказал его <a href="http://www.siptrade.ru/katalog/voip_shluzy_ata/gsm_gate_voip_gsm/gsmshluz_apc868_c5.html">тут</a>. Через 6 дней аппарат был у меня. Обошелся он мне в 3600 руб + 350 руб пересылка. Решил написать небольшой обзорчик аппарата.</p>
<p><span style="text-decoration: underline;"><strong>Обзор APC-868</strong></span></p>
<p>Итак, получил я вот такую аккуратно упакованную коробку:<br />
<a href="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0214.jpg"><img class="alignnone size-medium wp-image-678" title="IMG_0214" src="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0214-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><span id="more-677"></span></p>
<p>Комплектация меня очень порадовала:</p>
<p><a href="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0216.jpg"><img class="alignnone size-medium wp-image-679" title="IMG_0216" src="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0216-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>В комплект вошли:<br />
- Сам аппарат<br />
- Внешняя антенна на магнитом основании<br />
- Стацианарная антеннка<br />
- Блок питания<br />
- 4 аккумулятора 1500 мАч<br />
- Кабель для подключения к PC по RS-232<br />
- Кабель для подключения телефона<br />
- Инструкция на русском языке<br />
- Крепеж к стене</p>
<p>В блоке питания имеется отсек под 4 аккумулятора, аппарат может работать при отключении электроэнергии:<br />
<a href="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0219.jpg"><img class="alignnone size-medium wp-image-680" title="IMG_0219" src="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0219-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>Рассмотрим сам аппарат:</p>
<p><a href="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0220.jpg"><img class="alignnone size-medium wp-image-681" title="IMG_0220" src="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0220-300x225.jpg" alt="" width="300" height="225" /></a> <img class="alignnone size-medium wp-image-682" title="IMG_0217" src="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0217-300x225.jpg" alt="" width="300" height="225" /> <a href="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0221.jpg"><img class="alignnone size-medium wp-image-683" title="IMG_0221" src="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0221-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>Разьмы:<br />
Сбоку разъем для подключения антенны, снизу гнездо для установки сим-карты.<br />
Сзади устройство оборудовано 2-мя RJ-11 для подключения двух телефонных аппаратов, SERIAL порт для подключения к PC, и разьем для подключения питания.</p>
<p><span style="text-decoration: underline;"><strong>Подключаем и испытываем:</strong></span><br />
Устройство вприницпе в настройке не нуждается и начианет работать сразу. Устанавливаем симкарту, аккумуляторы, подключаем телефонный аппарат:<br />
<a href="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0222.jpg"><img class="alignnone size-medium wp-image-684" title="IMG_0222" src="http://nixadm.ru/wp-content/uploads/2011/03/IMG_0222-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>Пробывал 3 телефонных аппарата, единственная проблемма была с телефоном РУСЬ &#8212; телефон не звонил при входящем звонке, уверент что это настраивается в самом телефоне, лень было искать. Копать в сторону напряжения звонка. Остальные телефоны заработали без проблем. Набор поддерживается как тональный так и импульсный, чистый ровный гудок, звук без помех. Если телефонный аппарат поддерживает определение номера DTFM, то он будет определять номер.</p>
<p>Интернет испытывать не стал, да и небыло ком-порта, но думаю эта опция мало актуальна для дачи при наличии 3g usb модемов. Хотя возможно нашла бы применение в охранных системах и тд. Так же шлюз поддерживает отправку смс как с телефона, так и через программное обеспечение (не проверял).</p>
<p><span style="text-decoration: underline;"><strong>Впечатления:</strong></span><br />
В целом аппарат весьма неплохой за свою цену. Очень порадовала комплектация. Сам аппарат тоже очнь неплохо себя показал, полностью годится для решения моей задачи. Минус &#8212; возможны проблеммы с некоторыми телефонными аппаратами.</p>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/677/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Веб интерфес для прослушивания записанных Asterisk вызовов.</title>
		<link>http://nixadm.ru/archives/659</link>
		<comments>http://nixadm.ru/archives/659#comments</comments>
		<pubDate>Mon, 07 Mar 2011 11:37:35 +0000</pubDate>
		<dc:creator>rtty</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[VoIP]]></category>
		<category><![CDATA[Операционные системы.]]></category>
		<category><![CDATA[record]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[веб]]></category>
		<category><![CDATA[запись]]></category>

		<guid isPermaLink="false">http://nixadm.ru/?p=659</guid>
		<description><![CDATA[Для более удобного прослушивания записанных asterisk вызовов, решил написать простенький веб интерфейс. С помощью его можно выполнять такие простейшие фукции: - Поиск нужного звонка с помощью несложного фильтра - Прослушивание звонка из встроенного флеш плеера. Вот скриншот: &#160; 1. Устанавливаем /usr/ports/net/asterisk16-addons, предварительно добавив в Makefile строку: CFLAGS+=-DMYSQL_LOGUNIQUEID 2. Создаем базу данных: CREATE DATABASE asterisk; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Для более удобного прослушивания записанных asterisk вызовов, решил написать простенький веб интерфейс.<br />
С помощью его можно выполнять такие простейшие фукции:<br />
- Поиск нужного звонка с помощью несложного фильтра<br />
- Прослушивание звонка из встроенного флеш плеера.<br />
Вот скриншот:<br />
<a href="http://nixadm.ru/wp-content/uploads/2011/02/asteriskrec.jpg"><img class="size-full wp-image-611 alignnone" title="asteriskrec" src="http://nixadm.ru/wp-content/uploads/2011/02/asteriskrec.jpg" alt="" width="606" height="578" /></a></p>
<p>&nbsp;</p>
<p><span id="more-659"></span></p>
<p><strong>1. Устанавливаем /usr/ports/net/asterisk16-addons</strong>,<br />
предварительно добавив в Makefile строку:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">CFLAGS+=-DMYSQL_LOGUNIQUEID</pre></div></div>

<p><strong>2. Создаем базу данных:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> asterisk;
&nbsp;
<span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">INSERT</span>
<span style="color: #993333; font-weight: bold;">ON</span> asterisk<span style="color: #66cc66;">.*</span>
<span style="color: #993333; font-weight: bold;">TO</span> asterisk@localhost
<span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">'yourpassword'</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">USE</span> asterisk;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`cdr`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`calldate`</span> datetime <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0000-00-00 00:00:00'</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`clid`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`src`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`dst`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`dcontext`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`channel`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`dstchannel`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`lastapp`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`lastdata`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`duration`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`billsec`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`disposition`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">45</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`amaflags`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`accountcode`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`userfield`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`uniqueid`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`cld_idx`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`calldate`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`src_idx`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`src`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`dst_idx`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`dst`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`acc_idx`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`accountcode`</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p><strong>3. Файл /usr/local/etc/asterisk/cdr_mysql.conf</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>global<span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #007800;">hostname</span>=localhost
<span style="color: #007800;">dbname</span>=asterisk
<span style="color: #007800;">table</span>=cdr
<span style="color: #007800;">password</span>=youpassword
<span style="color: #007800;">user</span>=asterisk
<span style="color: #007800;">sock</span>=<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>mysql.sock
<span style="color: #007800;">userfield</span>=<span style="color: #000000;">1</span></pre></div></div>

<p>4. Скачиваем архив с вебинтерфейсом <a href="/files/ast-rec.0.1.tar.bz2">скачать</a>, распаковываем в директорию веб сервера. Настройки в файле config.php. Скрипт простейший, функции минимальны, делал для себя. Доступ к вебинтерфейсу нужно запаролить через .htaccess</p>
<p>5. Сам asterisk должен быть предварительно сконфигурирован для записи: http://nixadm.ru/archives/605</p>
<p>PS: Просьба, если кто установит, отписаться о результате. Делал давно, писал по памяти, может быть что-то упустил.</p>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/659/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>HP Microserver: мои впечатления.</title>
		<link>http://nixadm.ru/archives/615</link>
		<comments>http://nixadm.ru/archives/615#comments</comments>
		<pubDate>Wed, 23 Feb 2011 19:25:45 +0000</pubDate>
		<dc:creator>rtty</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Железо]]></category>
		<category><![CDATA[HP]]></category>
		<category><![CDATA[Microserver]]></category>
		<category><![CDATA[обзор]]></category>

		<guid isPermaLink="false">http://nixadm.ru/?p=615</guid>
		<description><![CDATA[Последнее время с фукцниями моего домашнего сервера справлялся неттоп 3Q Qoo, но появилась необходимость файлопомойки c четырьмя жесткими дисками. Более менее нормальные NASы с возможностью установки 4 HDD стоят долвольно таки не малые деньги, поэтому выбор пал на HP Microserver. Мои первые впечатления: - С вида девайс весьма симпатичный и аккуратный. Сразу стал частью интерьера [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-634" title="HP-MicroServer" src="http://nixadm.ru/wp-content/uploads/2011/02/HP-MicroServer.jpg" alt="" width="197" height="199" />Последнее время с фукцниями моего домашнего сервера справлялся неттоп 3Q Qoo, но появилась необходимость файлопомойки c четырьмя жесткими дисками. Более менее нормальные NASы с возможностью установки 4 HDD стоят долвольно таки не малые деньги, поэтому выбор пал на HP Microserver.</p>
<p>Мои первые впечатления:</p>
<p>- С вида девайс весьма симпатичный и аккуратный. Сразу стал частью интерьера комнаты.<br />
- Внутри все собрано компактно, но в тоже время удобно и быстро разбирается и собирается.<br />
- Внутри находятся 4 отсека под жесткие диски 3.5&#187; (SATA 1.0), в один отсек уже установлен диск на 160Гб. На материнской плате есть еще 1 SATA, в него можено подключить HDD или DVD который можно установить в отсек 5.25, питания подведено туда уже. И того у меня сейчас стоит 1 HDD родной в отсеке 5.25, на нем установлена система. И 4 WDC WD20EAR, из них собран RAID-Z (схема организации данных и четности подобна RAID-5, но используется динамический размер сегмента). Блок питания 200Вт без возможности горячей замены. Так же, на материнской плате имеются разьемы PCI Express x16 и PCI Express x1 (можно установить Low-profile видюшку, только с TDP не более 25Вт) ,  USB 2.0 внутренний. Память я сразу заменил на две планки по два гигабайта Hunix PC10600, проблем не возникло.<br />
- На задней панели расположены: VGA-разьем (HD-15F), 2 USB (на передней панели еще 4), Gigabit Ethernet (HP NC107i), eSATA.</p>
<p>Устройство стоит своих денег, по сравнению с NAS предоставляет возможность запуска полноценной операционной системы, хорошо маштабируется. Из недостатков будет скорее всего энергопотребление.</p>
<p><span id="more-615"></span></p>
<p>PS. Данная заметка не претендует на обзор, их очень много, например на хабре: <a href="http://habrahabr.ru/company/hp/blog/109685/">1</a> <a href="http://habrahabr.ru/blogs/hardware/110500/">2</a> <a href="http://habrahabr.ru/blogs/hardware/110921/">3</a></p>
<p><a href="http://habrahabr.ru/blogs/hardware/110921/"></a>Ветка на IXBT: <a href="http://forum.ixbt.com/topic.cgi?id=11:41849">тут</a></p>
<p>Страничка девайса на офф сайте HP: <a href="http://h10010.www1.hp.com/wwpc/ru/ru/sm/WF05a/15351-15351-4237916-4237917-4237917-4248009.html">тут</a></p>
<p>Ну и на последок фото отчет (снималось на iPhone, извиняйте за качество):<br />

<a href='http://nixadm.ru/archives/615/img_0172' title='IMG_0172'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0172-150x150.jpg" class="attachment-thumbnail" alt="IMG_0172" title="IMG_0172" /></a>
<a href='http://nixadm.ru/archives/615/img_0173' title='IMG_0173'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0173-150x150.jpg" class="attachment-thumbnail" alt="IMG_0173" title="IMG_0173" /></a>
<a href='http://nixadm.ru/archives/615/img_0174' title='IMG_0174'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0174-150x150.jpg" class="attachment-thumbnail" alt="IMG_0174" title="IMG_0174" /></a>
<a href='http://nixadm.ru/archives/615/img_0175' title='IMG_0175'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0175-150x150.jpg" class="attachment-thumbnail" alt="IMG_0175" title="IMG_0175" /></a>
<a href='http://nixadm.ru/archives/615/img_0176' title='IMG_0176'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0176-150x150.jpg" class="attachment-thumbnail" alt="IMG_0176" title="IMG_0176" /></a>
<a href='http://nixadm.ru/archives/615/img_0178' title='IMG_0178'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0178-150x150.jpg" class="attachment-thumbnail" alt="IMG_0178" title="IMG_0178" /></a>
<a href='http://nixadm.ru/archives/615/img_0179' title='IMG_0179'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0179-150x150.jpg" class="attachment-thumbnail" alt="IMG_0179" title="IMG_0179" /></a>
<a href='http://nixadm.ru/archives/615/img_0180' title='IMG_0180'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0180-150x150.jpg" class="attachment-thumbnail" alt="IMG_0180" title="IMG_0180" /></a>
<a href='http://nixadm.ru/archives/615/img_0181' title='IMG_0181'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0181-150x150.jpg" class="attachment-thumbnail" alt="IMG_0181" title="IMG_0181" /></a>
<a href='http://nixadm.ru/archives/615/img_0182' title='IMG_0182'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0182-150x150.jpg" class="attachment-thumbnail" alt="IMG_0182" title="IMG_0182" /></a>
<a href='http://nixadm.ru/archives/615/img_0183' title='IMG_0183'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0183-150x150.jpg" class="attachment-thumbnail" alt="IMG_0183" title="IMG_0183" /></a>
<a href='http://nixadm.ru/archives/615/hp-microserver' title='HP-MicroServer'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/HP-MicroServer-150x150.jpg" class="attachment-thumbnail" alt="HP-MicroServer" title="HP-MicroServer" /></a>
<a href='http://nixadm.ru/archives/615/img_0203' title='IMG_0203'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0203-150x150.jpg" class="attachment-thumbnail" alt="IMG_0203" title="IMG_0203" /></a>
<a href='http://nixadm.ru/archives/615/img_0204' title='IMG_0204'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0204-150x150.jpg" class="attachment-thumbnail" alt="IMG_0204" title="IMG_0204" /></a>
<a href='http://nixadm.ru/archives/615/img_0205' title='IMG_0205'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0205-150x150.jpg" class="attachment-thumbnail" alt="IMG_0205" title="IMG_0205" /></a>
<a href='http://nixadm.ru/archives/615/img_0206' title='IMG_0206'><img width="150" height="150" src="http://nixadm.ru/wp-content/uploads/2011/02/IMG_0206-150x150.jpg" class="attachment-thumbnail" alt="IMG_0206" title="IMG_0206" /></a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/615/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Asterisk: запись разговоров.</title>
		<link>http://nixadm.ru/archives/605</link>
		<comments>http://nixadm.ru/archives/605#comments</comments>
		<pubDate>Tue, 22 Feb 2011 14:31:55 +0000</pubDate>
		<dc:creator>rtty</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[VoIP]]></category>
		<category><![CDATA[mixmonitor]]></category>
		<category><![CDATA[monitor]]></category>
		<category><![CDATA[record]]></category>
		<category><![CDATA[запись]]></category>

		<guid isPermaLink="false">http://nixadm.ru/?p=605</guid>
		<description><![CDATA[Запись разговоров в Asterisk весьма полезная вешь, например, можно проконтролировать, как общаются сотрудники компании с клиентами. Для реализации данного функционала в Asterisk существуют функции Monitor (записывает в разные файлы отдельно голос звонящего и принимающего звонок) и MixMontor (микширует голоса звонящего и принимающего звонок и записывает в один файл). У себя я сделал так: Добавил в [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-606" title="Asterisk Record" src="http://nixadm.ru/wp-content/uploads/2011/02/aster.jpg" alt="Astersisk Record" width="199" height="109" /><br />
Запись разговоров в Asterisk весьма полезная вешь, например, можно проконтролировать, как общаются сотрудники компании с клиентами. Для реализации данного функционала в Asterisk существуют функции Monitor (записывает в разные файлы отдельно голос звонящего и принимающего звонок) и MixMontor (микширует голоса звонящего и принимающего звонок и записывает в один файл).</p>
<p><span id="more-605"></span></p>
<p>У себя я сделал так:<br />
Добавил в extensions.ael в секцию global переменные:</p>
<pre>globals {
    WAV=/var/log/asterisk/wav; //Временный каталог с WAV
    MP3=/usr/local/www/apache22/vhosts/asterisk.myhost.ru/mp3; //Куда выгружать mp3 файлы
    RECORDING=1; // Запись, 1 - включена.
}</pre>
<p>Вот пример из моего конфига:</p>
<pre>// Звонки на городские номера будут адресоваться через PSTN-GW.
context city-numbers {
       _XXXXXX =&gt; {
       if ("${RECORDING}" = "1"){
              Set(monopt=nice -n 19 /usr/local/bin/lame -b 16  --silent "${WAV}/${UNIQUEID}.wav"  "${MP3}/${UNIQUEID}.mp3" &amp;&amp; rm -f "${WAV}/${UNIQUEID}.wav");.
              MixMonitor(${WAV}/${UNIQUEID}.wav,b,${monopt});
       };
              Dial(SIP/${EXTEN}@spa3102,,T);
       };
};</pre>
<p>В примере выше: monopt задает комманду, выполняему после окончания записи, в данном случае выполняется комманда для конвертирования wav в mp3. Файл будет сохранен с именем ${UNIQUEID} (уникальный идентификатор звонка).<br />
Прим. Lame должен быть установлен  ( /usr/ports/audio/lame )</p>
<p>UPD: Продолжение: прикручиваем веб интерфейс для прослушивания звонков: http://nixadm.ru/archives/659</p>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/605/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Настраиваем PF (Packet Filter) на FreeBSD.</title>
		<link>http://nixadm.ru/archives/564</link>
		<comments>http://nixadm.ru/archives/564#comments</comments>
		<pubDate>Tue, 11 Jan 2011 18:12:16 +0000</pubDate>
		<dc:creator>rtty</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Операционные системы.]]></category>
		<category><![CDATA[anchor]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[pf]]></category>
		<category><![CDATA[pfctl]]></category>
		<category><![CDATA[rdr]]></category>

		<guid isPermaLink="false">http://nixadm.ru/?p=564</guid>
		<description><![CDATA[Продолжение, начало тут Вспомним нашу схемку: Итак, составим правила для PF: 1. Конфигурация PF. /etc/firewall/pf.conf: # Не фильтруем lo0 set skip on lo0 # nat rules nat-anchor "rules/*" # redirect rules rdr-anchor "rules/*" # rules anchor "rules/*" ### deny all ### block all ### rules ### load anchor "rules/gif0" from "/etc/firewall/pf.xl0" # Загружаем блок правил [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Продолжение, начало <a href="http://nixadm.ru/2010/05/%d0%9d%d0%b0%d1%81%d1%82%d1%80%d0%b0%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-%d1%84%d0%b0%d0%b5%d1%80%d0%b2%d0%be%d0%bb-pf-%d0%b2%d0%be-freebsd/">тут</a></strong><br />
<strong></strong><br />
Вспомним нашу схемку:<br />
<img class="size-full wp-image-212 alignnone" title="1" src="http://nixadm.ru/wp-content/uploads/2010/05/11.png" alt="" width="515" height="389" /><br />
Итак, составим правила для PF:<br />
<span id="more-564"></span></p>
<h2>1. Конфигурация PF.</h2>
<p>/etc/firewall/pf.conf:</p>
<pre>
# Не фильтруем lo0
set skip on lo0

# nat rules
nat-anchor "rules/*"

# redirect rules
rdr-anchor "rules/*"

# rules
anchor "rules/*"

### deny all ###
block all

### rules ###
load anchor "rules/gif0" from "/etc/firewall/pf.xl0" # Загружаем блок правил для xl0
load anchor "rules/gif1" from "/etc/firewall/pf.xl1" # Загружаем блок правил для xl1
# Для каждого нового интерфейса добавляем свой блок, например для OpenVPN:
#load anchor "rules/gif1" from "/etc/firewall/pf.tap0"
</pre>
<p>Файлик: /etc/firewall/pf.xl0:</p>
<pre># Сеть провайдера
if="xl0"
ip="10.2.2.10" # IP
gw="10.2.2.1" # Шлюз провайдера

# nat
nat on $if from !$ip -&gt; $ip  # Включаем NAT

# rdr
# Пример: пробросим порт 26770 (tcp, udp) с внешнего адреса
# на компьютер в локальной сети с IP 192.168.0.2
rdr on $if inet proto { tcp, udp } to $ip port 26770 -&gt; 192.168.0.2

# rules
# Разрешаем весь исходящий
pass out quick on $if
# Разрешаем icmp трафик
pass in quick on $if reply-to($if $gw) inet proto icmp to $ip
# Разрешаем ftp и блок PassivePort
pass in quick on $if reply-to($if $gw) inet proto tcp to $ip port { 21, 43000:44000 }
# Разрешаем ssh
pass in quick on $if reply-to($if $gw) inet proto tcp to $ip port 22
# Разрешаем www
pass in quick on $if reply-to($if $gw) inet proto tcp to $ip port 80
block in quick on $if</pre>
<p>Файлик: /etc/firewall/pf.xl1:</p>
<pre># Локальная сеть
if="xl1"
ip="192.168.0.1"

# rdr
# Пример редиректа для прозрачного прокси
#rdr on $if inet proto tcp to port 80 -&gt; 127.0.0.1 port 3129 

# rules
pass quick on $if</pre>
<p>Простейшие конфиги написаны, можно загружать правила:</p>
<pre>pfctl -f /etc/firewall/pf.conf
pfctl -e</pre>
<p>Для загрузки правил в автомате добавляем в /etc/rc.conf:</p>
<pre>### PF
pf_enable="YES"
pf_rules="/etc/firewall/pf.conf"</pre>
<p>Убедившись, что внутрисеть провайдера доступна с локальной сети, приступим к настройке pppoe.</p>
<h2>2. Настройка PPPOE.</h2>
<h3>2.1 Устанавливаем MPD:</h3>
<pre>cd /usr/ports/mpd5
make
make install clean</pre>
<h3>2.2 Добавляем в автозагруку:</h3>
<pre>echo 'mpd_enable="YES"' &gt;&gt; /etc/rc.conf
echo 'mpd_flags="-b"' &gt;&gt; /etc/rc.conf</pre>
<h3>2.3 Файлы конфигурации</h3>
<p>Главный конфигурационный файл /usr/local/etc/mpd5/mpd.conf:</p>
<pre>startup:
    set user admin 01345 admin
    set console self 127.0.0.1 5005
    set console open

default:
    load pppoe_stream

pppoe_client_common:
    set link max-redial 0
    set link keep-alive 10 60

pppoe_stream:
    create bundle static Bstream
    set iface enable tcpmssfix
    set iface route default  # Добавляет маршрут по умолчанию
    set iface up-script /usr/local/etc/mpd5/scripts/inet.stream.up.sh
    set iface down-script /usr/local/etc/mpd5/scripts/inet.stream.down.sh
    create link static Lstream pppoe
    set link action bundle Bstream
    set auth authname "000011111"  # Ваш логин
    set auth password "112233445"  # Ваш пароль
    load pppoe_client_common
    set pppoe iface re0    # Название сетевого интерфейса
    set pppoe service ""
    open</pre>
<p>Файлик /usr/local/etc/mpd5/scripts/inet.stream.up.sh:</p>
<pre>#!/bin/sh
if=$1
ip=$3
gw=$4
pfctl=/sbin/pfctl
ifconfig=/sbin/ifconfig
### pf ###
echo -e "
# nat
nat on $if from !$ip -&gt; $ip

# rdr
rdr pass on $if inet proto tcp from any to $if port 26770 -&gt; 192.168.0.2

# rules
pass out quick on $if
pass in quick on $if reply-to($if $gw) inet proto icmp
pass in quick on $if reply-to($if $gw) inet proto tcp to $ip port 22 # ssh
pass in quick on $if reply-to($if $gw) inet proto tcp to $ip port 80 # web
pass in quick on $if reply-to($if $gw) inet proto tcp to $ip port { 21, 24000:24050 }

block in quick on $if
" | $pfctl -a "rules/stream" -f -
######

### routes ###
# Добавляем нужные маршруты.
route=/sbin/route
route delete default
route add 10/8 10.2.2.1
route add default $gw</pre>
<p>Файлик /usr/local/etc/mpd5/scripts/inet.stream.down.sh:</p>
<pre>#!/bin/sh
if=$1
ip=$3
gw=$4
pfctl=/sbin/pfctl
ifconfig=/sbin/ifconfig
# route
$route delete default
$route add default 10.2.2.1
### pf ###
$pfctl -a "rules/stream" -F all
######</pre>
<p>Запускаем:</p>
<pre>service mpd5 start</pre>
]]></content:encoded>
			<wfw:commentRss>http://nixadm.ru/archives/564/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

