<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>andrejz</title>
  <link>http://andrejz.livejournal.com/</link>
  <description>andrejz - LiveJournal.com</description>
  <lastBuildDate>Tue, 05 May 2009 06:30:24 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>andrejz</lj:journal>
  <lj:journalid>9335206</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/41920823/9335206</url>
    <title>andrejz</title>
    <link>http://andrejz.livejournal.com/</link>
    <width>100</width>
    <height>95</height>
  </image>

<item>
  <guid isPermaLink='true'>http://andrejz.livejournal.com/14967.html</guid>
  <pubDate>Tue, 05 May 2009 06:30:24 GMT</pubDate>
  <title>nginx directives capture</title>
  <link>http://andrejz.livejournal.com/14967.html</link>
  <description>&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;В принципе идея была сделать для nginx некий помошник для генерации документации, но в силу лени и количества полезностей, которые можно таким образом добывать,&amp;nbsp;идея как-то потухла в моем мозгу.&lt;br /&gt;Написано как всегда на коленке. Документация,&amp;nbsp;которую пишет Сысоев - полная гадость,&amp;nbsp;но лучше то на русском нет :-)&lt;br /&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use File::Basename;&lt;br /&gt;&lt;br /&gt;die &amp;quot;Usage: $0 &amp;lt;dir to nginx source code&amp;gt;\n&amp;quot; unless $ARGV[0];&lt;br /&gt;&lt;br /&gt;RecurseWalk($ARGV[0]);&lt;br /&gt;&lt;br /&gt;sub ParseSourceCode {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $filename = shift;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my (@result, $line);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; open (IN, &amp;quot;$filename&amp;quot;) or die &amp;quot;[E]: $!\n&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (&amp;lt;IN&amp;gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; next if (/^#/); # Skip preproccesor macros&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line .= $_&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; close (IN);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Find our struct&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line =~ m#static ngx_command_t.*\s*=\s*{(.*)ngx_null_command\s};#s;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return unless($1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $stage_1 = $1;&lt;br /&gt;PARSE:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( $stage_1 =~ m#{(.*?)},#sx ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $stage_2 = $1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $stage_1 =~ s/{/|/;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push @result, $stage_2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto PARSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return @result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub CaptureData {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my ($module_name, @array) = @_;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my %hash;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Only *.c files contain our code&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; next unless $module_name =~ /.c$/;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $module_name = basename( $module_name );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $section (@array) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my ($dname) = $section =~ m/ngx_string\(&amp;quot;(.*)&amp;quot;\),/s;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my (@d) = split(&amp;quot;,&amp;quot;, $section);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $d[1] =~ s/^\s+//; $d[1] =~ s/^\s+$//; $d[1] =~ s/\n//; $d[1] =~ s/\ //g;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $tu = $d[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @d = split(/\|/, $d[1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;quot;$module_name: $dname -- &amp;quot;, join (&apos;,&apos;, @d), &amp;quot;\n&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub RecurseWalk {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my($path) = @_;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $path .= &apos;/&apos; if( $path !~ /\/$/ );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for my $filename( glob( $path.&apos;*&apos;)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( -d $filename) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RecurseWalk($filename);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CaptureData($filename, ParseSourceCode($filename));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Запускать так:&lt;br /&gt;./ngx_parser.pl /home/azverev/nginx-vendor-current/&lt;br /&gt;nginx.c: daemon -- NGX_MAIN_CONF,NGX_DIRECT_CONF,NGX_CONF_TAKE1&lt;br /&gt;nginx.c: master_process -- NGX_MAIN_CONF,NGX_DIRECT_CONF,NGX_CONF_TAKE1&lt;br /&gt;nginx.c: worker_processes -- NGX_MAIN_CONF,NGX_DIRECT_CONF,NGX_CONF_TAKE1&lt;br /&gt;nginx.c: worker_threads -- NGX_MAIN_CONF,NGX_DIRECT_CONF,NGX_CONF_TAKE1&lt;br /&gt;nginx.c: thread_stack_size -- NGX_MAIN_CONF,NGX_DIRECT_CONF,NGX_CONF_TAKE1&lt;br /&gt;nginx.c: user -- NGX_MAIN_CONF,NGX_DIRECT_CONF,NGX_CONF_TAKE12&lt;br /&gt;nginx.c: pid -- NGX_MAIN_CONF,NGX_DIRECT_CONF,NGX_CONF_TAKE1&lt;br /&gt;ngx_conf_file.c: include -- NGX_ANY_CONF,NGX_CONF_TAKE1&lt;br /&gt;ngx_log.c: error_log -- NGX_MAIN_CONF,NGX_CONF_1MORE&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;Про флаги можно почитать &lt;a href=&quot;http://catap.ru/blog/2009/04/29/nginx-type-of-directive/&quot;&gt;вот тут&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;</description>
  <comments>http://andrejz.livejournal.com/14967.html</comments>
  <category>nginx</category>
  <category>perl</category>
  <lj:mood>bored</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://andrejz.livejournal.com/14757.html</guid>
  <pubDate>Mon, 04 May 2009 13:40:22 GMT</pubDate>
  <title>Network overlaps</title>
  <link>http://andrejz.livejournal.com/14757.html</link>
  <description>&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;Находит все сети,&amp;nbsp;которые пересекаются с друг-другом. Иногда полезно. &lt;br /&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;&lt;br /&gt;my ($code, $msg) = overlap(qw(10.17.18.1/32 10.17.18.0/24 10.17.18.4/25));&lt;br /&gt;die $msg if ($code);&lt;br /&gt;print &amp;quot;OK\n&amp;quot;;&lt;br /&gt;&lt;br /&gt;sub subnet2range {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $subnet = shift;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my ($from, $to);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $subnet =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)$/ || die &amp;quot;bad CIDR format for $subnet\n&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $from = ($1*2**24) + ($2*2**16) + ($3*2**8) + $4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $to = $from + 2**(32-$5) - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ($from, $to);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Return code == 0 if OK&lt;br /&gt;# Return code == 1 and msg explain if fail&lt;br /&gt;sub overlap {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @networks = @_;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my (@subnets, %overlaps);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $subnet (@networks) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my ($from, $to) = subnet2range ($subnet);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push @subnets, { net =&amp;gt; $subnet, from =&amp;gt; $from, to =&amp;gt; $to };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @subnets = sort { $a-&amp;gt;{from} &amp;lt;=&amp;gt; $b-&amp;gt;{from} } @subnets;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (my $i=0; $i&amp;lt;=$#subnets; $i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (my $j=$i+1; $j&amp;lt;=$#subnets; $j++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last if $subnets[$i]-&amp;gt;{to} &amp;lt; $subnets[$j]-&amp;gt;{from};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push @{$overlaps{$subnets[$i]-&amp;gt;{net}}}, $subnets[$j]-&amp;gt;{net}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if $subnets[$i]-&amp;gt;{to} &amp;gt;= $subnets[$j]-&amp;gt;{from};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (scalar (keys %overlaps)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $subnet (sort keys %overlaps) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (1, sprintf (&amp;quot;Network %s overlap with %s&amp;quot;, $subnet, join (&apos;, &apos;, sort @{$overlaps{$subnet}})));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}</description>
  <comments>http://andrejz.livejournal.com/14757.html</comments>
  <category>network overlaps</category>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://andrejz.livejournal.com/4480.html</guid>
  <pubDate>Wed, 29 Nov 2006 15:35:10 GMT</pubDate>
  <title>if_bridge + ipfw</title>
  <link>http://andrejz.livejournal.com/4480.html</link>
  <description>Стала задача, сделать фильтрацию ipfw трафика проходящего между двумя кошками.&lt;br /&gt;Все бы хорошо, да вот только беда, трафик в этом канале бегает тегированый.&lt;br /&gt;&lt;br /&gt;Вот, возьмем наш случай&lt;br /&gt;&lt;br /&gt;[ LAN ]&amp;nbsp; ----- [Cisco 3750] --- dot1q --- [fxp0][FreeBSD][fxp1] ---- dot1q ---- [Cisco 3750] --- [LAN]&lt;br /&gt;&lt;br /&gt;то есть ipfw add reject blabalbal via bridge0 ничего не даст, как и via другие интерфейсы.&lt;br /&gt;&lt;br /&gt;Минут 40 ломал голову, не веря, что такая жопа бываает и фря это не умеет. Потом подумалось, что если не понимает так, тогда можно сделать снимать тег на входящем и одевать на исходящем интерфейсах. Не знаю, работает ли это до версии 6.2, не проверял.&lt;br /&gt;Но выкрутился так&lt;br /&gt;&lt;br /&gt;cloned_interfaces=&quot;bridge0 vlan101 vlan102&quot;&lt;br /&gt;ifconfig_vlan101=&quot;vlan 1000 vlandev fxp0 up&quot;&lt;br /&gt;ifconfig_vlan102=&quot;vlan 1000 vlandev fxp1 up&quot;&lt;br /&gt;ifconfig_bridge0=&quot;addm vlan101 addm vlan102 up&quot;&lt;br /&gt;&lt;br /&gt;Далее уже allow icmp from any to any via vlanxxxx и все работает на ура !&lt;br /&gt;&lt;br /&gt;Спасибо товарищу &lt;span class=&apos;ljuser ljuser-name_aaa111&apos; lj:user=&apos;aaa111&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://aaa111.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://aaa111.livejournal.com/&apos;&gt;&lt;b&gt;aaa111&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp;за снятие с ручника в паре случаев и за сочувствие :) Без Макса было бы тяжко&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
  <comments>http://andrejz.livejournal.com/4480.html</comments>
  <category>if_bridge</category>
  <category>ipfw</category>
  <category>802.1q</category>
  <category>freebsd</category>
  <lj:mood>accomplished</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://andrejz.livejournal.com/1622.html</guid>
  <pubDate>Mon, 06 Mar 2006 11:50:35 GMT</pubDate>
  <title>cyrus-imapd и BDB</title>
  <link>http://andrejz.livejournal.com/1622.html</link>
  <description>Вот, примерно год назад, с переходом на BDB 4.2 стал замечать, что иногда при stop\start или когда машина уходит не коректно в ребут (бывало и такое), Cyrus поднимается, но считает свои базы currupted, много читал, думал. Попробывал 4.3 - ситуация такая-же, если конечно на сервер есть нагрузка. Происходит это практически всегда на IDE винтах, на SCSI все нормально, видимо хвататет скорости провести транхакцию. Такое же бывает, когда db/log.* вырастает очень большого объема и время на его перемешение и создание не хватает, тогда cyrus вываливается с ошибкой, что не правильные права и действительно если посмотреть, то права там будут рутовые. Не хватает прыткости :)&lt;br /&gt;&lt;br /&gt;После чтения документации в BDB, придумалось, что там можно тюнить параметры, создал вот такой вот файл в db/ c именем DB_CONFIG &lt;br /&gt;----&lt;br /&gt;set_lg_max 104857600&lt;br /&gt;set_lg_bsize 204800&lt;br /&gt;set_lg_regionmax 409600&lt;br /&gt;set_cachesize 0 5120000 2&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;После этого, падения перестали иметь место :) Если кому-то пригодиться, юзайте.</description>
  <comments>http://andrejz.livejournal.com/1622.html</comments>
  <category>bdb</category>
  <category>cyrus-imap</category>
  <category>freebsd</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
</channel>
</rss>
