Шукати в цьому блозі

пʼятниця, 22 листопада 2013 р.

BGP: Практика использования unsuppress-map

Возникла следующая задача. На пограничном маршрутизаторе, где суммируются сети автономной сети возникла необходимость включить клиента и исключить его подсеть /30 из суммарных маршрутов, и проанонсить отдельно вовнутрь AS как отдельный маршрут.
Решение:
neighbor IBGP unsuppress-map unsupp-adv

route-map unsupp-adv permit 5
 match ip address 88

access-list 88 permit 212.xxx.xxx.xxx 0.0.0.3
В итоге сеть 212.xxx.xxx.xxx/30 нормально, отдельным маршрутом, проанонсилась во внутрь AS.

вівторок, 19 листопада 2013 р.

AnyEvent::SNMP

Понадобилось опросить по SNMP одно устройство, но так как в своё время разбирался с механизмом AnyEvent в perl то захотелось и в этом случае его использовать. К счастью модуль AnyEvent::SNMP в связке с Net::SNMP даёт такую возможность.
Собственно вот небольшой пример как эту связку использовать:
use AnyEvent::SNMP;
use Net::SNMP;

...

sub snmp {
    my @hosts = ('host10', 'host11');
    my @oids = (
        '.1.3.6.1.4.1.476.1.42.3.4.1.3.3.1.3.1',        # EnvTemperatureMeasurementDegC
        '.1.3.6.1.4.1.476.1.42.3.4.3.1.0'               # EnvStateSystem
    );
    my $community = "community";

    foreach my $host (@hosts) {

        printf("HOST: %s", $host);

        my $cv = AnyEvent->condvar;

        # Set timer 50 sec.
        my $w = AnyEvent->timer (after => 50, cb => sub { $cv->send("Timeout"); });

        Net::SNMP->session( -hostname => $host, -community => $community, -version => 'snmpv2c', -nonblocking => 1 )->get_request(
            -callback => sub {
                my $snmpSess = shift;
                my %oidsret;
                if ( defined $snmpSess->var_bind_list() ) {
                    foreach my $oid (@oids) { $oidsret{$oid} = $snmpSess->var_bind_list()->{$oid}; }
                }

                undef $w;
                $cv->send (\%oidsret);
            },
            -varbindlist => \@oids
        );
        my @result = $cv->recv;


        if (defined $result[0]) {
            foreach my $oid (@oids) {
                printf(" %s", $result[0]->{$oid});
            }
        } else {
            printf(" SNMP error");
        }

        printf("\n");
    }

}
Собственно всё как всегда, для AnyEvent - обёртка, callback, результат!
Для критиков. Безусловно, что вышеприведённый пример можно "оптимизировать". Например, получая результат $cv->recv за циклом обхода хостов, а через $cv->send передавать в результат более сложную структуру, которая бы содержала и имя хоста. Затем всю эту кухню разбирать. Но пример на то и пример чтобы над такими вещами не заморачиваться.

вівторок, 24 вересня 2013 р.

UIRD (Ukrainian Index of Retail Deposit Rates) - Український індекс ставок за депозитами фізичних осіб

UIRD (Ukrainian Index of Retail Deposit Rates) або Український індекс ставок за депозитами фізичних осіб – це індикативна ставка, що розраховується о 15:00 за Київським часом кожного Банківського дня в системі Thomson Reuters на основі номінальних ставок по строкових депозитах фізичних осіб у гривні на строк в 12 місяців з виплатою процентів після закінчення строку дії депозитного договору, що діють в 20 найбільших українських банках за розміром депозитного портфелю фізичних осіб.
Більш детальна інформація про Український індекс ставок за депозитами фізичних осіб  знаходиться на офіційному Інтернет-представництві – сайті Національного Банку України на вказаних нижче Інтернет-сторінках:

пʼятниця, 9 серпня 2013 р.

Преобразование IPv4-адресов в Perl

В дополнение к предыдущему, религиозно верному, решению по сортировке ip-адресов отдельно хочется отметить решение "из коробки" cpan - модуль Sort::Key::IPv4.
Установить его можно либо из репозитория дистрибутива Linux, либо непосредственно с cpan:
# cpan
cpan[1]> install Sort::Key::IPv4
CPAN: Storable loaded ok (v2.39)
Reading '/home/olden/.cpan/Metadata'
--- 8< --- skip --- 8< ---
  sudo /usr/bin/make install  -- OK

cpan[2]> exit
Возьмём наш предыдущий набор ip-адресов:
my @array = ("127.0.0.1","212.90.160.8", "10.100.175.11", "10.10.10.8", "212.90.160.33","212.90.160.40");
my %hash = ("127.0.0.1" => "1", "212.90.160.8" => "0", "10.100.175.11" => "1", "10.10.10.8" => "1", "212.90.160.33" => "0", "212.90.160.40" => [ "1", "2" ] );
И отсортируем его используя функционал модуля Sort::Key::IPv4
foreach my $ip ( ipv4sort @array ) {
    printf("%s\n", $ip);
}
и, соответственно, для ключей хеша:
foreach my $ip ( ipv4sort keys %hash ) {
    printf("%s => %s\n", $ip, $hash{$ip});
}

вівторок, 6 серпня 2013 р.

Преобразование IPv4-адресов в Perl

К примеру, имеем такие массив и хеш:
my @array = ("127.0.0.1","212.90.160.8", "10.100.175.11", "10.10.10.8", "212.90.160.33","212.90.160.40");
my %hash = ("127.0.0.1" => "1", "212.90.160.8" => "0", "10.100.175.11" => "1", "10.10.10.8" => "1", "212.90.160.33" => "0", "212.90.160.40" => [ "1", "2" ] );
Хотим:
  • научиться быстренько преобразовывать каждый ip-адрес либо в числовой вид, либо просто в набор из четырёх байт;
  • хотим быстро, без лишних накладных расходов, вывести отсортированные значения ip-адресов из массива;
  • также хотим быстро, без лишних накладных расходов, вывести отсортированные значения ip-адресов, которые являются ключами хеша.
Преобразования из ip-адреса в число, из ip-адреса в набор символов и обратно можно осуществить, например, следующим образом:
map { 
    # Преобразовать ip-адрес в число
    my $n = unpack("N",pack("C4",split /\./));

    # Преобразовать число в ip-адрес
    print join(".",unpack("C4",pack("N",$n))),"\n";

    # Преобразовать ip-адрес в набор символов
    my $c = pack("C4",split /\./);

    # Преобразовать набор символов в ip-адрес
    print join(".",unpack("C4", $c)),"\n";
} @array;

Для того чтобы вывести отсортированный массив ip-адресов очевидным, однако не самым эффективным, является следующее решение:
foreach my $ip ( sort {
    my @a = split /\./, $a; my @b = split /\./, $b;
    return $a[0] <=> $b[0] || $a[1] <=> $b[1] || $a[2] <=> $b[2] || $a[3] <=> $b[3];
    } @array ) {
    printf("%s\n", $ip);
}
Используем другое, более элегантное решение, выведем отсортированный массив ip-адресов, при используя преобразование GRT (Guttman-Rosler Transform) для того чтобы избежать вызова пользовательской функции в sort. Подробнее об этом можно прочитать в Pragmatic Perl — Выпуск 4. Июнь 2013 в статье "Сортировка в Perl".
foreach my $ip ( map { join(".",unpack("C4")) } sort map { pack("C4",split /\./) } @array ) {
    printf("%s\n", $ip);
}

Для того чтобы отсортировать по ключу хеша слегка преобразуем предыдущий цикл:
foreach my $ip ( map { join(".",unpack("C4")) } sort map { pack("C4",split /\./) } keys %hash ) {
    printf("%s => %s\n", $ip, $hash{$ip});
}


середа, 26 червня 2013 р.

bind: перенаправление кеширующих запросов

Предыстория такова. Был задано вопрос: как в кэширующем dns-сервере запросы определённым зонам отправлять на определённые dns-сервера?

Всем известна глобальная опция forwarders в секции options конфигурации bind. В ней задаётся безусловное перенаправление всех запросов к нашему серверу на другие dns-сервера. Однако задача ставилась таким образом, что, например, к домену domain.com необходимо перенаправить запрос к серверу отличному от описанного в глобальной опции forwarders секции options.

Слёту, что я смог придумать, в ответ на этот вопрос, это прописать для указанного домена slave зону, например так:
zone "domain.com" {
    type slave;
    file "/var/cache/bind/domain.com";
    masters {
      1.2.3.4;
      5.6.7.8;
    };
};
В принципе этот вариант работает, но как оказалось существует более элегантное решение, в котором не нужно "засорять" файловую систему "лишними" зонами доменов:
zone "domain.com" {
    type forward;
    forwarders {
      1.2.3.4;
      5.6.7.8;
    };
};
Надо признать, что второе решение, в свете оригинального вопроса, религиозно более верное.

ps: Справедливости ради так-же надо отметить, что решение было найдено самим вопрошающим, и как обычно это был pilson.

середа, 12 червня 2013 р.

(java.sql.SQLException) Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

Долго бился головой об стену, уже даже начал придумывать всяческие хитрые mysql-ные view-вы чтобы обмануть Java в проекте JDeveloper-а... Суть проблемы заключалась в том, что исторически сложилось так, что несущественные значения timestamp в mysql-базе заполнялись значениями '0000-00-00 00:00:00', а в Java они не преобразовывались нормально в значение timestamp и выбивали исключение.
Решение было найдено следующее. Во-первых, connection был преобразован в jdbc url, а во-вторых к нему был добавлен параметр zeroDateTimeBehavior установленный в значение convertToNull. О всех возможных значениях можно почитать на соответствующей странице руководства MySQL: Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J, а об использовании ADF Business Components совместно с MySQL тут "How To Use ADF Business Components with MySQL".
В итоге jdbc url стал выглядеть примерно так:
jdbc:mysql://hostname/database?ultraDevHack=true&capitalizeTypeNames=true&pedantic=true&zeroDateTimeBehavior=convertToNull&sqlmode=oracle