2008/08/22

Skrip sederhana mendaftar netblok IIX

Untuk keperluan pemisahan rute maupun pembatasan lebar pita... Ya, istilah "splitting route" dan "bandwidth shaping" atau "rate limiting" memang lebih popular. Saya cuma ingin menunjukkan kalau saya mencoba menggunakan bahasa Indonesia. Nya kitu lah pokona mah.

Pemisahan rute maupun pembatasan lebar pita koneksi Internet antara jalur IIX dan internasional adalah praktek yang sangat popular di Indonesia. Saya juga gak tahu kenapa. Mungkin karena bw IIX dari ISP yang satu sangat murah, sementara bw intl yg murah justru dari ISP lain, sehingga kita memutuskan untuk menyewa 2 uplink berbeda untuk IIX dan intl. Mungkin juga karena hal2 lain yang sifatnya spesifik individual (or communital? *bahasa mana eta?*). Atau memang standarnya begitu?

Mengambil daftar blok ip IIX dari http://lg.mohonmaaf.com/ sesuai saran pak Harijanto memang sangat baik. Tapi pasti jadi pusing sendiri karena hasilnya adalah sekitar 4500 baris daftar netblok yang beberapa diantaranya "cacat" dan saling overlap. Untuk lebih jelasnya coba saja sendiri. Memproses dengan excell jelas tidak akan saya lakukan.

Nah, supaya gampang, saya mengompilasi sebuah skrip sederhana. Tujuannya supaya cukup dengan sekali mengeksekusi skrip tersebut, maka daftar netblok IIX kita dapat. Malah kalau perlu tinggal diedit sedikit supaya outputnya menjadi skrip untuk memisahkan rute IIX dan intl. Tentu bukan cuma hal itu yang bisa dilakukan.

Skripnya seperti di bawah ini. Bagian pemrosesan dengan perl aslinya buatan Pak Steven yang saya kurangi sedikit. Saya mah gak ngerti perl2an, rieut... Jadi sebetulnya kredit harus diberikan ke beliau karena bagian terbesar skrip di bawah adalah bagian perl :P.

$ cat get-iix-netblocks.sh
#!/bin/sh
TMP1=/tmp/`date +%s`$RANDOM-1

curl -s -d "query=bgp&router=nice" http://lg.mohonmaaf.com/lg.cgi | grep ^\* | sed /^'* '/d|sed /^'*> '/d > $TMP1

cat $TMP1 | perl -MNet::Netmask -ne'm!(\d+\.\d+\.\d+\.\d+/?\d*)! or next;
$h = $1; $h =~ s/(\.0)+$//;
$b=Net::Netmask->new($h); $b->storeNetblock();
END {print map {$_->base()."/".$_->bits()."\n"}
cidrs2cidrs(dumpNetworkTable)}'

rm -f $TMP1 2>/dev/null


Skrip tersebut menggunakan curl untuk mengambil data dari sebuah alamat lalu hasilnya dibersihkan dengan grep dan sed. Selanjutnya skrip perl memanipulasi netblok pada baris2 di file tersebut. Modul perl yang dipakai adalah Net::Netmask. Perintah/program yg disebutkan biasanya sudah terinstal secara default di linux. Mungkin yang perlu ditambah adalah modul Net::Netmask dari CPAN atau paket libnet-netmask-perl jika anda menggunakan Debian. Output skrip dilempar ke STDOUT, jadi anda perlu redirection (./skrip > file_output) supaya keluarannya disimpan ke file.

Kalau mau dijadikan skrip pemisah rute IIX-intl, skripnya tinggal ditambahi menjadi seperti ini:

#!/bin/sh
TMP1=/tmp/`date +%s`$RANDOM-1

curl -s -d "query=bgp&router=nice" http://lg.mohonmaaf.com/lg.cgi | grep ^\* | sed /^'* '/d|sed /^'*> '/d > $TMP1

cat $TMP1 | perl -MNet::Netmask -ne'm!(\d+\.\d+\.\d+\.\d+/?\d*)! or next;
$h = $1; $h =~ s/(\.0)+$//;
$b=Net::Netmask->new($h); $b->storeNetblock();
END {print map {"route add -net ".$_->base()."/".$_->bits()." gw your.iix.gw dev your_iix_if metric 0\n"}
cidrs2cidrs(dumpNetworkTable)}'

echo "route add default gw your.intl.gw dev your_intl_if metric 0"

rm -f $TMP1 2>/dev/null


Nah sebegitu saja rasanya cukup. Kalau masih bisa dioptimasi dan diperbaiki, sharing ilmunya ya, siapa aja.

No comments: