Tampilkan postingan dengan label belajar. Tampilkan semua postingan
Tampilkan postingan dengan label belajar. Tampilkan semua postingan

Sabtu, Januari 10, 2009

Setting Squid di Intrepid Ibex Ubuntu untuk YM dan GTalk pakai GAIM

Beberapa hari ini saya baru menginstall squid di laptop saya. Tujuannya selain ingin belajar cara setting squid, juga untuk mengetahui detail koneksi internet saya. Dari beberapa panduan di internet, dan juga komentar pada file /etc/squid/squid.conf, saya berhasil menjalankan squid dan hasilnya cukup memuaskan. Koneksi saya rasakan menjadi lumayan stabil ketimbang koneksi langsung tanpa squid.

Satu hal yang baru saya sadari kemaren, adalah YM dan GTalk pakai GAIM ga bisa connect. Semula saya kira masalah koneksi Isat Eco yang memang kadang lambat. Setelah melihat log squid di /var/log/squid/access.log, saya mendapati baris log berikut ini:


1231494883.082 0 127.0.0.1 TCP_DENIED/403 1422 CONNECT scs.msg.yahoo.com:5050 - NONE/- text/html
1231494883.962 0 127.0.0.1 TCP_DENIED/403 1418 CONNECT talk.google.com:5222 - NONE/- text/html


Dari baris diatas terlihat bahwa koneksi ke port 5050 Yahoo dan port 5222 GTalk di-deny oleh squid. Berikut ini isi konfigurasi squid di /etc/squid/squid.conf terkait port:

#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 22 # ssh
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl Safe_ports port 995 # SSL
acl Safe_ports port 587 # TLS
acl purge method PURGE
acl CONNECT method CONNECT


Di konfigurasi, port 1025 s/d 65535 sudah ada di acl Safe_ports, tetapi koneksi ke port 5050 dan 5222 masih di-deny oleh squid. Saya coba juga tanya ke oom Google, tapi hanya menemukan pertanyaan yang sama tanpa ada solusi yang menjelaskan sebab di-deny-nya koneksi. Akhirnya saya coba solusi yang terlintas di pikiran.

Pada konfigurasi ada dua acl untuk port. Sayapun mencoba menambahkan port YM dan GTalk ke acl SSL_ports, sehingga konfigurasi sekarang menjadi:

...
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl SSL_ports port 5050 # YM
acl SSL_ports port 5222 # GTalk
...


Setelah squid di-restart, sekarang saya sudah bisa terhubung lagi ke YM dan GTalk pakai GAIM. Di log sekarang ada baris:

1231514336.530 883324 127.0.0.1 TCP_MISS/200 24334 CONNECT scs.msg.yahoo.com:5050 - DIRECT/66.163.181.184 -
1231514828.691 11193 127.0.0.1 TCP_MISS/200 81031 GET http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us&diffs=1&t=0&tags=short&rt=0&prog-ver=8.1.0.249&useutf8=1&legenc=codepage-1252 - DIRECT/209.191.93.51 text/xml
...
1231515222.670 247205 127.0.0.1 TCP_MISS/200 40954 CONNECT talk.google.com:5222 - DIRECT/72.14.235.125 -


Saya masih penasaran, kenapa sampai perlu dua acl untuk port. Ternyata saya menemukan jawabannya di file konfigurasi squid, di baris berikut ini

#Recommended minimum configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny purge
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports


Ternyata acl SSL_ports digunakan untuk membolehkan akses `CONNECT` yang memang dilakukan oleh GAIM untuk YM dan GTalk. Konfigurasi default squid akan melakukan deny terhadap semua koneksi ke port selain yang ada pada acl SSL_ports. Ini sebabnya kenapa YM dan GTalk tidak bisa terhubung, jika portnya tidak ditambahkan ke acl SSL_ports.

Semoga tulisan singkat ini dapat membantu rekan-rekan yang mengalami masalah serupa.

Rabu, Desember 31, 2008

Belajar Ruby

Berawal dari sebuah kebutuhan untuk mengetahui kapan DHCP Client memperbaharui IP Address, saya akhirnya malah belajar Ruby dan jadilah script sederhana berikut ini. FYI, saya menggunakan GNU/Linux Ubuntu Intrepid Ibex. Saya butuh informasi waktu perbaharuan IP berikutnya dari DHCP Client. Dari file /var/log/daemon.log saya bisa mendapatkan informasi berikut ini


$ grep renewal /var/log/daemon.log
Dec 29 10:32:41 hantulab dhclient: bound to 192.168.1.31 -- renewal in 14563182 seconds.
Dec 29 10:39:10 hantulab dhclient: bound to 192.168.1.31 -- renewal in 14168572 seconds.
Dec 29 12:18:45 hantulab dhclient: bound to 192.168.1.31 -- renewal in 13948234 seconds.
Dec 30 08:08:48 hantulab dhclient: bound to 10.2.13.34 -- renewal in 1496 seconds.
Dec 30 08:33:44 hantulab dhclient: bound to 10.2.13.34 -- renewal in 21496 seconds.
Dec 30 14:32:00 hantulab dhclient: bound to 10.2.13.34 -- renewal in 18630 seconds.
Dec 31 08:53:45 hantulab dhclient: bound to 10.2.13.34 -- renewal in 1446 seconds.


Ide awalnya adalah mengubah angka detik menjadi format jam. Dari tiga bahasa scripting yang terinstall di laptop saya, Perl, Python, dan Ruby, saya memutuskan untuk coba menggunakan Ruby sambil belajar. Dengan bekal panduan dari http://pine.fm/LearnToProgram/, sayapun membuat script sederhana berikut ini:

#!/usr/bin/env ruby

hour = ARGV[0].to_i / 3600
reminder = ARGV[0].to_i % 3600
minute = reminder / 60
second = reminder % 60

puts ARGV[0] + ' = ' + hour.to_s + ':' + minute.to_s + ':' + second.to_s


Lalu saya coba jalankan

$ ruby sectomin.rb 1446
1446 = 0:24:6


Hmm, lumayan. Script simple pertamaku pake Ruby. Selanjutnya aku juga perlu penjumlahan jam nih. Cari-cari nama fungsi dengan fungsionalitas sama dengan explode di PHP, nemu method split. Sekalian aku edit scriptnya dengan membuat fungsi.

#!/usr/bin/env ruby

def sectohour sec
hour = sec / 3600
reminder = sec % 3600
minute = reminder / 60
second = reminder % 60

hour.to_s + ':' + minute.to_s + ':' + second.to_s
end

def houradd hour1 hour2
arr_hour1 = hour1.split(':')
arr_hour2 = hour2.split(':')
result = (arr_hour1[0].to_i + arr_hour2[0].to_i) * 3600
+ (arr_hour1[1].to_i + arr_hour2[1].to_i) * 60
+ (arr_hour1[2].to_i + arr_hour2[2].to_i)
sectohour result
end

hour = sectohour ARGV[0].to_i

puts ARGV[0] + ' = ' + hour
puts ARGV[1] + ' + ' + ARGV[0] + ' = ' + houradd ARGV[1] hour


Coba dijalankan:

$ ruby sectomin.rb 1446 08:53:45
sectomin.rb:12: syntax error, unexpected tIDENTIFIER, expecting '\n' or ';'
sectomin.rb:19: syntax error, unexpected kEND, expecting $end


Wah...wah... koq error yah. Sebelum buka manual, coba-coba lagi, kali ini nambah koma sebagai pemisah argumen, ternyata berhasil. Untuk statemen multi baris juga mesti pake backslash, karena ga ada akhir baris pake ' seperti php. Untuk manggil fungsi dua argumen mesti pake tanda kurung. Inilah hasil script yang jalan, plus penyempurnaan sectohour.

#!/usr/bin/env ruby

def sectohour sec
hour = sec / 3600
reminder = sec % 3600
minute = reminder / 60
second = reminder % 60

hour.to_s \
+ ':' + (minute.to_s.length < 2 ? '0' : '') + minute.to_s \
+ ':' + (second.to_s.length < 2 ? '0' : '') + second.to_s
end

def houradd hour1,hour2
arr_hour1 = hour1.split(':')
arr_hour2 = hour2.split(':')
result = (arr_hour1[0].to_i + arr_hour2[0].to_i) * 3600 \
+ (arr_hour1[1].to_i + arr_hour2[1].to_i) * 60 \
+ (arr_hour1[2].to_i + arr_hour2[2].to_i)
sectohour result
end

hour = sectohour ARGV[0].to_i

puts ARGV[0] + ' = ' + hour
puts ARGV[1] + ' + ' + ARGV[0] + ' = ' + (houradd ARGV[1],hour)


Hasil running:

$ ruby sectomin.rb 1446 08:53:45
1446 = 0:24:6
08:53:45 + 1446 = 9:17:51


Setelah ini selesai, selanjutnya perlu otomatisasi dari pembacaan log sampai didapatkan hasil penjumlahannya. Dengan kombinasi grep dan tail, saya bisa dapat info ini:

$ grep renewal /var/log/daemon.log | tail -n 1
Dec 31 08:53:45 hantulab dhclient: bound to 10.2.13.34 -- renewal in 1446 seconds.


Selanjutnya dengan bantuan gawk yang powerfull, saya bisa membentuk string ini

$ grep renewal /var/log/daemon.log \
| tail -n 1 \
| gawk '{print "ruby sectomin.rb " $12 " " $3;}'
ruby sectomin.rb 1446 08:53:45


Lalu saya tambahkan backtick (`) sehingga saya bisa mendapatkan:

$ grep renewal /var/log/daemon.log \
| tail -n 1 \
| `gawk '{print "ruby sectomin.rb " $12 " " $3;}'`
1446 = 0:24:6
08:53:45 + 1446 = 9:17:51


Jreng...jreng... selesailah script sederhana Ruby pertama saya, plus parsing log. Semoga tulisan singkat saya ini bermanfaat. Ruby ternyata asik juga, cuman kadang saya terbawa kebiasaan di php. Belajar bahasa baru memang harus merubah paradigma dan pola pikir. Nantikan tulisan saya selanjutnya di blog ini.