Open Source "Billing Warung Internet/Rental Komputer" (bukan LTSP)

irigster

New member
Open Source "Billing Warung Internet/Rental Komputer" (bukan LTSP)
Date: Saturday, October 01, 2005 Hits: 17437 By: Iko Riyadi
Di era keterbukaan yang serba sulit dan susah ini, dibutuhkan alternatif software komputer bebas yang murah meriah dan terbuka source kodenya. Kenapa mesti terbuka source code-nya ? Karena dengan terbukanya source code-nya, kita punya akses langsung ke kode sumber dan berhak untuk mengubah dan atau mengembangkan software tersebut.

Pada kesempatan ini, penulis mencoba memberikan alternatif tersebut. Berikut ini adalah software billing warung internet atau rental komputer. Memang telah banyak software ? software serupa yang bertebaran di internet, tetapi software serupa rasanya kurang memenuhi kebutuhan penulis. Penulis memerlukan software billing yang ringan, cepat, dan powerful untuk digunakan bahkan di komputer yang spesifikasinya rendah sekalipun.
Maka dari itu penulis mencoba untuk menyusun baris-baris kode program kecil yang berjalan di atas sistem operasi Linux, tapi tidak menutup kemungkinan bisa berjalan di atas sistem operasi yang lain. Kok bisa ? Bisa saja, karena penulis menggunakan PERL (Practical Extraction and Report Language) sebagai bahasa pemrogramannya. Perl secara native terinstall di sistem berbasis Linux, tetapi sudah ada beberapa usaha mem-porting perl agar dapat digunakan di sistem operasi lain. Misalnya ActiveStatePerl adalah perl versi Windows yang dibuat oleh ActiveState (www.activestate.com).

Program ini merupakan program klien-server sederhana yang menggunakan modul Perl Tk, Time::HiRes, IO::Socket::INET, Net::hostent, dan Curses. Agar lebih fleksibel, untuk bagian klien, penulis membaginya menjadi 3 bagian, berturut-turut adalah klienkonsolebilling.0.3.pl, kliennetbilling.0.3.pl dan klienbilling.0.3.pl.
Bagian pertama berfungsi untuk mendapatkan waktu pada saat user memulai sessionnya, menghitung interval atau durasi user, menghitung ongkos yang harus dibayar user dan kemudian menuliskannya ke satu file log. Bagian ke dua berfungsi untuk mengambil isi file log dari bagian pertama, mengacak isinya, kemudian mengirimkan hasil acak tersebut sebagai satu pesan ke server.

Bagian ke tiga berfungsi untuk mengambil isi file log dari bagian pertama, menampilkan hasilnya ke sebuah graphical user interface yang lumayan enak dilihat.
Untuk menjalankan tiga file klien tersebut, digunakan satu skrip perl kecil yang bernama ikoklienbilling.0.3.pl, yang bisa dijalankan pada saat X server dijalankan.
Sedangkan file server bernama server.0.3.pl, yang berfungsi untuk mendaftar ip klien, menampilkan daftar tersebut ke layar monitor, menanti pesan yang datang dari klien, menerima pesan tersebut jika ada klien yang hidup, menyusun pesan yang telah diacak oleh klien tadi, kemudian baru menampilkannya ke layar monitor untuk tiap-tiap klien yang hidup.

Mengapa pesan yang dikirimkan oleh klien perlu diacak ? Karena penulis merasa perlu untuk menerapkan salah satu konsep keamanan di jaringan, bahwa data yang tidak diacak yang bersliweran di jaringan atau lebih sering disebut dengan cleartext/plaintext akan dapat dibaca oleh siapa saja. Tentu saja tindakan mengacak pesan tersebut harus diikuti dengan tindakan mengamankan kode sumber dari skrip-skrip perl billing kita tadi, agar dapat dibaca dan ditulisi oleh orang tertentu saja (root), tidak setiap orang (user) diperbolehkan membaca bagian enkrip dan dekrip-nya. Lebih bijaksana juga jika anda mengubah kuncinya secara berkala.
Berikut ini adalah kode sumber masing-masing program disertai penjelasannya.

*******awal klienkonsolebilling.0.3*******************

#!/usr/bin/perl
# klienkonsolebilling.0.3
# Copyright (c) Aug 2005 Iko Riyadi <iko_riyadi@yahoo.com>.
# GPL.


use Time::HiRes qw( gettimeofday tv_interval time ) ;

@bulan=("Januari","Februari","Maret",
"April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember");
@hari=("Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu");

$|=1;
$LOG="/tmp/iko_semeru.log";
$t0 = [gettimeofday];

@waktu=localtime(time);
$kode_hari=$waktu[6];
$tahun=$waktu[5]+1900;
$waqtu="Mulai => $hari[$kode_hari] $waktu[3] $bulan[$waktu[4]] $tahun jam $waktu[2]:$waktu[1]:$waktu[0]\n";

print $waqtu;

$duit=0;

# 60 menit = 1000 rupiah
$tarip = 1000;

while (1) {
@waktu=localtime(time);
$elapsed = tv_interval ( $t0, [gettimeofday]);
$menit =int ($elapsed/60);
print "Durasi = $elapsed detik = $menit menit\n";
$duit=(($menit/60)*1000) ;
if ($duit<$tarip) {$duit=$tarip}
elsif ($duit>=$tarip) {
$tarip_baru=$tarip+1000;
$tarip=$tarip_baru;
$duit=$tarip;
};
print "Bayar = $duit rupiah\n";
&printlog ("$hari[$kode_hari] $waktu[3] $bulan[$waktu[4]] $tahun\:\:$waktu[2]:$waktu[1]:$waktu[0]\:\:$menit\:\:$duit\:\:$waqtu\:\:\n");
print "==============\n";
sleep 3;
}

####end

sub printlog {
open(lo,">$LOG");
print lo @_;
close(lo);
return;
}
*****akhir klienkonsolebilling.0.3*********************

**********awal kliennetbilling.0.3******************
#!/usr/bin/perl
# kliennetbilling.0.3
# Copyright (c) Aug 2005 Iko Riyadi <iko_riyadi@yahoo.com>.
# GPL.

# Client Program
use IO::Socket::INET;

$|=1;
$PHILE="/tmp/iko_semeru.log";

print ">> Client Program <<";

# Create a new socket
$MySocket=new IO::Socket::INET->new(PeerAddr=>'192.168.1.4',
PeerPort=>5500,
Proto=>'udp'
);

while(1)
{
&buka;

$menit=$fh[2];$biaya=$fh[3];
#$hariini=$fh[0];$jamini=$fh[1];
$mulaimain=$fh[4];
$msg="Durasi : $menit menit; Ongkos : $biaya rupiah; $mulaimain";
# Acak...acak...acak... :)
#
$msg=~tr/ABCDEFGHIJKLMNOPQRSTUVWXYZ/VBNMLPOIUYTREWQASDFGHJKZXC/;
$msg=~tr/abcdefghijklmnopqrstuvwxyz/dfghjklpoiuytrewqasbvcnmzx/;
$msg=~tr/0123456789/5826479310/;
$msg=~tr/:;/?!/;

if($msg ne '')
{
print "\nSending message '",$msg,"'";
if($MySocket->send($msg))
{
print ".....<done>","\n";
#print $def_msg;
}
}
else
{
# Send an empty message to server and exit
$MySocket->send('');
exit 1;
}

$MySocket->recv($text,128);
print "$text";
sleep 10;
}


sub buka {
open(FH, $PHILE) || die("Cannot open the file");
$asli=<FH>;
@fh=split ("::",$asli);
close(FH);
}
**********akhir kliennetbilling.0.3******************

*********awal klienbilling.0.3*********************
#!/usr/bin/perl -w
# klienbilling.0.3
# Copyright (c) Aug 2005 Iko Riyadi <iko_riyadi@yahoo.com>.
# GPL.

use Tk;

$|=1;
$PHILE="/tmp/iko_semeru.log";
$NAME="IKO's LINUX WARNET\nKLIEN BILLING SYSTEM";
$VERSION="Versi 0.3";
$COPYRIGHT="Copyright (c) Iko Riyadi,\nAug 2005. GPL.";

my $Main = MainWindow->new();
$Main->configure(-title=>'Klien Semeru Rental KOMPUTER');
$Main->geometry('+0+0');
$Main->minsize(qw(330 200));
$Main->maxsize(qw(330 200));

sub buka {
open(FH, $PHILE) || die("Cannot open the file");
$asli=<FH>;
@fh=split ("::",$asli);
close(FH);
}

sub show_messageBox {
#my($iconvar, $typevar) = @_;
my $button = $Main->messageBox('-icon' => 'warning', -type => 'OK',
-title => 'Peringatan',
-message => "Maaf, kotak ini tidak bisa ditutup !");
} # end show_messageBox

###untuk mencegah tutup window atau ALT+F4
sub my_exit_handler
{
&show_messageBox;
}

$Main->protocol('WM_DELETE_WINDOW',\&my_exit_handler);
###end pencegahan
&buka;
$menit=$fh[2];$biaya=$fh[3];
$hariini=$fh[0];$jamini=$fh[1];$mulaimain=$fh[4];

tanda :
my $box3 = $Main->Label(-text => "jam sekarang :\n$jamini",
-borderwidth => 1,
-relief => "raised");
my $box4 = $Main->Button
(-text=>'Update',-background=>'pink',
-foreground=>'black',
-command=>sub{
&buka;$menit=$fh[2];$biaya=$fh[3];
$hariini=$fh[0];$jamini=$fh[1];$mulaimain=$fh[4];
#print "juga $hariini & $jamini\n";print "tes $menit & $biaya\n";
goto tanda})->pack;
my $box1 = $Main->Label(-text => $mulaimain,
-borderwidth => 1, -relief => "raised",
-background=>'yellow',-foreground=>'red');
my $box2 = $Main->Label(-text => "Durasi : $menit menit\nTarif : $biaya rupiah",
-borderwidth => 1,
-relief => "raised");
$Main -> Photo('img',
-file => "/home/semeru4/dokumenku/proyekpl/iseng/republic_perl.xpm",
-height=>100,-width=>100) ;
my $box5 = $Main->Label('-image' => 'img',
-borderwidth => 1, -relief => "raised",
-background=>'white'
)->pack;
my $box6 = $Main->Label(-text => "$NAME\n$VERSION\n$COPYRIGHT",
-borderwidth => 1, -relief => "raised",
-background=>'white',-foreground=>'red');

$box1->form(-top => '%0', -left => '%0', -right => '%100');
$box2->form(-top => $box1, -left => '%0', -right => '%60', -bottom =>
$box4);
$box3->form(-top => $box1, -left => $box2, -right => '%100', -bottom =>
$box4);
$box4->form(-left => '%0', -right => '%100', -bottom => $box5);
$box5->form(-left => '%0', -right => '%40', -bottom => '%100');
$box6->form(-top => $box4, -left => $box5, -right => '%100', -bottom => '%100');

MainLoop;
*********akhir klienbilling.0.3*********************

********awal ikoklienbilling.0.3***********************
#!/usr/bin/perl -w
# ikoklienbilling.0.3
# Copyright (c) Aug 2005 Iko Riyadi <iko_riyadi@yahoo.com>.
# GPL.

`klienkonsolebilling.0.3.pl & kliennetbilling.0.3.pl & klienbilling.0.3.pl`;

#end
********akhir ikoklienbilling.0.3***********************


*******awal server.0.3.pl*******************

#!/usr/bin/perl
# serverbillingiko.0.3
# Copyright (c) Aug 2005 Iko Riyadi <iko_riyadi@yahoo.com>.
# GPL.

use IO::Socket::INET;
use Net::hostent;
use Curses;

$|=1;
$NAME="IKO's LINUX WARNET SERVER BILLING SYSTEM";
$VERSION="0.3";
$COPYRIGHT="(c) Iko Riyadi, Aug 2005. GPL.";

# Dibatasi hanya 6 komputer klien
$KOMPUTER_01="192.168.1.1";
$KOMPUTER_02="192.168.1.2";
$KOMPUTER_03="192.168.1.3";
$KOMPUTER_04="192.168.1.4";
$KOMPUTER_05="192.168.1.5";
$KOMPUTER_06="192.168.1.252";

%daftar_ip=("","");

$win = new Curses;
$win->addstr(0, 10, ">> Server Program <<");
$win->addstr(1, 5, "[Server $0 is running]");
$win->addstr(20, 1, "$NAME");
$win->addstr(21, 1, "Versi $VERSION");
$win->addstr(22, 1, "Copyright $COPYRIGHT");
$win->addstr(3, 0, "KOMPUTER KLIEN 1");
$win->addstr(3, 48, "KOMPUTER KLIEN 2");
$win->addstr(8, 0, "KOMPUTER KLIEN 3");
$win->addstr(8, 48, "KOMPUTER KLIEN 4");
$win->addstr(13, 0, "KOMPUTER KLIEN 5");
$win->addstr(13, 48, "KOMPUTER KLIEN 6");
$win->addstr(3, 47, "|");
$win->addstr(4, 47, "|");
$win->addstr(5, 47, "|");
$win->addstr(6, 47, "|");

$win->addstr(8, 47, "|");
$win->addstr(9, 47, "|");
$win->addstr(10, 47, "|");
$win->addstr(11, 47, "|");

$win->addstr(13, 47, "|");
$win->addstr(14, 47, "|");
$win->addstr(15, 47, "|");
$win->addstr(16, 47, "|");

$win->addstr(2, 0, "-----------------------------------------------+--------------------------------------------");
$win->addstr(7, 0, "-----------------------------------------------+--------------------------------------------");
$win->addstr(12, 0, "-----------------------------------------------+--------------------------------------------");
$win->addstr(17, 0, "-----------------------------------------------+--------------------------------------------");
$win->refresh;

# Create a new socket
$MySocket=new IO::Socket::INET->new(LocalAddr => '192.168.1.4',
LocalPort=>5500,
Proto=>'udp'
);

$MySocketClient=new IO::Socket::INET->new(PeerAddr => '192.168.1.5',
PeerPort=>$portclient,
Proto=>'udp'
);

# Keep receiving messages from client
while(1)
{
$MySocket->recv($text,128);

# teks acak disusun kembali
$text=~tr/VBNMLPOIUYTREWQASDFGHJKZXC/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;
$text=~tr/dfghjklpoiuytrewqasbvcnmzx/abcdefghijklmnopqrstuvwxyz/;
$text=~tr/5826479310/0123456789/;
$text=~tr/?!/:;/;

$hasil=$text=~/(Durasi \: (.+) menit)\; (Ongkos \: (.+) rupiah)\; (.+)/;
if ($hasil) {
$durasi=$1;
$ongkos=$3;
$mulai=$5;
} else {
$durasi="eror Durasi";
$ongkos="eror Ongkos";
$mulai="eror Mulai";
}

$ipclient=$MySocket->peerhost();
$portclient=$MySocket->peerport();

if ($MySocketClient) {
$win->addstr(24, 1, "Connected Client!");
$win->refresh;
#$MySocketClient->connect("Tes dari server\n",128,"$ipclient:$portclient");
#$MySocketClient->send("Tes dari server\n",128,"$ipclient:$portclient");
}
#$win->addstr(25, 1, $portclient);
#$win->refresh;

$h = gethost($ipclient);
$namaklien=$h->name;
if (!(exists($daftar_ip{$ipclient}))) {
$daftar_ip{$ipclient}=$namaklien;
}

if ($ipclient eq $KOMPUTER_01)
{
$win->addstr(3, 0, "# Konek dari $namaklien ($ipclient)");
$win->addstr(4, 0, "# $durasi");
$win->addstr(5, 0, "# $ongkos");
$win->addstr(6, 0, "# $mulai");
$win->refresh;
}

elsif ($ipclient eq $KOMPUTER_02)
{
$win->addstr(3, 48, "# Konek dari $namaklien ($ipclient)");
$win->addstr(4, 48, "# $durasi");
$win->addstr(5, 48, "# $ongkos");
$win->addstr(6, 48, "# $mulai");
$win->refresh;
}

elsif ($ipclient eq $KOMPUTER_03)
{
$win->addstr(8, 0, "# Konek dari $namaklien ($ipclient)");
$win->addstr(9, 0, "# $durasi");
$win->addstr(10, 0, "# $ongkos");
$win->addstr(11, 0, "# $mulai");
$win->refresh;
}

elsif ($ipclient eq $KOMPUTER_04)
{
$win->addstr(8, 48, "# Konek dari $namaklien ($ipclient)");
$win->addstr(9, 48, "# $durasi");
$win->addstr(10, 48, "# $ongkos");
$win->addstr(11, 48, "# $mulai");
$win->refresh;
}

elsif ($ipclient eq $KOMPUTER_05)
{
$win->addstr(13, 0, "# Konek dari $namaklien ($ipclient)");
$win->addstr(14, 0, "# $durasi");
$win->addstr(15, 0, "# $ongkos");
$win->addstr(16, 0, "# $mulai");
$win->refresh;
}

elsif ($ipclient eq $KOMPUTER_06)
{
$win->addstr(13, 48, "# Konek dari $namaklien ($ipclient)");
$win->addstr(14, 48, "# $durasi");
$win->addstr(15, 48, "# $ongkos");
$win->addstr(16, 48, "# $mulai");
$win->refresh;
}
}
*******akhir server.0.3.pl*******************



Hal-hal yang perlu diperhatikan diantaranya adalah:
- Program ini dibuat dengan asumsi bahwa komputer klien harus menjalankan X Server dan desktop manager, sedangkan komputer server bisa di terminal biasa saja
- Mengedit file /etc/hosts, tambahkan entry host klien, contoh :
192.168.1.4 semeru04.server semeru04
127.0.0.1 localhost.localdomain localhost
192.168.1.1 semeru01.klien semeru01
192.168.1.2 semeru02.klien semeru02
192.168.1.3 semeru03.klien semeru03
192.168.1.5 semeru05.klien semeru05
192.168.1.251 neo01.ltsp neo01
192.168.1.252 neo02.ltsp neo02
- Program server dijalankan di x terminal atau konsole dengan panjang dan lebar yang cukup, sehingga karakter yang ditampilkan tidak saling tumpang tindih, misalnya anda bisa memakai contoh berikut (harus sebaris ke samping, tidak boleh putus) :
gnome-terminal -e /home/semeru4/dokumenku/proyekpl/iseng/server.0.3.pl --geometry=95x28+2+2 &
- Di sisi klien, user harus menekan tombol update untuk memperbarui tampilan data ongkos dan durasi sessionnya (sebenarnya proses counting berjalan terus, tapi untuk tampilan user interface klien harus di-update secara manual)
- Taruhlah ikoklienbilling.0.3.pl di folder /etc/X11/xinit.d dan pastikan file tersebut dapat dieksekusi (chmod +x ikoklienbilling.0.3.pl) di sisi klien
- Taruhlah file klienkonsolebilling.0.3.pl, kliennetbilling.0.3.pl, dan klienbilling.0.3.pl ke folder /usr/local/bin dan pastikan file-file tersebut dapat dieksekusi di sisi klien
- Program server di sisi server dapat anda jalankan kapan saja, bahkan jika klien sudah lama login pun, atau komputer server tiba-tiba mati, program server masih tetap bisa dijalankan saat dihidupkan kembali
- Program klienbilling.0.3.pl tidak bisa ditutup, jika ditutup akan menampilkan pesan peringatan kepada user
- Jika komputer klien tiba-tiba mati, anda bisa melihat log terakhir di file /tmp/iko_semeru.log di komputer klien

Hal-hal yang rencananya akan penulis terapkan di antaranya :
- Log server ditulis ke sebuah file atau ditulis ke database MySQL
- Menerapkan sistem member & discount
- Menerapkan laporan harian, mingguan dan bulanan di server
- Menerapkan billing sistem ini ke jaringan berbasis LTSP (dengan sistem logging yang tentunya berbeda => local user session)
- Mempercantik user interface milik klien dan server
- Menerapkan sistem lock terpusat dari server di klien (semacam xlock) sehingga untuk user yang belum login tidak akan bisa menggunakan desktop klien

Akhir kata, masih banyak kekurangan yang ada di billing sistem ini, karena ini masih versi awal, penulis ingin menunjukkan bahwa banyak hal yang bisa dilakukan di dunia Linux. Penulis berharap akan banyak masukan dari para insan IT di seluruh Indonesia.
Catatan : screenshot dan file-file yang behubungan dengan program billing ini dapat anda temukan di www.geocities.com/iko94/billing.

REFERENCES :
1. Perl Programmers Reference Guide (perl manual)
2. Socket Programming in Perl <premshree.resource-locator.com>
3. Open Source Institute <www.osix.net/modules/article/topic.php?id=8>

THX TO :
1. G O D
2. My Lovely WIFE
3. GNU Team, Mandrake, Linus Torvalds & Larry Wall
4. qq & tiyox
5. 1st team (boeboe yg jomblo & alphret)
6. neoteker team (kendi, zacka, geo)

MEREK DAGANG :
Seluruh merek dagang yang digunakan dalam artikel ini merupakan hak cipta dari pemegang merek dagang masing-masing. Linux merupakan trade mark dari Linus Torvalds. Linux di sini adalah singkatan dari GNU/Linux.

KONTAK :
1. iko_riyadi@yahoo.com
2. www.geocities.com/iko94/billing
3. Neoteker :: Better Concept Of Learning
Source: JASAKOM Information Center
 
Back
Top