Tahun II, Nomor 8, Mei 2000

Membangun Billing System untuk Server Warnet

Home
Halaman Muka

SCILAB sebagai Alternatif Matlab

Menggambar Ilmiah di Linux

Pendahuluan

Edisi yang lalu telah dibahas tentang konfigurasi untuk server internet cafe (warnet). Pengembangan berikutnya seputar server warnet yang dapat dilakukan adalah meminimalkan pekerjaan operator. Server warnet harus dapat bertindak layaknya server wartel (warung telekomunikasi) dimana begitu gagang telepon ditutup, server melakukan pencetakan tagihan.

Sebelum kita mulai mengembangkan billing system untuk warnet, ada beberapa isu atau syarat kelayakan suatu server warnet, baik yang terkait dengan billing system ataupun teknik networking lainnya:

Multiplatform

 Server yang baik sanggup menjadi gateway bagi berbagai platform sehingga memberi kebebasan bagi para pengguna untuk memilih. Kebebasan ini begitu penting mengingat kita tidak bisa memaksakan pelanggan untuk menggunakan platform tertentu.

Thin-Client

 Sedapat mungkin setting-up di sisi client tidak terlalu banyak. Hindari instalasi atau pembuatan program yang sangat spesifik untuk suatu platform, setidaknya itulah langkah awal menuju universalitas. Dari sisi hardware, suatu server yang berisi program billing beserta printer-nya perlu dibackup dengan UPS (uninterrupable power supply). Hal ini untuk mengantisipasi padamnya listrik saat pelanggan sedang menggunakan internet. Dengan demikian tagihan tetap dapat dicetak.

Skenario

Ketika pelanggan datang ke internet cafe dan duduk di depan komputer, dia harus menjalankan script berikut:
$ telnet192.168.1.18000 ,br> 192.168.1.1 adalah IP address server dan 8000 analah nomor port program billing. Demi kemudahan pelanggan, buatkan shorcut untuk script tersebut. Jangan lupa untuk memberikan informasi penggunaannya, misalnya dalam bentuk stiker yang ditempelkan di bingkai monitor, yang bisa jadi bunyinya seperti ini: ``TO START, PLEASE
DOUBLE-CLICK LOGIN ICON''.

Selanjutnya program akan menampilkan pesan (di layar telnet): ``CLOSE YOUR TELNET PROGRAM TO LOGOUT'' atau ``TUTUP PROGRAM TELNET ANDA JIKA SUDAH SELESAI BERINTERNET''. Setelah pesan tersebut, pelanggan tadi secara otomatis dapat menggunakan komputer yang ada di hadapannya untuk surfing ke internet dan mulailah awal pemakaian dicatat. Tanpa proses di atas, komputer yang digunakannya tidak dapat dipakai untuk internet karena ada kontrol dari program ipchains. Setelah pelanggan puas bermain internet atau memang karena uangnya pas untuk sekian jam pemakaian, si pelanggan harus mematikan program telnet tadi, dan secara otomatis terdengar suara printer mencetak tagihan. Informasi yang tertera dalam tagihan adalah: nomor IP komputer yang dipakai, waktu awal dan akhir pemakaian, serta jumlah rupiah yang harus dikeluarkan berdasarkan selisih waktu awal dan akhir tadi. Jangan lupa menyertakan pesan terima kasih serta nama internet cafe Anda.

Dengan demikian, layaknya operator wartel, operator warnet hanya menunggu pelanggan selesai bermain internet, menerima uang pembayaran, serta memberikan uang kembali (kalau perlu).
Lalu, mengapa harus telnet yang dipakai ? Seperti yang diutarakan sebelumnya bahwa program dirancang dengan konsep ``thin-client'', maka diambillah sebuah ``benang merah'' yang berawal dari suatu pertanyaan: program komunikasi apakah yang dimiliki oleh mayoritas platform ? Salah satu jawaban untuk pertanyaan ini adalah telnet.

Teknis Pelaksanaan

Untuk memenuhi skenario di atas, bukanlah suatu hal yang sulit. Dengan Linux semuanya dapat terjawab dan bahannya tersedia di berbagai distribusi seperti SuSE, RedHat, Slackware, dsb.

Kebutuhan Program

Ada beberapa paket atau program yang dibutuhkan untuk program yang dijalankan di server, antara lain:

Python
Program ini ditulis dengan bahasa Python yang dijalankan sebagai daemon (idle di memory) yang menantikan permintaan client di port 8000.

ipchains
Penggunaan ipchains sudah dibahas dalam tulisan di edisi yang lalu. Oleh karena itu penggunaanya mutlak diperlukan jika Anda ingin membangun server warnet, dengan atau tanpa billing system.

dialer
Dialer adalah program untuk proses dial ke ISP (Internet Service Provider). Syarat dari sebuah dialer untuk memenuhi kebutuhan program billing ini adalah sifatnya yang langsung melakukan proses dialing pada saat dipanggil. Contohnya adalah wvdial, seperti yang digunakan dalam dalam program ini. Bagi pengguna RedHat dimana dialing menggunakan script ifup tidak perlu khawatir, karena dalam program ini disertakan contoh pengganti wvdial.

pidof
pidof dipakai untuk mengetahui apakah dialer sudah dipanggil. Pemeriksaan ini untuk menghindari pemanggilan dua kali yang bisa saja terjadi bila dua user login pada saat yang sama.

ifconfig
Dipakai untuk melihat apakah server sudah mendapat IP dari ISP.

netstat
Untuk memantau konektivitas client ke server dengan cara melihat apakah client masih terhubung ke port 8000. Dengan kata lain: apakah program telnetnya masih hidup ?

ping
Sama dengan netstat, juga memantau konektivitas client ke server. Berbeda dengan netstat, jika client hang atau kabel network-nya terputus, secara otomatis prosedur logout untuk client tersebut dijalankan.

lpr
lpr dipakai untuk pencetakan dimana inputnya melalui teknik piping yang diberikan perintah echo.
Untuk client, program yang dibutuhkan adalah hanya telnet.

Menjalankan Program

Jalankan sebagai root script warnetd-simple.py dengan cara:
#pythonwarnetd-simple.py&

Atau jika Anda telah mengubahnya menjadi executable dengan:
#chmod755warnetd-simple.py

maka dapat langsung dijalankan dengan:
#./warnetd-simple.py&

warnetd-simple.py Script berikut juga dapat diambil di 
http://www.rab.co.id/software/produk/warnet/warnetd-simple.py

000|#!/usr/bin/python 
001| 
002|importsocket#Forgethostbyaddr() 
003|importSocketServer 
004|importos 
005|importsys 
006|importstring 
007|importtime 
008| 
009|classServerWARNET(SocketServer.ForkingTCPServer): 
010|defserver_bind(self): 
011|"""Overrideserver_bindtostoretheservername.""" 
012|SocketServer.TCPServer.server_bind(self) 
013|host,port=self.socket.getsockname() 
014|ifnothostorhost=='0.0.0.0': 
015|host=socket.gethostname() 
016|hostname,hostnames,hostaddrs=socket.gethostbyaddr(host) 
017|if'.'notinhostname: 
018|forhostinhostnames: 
019|if'.'inhost: 
020|hostname=host 
021|break 
022| 
023|self.ip=hostaddrs[0] 
024|self.nama=hostname 
025|self.port_squid=3128 
026| 
027|#Hapussemuaperaturanipchains 
028|os.system('ipchains-F') 
029| 
030|#tutupportsquid 
031|os.system('ipchains-Ainput-s192.168.1.0/24-ptcp\ 
032|-jDENY-d%s%s'%(self.ip,self.port_squid)) 
033| 
034|#SuSE 
035|self.dialer="wvdial" 
036|self.KillDialer="killallwvdial" 
037|self.IsDialerOn="pidofwvdial" 
038| 
039|#RedHat 
040|#self.dialer="ifupppp0" 
041|#self.KillDialer="ifdownppp0" 
042|#self.IsDialerOn="pidofpppd" 
043| 
044| 
045|classKendaliWARNET(SocketServer.StreamRequestHandler): 
046|defhandle(self): 
047|ip_client=self.client_address[0] 
048|port_client=self.client_address[1] 
049| 
050|forward_str="ipchains-%%sforward-jMASQ-s%s"%ip_client 
051|squid_str="ipchains-%%sinput-s%s-ptcp-jACCEPT-d%s%s"\ 
052|%(ip_client,self.server.ip,self.server.port_squid) 
053| 
054|self.wfile.write("\n\rHello%s\n\r"%ip_client) 
055|self.wfile.write("Selamatdatangdiserver%s\n\r"%self.server.nama) 
056| 
057|#Apakahdialersudahrunning? 
058|DialerOn=os.system(self.server.IsDialerOn)==0 
059|ifnotDialerOn: 
060|os.system(self.server.dialer) 
061| 
062|#TunggusampaiservermendapatIPdariISP 
063|self.wfile.write("\n\rTunggusampaimodemtersambungkeISP") 
064|whileos.system("ifconfig|grepppp0")>0: 
065|pass 
066| 
067|#Penggunaanipchainsberikutmungkinmembuatandaperlu 
068|#menjalankanserverinisebagairoot 
069|os.system(forward_str%"A") 
070|os.system(squid_str%"I") 
071| 
072|self.wfile.write("\rSilahkanber-internet.TutupprogramTELNET\ 
073|Andajikasudahselesai.") 
074| 
075|awal=time.time() 
076| 
077|#Logoutjikakoneksiterputus 
078|logout=0 
079|whilenotlogout: 
080|#pantaukonektivitasport 
081|logout=os.system('netstat-n|grepESTABLISH|\ 
082|grep"%s:%s"'%(ip_client,port_client))<>0 
083|ifnotlogout: 
084|#pantaukonektivitasjaringan 
085|logout=os.system('ping-c1%s|grep"1packetsreceived"'%\ 
086|ip_client)<>0 
087| 
088|akhir=time.time() 
089| 
090|t=time.localtime(awal) 
091|s_awal="%d-%d-%d%d:%d:%d"%(t[2],t[1],t[0],t[3],t[4],t[5]) 
092|t=time.localtime(akhir) 
093|s_akhir="%d-%d-%d%d:%d:%d"%(t[2],t[1],t[0],t[3],t[4],t[5]) 
094| 
095|#Rp5000/jam 
096|rp=int(5000*(akhir-awal)/3600) 
097| 
098|cetak="No.Komputer:%s\nAwal:%s\nAkhir:\ 
099|%s\nBiaya(Rp):%s"\ 
100|%(ip_client,s_awal,s_akhir,rp) 
101| 
102|os.system('echo"%s"|lpr'%cetak) 
103| 
104|#Cabuthakakses 
105|os.system(forward_str%"D") 
106|os.system(squid_str%"D") 
107| 
108|#Disconnectdialerjikatidakadayanglogin 
109|AdaYgLogin=os.system("ipchains-L|grep-nMASQ")==0 
110|ifnotAdaYgLogin: 
111|os.system(self.server.KillDialer) 
112| 
113|return 
114| 
115| 
116|#Blokutama 
117| 
118|ifsys.argv[1:]: 
119|port=string.atoi(sys.argv[1]) 
120|else: 121|port=8000 
122| 
123|AlamatServer=('',port) 
124| 
125|warnetd=ServerWARNET(AlamatServer,KendaliWARNET) 
126| 
127|print"LayananWARNETpadaport",port,"..." 
128|warnetd.serve_forever()

Referensi

  1. Sugiana, Owo, Internet Cafe, Majalah Elektro, Jakarta, 2000
  2. Lutz, Mark, Programming Python, O'Reilly, CA, USA, 1996
Owo Sugiana : sugiana@rab.co.id


| SCILAB sebagai Alternatif Matlab | Menggambar Ilmiah di Linux |

Email : jakarta@jakarta.linux.or.id


| Home | Halaman Muka
 © 1999-2000 ELEKTRO Online
All Rights Reserved.
Last modified on :