среда, 1 октября 2008 г.

Калькулятор для пересчета сетевой маски в длину префикса и обратно

Конечно, настоящий network administrator должен уметь пересчитывать netmask в prefixlen в уме, разбуженный среди ночи. Но ум с возрастом имеет свойство притупляться - и почему-то именно в сфере арифметики в уме. Потому пишем костыль для стареющего админа - скрипт на любимом админском языке, который примет на входе длину префикса или сетевую маску - и подсчитает то, чего нам не хватало


#!/usr/bin/perl -w

# netmask <-> prefixlen convert
# usage: $0 mask|len

use strict;

if ($#ARGV != 0 || $ARGV[0] =~ /[^\d.]/) {
print STDERR "Usage: $0 mask|len\n";
exit 1;
}
if ($ARGV[0] =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
# на входе - сетевая маска

# максимально возможная длина префикса
my $r = 32;
# переводим адрес в число
my $n = ($1 << 24) + ($2 << 16) + ($3 << 8) + $4;
# пока не появится 1 в младшем бите,
# сдвигаем адрес вправо - и уменьшаем длину на 1

until ($n & 1) {
$n >>= 1;
$r--;
}
print $r, "\n";
} else {
# на входе - длина префикса

# переводим ее в числовой адрес маски
my $r = (0xffffffff << (32 - $ARGV[0]))
& 0xffffffff;
# и форматируем в dot-нотацию
for (my $i = 24; $i >= 0; $i -= 8) {
print (($r & (0xff << $i)) >> $i);
if ($i) {
print '.';
}
}
print "\n";
}

Комментариев нет: