Menuju Spanel 2: Modularisasi dan Kontribusi Open Source

(Seri posting blog “Menuju Spanel 2″ akan membahas perombakan-perombakan yang terjadi pada Spanel generasi berikutnya, dibandingkan dengan generasi saat ini.)

Salah satu masalah utama pada codebase Spanel yang lama (1.x) adalah sifatnya yang tidak modular. Modularitas adalah salah satu prinsip dasar dalam software engineering untuk membantu mengendalikan kompleksitas sebuah perangkat lunak.

Hal ini dicoba diperbaiki di Spanel 2. Pertama-tama, fungsi-fungsi generik telah di-spin off menjadi modul-modul Perl tersendiri. Proses refaktor selama awal hingga pertengahan 2011 secara langsung maupun tidak langsung telah menghasilkan sekitar 40 distribusi di CPAN, dan masih akan ada lagi beberapa yang menyusul. Penulis cukup puas dengan hasil ini karena dengan menjadi modul Perl di CPAN, Spanel berkontribusi terhadap open source (khususnya di komunitas bahasa Perl). Infrastruktur CPAN juga memberikan fasilitas smoke dan regression testing gratis.

Menuju Spanel 2: Mengapa INI ketimbang YAML?

(Seri posting blog “Menuju Spanel 2″ akan membahas perombakan-perombakan yang terjadi pada Spanel generasi berikutnya, dibandingkan dengan generasi saat ini.)

Saat ini di Spanel 1.3, format file konfigurasi yang digunakan sebagian besar adalah YAML. Format ini rapi dibaca (seperti Python), mendukung data struktur kompleks, dan tersedia parser untuk Perl, Python, PHP, Ruby, dan bahasa-bahasa lain.

Lalu kenapa di Spanel 2 diganti menjadi INI?

Pertama, format YAML sedikit sulit dikuasai. Walaupun sintaks dasarnya seperti JSON atau Python, tapi ada detil-detil yang kadang menjebak, misalnya kewajiban memberi spasi setelah titik dua atau koma. Ada sintaks panjang dan sintaks pendek (mis: [1, 2, 3] utk array atau {a: 1, b: 2} untuk hash. Ada berbagai sintaks here-doc. Dsb.

Sementara itu format INI cukup sederhana dan dimengerti pengguna Windows sekalipun.

Kedua, yang terpenting, jika diparse lalu didump ulang, semua implementasi YAML yang ada menghilangkan formatting dan komen semula. Ini tidak ideal untuk file konfigurasi, karena di konfigurasi kita sering membubuhi komen yang kadang penting. Untuk format INI, lebih mudah membuat parser yang round-trip, artinya yang bisa menjaga formatting dan komentar.

Format INI yang sederhana juga memudahkan otomasi untuk menghapus/menambahkan konfigurasi dari skrip. Ini yang dilakukan git misalnya, git mengizinkan kita mengubah konfigurasi lewat opsi git itu sendiri.

Referensi: http://blogs.perl.org/users/steven_haryanto/2011/09/yaml-vs-ini-again-and-the-plan-for-yet-another-ini-module.html

Perubahan rencana (Spanel 2)

Rencana refactoring Spanel 1.3.15 ternyata memakan waktu lebih lama dari yang diperkirakan (target rilis Mar 2011 ternyata molor hingga saat ini). Jadi, sekitar seminggu yang lalu, label rilis 1.3.15 akan diterapkan pada codebase lama. Spanel 1.3.15 akan diupdate untuk Debian Squeeze dan dirilis minggu ini, karena dukungan terhadap Squeeze memang menjadi salah satu hal yang mendesak.

Sementara branch refactoring yang selama ini diblog akan dilabeli sebagai Spanel 2. Spanel 2 akan menempuh perombakan menjadi modular, berganti format konfigurasi dari YAML menjadi INI, dan banyak pembenahan lainnya.

Menuju 1.3.15: Remote API

Versi 1.3.15 yang akan dirilis beberapa minggu lagi menghadirkan beberapa fitur baru. Tiap posting dari seri “Menuju 1.3.15″ akan membahas satu dari fitur-fitur ini. Pada posting kali ini: Remote API.

Spanel 1.3.15 adalah versi pertama Spanel yang memiliki fitur remote API lengkap, mengizinkan seluruh fungsionalitas Spanel yang terkandung di dalam API untuk diakses secara remote lewat HTTPS (port 950, atau port 443 lewat https://NAMAHOSTSPANEL/api.cgi). Klien PHP dan Perl tersedia. Untuk klien Perl, ada di modul Spanel::APIClient::Unix dan Spanel::APIClient::HTTP. Untuk klien PHP, tersedia di spanel_api_client.inc.php (fungsi spanel_call_api_unix() dan spanel_call_api_http()). Jika Anda ingin menulis klien dalam bahasa lain, bisa melihat contoh dari Perl dan PHP. API Spanel menggunakan HTTP REST biasa + JSON dan amat mudah dipakai, kode untuk klien PHP hanya sekitar 75 baris.

Spanel sendiri menyediakan klien command line yaitu perintah “spanel api”.

Untuk daftar API lengkap, dapat dilihat dengan perintah “spanel api -l”, “spanel api NAMAMODUL -l”, dan “spanel api NAMAMODUL NAMAFUNGSI –help”. Atau bisa juga di http://api.spanel.info/ .

Sebelumnya terdapat dua akses API remote juga yang tidak lengkap. Pertama, via HTTP, terdapat api0.cgi yang dibuat tahun 2008 untuk mengkoneksikan Spanel dengan WHMCS. api0.cgi ini hanya berisi fungsi-fungsi untuk membuat akun, suspensi/unsuspensi, menghapus akun, dan beberapa fungsi lainnya. Satu lagi, via HTTPS port 1010 dan ditempelkan di spanel-jobd, hanya berisi fungsi untuk sinkronisasi zona DNS. Dibuat tahun 2009 bersamaan dengan migrasi sistem DNS dari Bind ke PowerDNS.

Bersamaan dengan dirilisnya API remote baru, kedua API remote lama dengan ini ditiadakan.

Berbagai kemungkinan kini terbuka untuk mengintegrasikan Spanel dengan sistem lain serta mengendalikan Spanel dari jarak jauh. Stay tuned!

Menuju 1.3.15: tab completion

Versi 1.3.15 yang akan dirilis beberapa minggu lagi menghadirkan beberapa fitur baru. Tiap posting dari seri “Menuju 1.3.15″ akan membahas satu dari fitur-fitur ini. Pada posting kali ini: tab completion di shell bash.

Sesuai tradisi, Spanel adalah control panel yang ramah terhadap admin dan mode command-line/shell. Versi 1.3.15 meneruskan tradisi ini dengan menghadirkan fitur tab completion bagi perintah utama “spanel” untuk meningkatkan kenyamanan dan kecepatan bekerja di shell. Tab completion adalah fitur di shell yang memungkinkan kita melengkapi nama file/direktori/perintah/dll dengan menekan tombol Tab. Mari kita lihat apa saja tab completion yang tersedia:

Melengkapi subcommand

# spanel <tab>

akan menampilkan daftar subperintah Spanel yang tersedia (contohnya: api, list-accounts, dsb; saat ini jumlahnya ada sekitar 150). Catatan: bergantung pada setting bash Anda (set show-all-if-ambiguous On/Off di ~/.inputrc), tombol Tab bisa harus ditekan dua kali atau cukup satu kali saja. Pada contoh di bawah notasi <tab> hanya ditulis sekali.

Jika sudah ada kata yang diketik sebelum menekan Tab:

# spanel get-<tab>

maka bash hanya akan menampilkan daftar subperintah yang diawali kata tersebut (dalam hal ini “get-”, contohnya “get-account-info”, “get-accounts-count”, dsb).

Melengkapi opsi

Jika Anda mengetik “-” (minus) dulu, maka Spanel beranggapan Anda menginginkan melengkapi opsi dan akan menampilkan pilihan semua opsi yang tersedia untuk “spanel” atau salah satu subperintahnya. Contoh:

# spanel -<tab>

akan menampilkan daftar opsi umum perintah “spanel”, yaitu -h, -?, –help, -l, –list, -v, –version, dsb.

# spanel create-account -<tab>

akan menampilkan daftar opsi untuk subperintah create-account, yaitu: –account, –domain, –email, –plan, dsb.

Melengkapi nilai opsi

Tiap opsi dapat mengandung nilai yang berbeda-beda. Contohnya, opsi –account diisi dengan daftar akun hosting yang ada. Opsi –plan dengan daftar plan hosting yang ada, –site dengan daftar situs/subdomain, dsb. Spanel dapat melengkapi daftar nilai sesuai jenis opsinya. Contoh:

# spanel delete-account --account <tab>
# spanel delete-account <tab>; # sama dengan di atas, karena --account dapat disebutkan sebagai argumen pertama

akan melengkapi –account dengan daftar pilihan nama akun yang terdapat di server.

Bahkan:

# spanel suspend-account <tab>

hanya akan melengkapi dengan daftar akun yang tidak sedang tersuspensi. Sementara:

# spanel unsuspend-account <tab>

hanya akan melengkapi dengan daftar akun yang sedang tersuspensi.

PS: Terima kasih kepada Bang Endrik yang menginspirasi pembuatan fitur tab completion ini.

Menuju 1.3.15: spanel setup

Versi 1.3.15 yang akan dirilis beberapa minggu lagi menghadirkan beberapa fitur baru. Tiap posting dari seri “Menuju 1.3.15″ akan membahas satu dari fitur-fitur ini. Pada posting kali ini: “spanel setup”.

Perintah “spanel-setup” sebelumnya merupakan sebuah skrip tunggal yang monolitik (sekitar 2500+ baris kode Perl). Ada beberapa kekurangan yang keterbatasan yang dirasakan selama ini. Pertama, step check-selections (mengeset daftar paket Debian yang diinstal) dan check-setup (membuat file/direktori yang dibutuhkan, memasukkan snippet konfigurasi, dan semua setup lain) yang terpisah. Dulu saya sengaja memisahkan ini karena memikirkan fleksibilitas, namun nampaknya ini keputusan yang keliru karena kadang salah satu langkah tidak dilakukan sehingga sistem menjadi tidak konsisten. Kedua, step check-setup kadang-kadang harus diulang beberapa kali sampai seluruh setup benar. Ini dikarenakan alur kode setup yang hanya one-pass sehingga setelah skrip membenarkan sebuah setting, ia tidak mengulang pengecekan untuk memastikan apakah setting tersebut sudah benar atau tidak. Tentu saja ini agak mengganggu admin yang melakukan setup.

Karena itu pada versi terbaru Spanel, spanel-setup direfaktor ulang. Kini ia menjadi bagian dari perintah “spanel”, yaitu “spanel setup”. Perintah tunggal “spanel” adalah framework aplikasi yang memberi keuntungan waktu startup yang lebih cepat dan fitur-fitur seragam, salah satunya tab completion di shell bash.

Setup juga dibuat menjadi modular, dibagi-bagi menjadi modul dan fungsi. Semuanya ditaruh di keluarga modul Perl Spanel::Setup::*. Ini mirip dengan API (yang juga ditaruh di dalam modul-modul Perl Spanel::API::*). Setiap fungsi setup mengecek sebuah setting, dan dapat bekerja dalam beberapa mode: dry run (simulasi, hanya mengecek tanpa melakukan modifikasi), normal setup, dan unsetup (untuk membalikkan setup, uninstall). Antara fungsi-fungsi ini terdapat hubungan dependensi, sehingga kita bisa melakukan run terhadap sebuah fungsi setup saja (contoh: service.proftpd untuk mensetup ProFTPD) dan semua dependensi yang diperlukan oleh fungsi setup tersebut (antara lain: konfigurasi Spanel, requirements Spanel) akan dijalankan juga terlebih dulu. Dengan demikian, dipastikan sebuah setting benar-benar konsisten dari top-bottom.

Kita juga bisa melakukan show run, yaitu mendaftar urutan pengerjaan fungsi-fungsi setup tanpa benar-benar menjalankannya.

Cara kerja setup yang baru ini barangkali baru akan gamblang jika dijelaskan lewat contoh dan screenshots. Namun harap bersabar menunggu posting berikutnya. Sampai jumpa!