<?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>jared.kiev.ua</title>
	<atom:link href="http://jared.kiev.ua/feed/" rel="self" type="application/rss+xml" />
	<link>http://jared.kiev.ua</link>
	<description>Сетап как стиль жизни</description>
	<lastBuildDate>Wed, 07 Mar 2012 19:15:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Как я был радистом</title>
		<link>http://jared.kiev.ua/2012/03/%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%b1%d1%8b%d0%bb-%d1%80%d0%b0%d0%b4%d0%b8%d1%81%d1%82%d0%be%d0%bc/</link>
		<comments>http://jared.kiev.ua/2012/03/%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%b1%d1%8b%d0%bb-%d1%80%d0%b0%d0%b4%d0%b8%d1%81%d1%82%d0%be%d0%bc/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 19:07:52 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Icecast]]></category>
		<category><![CDATA[icecast]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=261</guid>
		<description><![CDATA[<p>Нашел в веб-архиве свою старую статью про настройку радио на FreeBSD. Пока не потерлась &#8212; выложу здесь, авось кому пригодится.</p>
<hr />
<p>Поставили как-то задачу: взять с микшерного пульта радиохолдинга 3 радиоканала и вещать их в сеть. После танцев с бубном вокруг Shoutcast-a был выбран все-таки Icecast, т.к. ogg ест меньше трафика и звучит лучше.</p>
<p><a href="http://jared.kiev.ua/2012/03/%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%b1%d1%8b%d0%bb-%d1%80%d0%b0%d0%b4%d0%b8%d1%81%d1%82%d0%be%d0%bc/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Нашел в веб-архиве свою старую статью про настройку радио на FreeBSD. Пока не потерлась &#8212; выложу здесь, авось кому пригодится.</p>
<hr />
<p>Поставили как-то задачу: взять с микшерного пульта радиохолдинга 3 радиоканала и вещать их в сеть. После танцев с бубном вокруг Shoutcast-a был выбран все-таки Icecast, т.к. ogg ест меньше трафика и звучит лучше.</p>
<p>Для тех, кто о онлайн-радио имеет довольно смутное понятие, опишу схему его работы.<br />
Состоит оно из 3 частей &#8212; источника звука, источника потока и ретранслятора. Может не так назвал, но суть от этого не меняется.</p>
<p>1. Источник звука. Микрофон, аудиофайл, другое онлайн-радио, линейный вход и т.д. &#8212; звук можно брать откуда угодно.<br />
2. Источник потока. Демон, который берет сигнал из источника звука, если надо, меняет ему качество, битрейт, кол-во каналов и пр. &#8212; и отправляет на ретранслятор.<br />
3. Ретранслятор. Демон, к которому коннектятся пользователи в поисках счастья и музыки. <img src='http://jared.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> )</p>
<p>В моем случае звук берется с линейного входа, оцифровывается демоном Ices и отправляется на Icecast для ретрансляции.</p>
<p>Итак, поехали.</p>
<p><code># cd /usr/ports/audio/icecast2 &amp;&amp; make install clean<br />
# cd /usr/ports/audio/ices &amp;&amp; make install clean<br />
</code></p>
<p>Далее собственно конфиги:</p>
<blockquote><p># cat /usr/local/etc/icecast.xml<br />
&lt;icecast&gt;<br />
&lt;limits&gt;<br />
&lt;clients&gt;400&lt;/clients&gt;<br />
&lt;sources&gt;4&lt;/sources&gt;<br />
&lt;threadpool&gt;5&lt;/threadpool&gt;<br />
&lt;queue-size&gt;524288&lt;/queue-size&gt;<br />
&lt;client-timeout&gt;30&lt;/client-timeout&gt;<br />
&lt;header-timeout&gt;15&lt;/header-timeout&gt;<br />
&lt;source-timeout&gt;10&lt;/source-timeout&gt;<br />
&lt;burst-on-connect&gt;0&lt;/burst-on-connect&gt;<br />
&lt;burst-size&gt;65535&lt;/burst-size&gt;<br />
&lt;/limits&gt;</p>
<p>&lt;authentication&gt;<br />
&lt;!&#8212; Sources log in with username &#8216;source&#8217; &#8212;&gt;<br />
&lt;source-password&gt;k7sgw3onpfbos7ed&lt;/source-password&gt;<br />
&lt;!&#8212; Relays log in username &#8216;relay&#8217; &#8212;&gt;<br />
&lt;relay-password&gt;w938vo4rybiof4y3tf&lt;/relay-password&gt;</p>
<p>&lt;!&#8212; Admin logs in with the username given below &#8212;&gt;<br />
&lt;admin-user&gt;admin&lt;/admin-user&gt;<br />
&lt;admin-password&gt;d3rp9r0l&lt;/admin-password&gt;<br />
&lt;/authentication&gt;</p>
<p>&lt;!&#8212; This is the hostname other people will use to connect to your server.<br />
It affects mainly the urls generated by Icecast for playlists and yp<br />
listings. &#8212;&gt;<br />
&lt;hostname&gt;jazz.td.net.ua&lt;/hostname&gt;</p>
<p>&lt;listen-socket&gt;<br />
&lt;port&gt;8000&lt;/port&gt;<br />
&lt;/listen-socket&gt;</p>
<p>&lt;mount&gt;<br />
&lt;mount-name&gt;/hit-fm-64k.ogg&lt;/mount-name&gt;<br />
&lt;max-listeners&gt;400&lt;/max-listeners&gt;<br />
&lt;burst-size&gt;65536&lt;/burst-size&gt;<br />
&lt;hidden&gt;0&lt;/hidden&gt;<br />
&lt;no-yp&gt;1&lt;/no-yp&gt;<br />
&lt;/mount&gt;</p>
<p>&lt;mount&gt;<br />
&lt;mount-name&gt;/hit-fm-128k.ogg&lt;/mount-name&gt;<br />
&lt;max-listeners&gt;400&lt;/max-listeners&gt;<br />
&lt;burst-size&gt;65536&lt;/burst-size&gt;<br />
&lt;hidden&gt;0&lt;/hidden&gt;<br />
&lt;no-yp&gt;1&lt;/no-yp&gt;<br />
&lt;/mount&gt;</p>
<p>&lt;mount&gt;<br />
&lt;mount-name&gt;/rusradio-64k.ogg&lt;/mount-name&gt;<br />
&lt;max-listeners&gt;400&lt;/max-listeners&gt;<br />
&lt;burst-size&gt;65536&lt;/burst-size&gt;<br />
&lt;hidden&gt;0&lt;/hidden&gt;<br />
&lt;no-yp&gt;1&lt;/no-yp&gt;</p>
<p>&lt;mount&gt;<br />
&lt;mount-name&gt;/kiss-fm-64k.ogg&lt;/mount-name&gt;<br />
&lt;max-listeners&gt;400&lt;/max-listeners&gt;<br />
&lt;burst-size&gt;65536&lt;/burst-size&gt;<br />
&lt;hidden&gt;0&lt;/hidden&gt;<br />
&lt;no-yp&gt;1&lt;/no-yp&gt;<br />
&lt;/mount&gt;</p>
<p>&lt;fileserve&gt;1&lt;/fileserve&gt;</p>
<p>&lt;paths&gt;<br />
&lt;!&#8212; basedir is only used if chroot is enabled &#8212;&gt;<br />
&lt;basedir&gt;/usr/local/share/icecast&lt;/basedir&gt;</p>
<p>&lt;!&#8212; Note that if &lt;chroot&gt; is turned on below, these paths must both<br />
be relative to the new root, not the original root &#8212;&gt;<br />
&lt;logdir&gt;/var/log&lt;/logdir&gt;<br />
&lt;webroot&gt;/usr/local/share/icecast/web&lt;/webroot&gt;<br />
&lt;adminroot&gt;/usr/local/share/icecast/admin&lt;/adminroot&gt;<br />
&lt;!&#8212; &lt;pidfile&gt;/usr/local/share/icecast/icecast.pid&lt;/pidfile&gt; &#8212;&gt;</p>
<p>&lt;!&#8212; Aliases: treat requests for &#8216;source&#8217; path as being for &#8216;dest&#8217; path<br />
May be made specific to a port or bound address using the &#171;port&#187;<br />
and &#171;bind-address&#187; attributes.<br />
&#8212;&gt;<br />
&lt;!&#8212;<br />
&lt;alias source=&#187;/foo&#187; dest=&#187;/bar&#187;/&gt;<br />
&#8212;&gt;<br />
&lt;!&#8212; Aliases: can also be used for simple redirections as well,<br />
this example will redirect all requests for <a href="http://web.archive.org/web/20080310014510/http://server:port/" rel="nofollow" target="_blank">http://server:port/</a> to<br />
the status page<br />
&#8212;&gt;<br />
&lt;alias source=&#187;/&#187; dest=&#187;/status.xsl&#187;/&gt;<br />
&lt;/paths&gt;</p>
<p>&lt;logging&gt;<br />
&lt;accesslog&gt;icecast-access.log&lt;/accesslog&gt;<br />
&lt;errorlog&gt;icecast-error.log&lt;/errorlog&gt;<br />
&lt;!&#8212; &lt;playlistlog&gt;playlist.log&lt;/playlistlog&gt; &#8212;&gt;<br />
&lt;loglevel&gt;4&lt;/loglevel&gt; &lt;!&#8212; 4 Debug, 3 Info, 2 Warn, 1 Error &#8212;&gt;<br />
&lt;logsize&gt;10000&lt;/logsize&gt; &lt;!&#8212; Max size of a logfile &#8212;&gt;<br />
&lt;!&#8212; If logarchive is enabled (1), then when logsize is reached<br />
the logfile will be moved to [error|access|playlist].log.DATESTAMP,<br />
otherwise it will be moved to [error|access|playlist].log.old.<br />
Default is non-archive mode (i.e. overwrite)<br />
&#8212;&gt;<br />
&lt;!&#8212; &lt;logarchive&gt;1&lt;/logarchive&gt; &#8212;&gt;<br />
&lt;/logging&gt;</p>
<p>&lt;security&gt;<br />
&lt;chroot&gt;0&lt;/chroot&gt;<br />
&lt;changeowner&gt;<br />
&lt;user&gt;nobody&lt;/user&gt;<br />
&lt;group&gt;nogroup&lt;/group&gt;<br />
&lt;/changeowner&gt;<br />
&lt;/security&gt;<br />
&lt;/icecast&gt;</p></blockquote>
<p>&nbsp;</p>
<p>Небольшие пояснения &#8212; радиостанций у меня было 3, одну из них надо было транслировать в 2 битрейтах. Не знаю, зачем оно в случае с ogg &#8212; разницы между 64 и 256 не слышно, но такова была постановка задачи.</p>
<p>Теперь типичный файл конфигурации ices:</p>
<blockquote><p># cat /usr/local/etc/ices-oss-hit.xml<br />
&lt;?xml version=&#187;1.0&#8243;?&gt;<br />
&lt;ices&gt;</p>
<p>&lt;!&#8212; run in background  &#8212;&gt;<br />
&lt;background&gt;0&lt;/background&gt;<br />
&lt;!&#8212; where logs go. &#8212;&gt;<br />
&lt;logpath&gt;/var/log&lt;/logpath&gt;<br />
&lt;logfile&gt;ices.log&lt;/logfile&gt;<br />
&lt;!&#8212; size in kilobytes &#8212;&gt;<br />
&lt;logsize&gt;2048&lt;/logsize&gt;<br />
&lt;!&#8212; 1=error, 2=warn, 3=infoa ,4=debug &#8212;&gt;<br />
&lt;loglevel&gt;4&lt;/loglevel&gt;<br />
&lt;!&#8212; logfile is ignored if this is set to 1 &#8212;&gt;<br />
&lt;consolelog&gt;0&lt;/consolelog&gt;</p>
<p>&lt;!&#8212; optional filename to write process id to &#8212;&gt;<br />
&lt;!&#8212; &lt;pidfile&gt;/home/ices/ices.pid&lt;/pidfile&gt; &#8212;&gt;</p>
<p>&lt;stream&gt;<br />
&lt;metadata&gt;<br />
&lt;name&gt;Hit FM Radio&lt;/name&gt;<br />
&lt;genre&gt;Hits&lt;/genre&gt;<br />
&lt;description&gt;Hit FM UA&lt;/description&gt;<br />
&lt;url&gt;http://www.hitfm.ua&lt;/url&gt;<br />
&lt;/metadata&gt;</p>
<p>&lt;input&gt;<br />
&lt;module&gt;oss&lt;/module&gt;<br />
&lt;param name=&#187;rate&#187;&gt;44100&lt;/param&gt;<br />
&lt;param name=&#187;channels&#187;&gt;2&lt;/param&gt;<br />
&lt;param name=&#187;device&#187;&gt;/dev/dsp1.0&lt;/param&gt;<br />
&lt;!&#8212; Read metadata (from stdin by default, or &#8212;&gt;<br />
&lt;!&#8212; filename defined below (if the latter, only on SIGUSR1) &#8212;&gt;<br />
&lt;param name=&#187;metadata&#187;&gt;0&lt;/param&gt;<br />
&lt;param name=&#187;metadatafilename&#187;&gt;test&lt;/param&gt;<br />
&lt;/input&gt;</p>
<p>&lt;instance&gt;<br />
&lt;hostname&gt;localhost&lt;/hostname&gt;<br />
&lt;port&gt;8000&lt;/port&gt;<br />
&lt;password&gt;k7seo837tf54vied&lt;/password&gt;<br />
&lt;mount&gt;/hit-fm-64k.ogg&lt;/mount&gt;<br />
&lt;yp&gt;1&lt;/yp&gt;</p>
<p>&lt;encode&gt;<br />
&lt;quality&gt;0&lt;/quality&gt;<br />
&lt;samplerate&gt;44100&lt;/samplerate&gt;<br />
&lt;channels&gt;2&lt;/channels&gt;<br />
&lt;/encode&gt;</p>
<p>&lt;downmix&gt;0&lt;/downmix&gt;<br />
&lt;/instance&gt;</p>
<p>&lt;instance&gt;<br />
&lt;hostname&gt;localhost&lt;/hostname&gt;<br />
&lt;port&gt;8000&lt;/port&gt;<br />
&lt;password&gt;k7senpfboi8s7ed&lt;/password&gt;<br />
&lt;mount&gt;/hit-fm-128k.ogg&lt;/mount&gt;<br />
&lt;yp&gt;1&lt;/yp&gt;</p>
<p>&lt;encode&gt;<br />
&lt;quality&gt;5&lt;/quality&gt;<br />
&lt;samplerate&gt;44100&lt;/samplerate&gt;<br />
&lt;channels&gt;2&lt;/channels&gt;<br />
&lt;/encode&gt;</p>
<p>&lt;downmix&gt;0&lt;/downmix&gt;<br />
&lt;/instance&gt;</p>
<p>&lt;/stream&gt;</p>
<p>&lt;/ices&gt;</p></blockquote>
<p>В принципе вуаля, осталось запустить.</p>
<p>Добавляем icecast_enable=&#187;YES&#187; в /etc/rc.conf и пишем стартап-скрипт для ices:</p>
<p><code># cat /usr/local/etc/rc.d/zzzz.ices.sh<br />
#!/bin/sh</code></p>
<p>/usr/sbin/mixer -f /dev/dsp0 =rec line<br />
/usr/sbin/mixer -f /dev/dsp1 =rec line<br />
/usr/sbin/mixer -f /dev/dsp2 =rec line</p>
<p>echo &#171;HIT FM&#187;<br />
/usr/local/bin/ices /usr/local/etc/ices-oss-hit.xml &amp;<br />
sleep 1</p>
<p>echo &#171;Russian Radio&#187;<br />
/usr/local/bin/ices /usr/local/etc/ices-oss-russian.xml &amp;<br />
sleep 1</p>
<p>echo &#171;KISS FM&#187;<br />
/usr/local/bin/ices /usr/local/etc/ices-oss-kiss.xml &amp;</p>
<p>dsp0-2, соответственно, звуковые карты.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2012/03/%d0%ba%d0%b0%d0%ba-%d1%8f-%d0%b1%d1%8b%d0%bb-%d1%80%d0%b0%d0%b4%d0%b8%d1%81%d1%82%d0%be%d0%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Поиск в логах Exim</title>
		<link>http://jared.kiev.ua/2011/12/exim-search-log/</link>
		<comments>http://jared.kiev.ua/2011/12/exim-search-log/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 13:58:43 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Exim]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Скрипты]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=259</guid>
		<description><![CDATA[<p>Часто бывает, что кто-то просит найти письмо такого-то пользователя, которое было отправлено позавчера, например. Можно перерывать логи руками, а можно воспользоваться скриптом, который любезно прислал один из читателей:</p>
<p><code>#!/bin/sh</p>
<p>to_grep="$*"</p>
<p>if [ ${#to_grep} = 0 ]<br />
then<br />
    echo "<br />
    STOP: Where is search string?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</code></p>
<p><a href="http://jared.kiev.ua/2011/12/exim-search-log/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Часто бывает, что кто-то просит найти письмо такого-то пользователя, которое было отправлено позавчера, например. Можно перерывать логи руками, а можно воспользоваться скриптом, который любезно прислал один из читателей:</p>
<p><code>#!/bin/sh</p>
<p>to_grep="$*"</p>
<p>if [ ${#to_grep} = 0 ]<br />
then<br />
    echo "<br />
    STOP: Where is search string?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>tmp_major_filename="/tmp/searchmajortmp$$"<br />
rm -f "${tmp_major_filename}"</p>
<p># Мониторим Ctrl+C чтобы не оставлять хвостов из временных файлов.<br />
trap 'rm -f ${tmp_major_filename} ;echo ; exit 13' TERM INT</p>
<p>exlog_log="/var/log/exim/mainlog"</p>
<p>if [ ! -r "${exlog_log}" ]<br />
then<br />
    echo "<br />
        STOP: Where is exim log?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>today_is=`date +%Y-%m-%d`</p>
<p>echo "1" | awk -v today_is="${today_is}" -v rex_log="${exlog_log}" '{<br />
    dl_cn = 0                                   # устанавливаем счетчик дней в 0<br />
    # Получаем список файлов лога exim-a, считаем их количество.<br />
    cmd_get_file_list=("ls "rex_log"*")<br />
    while ((cmd_get_file_list |getline)> 0) {<br />
        ++fl_cn<br />
    }<br />
    close (cmd_get_file_list)</p>
<p>    # Узнаем что у нас за ОС<br />
    cmd_what_os=("uname -s")<br />
    cmd_what_os |getline os_is<br />
    close(cmd_what_os)</p>
<p>    while (dl_cn < fl_cn) {<br />
        # Получаем три значения в массиве (год, месяц, день) - текущая дата.<br />
        if (dl_cn == 0) {<br />
            split(today_is,TEMPTODAY,"-")<br />
            today_is_month = TEMPTODAY[2]<br />
            month_arg = TEMPTODAY[2]<br />
        } else {<br />
            cmd_month_arg = (today_is_month - month_arg)<br />
            # Получаем три значения в массиве (год, месяц, день) - последнее число нужного нам предыдущего месяца.<br />
            if (os_is == "FreeBSD" || os_is == "Darwin") {<br />
                cmd_date_last_month=("date -v-"cmd_day_arg"d -v-"cmd_month_arg"m +%Y-%m-%d")<br />
            } else {<br />
                cmd_date_last_month=("date -d \""cmd_day_arg" days ago "cmd_month_arg" months ago\" +%Y-%m-%d")<br />
            }<br />
            cmd_date_last_month |getline<br />
            split($0,TEMPTODAY,"-")<br />
            close (cmd_date_last_month)<br />
        }</p>
<p>        # Выясняем до какого числа месяца будем делать декремент.<br />
        days_until = (fl_cn - dl_cn)<br />
        if (days_until > 0) {<br />
            day_until = 1<br />
        } else {<br />
            day_until = days_until<br />
        }</p>
<p>        cmd_day_arg = TEMPTODAY[3]</p>
<p>        # Получаем список дат в нисходящем порядке, забиваем в массив.<br />
        for (tmp_td=TEMPTODAY[3];tmp_td>=day_until;tmp_td--) {<br />
            # Заодно пририсовываем нули для красоты.<br />
            if (length(tmp_td) == 1) {<br />
                day_number = ("0"tmp_td)<br />
            } else {<br />
                day_number = tmp_td<br />
            }<br />
            FILESLIST[++dl_cn] = (TEMPTODAY[1]"-"TEMPTODAY[2]"-"day_number)<br />
        }</p>
<p>        # Проверяем первая ли у нас итерация цикла.<br />
        if (month_arg != today_is_month) {<br />
            month_arg--<br />
        }<br />
        split("",TEMPTODAY)<br />
    }</p>
<p>    # Печать массива.<br />
    printf "\n"<br />
    for (xs=1;xs<=fl_cn;xs++) {<br />
        printf "\t%s%s%s\t%s\n" , "(", xs, ")", FILESLIST[xs]<br />
    }<br />
    split("",FILESLIST)<br />
        printf "\n\t"<br />
    exit<br />
}'</p>
<p>read -p "Enter Digit:   " num_to_grep</p>
<p>if [ ${#num_to_grep} = 0 ]<br />
then<br />
    echo "<br />
        STOP: Where is digit?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>awk -v tmfname="${tmp_major_filename}" -v today_is="${today_is}" -v num_to_grep="${num_to_grep}" -v rex_log="${exlog_log}" -v to_grep="${to_grep}" '{<br />
    # Проверяем пользовательский ввод. Устанавливаем переменную w_show.<br />
    if ($0 ~ /^[1-3]$/) {<br />
        w_show=$0<br />
        exit<br />
    } else {<br />
        printf "\n\t%s\n\n", msg_wrong_number > err_log<br />
        split("",QUEUEARR)<br />
        split("",REJARRAY)<br />
        was_error = 1<br />
        exit 1<br />
    }<br />
} BEGIN {<br />
    q_cn = 0<br />
    r_cn = 0<br />
    err_log = "/dev/stderr"</p>
<p>    # Сообщения<br />
    msg_nothing_to_show = "STOP: Nothing to show."<br />
    msg_no_records = "STOP: No Records."<br />
    msg_wrong_number = "STOP: Wrong number."<br />
    msg_header_major = "SUCCESS"<br />
    msg_header_minor = "FAILURE"<br />
    msg_header_summ = "SUMMARY"</p>
<p>    # Паттерн очереди<br />
    patt_QUEbe = "^[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]-[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]-[A-Za-z0-9][A-Za-z0-9]$"</p>
<p>    # Получаем список файлов лога exim-a, добавляем их в массив, считаем их количество.<br />
    cmd_get_file_list=("ls "rex_log"*")<br />
    while ((cmd_get_file_list |getline)> 0) {<br />
        FILESLIST[++fl_cn] = $0<br />
    }<br />
    close (cmd_get_file_list)</p>
<p>    # Проверяем пользовательский ввод. Получаем имя файла, проверяем заархивирован ли он, устанавливаем необходимые переменные.<br />
    if (num_to_grep ~ /^[0-9]+$/ &#038;&#038; (num_to_grep <= fl_cn &#038;&#038; num_to_grep != 0)) {<br />
        ex_log = FILESLIST[num_to_grep]<br />
        tmpfilename_parts = split(FILESLIST[num_to_grep],TMPFILENAME,".")<br />
        if (TMPFILENAME[tmpfilename_parts] == "gz") {<br />
            first_grep = ("zgrep -ni \""to_grep"\" "ex_log)<br />
            second_grep = ("zgrep -f "tmfname" "ex_log)<br />
            pr_ex_log = ("zcat "ex_log)<br />
        } else {<br />
            first_grep = ("grep -ni \""to_grep"\" "ex_log)<br />
            second_grep = ("grep -f "tmfname" "ex_log)<br />
            pr_ex_log = ("cat "ex_log)<br />
        }<br />
        split("",TMPFILENAME)<br />
        split("",FILESLIST)<br />
    } else {<br />
        printf "\n\t%s\n\n", msg_wrong_number > err_log<br />
        was_error = 1<br />
        exit 1<br />
    }</p>
<p>    # Запускаем греп лога екзима. Если в строке в нужном месте есть совпадение с паттерном очереди, и это не реджект,<br />
    # добавляем очередь в массив очередей. Иначе номер строки лога в массив номеров строк лога.<br />
    while ((first_grep |getline)> 0) {<br />
        if (split($0,TMPLINE,":")>0) {<br />
            testqueue = substr(TMPLINE[4],4,16)<br />
            if (testqueue ~ patt_QUEbe) {<br />
                if (substr(TMPLINE[4],21,8) == "rejected") {<br />
                    REJARRAY[++r_cn] = TMPLINE[1]<br />
                } else if ((testqueue in QUEUEARR) == 0) {<br />
                    QUEUEARR[testqueue]<br />
                    ++q_cn<br />
                }<br />
            } else {<br />
                REJARRAY[++r_cn] = TMPLINE[1]<br />
            }</p>
<p>        }<br />
        split("",TMPLINE)<br />
    }<br />
    printf "\n"<br />
    close (first_grep)</p>
<p>        # Считаем и печатаем сколько мы всего нашли. Заодно приглашение ввода номера того что хочется увидеть если чего-то нашли.<br />
        printf "\t%s\t%s\t%s\n", "(1)", msg_header_major, q_cn<br />
        printf "\t%s\t%s\t%s\n", "(2)", msg_header_minor, r_cn<br />
        printf "\t%s\t%s\t%s\n", "(3)", msg_header_summ, (q_cn+r_cn)<br />
        if ((q_cn+r_cn) == 0) {<br />
            printf "\n\t%s\n\n", msg_nothing_to_show > err_log<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            was_error = 1<br />
            exit 1<br />
        } else {<br />
            printf "\n\t%s\t" , "Enter Digit:"<br />
        }<br />
} END {<br />
    if (was_error == 1) {<br />
        exit 1<br />
    }</p>
<p>    # Получаем значение год-месяц-день из лога который будем показывать.<br />
    pr_ex_log | getline<br />
    close (pr_ex_log)<br />
    actdte = substr($0,1,10)</p>
<p>    # Устанавливаем переменные - элементы декора.<br />
    header_major = sprintf("%s%s%s%s%s", "-------------------------------- ",msg_header_major," ---------------------------------------- ",actdte," ----------------------")<br />
    header_minor = sprintf("%s%s%s%s%s", "-------------------------------- ",msg_header_minor," ---------------------------------------- ",actdte," ----------------------")<br />
    footer = sprintf("%s%s%s\n", "------------------------------------------------------------------------------- ",actdte," ----------------------")<br />
    splitter_completed = sprintf("%s", "+ ------------ c -- o -- m -- p -- l -- e -- t -- e -- d ---------------------- +")</p>
<p>    cmd_more = "more"</p>
<p>    # Пользователь возжелал увидеть очереди.<br />
    if (w_show == 1) {<br />
        if (q_cn == 0) {<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            printf "\n\t%s\n\n", msg_no_records > err_log<br />
            exit 1<br />
        } else {<br />
            y = 1<br />
            z = 0<br />
            # Сбрасываем содержимое массива очередей во временный файл<br />
            for (tq in QUEUEARR) {<br />
                print (tq) >> tmfname<br />
            }<br />
            print(header_major)<br />
            # Грепаем лог екзима используя временный файл в качестве файла паттернов.<br />
            while ((second_grep |getline)> 0) {<br />
                if (length($0) == 46) {<br />
                    if (substr($0,38,9) == "Completed") {<br />
                        print (splitter_completed) | cmd_more<br />
                    } else {<br />
                        print(substr($0,12)) | cmd_more<br />
                    }<br />
                } else {<br />
                    print(substr($0,12)) | cmd_more<br />
                }<br />
            }<br />
            close (second_grep)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }</p>
<p>    # Пользователь возжелал увидеть отлупы.<br />
    } else if (w_show == 2) {<br />
        if (r_cn == 0) {<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            printf "\n\t%s\n\n", msg_no_records > err_log<br />
            exit 1<br />
        } else {<br />
            y = 1<br />
            z = 0<br />
            print(header_minor)<br />
            while ((pr_ex_log |getline)> 0) {<br />
                z++<br />
                if(z == REJARRAY[y]){<br />
                    print(substr($0,12)) | cmd_more<br />
                    y++<br />
                }<br />
            }<br />
            close (pr_ex_log)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }</p>
<p>    # Пользователь возжелал увидеть все.<br />
    } else if (w_show == 3) {<br />
        if (r_cn != 0) {<br />
            y = 1<br />
            z = 0<br />
            print(header_minor)<br />
            while ((pr_ex_log |getline)> 0) {<br />
                z++<br />
                if(z == REJARRAY[y]){<br />
                    print(substr($0,12)) | cmd_more<br />
                    y++<br />
                }<br />
            }<br />
            close (pr_ex_log)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }<br />
        if (q_cn != 0) {<br />
            y = 1<br />
            z = 0<br />
            # Сбрасываем содержимое массива очередей во временный файл<br />
            for (tq in QUEUEARR) {<br />
                print (tq) >> tmfname<br />
            }<br />
            print(header_major)<br />
            # Грепаем лог екзима используя временный файл в качестве файла паттернов.<br />
            while ((second_grep |getline)> 0) {<br />
                if (length($0) == 46) {<br />
                    if (substr($0,38,9) == "Completed") {<br />
                        print (splitter_completed) | cmd_more<br />
                    } else {<br />
                        print(substr($0,12)) | cmd_more<br />
                    }<br />
                } else {<br />
                    print(substr($0,12)) | cmd_more<br />
                }<br />
            }<br />
            close (second_grep)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }<br />
    }<br />
    split("",QUEUEARR)<br />
    split("",REJARRAY)<br />
}' -</p>
<p>rm -f "${tmp_major_filename}"</p>
<p># Настройки логгирования в конфиге exim:<br />
# --<br />
# log_file_path = /var/log/exim/exim_%s.log<br />
# write_rejectlog = no<br />
#<br />
# log_selector = \<br />
#    +all_parents \<br />
#    +connection_reject \<br />
#    -host_lookup_failed \<br />
#    -incoming_interface \<br />
#    -lost_incoming_connection \<br />
#    +received_sender \<br />
#    +received_recipients \<br />
#    +smtp_confirmation \<br />
#    +smtp_syntax_error \<br />
#    +smtp_protocol_error \<br />
#    -queue_run<br />
#<br />
# syslog_timestamp = yes<br />
#<br />
# --<br />
#<br />
# Ver 1.1<br />
#</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2011/12/exim-search-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сборка gmirror без перезагрузки</title>
		<link>http://jared.kiev.ua/2011/08/gmirror/</link>
		<comments>http://jared.kiev.ua/2011/08/gmirror/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 22:15:40 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Общее]]></category>
		<category><![CDATA[Gmirror]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=253</guid>
		<description><![CDATA[<p>В сети есть достаточное количество описаний, как на FreeBSD собрать программный RAID-1, он же gmirror. Все они требуют в определенный момент перезагрузки сервера между включением в зеркало первого диска и остальных. Однако, бывают ситуации, когда она нежелательна либо невозможна. Прямо сейчас строю такую машинку, соответственно, пришлось выкручиваться. Итак, начнем:</p>
<p><a href="http://jared.kiev.ua/2011/08/gmirror/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>В сети есть достаточное количество описаний, как на FreeBSD собрать программный RAID-1, он же gmirror. Все они требуют в определенный момент перезагрузки сервера между включением в зеркало первого диска и остальных. Однако, бывают ситуации, когда она нежелательна либо невозможна. Прямо сейчас строю такую машинку, соответственно, пришлось выкручиваться. Итак, начнем:</p>
<p>Включаем в ядро поддержку gmirror после перезагрузки:<br />
<code># echo 'geom_mirror_load=YES' >> /boot/loader.conf</code></p>
<p>Даем системе доступ для изменения конфигурации дисков:<br />
<code># sysctl kern.geom.debugflags=16<br />
kern.geom.debugflags: 0 -> 16</code></p>
<p>Вставляем первый диск:<br />
<code># gmirror label -v -b round-robin gm0 /dev/ad4<br />
Metadata value stored on /dev/ad4.<br />
Done.</code></p>
<p>Правим /etc/fstab. В нем меняем все вхождения /dev/ad4 на /dev/mirror/gm0, например, /dev/ad4s1a станет /dev/mirror/gm0s1a и т.п.</p>
<p>Дальше самая хитрость &#8212; вместо перезагрузки подгружаем ядру модуль gmirror и вставляем второй диск:<br />
<code># kldload geom_mirror<br />
# gmirror insert gm0 /dev/ad6<br />
</code></p>
<p>Проверяем:<br />
<code># gmirror list<br />
Geom name: gm0<br />
State: DEGRADED<br />
Components: 2<br />
Balance: round-robin<br />
Slice: 4096<br />
Flags: NONE<br />
GenID: 0<br />
SyncID: 1<br />
ID: 1867633513<br />
Providers:<br />
1. Name: mirror/gm0<br />
   Mediasize: 750156373504 (699G)<br />
   Sectorsize: 512<br />
   Mode: r1w0e0<br />
Consumers:<br />
1. Name: ad4<br />
   Mediasize: 750156374016 (699G)<br />
   Sectorsize: 512<br />
   Mode: r1w1e1<br />
   State: ACTIVE<br />
   Priority: 0<br />
   Flags: NONE<br />
   GenID: 0<br />
   SyncID: 1<br />
   ID: 129648194<br />
2. Name: ad6<br />
   Mediasize: 750156374016 (699G)<br />
   Sectorsize: 512<br />
   Mode: r1w1e1<br />
   State: SYNCHRONIZING<br />
   Priority: 0<br />
   Flags: DIRTY, SYNCHRONIZING<br />
   GenID: 0<br />
   SyncID: 1<br />
   Synchronized: 0%<br />
   ID: 3539837274<br />
</code></p>
<p>Видим, что зеркало соорудилось и пошла синхронизация. Далее остается периодически поглядывать за ее ходом:<br />
<code># gmirror status<br />
      Name    Status  Components<br />
mirror/gm0  DEGRADED  ad4<br />
                      ad6 (22%)<br />
</code></p>
<p>По окончании процесса можно и перегрузиться с собранным зеркалом.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2011/08/gmirror/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exim: автоблокировка спам-хостов</title>
		<link>http://jared.kiev.ua/2011/05/exim-autoblock-spam/</link>
		<comments>http://jared.kiev.ua/2011/05/exim-autoblock-spam/#comments</comments>
		<pubDate>Mon, 16 May 2011 11:38:27 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Exim]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[Spamassassin]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=246</guid>
		<description><![CDATA[<p>Несмотря на то, что моя конфигурация Exim вышла довольно удачной, некоторое количество спама через нее все же проходит. Как правило, сыпется он с одних и тех же спам-серверов, которые можно блокировать. Однако, каждый раз ходить на сервер через некоторое время становится лениво, потому автоматизируем процесс:</p>
<p><a href="http://jared.kiev.ua/2011/05/exim-autoblock-spam/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Несмотря на то, что моя конфигурация Exim вышла довольно удачной, некоторое количество спама через нее все же проходит. Как правило, сыпется он с одних и тех же спам-серверов, которые можно блокировать. Однако, каждый раз ходить на сервер через некоторое время становится лениво, потому автоматизируем процесс:</p>
<pre>#!/bin/sh

for file in `find /var/mail/yourdomain.com/spamreport/new -type f`
do
    cat $file | grep "Subject: block=" | sed 's/Subject: block=//' >> /usr/local/etc/exim/spam-hosts
done

rm -f /var/mail/yourdomain.com/spamreport/new/*
</pre>
<p>Осталось внести изменения в конфигурацию Exim. Добавляем в /usr/local/etc/exim/100.main.conf: </p>
<pre>hostlist bad_hosts = net-iplsearch;/usr/local/etc/exim/spam-hosts</pre>
<p>В /usr/local/etc/exim/configure правим ту часть, где описывается acl_check_rcpt:</p>
<pre># Эти правила срабатывают для каждого письма
acl_check_rcpt:

warn set acl_c_lp       = $local_part@$domain

deny   message = Relay not permitted
       hosts = +bad_hosts
</pre>
<p>Создаем файл и перезапускаем Exim:</p>
<pre># touch /usr/local/etc/exim/spam-hosts
# /usr/local/etc/rc.d/exim restart
</pre>
<p>Для успешной работы надо создать почтовый ящик spamreport@yourdomain.com и вставить вызов скрипта в Cron. Теперь на spamreport@yourdomain.com можно отправлять письма с темой &#171;block=123.32.14.56&#8243;, где 123.32.14.56 &#8212; ip спам-сервера.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2011/05/exim-autoblock-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zabbix: мониторинг доступности оборудования</title>
		<link>http://jared.kiev.ua/2011/01/zabbix-icmp/</link>
		<comments>http://jared.kiev.ua/2011/01/zabbix-icmp/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 20:57:02 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Zabbix]]></category>
		<category><![CDATA[Мониторинг]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=243</guid>
		<description><![CDATA[<p>Возникла задача мониторить Заббиксом доступность свитчей в сети. Вроде задача тривиальная, однако, пришлось немного потанцевать с бубном, пока нашлось решение. В итоге выкладываю шаблон, он умеет мониторить доступность железки (произвольной), задержку пинга до нее и процент потерь. Желательно установить fping.</p>
<p><a href="http://jared.kiev.ua/2011/01/zabbix-icmp/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Возникла задача мониторить Заббиксом доступность свитчей в сети. Вроде задача тривиальная, однако, пришлось немного потанцевать с бубном, пока нашлось решение. В итоге выкладываю шаблон, он умеет мониторить доступность железки (произвольной), задержку пинга до нее и процент потерь. Желательно установить fping.</p>
<p>Собственно, сам <a href='/wp-content/uploads/2011/01/switches.xml'>шаблон</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2011/01/zabbix-icmp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Спасение данных с умирающего диска</title>
		<link>http://jared.kiev.ua/2010/09/bad-blocks-gmirror/</link>
		<comments>http://jared.kiev.ua/2010/09/bad-blocks-gmirror/#comments</comments>
		<pubDate>Fri, 24 Sep 2010 23:58:43 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Gmirror]]></category>
		<category><![CDATA[RAID]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=232</guid>
		<description><![CDATA[<p>Не далее, чем вчера пришлось заниматься вытаскиванием данных с диска, по которому строевым шагом пошли бедблоки. Методика некоторое время обдумывалась, потом была приведена в исполнение. Логика проста: ставим в сервер рядом с проблемным диском такой же по размеру (в моем случае это были Seagate и WD, так что производитель не суть важен, хотя новый честно подбирал похожий по параметрам) и вместо конвульсий в виде dd и прочего копирования пробуем по-тихому отзеркалить все на новый диск. Итак, приступим:</p>
<p><a href="http://jared.kiev.ua/2010/09/bad-blocks-gmirror/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Не далее, чем вчера пришлось заниматься вытаскиванием данных с диска, по которому строевым шагом пошли бедблоки. Методика некоторое время обдумывалась, потом была приведена в исполнение. Логика проста: ставим в сервер рядом с проблемным диском такой же по размеру (в моем случае это были Seagate и WD, так что производитель не суть важен, хотя новый честно подбирал похожий по параметрам) и вместо конвульсий в виде dd и прочего копирования пробуем по-тихому отзеркалить все на новый диск. Итак, приступим:</p>
<pre># echo 'geom_mirror_load=YES' &gt;&gt; /boot/loader.conf
# sysctl kern.geom.debugflags=16</pre>
<p>Здесь мы включили модуль geom_mirror при загрузке системы и режим отладки, при котором возможно создание программного зеркала. Создаем массив и запихиваем туда проблемный диск:</p>
<pre># gmirror label -v -b round-robin gm0 /dev/ad4
Metadata value stored on /dev/ad4.
Done.</pre>
<p>Далее надо поправить /etc/fstab, заменив подстроку /dev/ad4 на /dev/mirror/gm0. В итоге вместо записей вида</p>
<pre>/dev/ad4s1a             /               ufs     rw              1       1</pre>
<p>получится</p>
<pre>/dev/mirror/gm0s1a             /               ufs     rw              1       1</pre>
<p>Перезагружаемся в <strong>single user mode</strong> (Это важный момент, его нет в статьях по настройке gmirror &#8212; обычно все отрабатывает нормально и без него. Но в случае с проблемным диском он может и не отзеркалиться.) Далее:</p>
<pre># gmirror insert gm0 /dev/ad7</pre>
<p>После чего команда gmirror status некоторое время будет показывать приблизительно следующее:</p>
<pre>Name    Status  Components
 mirror/gm0  DEGRADED  ad4
                  ad7 (1%)</pre>
<p>Что будет означать, что идет процесс перестройки зеркала. после того, как DEGRADED сменится на COMPLETE, можно тушить сервер и заменять проблемный диск новым. После чего загружаемся и разбираем зеркало. Сначала попросим gmirror забыть о лишнем диске ad7 (теперь он стал ad4):</p>
<pre># gmirror forget gm0</pre>
<p>Теперь gmirror status покажет такое:</p>
<pre>Name    Status  Components
mirror/gm0  COMPLETE ad4</pre>
<p>После чего опять правим /etc/fstab, меняем /dev/mirror/gm0 назад на /dev/ad4 и просим gmirror вытащить из массива последний диск:</p>
<pre># gmirror remove gm0 /dev/ad4</pre>
<p>Машина самостоятельно уходит в перезагрузку, по окончании которой зеркала нет, новый диск называется точно так, как старый и данные на нем остались те, что надо.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/09/bad-blocks-gmirror/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Exim &#8212; ошибка в конфиге</title>
		<link>http://jared.kiev.ua/2010/07/exim-bug/</link>
		<comments>http://jared.kiev.ua/2010/07/exim-bug/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 11:10:09 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Exim]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[SpamAssassin]]></category>
		<category><![CDATA[Почта]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[Spamassassin]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=228</guid>
		<description><![CDATA[<p>К сожалению, в мою <a href="http://jared.kiev.ua/2010/01/isp-mailserver-1-exim/">конфигурацию</a> Экзима закралась ошибка, которая хоть и появлялась редко, была довольно досадной. В частности, при определенных условиях, ACL, который проверяет почту на спам, не видел переменную, в которой хранился адрес адресата и не отрабатывал. В основную статью изменения уже добавлены, решил выложить дополнительный пост для тех, кто ее не будет перечитывать. Итак, надо поправить 2 файла: 500.acl-check-data.conf и configure.</p>
<p><a href="http://jared.kiev.ua/2010/07/exim-bug/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>К сожалению, в мою <a href="http://jared.kiev.ua/2010/01/isp-mailserver-1-exim/">конфигурацию</a> Экзима закралась ошибка, которая хоть и появлялась редко, была довольно досадной. В частности, при определенных условиях, ACL, который проверяет почту на спам, не видел переменную, в которой хранился адрес адресата и не отрабатывал. В основную статью изменения уже добавлены, решил выложить дополнительный пост для тех, кто ее не будет перечитывать. Итак, надо поправить 2 файла: 500.acl-check-data.conf и configure.</p>
<p>500.acl-check-data.conf: после &#171;.ifdef USE_SPAMD&#187; добавляем строку:</p>
<pre>warn set acl_m5 = $acl_c_lp
</pre>
<p>configure: после строки &#171;acl_check_rcpt:&#187; вставляем:</p>
<pre>warn set acl_c_lp       = $local_part@$domain</pre>
<p>Перед обоими вставками лучше вставить пустую строку.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/07/exim-bug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Обновляем систему по-быстрому</title>
		<link>http://jared.kiev.ua/2010/06/%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-%d0%bf%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%be%d0%bc%d1%83/</link>
		<comments>http://jared.kiev.ua/2010/06/%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-%d0%bf%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%be%d0%bc%d1%83/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 14:12:33 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[cvsup]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=224</guid>
		<description><![CDATA[<p>Почти во всех руководствах по FreeBSD для обновления системы прелдагают использовать классический cvsup, либо как вариант &#8212; cvsup-without-gui. Однако, то же самое можно делать, не устанавливая в систему никаких дополнительных пакетов и гораздо быстрее. Для этого мы воспользуемся аналогом cvsup, поставляемым с базовой системой &#8212; csup.</p>
<p><a href="http://jared.kiev.ua/2010/06/%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-%d0%bf%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%be%d0%bc%d1%83/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Почти во всех руководствах по FreeBSD для обновления системы прелдагают использовать классический cvsup, либо как вариант &#8212; cvsup-without-gui. Однако, то же самое можно делать, не устанавливая в систему никаких дополнительных пакетов и гораздо быстрее. Для этого мы воспользуемся аналогом cvsup, поставляемым с базовой системой &#8212; csup.</p>
<p>Файлы для обновления портов и системы сразу после установки доступны в каталоге /usr/share/examples/cvsup. Там же и поправим нужный: в моем случае &#8212; файл обновления портов ports-supfile:</p>
<pre># ee /usr/share/examples/cvsup/ports-supfile

<span style="color: #000000;"># Сервер, с которого обновляться, в моем случае ftp6.ua.FreeBSD.org</span>
*default host=ftp6.ua.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix

*default compress

# Обновлять все дерево портов
ports-all
</pre>
<p>Вот и все, дальше остается только запустить обновление командой:</p>
<pre># csup /usr/share/examples/cvsup/ports-supfile
</pre>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/06/%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-%d0%bf%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%be%d0%bc%d1%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Мониторинг с помощью Zabbix: установка Zabbix</title>
		<link>http://jared.kiev.ua/2010/03/zabbix-install/</link>
		<comments>http://jared.kiev.ua/2010/03/zabbix-install/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 22:06:34 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[jail]]></category>
		<category><![CDATA[Zabbix]]></category>
		<category><![CDATA[Мониторинг]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=210</guid>
		<description><![CDATA[<p style="text-align: justify;">Как и многие коллеги-администраторы, долгое время я пользовался для мониторинга всего и вся либо Nagios, либо чем-то самописным &#8212; так сложилось исторически. В последнее время стало изрядно лениво лазить по конфигурационным файлам, чтоб добавить хост, сервис и т.п., а потом еще и проверять в веб-интерфейсе, все ли видно хорошо. Захотелось некой удобной софтины для мониторинга, с конфигурацией в БД, удобным веб-интерфейсом и прочими прелестями. В качестве таковой был выбран Zabbix и честно говоря, вполне себя оправдывает, разве что ресурсов ест многовато. Им сегодня и займемся:</p>
<p><a href="http://jared.kiev.ua/2010/03/zabbix-install/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Как и многие коллеги-администраторы, долгое время я пользовался для мониторинга всего и вся либо Nagios, либо чем-то самописным &#8212; так сложилось исторически. В последнее время стало изрядно лениво лазить по конфигурационным файлам, чтоб добавить хост, сервис и т.п., а потом еще и проверять в веб-интерфейсе, все ли видно хорошо. Захотелось некой удобной софтины для мониторинга, с конфигурацией в БД, удобным веб-интерфейсом и прочими прелестями. В качестве таковой был выбран Zabbix и честно говоря, вполне себя оправдывает, разве что ресурсов ест многовато. Им сегодня и займемся:</p>
<pre># cd /usr/ports/net-mgmt/zabbix-server
# make install
┌────────────────────────────────────────────────────────────────────┐
 │                Options for zabbix-server 1.8.1,2                   │
 │ ┌────────────────────────────────────────────────────────────────┐ │
 │ │         [X] MYSQL   Use MySQL backend                          │ │
 │ │         [ ] PGSQL   Use PostgreSQL backend                     │ │
 │ │         [ ] SQLITE  Use SQLite backend                         │ │
 │ │         [ ] IPV6    Support for IPv6                           │ │
 │ │         [ ] LDAP    Support for checking LDAP servers          │ │
 │ │         [X] JABBER  Use jabber media type                      │ │
 │ │         [X] FPING   Use fping for pinging hosts                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 ├─└────────────────────────────────────────────────────────────────┘─┤
 │                       [  OK  ]       Cancel                        │
 └────────────────────────────────────────────────────────────────────┘
</pre>
<p style="text-align: justify;">Пока он ставится, немного расскажу о идеологии софтины. Состоит она из нескольких частей: сервера, агента, фронтенда. Сервер умеет опрашивать агентов или сами объекты мониторинга (в случае с последними поддерживаются протоколы SNMP и IPMI). Агент ставится на объект мониторинга (версии агента есть для широкого перечня операционных систем, включая винды) и шлет данные на сервер, также умеет выполнять на объекте заданные команды, фронтенд стоит на веб-сервере и показывает весь процесс. К базе данных обращаются сервер и фронтенд, агентам она не нужна. Создаем ее (исходим из того, что MySQL у нас на том же хосте, где zabbix-сервер):</p>
<pre># mysql
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'zabbixpassword';
GRANT USAGE ON * . * TO 'zabbix'@'localhost' IDENTIFIED BY 'zabbixpassword' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
CREATE DATABASE IF NOT EXISTS `zabbix` ;
GRANT ALL PRIVILEGES ON `zabbix` . * TO 'zabbix'@'localhost';
quit;
# cd /usr/local/share/zabbix/server/create
# cat schema/mysql.sql data/data.sql data/images_mysql.sql | mysql -uzabbix -pzabbixpassword zabbix
# echo zabbix_server_enable=\"YES\" &gt;&gt; /etc/rc.conf
# cp /usr/local/etc/zabbix/zabbix_server.conf.sample /usr/local/etc/zabbix/zabbix_server.conf
# ee /usr/local/etc/zabbix/zabbix_server.conf
</pre>
<p>Настройки по умолчанию достаточно разумны, потому файл /usr/local/etc/zabbix/zabbix_server.conf небольшой, для справки потом можно будет заглянуть в дефолтный файл:</p>
<pre><span style="color: #000000;"># Исходящий IP, с него будут осуществляться соединения с агентами и объектами мониторинга
</span>SourceIP=192.168.1.10

<span style="color: #000000;"># Лог-файл
</span>LogFile=/var/log/zabbix_server.log

<span style="color: #000000;"># Размер лог-файла, в мегабайтах, 0 отключает ротацию лога
</span>LogFileSize=10

<span style="color: #000000;"># Уровень дебага, 0 - отключить, 1 - критические ошибки, 2 - ошибки, 3 - предупреждения, 4 - дебаг
</span>DebugLevel=3

<span style="color: #000000;"># Хост БД
</span>DBHost=localhost

<span style="color: #000000;"># Название БД
</span>DBName=zabbix

<span style="color: #000000;"># Пользователь БД
</span>DBUser=zabbix

<span style="color: #000000;"># Пароль БД
</span>DBPassword=zabbixpassword

<span style="color: #000000;"># Путь к Mysql-сокету
</span>DBSocket=/tmp/mysql.sock

<span style="color: #000000;"># Порт SQL-сервера, если используем сокет - не надо
</span># DBPort=3306
</pre>
<p>Если заббикс стоит, как в моем случае, в джейле, то на хост-машине надо в /etc/sysctl.conf добавить:</p>
<pre>security.jail.sysvipc_allowed=1
kern.ipc.shmall=2097152
kern.ipc.shmmax=2147483648</pre>
<p>На этом все, сервер можно запускать:</p>
<pre># touch /var/log/zabbix_server.log
# chown zabbix:zabbix /var/log/zabbix_server.log
# /usr/local/etc/rc.d/zabbix_server start</pre>
<p>Теперь займемся фронтендом.</p>
<pre># cd /usr/ports/math/php5-bcmath
# make install
# cd /usr/ports/net-mgmt/zabbix-server/work/zabbix-1.8.1/frontends/php
# cp -R * /usr/local/www/vhosts/zabbix.jared.kiev.ua
# cd /usr/local/www/vhosts/zabbix.jared.kiev.ua/conf/
# cp zabbix.conf.php.example zabbix.conf.php
# ee zabbix.conf.php
</pre>
<p>Тут вписываем параметры доступа к БД и прочее:</p>
<pre>&lt;?php
global $DB;

$DB["TYPE"]             = "MYSQL";
$DB["SERVER"]           = "localhost";
$DB["PORT"]             = "0";
$DB["DATABASE"]         = "zabbix";
$DB["USER"]             = "zabbix";
$DB["PASSWORD"]         = "zabbixpassword";
$ZBX_SERVER             = "localhost";
$ZBX_SERVER_PORT        = "10051";
$ZBX_SERVER_NAME        = "";

$IMAGE_FORMAT_DEFAULT   = IMAGE_FORMAT_PNG;
?&gt;
</pre>
<p>Все, теперь можно смело заходить в фронтенд с логином Admin и паролем zabbix и заниматься дальнейшей настройкой системы.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/03/zabbix-install/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Fastest CVSUP &#8212; обновляемся быстро</title>
		<link>http://jared.kiev.ua/2010/02/fastest-cvsup/</link>
		<comments>http://jared.kiev.ua/2010/02/fastest-cvsup/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 20:15:34 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[cvsup]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=208</guid>
		<description><![CDATA[<p>При обновлении системы, портов и т.п. неизменно хочется, чтоб оно прошло побыстрее. В этом нам поможет утилита fastest cvsup, которая подберет самый быстрый cvsup-сервер. В установке и настройке она очень проста:</p>
<p><a href="http://jared.kiev.ua/2010/02/fastest-cvsup/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>При обновлении системы, портов и т.п. неизменно хочется, чтоб оно прошло побыстрее. В этом нам поможет утилита fastest cvsup, которая подберет самый быстрый cvsup-сервер. В установке и настройке она очень проста:</p>
<pre># cd /usr/ports/sysutils/fastest_cvsup
# make install

 ┌────────────────────────────────────────────────────────────────────┐
 │                Options for fastest_cvsup 0.2.9_6                   │
 │ ┌────────────────────────────────────────────────────────────────┐ │
 │ │           [ ] ROUNDTRIP  Build with round-trip patch           │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 │ │                                                                │ │
 ├─└────────────────────────────────────────────────────────────────┘─┤
 │                       [  OK  ]       Cancel                        │
 └────────────────────────────────────────────────────────────────────┘</pre>
<p>Опции у утилиты достаточно просты и по большому счету, нам понадобится только опция -c, после которой задается 2-буквенный код страны. Дальше она выбирает самый близкий по пингу к нам официальный sup-сервер:</p>
<pre># fastest_cvsup -c ua
&gt;&gt;  Querying servers in countries: ua
--&gt; Connecting to cvsup.ua.freebsd.org [83.218.232.71]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 14.70 ms
--&gt; Connecting to cvsup2.ua.freebsd.org [62.244.55.197]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 2.15 ms
--&gt; Connecting to cvsup3.ua.freebsd.org [212.42.64.9]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 2.93 ms
--&gt; Connecting to cvsup4.ua.freebsd.org [82.193.96.50]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 1.81 ms
--&gt; Connecting to cvsup5.ua.freebsd.org [213.186.196.224]...
 * error: connect: timeout
--&gt; Connecting to cvsup6.ua.freebsd.org [62.149.2.9]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 1.99 ms
--&gt; Connecting to cvsup7.ua.freebsd.org [213.186.196.224]...
 * error: connect: timeout
--&gt; Connecting to cvsup8.ua.freebsd.org [83.218.232.71]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 2.31 ms
--&gt; Connecting to cvsup9.ua.freebsd.org [80.249.224.11]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 12.62 ms
--&gt; Connecting to cvsup10.ua.freebsd.org [78.152.160.14]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 16.40 ms
--&gt; Connecting to cvsup11.ua.freebsd.org [217.20.163.35]...
 - server replied: OK 17 0 SNAP_16_1h CVSup server ready
 - time taken: 2.46 ms

&gt;&gt;  Speed Daemons:
 - 1st: cvsup4.ua.freebsd.org
 - 2nd: cvsup6.ua.freebsd.org
 - 3rd: cvsup2.ua.freebsd.org</pre>
<p>Вот и все, теперь осталось только вписать понравившийся сервер в конфиг.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/02/fastest-cvsup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: jared.kiev.ua @ 2012-05-20 00:09:00 -->
