<?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/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:andrejz</id>
  <title>andrejz</title>
  <subtitle>andrejz</subtitle>
  <author>
    <name>andrejz</name>
  </author>
  <link rel="alternate" type="text/html" href="http://andrejz.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://andrejz.livejournal.com/data/atom"/>
  <updated>2009-05-05T06:38:40Z</updated>
  <lj:journal userid="9335206" username="andrejz" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://andrejz.livejournal.com/data/atom" title="andrejz"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrejz:14967</id>
    <link rel="alternate" type="text/html" href="http://andrejz.livejournal.com/14967.html"/>
    <link rel="self" type="text/xml" href="http://andrejz.livejournal.com/data/atom/?itemid=14967"/>
    <title>nginx directives capture</title>
    <published>2009-05-05T06:30:24Z</published>
    <updated>2009-05-05T06:38:40Z</updated>
    <category term="nginx"/>
    <category term="perl"/>
    <content type="html">&lt;a name="cutid1"&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 (',', @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 .= '/' if( $path !~ /\/$/ );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for my $filename( glob( $path.'*')) {&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="http://catap.ru/blog/2009/04/29/nginx-type-of-directive/"&gt;вот тут&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrejz:14757</id>
    <link rel="alternate" type="text/html" href="http://andrejz.livejournal.com/14757.html"/>
    <link rel="self" type="text/xml" href="http://andrejz.livejournal.com/data/atom/?itemid=14757"/>
    <title>Network overlaps</title>
    <published>2009-05-04T13:40:22Z</published>
    <updated>2009-05-04T13:44:41Z</updated>
    <category term="network overlaps"/>
    <category term="perl"/>
    <content type="html">&lt;a name="cutid1"&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 (', ', 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;}</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrejz:4480</id>
    <link rel="alternate" type="text/html" href="http://andrejz.livejournal.com/4480.html"/>
    <link rel="self" type="text/xml" href="http://andrejz.livejournal.com/data/atom/?itemid=4480"/>
    <title>if_bridge + ipfw</title>
    <published>2006-11-29T15:35:10Z</published>
    <updated>2007-05-07T16:02:09Z</updated>
    <category term="if_bridge"/>
    <category term="ipfw"/>
    <category term="802.1q"/>
    <category term="freebsd"/>
    <content type="html">Стала задача, сделать фильтрацию 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="bridge0 vlan101 vlan102"&lt;br /&gt;ifconfig_vlan101="vlan 1000 vlandev fxp0 up"&lt;br /&gt;ifconfig_vlan102="vlan 1000 vlandev fxp1 up"&lt;br /&gt;ifconfig_bridge0="addm vlan101 addm vlan102 up"&lt;br /&gt;&lt;br /&gt;Далее уже allow icmp from any to any via vlanxxxx и все работает на ура !&lt;br /&gt;&lt;br /&gt;Спасибо товарищу &lt;span class='ljuser ljuser-name_aaa111' lj:user='aaa111' style='white-space: nowrap;'&gt;&lt;a href='http://aaa111.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://aaa111.livejournal.com/'&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;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:andrejz:1622</id>
    <link rel="alternate" type="text/html" href="http://andrejz.livejournal.com/1622.html"/>
    <link rel="self" type="text/xml" href="http://andrejz.livejournal.com/data/atom/?itemid=1622"/>
    <title>cyrus-imapd и BDB</title>
    <published>2006-03-06T11:50:35Z</published>
    <updated>2007-05-07T16:02:59Z</updated>
    <category term="bdb"/>
    <category term="cyrus-imap"/>
    <category term="freebsd"/>
    <content type="html">Вот, примерно год назад, с переходом на 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;После этого, падения перестали иметь место :) Если кому-то пригодиться, юзайте.</content>
  </entry>
</feed>
