1 Insmod Insmod-insmod yang Serakah Pernah mencoba untuk memasukkan semua modul kernel yang tersedia? Belum? Ingin mencoba? Kita akan membuat program ...
Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
Insmod
Insmod-insmod yang Serakah Pernah mencoba untuk memasukkan semua modul kernel yang tersedia? Belum? Ingin mencoba? Kita akan membuat program serakah yang akan mencoba untuk memasukkan semua modul ke dalam kernel.
K
ompilasi kernel yang baik untuk digunakan di desktop seharusnya turut melibatkan modul kernel agar kernel sendiri tidak menjadi terlalu besar. Selain itu, rasa-rasanya tidak perlu membangun satu kernel besar dengan segala fasilitas termasuk di dalamnya. Membangun kernel yang terlalu minimal juga akan cukup merepotkan, terutama apabila kita mengganti peripheral tertentu. Beberapa waktu yang lalu, ketika penulis baru saja berkenalan dengan modul kernel, pertanyaan-pertanyaan seputar modul sempat terlintas. Apakah mungkin memasukkan semua modul yang kita compile ke dalam kernel? Apakah yang terjadi setelah itu? Apakah komputer dapat menjadi hang? Apakah komputer akan menjadi lambat? Dan masih banyak apakah-apakah yang lain. Seiring dengan berjalannya waktu dan kebutuhan lain yang jauh lebih mendesak, akhirnya pertanyaanpertanyaan itu pun terlupakan begitu saja. Namun, kenapa tidak mencobanya? Secara teori, tentunya tidak mungkin memasukkan semua modul ke dalam kernel. Tapi, seberapa banyakkah yang dapat dimasukkan dan apakah yang akan terjadi, sepertinya menarik untuk diperhatikan. Mendukung era Linux yang user friendly, walaupun program yang akan kita buat tidak memiliki nilai fungsionalitas yang tinggi, kita dapat membuatnya dalam interface yang ramah. Bahkan, karena proses memasukkan semua modul berlangsung cukup lama, kita bisa menampilkannya dalam interface yang sangat informatif. Program yang kita bangun akan
memanfaatkan bash, dialog, dan program tput.
1. Fitur program Apakah yang dapat program kita lakukan? Yang pertama-tama, begitu pengguna menjalankannya, kita akan menampilkan sebuah dialog yang berfungsi sebagai konfirmasi. Kita juga bisa menampilkan peringatan dan pengguna akan diberikan kesempatan untuk membatalkan. Andaikata pengguna memilih menjalankan program ini, maka kita bisa segera menampilkan informasi tentang modul apa saja yang akan dimasukkan ke kernel, persentase secara keseluruhan, modul yang telah diuji, sisa modul yang akan diuji, modul yang berhasil dimasukkan, dan modul yang gagal dimasukkan. Semua akan ditampilkan dalam interface yang menarik. Terakhir, pengguna akan disuguhi dialog informatif tentang jumlah modul yang berhasil dimasukkan dan modul yang gagal dimasukkan. Satu hal lagi, segala percobaan pada program ini adalah percobaan untuk menguji apakah suatu modul dapat dimasukkan ke dalam kernel atau tidak. Menggunakan opsi -n pada insmod, kita akan menguji apakah suatu modul dapat dimasukkan atau tidak. Dengan kata lain, you can try it at home. Program ini akan kita beri nama greedy_insmod, karena sifatnya yang begitu serakah.
2. Variabel-variabel penting Pertama-tama, kita akan mendefinisikan beberapa variabel penting mulai dari informasi hak cipta, versi, dan lisensi.
www.infolinux.web.id
VERSION=0.1a COPYRIGHT=”(c) Noprianto, June 2003. GPL” Setelah itu, kita akan membuat beberapa variabel penting seputar versi kernel dan direktori modul kernel. KERNEL_VERSION=$(uname -r) KERNEL_MODULES_DIR=/lib/modules/ $KERNEL_VERSION/kernel/ FAILS=0 OKS=0 Variabel FAILS dan OKS masingmasing dimaksudkan untuk mencatat jumlah modul yang gagal dan berhasil dimasukkan. Untuk memperindah program dialog, kita membuat alias agar program yang kita memiliki tampilan yang seragam. alias dialog=”dialog —backtitle ‘Greedy kernel module installer v$VERSION ($KERNEL_VERSION)’”
3. Program utama Program yang akan kita bangun kali ini tidaklah panjang. Program ini bahkan tidak perlu untuk mendefinisikan fungsi baru. Pertama-tama yang harus dilakukan pada program utama adalah menampilkan sebuah dialog dimana pengguna dapat memilih tombol Yes atau No. Apabila pengguna memilih untuk menekan tombol No, maka program segera diterminasi. Apabila pengguna menekan tombol Yes, maka cerita pun dimulai. Pertamatama, kita perlu untuk membersihkan seluruh layar kita. Pembersihan layar dapat dilakukan dengan perintah berikut: tput reset Selanjutnya, kita akan menghitung jumlah modul keseluruhan yang terdapat di sistem. Berikut adalah cara mendapatkannya: MODULES_COUNT=$(modprobe -l | wc -l) Setelah itu, sebuah perulangan for akan dilakukan untuk mencoba memasukkan semua modul ke dalam kernel. Dalam perulangan tersebut, kita akan memenggal ekstensi dari nama file module. Kemudian kita juga perlu untuk menghitung persentasi keseluruhan.
INFOLINUX AGUSTUS 2003
49
TUTORIAL
Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
Insmod
Tidak lupa kita mencoba memasukkan modul ke dalam kernel dan menguji hasilnya, sehingga kita dapat menampilkan jumlah kegagalan dan keberhasilan. for module in $(modprobe -l) do bare_module=‘basename $module | awk -F. ‘{print $1}’‘ percent=‘echo $i*100/ $MODULES_COUNT | bc‘ tput cup 1 0 echo -n “installing module $bare_module “ tput cup 1 55 insmod -n $bare_module 1>/dev/null 2>&1 if [ $? -eq 0 ] then OKS=‘expr $OKS + 1‘ echo “[OK] “ else FAILS=‘expr $FAILS + 1‘ echo “[Failed] “ fi tput cup 2 0 echo “[overall $percent%] [$i tested] [`expr $MODULES_COUNT - $i` to go ] [$OKS inserted] [$FAILS failed]” i=‘expr $i + 1‘ done Baris berikut ini digunakan untuk memenggal ekstensi dari nama file modul: bare_module=‘basename $module | awk -F. ‘{print $1}’‘ Sementara baris berikut ini dimaksudkan untuk mendapatkan persentase kesuluruhan: percent=‘echo $i*100/ $MODULES_COUNT | bc‘ Untuk menghitung, kita menggunakan program bc. Setelah itu, kita akan menampilkannya dalam posisi tertentu. Untuk itu, kita perlu menggunakan program tput. Hal ini semata-mata untuk keindahan program. tput cup 1 0 Blok berikut ini dimaksudkan untuk mencoba memasukkan modul ke dalam
50
INFOLINUX AGUSTUS 2003
kernel dan menguji keberhasilannya. Bagi Anda yang nekad, hapuslah opsi -n pada insmod berikut dan insmod benar-benar akan mencoba memasukkan modul ke dalam kernel. Pada komputer yang penulis gunakan untuk menulis artikel ini, hang terjadi beberapa kali dan cukup mengganggu. Dan terpaksa, komputer pun harus di-restart. insmod -n $bare_module 1>/dev/null 2>&1 if [ $? -eq 0 ] then OKS=‘expr $OKS + 1‘ echo “[OK] “ else FAILS=‘expr $FAILS + 1‘ echo “[Failed] “ fi Tak lupa kita menampilkan informasi selengkap mungkin dengan kode berikut ini: tput cup 2 0 echo “[overall $percent%] [$i tested] [`expr $MODULES_COUNT - $i` to go ] [$OKS inserted] [$FAILS failed]” Setelah perulangan tersebut selesai dilakukan, kita akan menampilkan jumlah modul yang berhasil dan gagal dimasukkan. Untuk memperindah tampilan, kita menggunakan program dialog. dialog —msgbox “done GreedyMan, we have $OKS inserted to kernel, and $FAILS failed “ 10 40 Dan selesailah sudah. Berikut ini adalah kode selengkapnya: #!/bin/sh VERSION=0.1a COPYRIGHT=”(c) Noprianto, June 2003. GPL” KERNEL_VERSION=$(uname -r) KERNEL_MODULES_DIR=/lib/modules/ $KERNEL_VERSION/kernel/ FAILS=0 OKS=0 alias dialog=”dialog —backtitle ‘Greedy kernel module installer v$VERSION
www.infolinux.web.id
($KERNEL_VERSION)’”
dialog —yesno “Sure to do greedy insmod ? It will make your system unstable” 10 40 if [ $? -ne 0 ] then exit 1 else i=0 tput reset MODULES_COUNT=$(modprobe -l | wc -l) for module in $(modprobe -l) do bare_module=‘basename $module | awk -F. ‘{print $1}’‘ percent=‘echo $i*100/ $MODULES_COUNT | bc‘ tput cup 1 0 echo -n “installing module $bare_module “ tput cup 1 55 insmod -n $bare_module 1>/dev/null 2>&1 if [ $? -eq 0 ] then OKS=‘expr $OKS + 1‘ echo “[OK] “ else FAILS=‘expr $FAILS + 1‘ echo “[Failed] “ fi tput cup 2 0 echo “[overall $percent%] [$i tested] [`expr $MODULES_COUNT - $i` to go ] [$OKS inserted] [$FAILS failed]” i=‘expr $i + 1‘ done dialog —msgbox “done GreedyMan, we have $OKS inserted to kernel, and $FAILS failed “ 10 40 fi Demikianlah perkenalan kita dengan program yang serakah. Sampai saat ini, walaupun secara fungsi tidak bernilai tinggi, paling tidak penulis menjadi tahu bagaimana cara untuk menulis dalam suatu lokasi tertentu. Noprianto ([email protected])
Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
TUTORIAL
IKLAN
www.infolinux.web.id
INFOLINUX AGUSTUS 2003
51
TUTORIAL
Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
Zope
Membuat Produk Zope Sendiri Belum ada produk Zope yang dapat memenuhi kebutuhan Anda? Tertantang untuk membuat sendiri?
Z
ope adalah framework pembuatan aplikasi web yang sangat besar dan luar biasa. Dengan Zope, banyak produk yang telah dibangun untuk mempermudah pembuatan aplikasi web yang luar biasa. Contoh produk Zope yang dapat digunakan untuk pembuatan aplikasi web adalah DTML dan ZPT. Dengan produk-produk tersebut, aplikasi-aplikasi web nan indah dan skalabel siap untuk lahir dari tangan Anda. Saat ini, apabila Anda melakukan instalasi Zope default, Anda telah dilengkapi dengan belasan produk siap pakai. DTML, ZPT, dan Python Script mungkin adalah contoh-contoh produk luar biasa, yang dapat digunakan untuk membangun aplikasi web. Dengan menggunakan DTML atau ZPT saja, dan dilengkapi dengan Python Script untuk menangani pemrosesan data, Anda dapat membangun aplikasi dengan cepat dan mudah. Kemudian, apabila Anda memerlukan aplikasi content management system (CMS), produk CMF dapat langsung Anda gunakan. Ada lagi Plone, juga sebuah CMS, namun datang dengan tampilan yang indah luar biasa. Dan masih terdapat sangat banyak produk Zope lainnya. Di situs Zope, kita dapat menemukan ratusan produk Zope siap pakai, mulai yang sederhana sampai yang siap digunakan untuk lingkungan produktif. Katakanlah, Anda adalah pemilik koran online. Kebutuhan utama Anda secara sederhana mungkin hanyalah menampilkan berita-berita yang telah dibagi dalam kategori-kategori tertentu. Dan secara sederhana pula, setiap wartawan Anda dapat langsung memasukkan berita tanpa melalui aneka sistem workflow yang rumit. Sederhana
52
INFOLINUX AGUSTUS 2003
memang. Untuk kebutuhan seperti itu, Anda dapat menggunakan CMF ataupun Plone. Tapi kedua produk Zope tersebut bukanlah produk yang sederhana. Mereka adalah produk yang kompleks. Dan Anda tidak butuh produk sekompleks itu. Anda butuh yang sederhana. Dengan Zope, Anda dapat membuatnya! Produk Zope sendiri dapat dianalogikan seperti halnya sistem plugin pada web browser kita. Web browser adalah aplikasi utama dengan fungsi yang telah jelas dan plug-in hanyalah sebagai pelengkap dengan fungsi yang juga spesifik. Bedanya dengan Zope, alih-alih menemukan sebuah aplikasi utama, kita hanya akan menemukan sebuah framework. Framework tersebut dilengkapi dengan berbagai ‘plug-in’ yang lebih dikenal sebagai produk. Produk Zope sendiri, seperti telah disebutkan sebelumnya, dapatlah sangat sederhana. Dapat pula menjadi begitu kompleks. Tentu saja tidak bijak apabila kita hantam kromo untuk membangun produk Zope tanpa melihat apakah produk yang tersedia saat ini telah mampu memenuhi kebutuhan kita, atau paling tidak, memenuhi sebagian kebutuhan kita. Dengan koleksi ratusan produk, mungkin salah satunya dapat dikembangkan lebih lanjut. Dan untuk itu, kita perlu mengetahui cara-cara pembuatan produk. Artikel ini akan membahas bagaimana kita membangun produk yang sederhana namun dapat digunakan. Tampilan produk yang kita buat pun akan tampak seprofesional produk-produk Zope lainnya. Mari sambut produk Hello World! Sebelum kita memulai, ada baiknya bagi kita untuk memahami penggunaan
www.infolinux.web.id
Python terlebih dahulu. Ya, pemahaman dasar-dasar Python adalah mutlak dalam pembuatan produk Zope. Kemudian, sebuah Zope yang telah berfungsi dengan baik pun harus tersedia di sistem kita. Dan jangan lupa, untuk mempermudah hidup dan mengurangi sakit mata, siapkan juga editor teks yang andal dan dapat mengenali sintakssintaks Python. Vim adalah contoh yang baik. Tutorial ini akan dibagi dalam langkah-langkah beserta penjelasannya. 1. Direktori untuk produk Buatlah sebuah direktori dengan nama Hello di bawah direktori produk Zope (umumnya di /usr/lib/zope/lib/python/ Products). 2. Definisi class produk Ini adalah langkah mutlak yang harus dikerjakan sebaik-baiknya. Walaupun produk yang kita buat hanyalah produk yang sangat sederhana, kita tetap perlu mendefinisikan sebuah class yang baik. Simpanlah class ini ke dalam file hello.py di direktori Hello yang telah dibuat di langkah (1). from OFS import SimpleItem from Globals import DTMLFile class hello(SimpleItem.SimpleItem): ‘’’ produk hello ‘’’ meta_type = ‘Hello’ def __init__(self, id, title,msg): ‘’’ inisialisasi instance baru untuk Hello ‘’’ self.id = id
Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
Kata kunci meta_type adalah kata kunci untuk nama produk kita yang akan tampil di Add Product List Zope Management Interface. Untuk itu, sebuah nama yang unik haruslah diberikan. Kemudian kita mendefinisikan fungsi __init__() yang berfungsi sebagai constructor class. Kemudian kita perlu juga untuk mendefinisikan sebuah tampilan default untuk objek yang instansiasi dari produk kita. Nama entiti default-nya adalah index_html. Dalam hal ini, karena index_html akan menampilkan kode-kode HTML dan tag DTML, maka alih-alih menampilkannya di dalam kode class, kita akan menggunakan dokumen DTML yang terpisah dan diletakkan di direktori dtml, relatif dari direktori produk Hello. Demikian juga dengan manage_editHelloForm, manage_workspace dan manage_main. Tiga terakhir ini adalah entiti administratif yang menunjuk ke satu file DTML yang sama. Kita perlu untuk menurunkan class kita dari class dasar yang akan sangat membantu, yaitu class SimpleItem. Tanpa menurunkan dari class lain, class hello yang kita buat tidak akan dapat digunakan seperti halnya produk Zope lainnya. Dan sebaliknya, dengan menurunkan dari SimpleItem, maka objek yang dibuat dari produk kita telah dapat di-cut dan di-paste ke container lain (contoh container yang paling baik adalah Folder), telah memiliki dukungan untuk bekerja dengan ZMI, memiliki dukungan FTP dan WebDAV, memiliki
dukungan untuk kepemilikan, dukungan undo dan lainnya. Luar biasa, bukan? Berikut ini adalah beberapa hal yang perlu diperhatikan dalam membangun produk Zope: Semua class dan fungsi harus memiliki documentation string. Zope akan menolak semua produk yang tidak memiliki dokumentasi internal tersebut. Hal ini juga akan memudahkan developer lain yang membaca source code produk Anda. Pembuatan produk berarti pembuatan objek baru yang siap di instansiasi dan dipublikasikan. Zope sendiri akan melakukan publikasi objek (Object Publishing). Dengan demikian, apabila produk Anda nanti diinstansiasi dengan nama tes_hello misalnya, maka objek tersebut akan dipublikasikan oleh Zope dan dapat diakses melalui web browser. Semua hal adalah objek. Pada method __init__(), kita menuliskan kode self.id = id. Hal ini adalah mutlak karena setiap objek pada Zope akan memiliki atribut id. 3. Penambahan produk Hello oleh user Pada produk-produk yang lain, kita akan disuguhkan sebuah form apabila ingin menambahkan produk tersebut ke dalam
www.infolinux.web.id
suatu container. Demikian juga produk kita. Apabila user ingin menambahkan produk Hello, maka kita harus menampilkan suatu form kepada user. User kemudian dapat mengisikan beberapa properti produk. Karena produk yang kita buat hanya memiliki tiga properti dengan nama id, title, dan msg, maka ketiga properti inilah yang dapat diatur oleh user. Tambahkan kode-kode berikut ini dalam file hello.py dan letakkan di luar definisi class hello. manage_addHelloForm = DTMLFile(‘dtml/ manage_addHelloForm’, globals()) def manage_addHello(self, id, title, msg, REQUEST=None): ‘’’ Response untuk manage_addHelloForm ‘’’ self._setObject(id, hello(id,title, msg)) if REQUEST is not None: return self.manage_main(self, REQUEST) manage_addHelloForm adalah sebuah file DTML, sama seperti halnya index_html. Sementara fungsi manage_addHello() adalah action untuk form manage_addHelloForm. Method setObject akan mengurus penambahan objek ke container. Setelah penambahan berhasil, maka tampilan
INFOLINUX AGUSTUS 2003
53
TUTORIAL
Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
Form penambahan produk Hello
akan diarahkan kembali ke form manage_main. 4. Tambahan untuk class hello Form manage_editHelloForm dapat digunakan untuk mengubah properti objek yang diinstansiasi dari produk kita. Dan tentunya kita pun perlu menyimpan segala perubahan yang dilakukan oleh user. Zope sendiri datang bersama ZODB, sebuah objek database yang luar biasa. Segala objek dapat disimpan di dalam ZODB ini. Begitupun dengan perubahan yang kita lakukan. Tambahkan fungsi berikut ini ke dalam class hello: def manage_editAction(self, title, msg, REQUEST=None): ‘’’ Menyimpan perubahan ‘’’ self.title = title self.msg = msg self._p_changed = 1 if REQUEST is not None: msgtouser = ‘Hello %s updated’ %self.id return self.manage_main(self, REQUEST, manage_tabs_message= msgtouser,)
54
INFOLINUX AGUSTUS 2003
Zope
Produk Hello telah ditambahkan ke root Zope
Dengan memberikan nilai 1 kepada properti _p_changed, kita telah menyimpan segala perubahan pada objek tersebut. Untuk memperindah tampilan layar edit produk kita yang didefinisikan di dalam file manage_editHelloForm, tambahkan baris-baris berikut ini persis di bawah kata kunci meta_type: manage_options = ( {‘label’:’properties’, ‘action’:’manage_ editHelloForm’, ‘help’:(‘Hello’, ’hello_edit.stx’)}, {‘label’:’view’, ‘action’:’index_html’}, ) Layar edit kita dilengkapi juga dengan fasilitas Help yang akan dibaca dari file hello_edit.stx. File dengan ekstensi stx dimaksudkan sebagai file Structured Text, sebuah teks terstruktur yang dapat di-parse oleh Zope dan ditampilkan dalam format yang indah. Dengan demikian, berikut ini adalah definisi lengkap class hello yang kita miliki: class hello(SimpleItem.SimpleItem): ‘’’ produk hello ‘’’
def __init__(self, id,title,msg): ‘’’ inisialisasi instance baru untuk Hello ‘’’ self.id = id self.title = title self.msg = msg index_html = DTMLFile(‘dtml/ index_html’, globals()) manage_editHelloForm = DTMLFile(‘dtml/ manage_editHelloForm’, globals()) manage_workspace= DTMLFile(‘dtml/ manage_editHelloForm’,globals()) manage_main= DTMLFile(‘dtml/ manage_editHelloForm’,globals()) def manage_editAction(self, title, msg, REQUEST=None):
TUTORIAL
Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
Zope
‘’’ Menyimpan perubahan ‘’’ self.title = title self.msg = msg self._p_changed = 1 if REQUEST is not None: msgtouser = ‘Hello %s updated’ %self.id return self.manage_main(self, REQUEST, manage_tabs_ message=msgtouser,) 5. Inisialisasi untuk produk Produk yang kita buat akan memasuki tahap-tahap penyelesaian dipandang dari sisi fungsionalisasi. Untuk saat ini, kita telah memiliki direktori Hello dan file hello.py di dalamnya. Sementara itu, kita masih memiliki utang untuk index_html.dtml, manage_addHelloForm. dtml, dan manage_editHelloForm.dtml. Selain itu, file help hello_edit.stx pun masih belum dibuat. Untuk saat ini, Anda boleh melupakan kesemua utang kita tersebut. Adalah lebih penting untuk menyelesaikan file inisialisasi untuk produk kita. Buatlah file __init__.py dan letakkanlah di bawah direktori Hello: import hello def initialize(context): ‘’’ Inisialisasi produk Hello ‘’’
Buatlah sebuah file 16x16 pixel dan berilah nama hello.png. File tersebut, seperti yang terdefinisi di registerClass(), akan menjadi icon untuk produk kita. Kemudian, tak lupa, kita pun meminta Zope untuk meregistrasikan help kita. Sampai saat ini, kita telah memiliki tiga file: hello.py, __init__.py dan hello.png. Dan pembuatan produk kita pun makin mendekati garis finish. 6. Pembuatan berbagai form Saatnya untuk membayar hutang yang kita miliki satu per satu. Untuk form saja, kita memiliki 3 hutang: index_html.dtml, manage_addHelloForm.dtml, manage_editHelloForm.dtml. Pada kode di class hello, kita tidak menuliskan ekstensi .dtml secara eksplisit karena DTMLFile() telah mengetahuinya. Pertama-tama, buatlah terlebih dahulu direktori dtml di bawah direktori Hello. Kemudian masuklah ke direktori dtml tersebut. Kita akan memulai dari index_html.dtml:
() says
() Kemudian, giliran hutang manage_addHelloForm.dtml yang dibayar:
This is Hello ! Just want to say Hello !
”>
msg
”>
Dan inilah utang form kita yang terakhir: manage_editHelloForm.dtml:
7. Pembuatan Help Utang kita belumlah lunas. Masih ada beberapa hal yang perlu dikerjakan, salah satunya adalah pembuatan help. Di dalam form manage_addHelloForm dan file hello.py sendiri, kita mendefinisikan file hello_edit.stx. Sebenarnya, Anda dapat membuat file help sebanyak yang Anda inginkan. Anda bahkan dapat pula membuat help untuk API produk Anda. Karena topik pembuatan help sangatlah luas, maka artikel ini hanya akan membahas sampai help dalam format teks. Buatlah direktori help di bawah direktori Hello dan masuklah ke dalam