Thursday, March 13, 2008

Route summarization script

I've been searching the internet for a script/program that can automatically summarize CIDR classes that I pass to it. I haven't found one, but I found a perl module (Net::CIDR::Lite) that does just this.

I wrote a small script that takes the CIDR classes and summarizes them and then outputs the summarized classes. This is useful for generating a routing table for a management server and basically you have to copy the classes from a router, summarize them and paste them on the server.

Here's the script - copy/paste it in a perl file and make it executable:


#!/usr/bin/perl
use strict;
use warnings;
use Net::CIDR::Lite;

my $ipv4String='[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}';

if(defined $ARGV[0] && $ARGV[0] eq '-h'){
print "usage: $0

This script summarizes your IP classes (if possible). Input IPs with mask one per line. End with CTRL+D. Optionally, redirect a file to stdin like so:
$0 < cidr.txt ";
exit;
}


print "Enter IP/Mask one per line (1.2.3.0/24). End with CTRL+D.\n";

my $cidr =Net::CIDR::Lite->new;

while(<>){
if(/($ipv4String\/[0-9]{1,2})/){
my $item=$1;
$cidr->add($item);
}
else{
print "Ignoring previous line.\n";
}
}
my @cidr_list = $cidr->list;
print "======Aggregated IP list:======\n";
foreach my $item(@cidr_list){
print "$item\n";
}


Here's how to run the script:

root@panopticon variousScripts]# ./aggregateCIDR.pl
Enter IP/Mask one per line (1.2.3.0/24). End with CTRL+D.
1.1.1.0/24
1.1.2.0/24
1.1.4.0/24
1.1.3.0/24
1.1.0.0/24
1.1.1.128/25
======Aggregated IP list:======
1.1.0.0/22
1.1.4.0/24
[root@panopticon variousScripts]# ./aggregateCIDR.pl

The script requires Net::CIDR::Lite. If you get an error message, you need to install this module:

[root@panopticon variousScripts]# ./aggregateCIDR.pl
Can't locate Net/CIDR/Lite.pm in @INC (@INC contains: /usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/5.8.5 /usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.4/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.3/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.2/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.1/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.4/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.3/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.2/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.1/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl/5.8.2 /usr/lib/perl5/vendor_perl/5.8.1 /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at ./aggregateCIDR.pl line 4.
BEGIN failed--compilation aborted at ./aggregateCIDR.pl line 4.
[root@panopticon variousScripts]# perl -MCPAN -e 'install Net::CIDR::Lite;'
CPAN: Storable loaded ok
Going to read /home/adrianp/.cpan/Metadata
Database was generated on Mon, 03 Sep 2007 07:37:38 GMT
...

Monday, February 25, 2008

Editing crontab on Solaris

I wanted to edit the crontab on a Solaris 10 box, but when I tried to execute crontab -e, it didn't take me to the vi editor. This is what I got instead:

# crontab -e
434


No matter what I typed, I couldn't use this edit mode.

Turns out my terminal wasn't exported properly and vi started in 'one line' mode. Here's how to get the default vi back - you need to have the properly variables set in your shell:

# EDITOR=vi
# export EDITOR
# TERMINAL=xterm
# export TERMINAL
(for bash).
Now, try crontab -e again, and vi should be 'full screen'.

Tuesday, February 19, 2008

Long delays in mysql because of DNS

Recently I experienced very long delays while connecting to remote mysql databases, without any apparent reason. The connect would stall while connecting, before issuing querries and would wait for about 15-20 seconds before working.

I managed to find out why: The mysqld server uses reverse DNS queries to find out the name of the calling host. If the DNS is unavailable at the server side (as was my case), it takes a while for the query to time out.

To solve this, you must add your ip and hostname in the /etc/hosts of your mysql server, so it is able to resolve your IP (or get the DNS working).

More info here: http://dev.mysql.com/doc/refman/5.0/en/dns.html

Friday, February 15, 2008

First post!

This post is just for testing purposes. I'm new to this 'blogging' thing!