Membuat web server menggunakan Twisted

Diposting oleh Haddad Sammir

Sobat, atas desakan saudara-saudaraku yang kurang beres pikirannya dan untuk menjaga reputasiku sebagai h3k3r Brondong, maka aku putuskan untuk mulai menulis mengenai h3k1ng atau paling tidak mengenai komputer di blog ini.

Beberapa waktu yang lalu aku dapat mainan bernama Twisted. Sebuah Networking Framework yang cukup menarik hati karena penggunaannya yang begitu luas dan ditulis menggunakan Python. Tak kurang dari aplikasi Email, XMPP, Web hingga apapun yang dapat kau bayangkan dalam sebuah program berorintasi jaringan dapat dibangun menggunakan Framework ini. Hebatnya lagi, kau bahkan bisa mendefenisikan protokol mu sendiri.

Namun untuk dapat melakukan semua itu, dibutuhkan pengetahuan mengenai Pemprograman Python yang memadai. Sudahkah kau belajar Python hari ini?

~~~

Keuntungan mengunakan Framework ini adalah kau dapat menjaga aplikasimu sesederhana dan sekecil mungkin sekaligus mengurangi kompleksitas. Efeknya akan sangat terasa jika kau memaksimalkan penggunaan python dalam aplikasi yang kau buat. Hal ini akan sangat membantumu dalam melakukan integrasi dan content sharing. Ingat sobat, kita menggunakan object yang sama!

Yang tak kalah hebatnya, kau tidak perlu install PHP pada aplikasimu yang berorintasi web karena semua orang tahu People Hate Php! Python yang akan melakukan semua keperluan otomatisasi. Filosofi python yang “battery included” bahkan membuatmu tidak perlu melirik library tambahan selama tidak dibutuhkan.

Kau juga tidak perlu meng-install Apache. Buat apa kau menggunakan twisted? Kau boleh buang Apache dari sistemmu.

~~~

Kau sudah siap untuk memulainya sobat ?

Artikel blog ku kali ini akan mendemostrasikan pembuatan web server sederhana mengunakan twisted, kita akan menggunakan static file, dalam hal ini cukup file html saja dan dukungan cgi-bin. Untuk cgi-bin akan didemonstrasikan dengan menggunakan skrip Perl.

Sebelumnya maaf sobatku, artikel ini tidak akan menjelaskan twsited secara menyeluruh, juga bukan artikel yang murni tutorial. Artikel ini hanya mendemonstrasikan penggunaan twisted. Namun jika kau berkenan, aku akan tulis artikel mengenai twisted semampuku, sebanyak yang kau mau!

Persiapan yang kau butuhkan adalah sebuah sistem linux (mohon maaf, bagi yang menggunakan windos), serta twisted yang telah terinstall. Instalasi twisted tidaklah begitu sulit, jadi akan aku lewatkan saja, namun jika kau terkendala masalah saat instalasi twisted, kau tinggalkan sajalah komen, nanti akan aku coba jelaskan padamu.

Pertama sekali, kau buatlah dulu direktori kerja mu. Terserahlah kau mau buat dimana. Kalau aku akan buat direktori twisted di /home/haddad .

Setelah itu, kau buat dalam direktori kerjamu dua buah direktori lagi yang akan digunakan untuk meletakkan file-file html dan cgi. Aku buat direktori “site” dan “cgibin” di dalam direktori /home/haddad.


Seperti inilah susunan direktori kerja dalam komputerku:
haddad@moria:~/twisted> pwd
/home/haddad/twisted
haddad@moria:~/twisted> ls -al
total 32
drwxr-xr-x 4 haddad users 4096 2009-01-23 12:18 .
drwxr-xr-x 105 haddad users 4096 2009-01-23 10:46 ..
drwxr-xr-x 2 haddad users 4096 2009-01-23 12:00 cgibin
drwxr-xr-x 2 haddad users 4096 2009-01-05 19:31 site


Sobat, sekarang kita akan mulai menulis kode. Aktifkanlah editor kesukaanmu!
Kuingatkan, cukup kau ketik saja kodenya, jangan pula kau ambil pusing. Nanti akan aku jelaskan kepadamu cara kerjanya.



Ingat kawanku, kau harus sesuaikan penempatan path pada argumen-argumen pada kode diatas dengan direktori kerjamu.

Setelah itu, boleh kau simpan dengan dengan nama apa saja yang suka dan kau letakkan file tersebut didirektori kerjamu. Kalau aku, akan kusimpan di direktori /home/haddad/twisted dengan nama webserver.py .


haddad@moria:~/twisted> pwd ; ls
/home/haddad/twisted
cgibin site webserver.py


Sampai pada langkah ini kau sudah buat web server mu sendiri menggunakan twisted. Sekarang yang harus kau siapkan adalah file html yang akan tampil jika kau membuka browser dan mengetikkan alamat localhost:31337. Betul, betul, betul! Kita menggunakan port 31337, bukannya 80. Kau sebenarnya bisa berikan port berapa saja, 31337 itu aku buat supaya terlihat keren saja.

Jika kau ingin menggunakan file-file cgi yang kau tulis menggunakan perl, cukup kau letakkan pada direktori “cgibin”. Di komputerku akan ku letakkan skrip perl tersebut di: /home/haddad/twisted/cgibin

Seperti inilah skrip perl yang ku buat untuk uji coba CGI Bin:


#!/usr/bin/perl

print "content-type: text/html \n\n";
print "

TWISTED IS ROCK

\n";

exit(0);



Jangan lupa ya sobat untuk mengubah permisi skrip perl yang kau buat menjadi executable!

Sekarang seperti inilah direktori kerjaku:


haddad@moria:~/twisted> pwd ; ls -Ral
/home/haddad/twisted
.:
total 40
drwxr-xr-x 4 haddad users 4096 2009-01-23 13:16 .
drwxr-xr-x 105 haddad users 4096 2009-01-23 14:30 ..
drwxr-xr-x 2 haddad users 4096 2009-01-23 15:47 cgibin
drwxr-xr-x 2 haddad users 4096 2009-01-23 15:44 site
-rw-r--r-- 1 haddad users 278 2009-01-23 13:16 webserver.py

./cgibin:
total 24
drwxr-xr-x 2 haddad users 4096 2009-01-23 15:47 .
drwxr-xr-x 4 haddad users 4096 2009-01-23 13:16 ..
-rwxr-xr-x 1 haddad users 156 2009-01-23 15:46 cgi.pl

./site:
total 24
drwxr-xr-x 2 haddad users 4096 2009-01-23 15:44 .
drwxr-xr-x 4 haddad users 4096 2009-01-23 13:16 ..
-rw-r--r-- 1 haddad users 118 2009-01-05 19:20 index.html


Jika kau sudah tidak sabar, jalankanlah web server mu. Tentunya kau harus masuk ke shell dan mengetikkan:


haddad@moria:~/twisted> python webserver.py


Jika tidak ada kesalahan, kau seharusnya sudah bisa mengakses web server mu menggunakan browser dengan mengetikkan alamat:

http://localhost:31337/

Begitu juga kalau kau ingin mengakses file cgi yang telah kau siapkan, cukup arahkan browsermu ke:

http://localhost:31337/cgi-bin/cgi.pl

Cukup sederhana bukan ?

Karna aku telah berjanji padamu dan kaupun tetap memaksaku menjelaskannya, maka akan ku jelaskan padamu cara kerja web server yang telah kita buat.

Aku sampaikan padamu sobat, aku bukan pakar atau orang hebat, akupun tidak bermahsud mengguruimu. Jika kau menemukan kesalahan pada penulisan artikel ini, harap kau maafkan aku dan tolong kau koreksi.

Twisted adalah sebuah framework jaringan sobat. Jadi jangan kau samakan dengan framework web seperti Djanggo atau CherryPy. Cara termudah memahami twisted adalah dengan memandangnya sebagai sekumpulan komponen. Komponen-komponen tersebut harus kau rakit menjadi aplikasi yang kau butuhkan. Tentunya sebelum kau merakitnya, kau harus persiapkan (konfigurasikan) komponen tersebut. Apakah kau harus memasukkan argumen-argumen tertentu atau bahkan melakukan overriden method-method tertentu.

Dalam konteks aplikasi yang kita buat, ada dua komponen utama yang kita gunakan yaitu “internet” dan “web”.

Kau bisa lihat dari statement import pada kode kita diatas komponen-komponen apa saja yang terlibat. Komponen twisted.internet adalah komponen yang bertangung jawab mengurus asynchronous I/O dan events. Sedangkan reactor, komponen ini memiliki mekanisme internal yang tidak harus (mungkin tidak boleh) kita campuri. Pada web server kita sobat, komponen ini mengimplementasikan interface twisted.internet.interfaces.IReactorTCP yang mendefenisikan method diantaranya listenTCP.

Kalau kau mengacu ke dokumentasi API nya, method listenTCP dedefenisikan seperti ini:

def listenTCP(port, factory, backlog=50, interface=''):

Dan fungsi method ini adalah menghubungkan angka numerik port (misalnya 80 untuk web) dengan protocol factory. Jika ada koneksi pada port yang diberikan, maka akan ditangani oleh protocol factory.

Coba kau perhatikan kembali kode web server kita:

reactor.listenTCP(31337, site)

“31337” adalah nomor port, sedangkan “site” merupakan instance protocol factory.

Sampai disinilah wewenang twisted.internet sebagai penanggung jawab asynchronous i/o dan events.

~~~

Untuk mengani segala hal yang berhubungan dengan web, baik itu protokol http, request, url mapping dan banyak hal lainnya kita menggunakan komponen twisted.web.

Dalam studi kasus web server kita sobatku, kita harus mempersiapkan protocol factory yang akan menangani koneksi pada port 31337. Tentunya protokol ini adalah protokol http.

Ku beritahu kau sobat, twisted sudah mempersiapkan segalanya. Kau lihatlah kode yang kita buat:
site = server.Site(root)

Site merupakan instance dari class server.Site. Bacalah penggalan kode class Site ini:

class Site(http.HTTPFactory):

def __init__(self, resource, logPath=None, timeout=60*60*12):

Kalau kau telah belajar python hari ini sobat, kau pasti akan tahu kalau server.Site adalah turunan dari http.HTTPFactory. Class ini lah yang akan menangani koneksi pada port 31337.

Lihat kembali defenisi method __init__ yang dimiliki server.Site. Class ini membutuhkan argumen berupa “resource”.

Sekarang yang harus kita lakukan adalah mempersiapkan resource. Seperti yang ku katakan sebelumnya, web server kita akan berurusan dengan static file. Kau masih ingat kan? Oleh karena itu, kita harus menggunakan komponen yang berfungsi menangani resource static.

Kalau kau tidak malas membaca, di dokumentasi API twisted kau akan temukan modul “static” yang bertanggung jawab pada resource static. Lebih dalam lagi kau masuk, kau akan menemukan sebuah class bernama “File” yang berfungsi “represents a plain non-interpreted file”. Kau artikan sendiri sajalah, tahu lah kau bahasa inggrisku sekerat ular sekerat naga!

Kita akan gunakan class File ini. Sebelumnya, kau interogasi dululah API-nya. Ada cukup banyak method, tapi yang paling penting harus kau perhatikan adalah:

def __init__(self, path, defaultType="text/html", ignoredExts=(), registry=None, allowExt=0):

Kau lihat sendiri, argumen yang harus kita masukkan adalah “path”. Itulah argumen yang telah kita masukkan kode web server kita. Argumen yang aku berikan:

/home/haddad/twisted/site

Class ini nantinya sobat, akan melakukan pemetaan (mapping) terhadap request url. Kode:

root = static.File('/home/haddad/twisted/site')

berarti direktori /home/haddad/twisted/site dipetakan ke: localhost/ dan jika didalamnya terdapat file bernama “foo.html” akan dipetakan ke: localhost/foo.html . Jika terdapat direktori didalamnya yang bernama “bar” akan dipetakan ke: localhost/bar/ .

Kode:

root.putChild('cgi-bin', twcgi.CGIDirectory('/home/haddad/twisted/cgibin'))

berarti kau memetakan sebuah direktori ke dalam localhost/. Dalam contoh kita sobat, kita memetakan direktori /home/haddad/twisted/cgibin ke localhost/cgi-bin. Berarti sekarang kita punya web site dengan struktur seperti ini:

localhost/
localhost/cgi-bin/

Dan kau tidak boleh lupa sobat, class twcgi.CGIDirectory yang bertanggung jawab terhadap skrip-skrip CGI. Bagaimana cara kerjanya, kau baca sendiri sajalah dokumentasinya. Jangan jadi pemalas kau ini!

~~~

Bagiku sobat, seperti inilah taknik yang ku gunakan dalam memprogram berbasis framework: kau ingin buat apa? Kau daftar lah semua yang kau butuhkan. Cari komponen yang akan membantumu. Kau siapkan komponen tersebut dan rakitlah menjadi aplikasi yang kau inginkan.

Terima kasih telah membaca artikelku sampai ke bagian ini sobat. Kalau kau suka tinggalkan lah komentar, kalau ada yang salah, tolong kau ingatkan aku. Semoga kau tak bosan mengunjungi blog ini. Sayonara ... Live long and prosper!

0 komentar:

Posting Komentar