Monday, November 7, 2016

Mengaktifkan Plugin Poppassd di RainLoop

Pendahuluan

Poppassd adalah program yang mengijinkan user mengubah password sistem (biasanya digunakan untuk mengubah password email account) sehingga memungkinkan pengguna untuk mengubah password email mereka.

Pada sistem operasi Linux turunan Debian, Poppassd berjalan di bawah layanan xinetd.d dan BUKAN service mandiri sehingga kita tidak bisa menjalankan program ini layaknya service seperti pada gambar 1 berikut:

Gambar 1 Poppassd Bukan Service

Poppassd secara default berjalan pada protokol Transmission Control Protocol (TCP) port 106.

Pada webmail RainLoop (red: webmail favorit penulis), Poppassd adalah sebuah plugin yang memungkinkan pengguna email mengganti password mereka secara mandiri melalui account seting masing-masing. 

Masalahnya tidak sesederhana itu... Saat kita selesai menginstall RainLoop, login sebagai admin, menginstall plugin Poppassd seperti Gambar 2:

Gambar 2 Instalasi Paket Poppassd di Webmail RainLoop

 kemudian mengaktifkan pluginnya pada Gambar 3:

Gambar 3 Aktivasi Plugin Poppassd

Pengguna tidak bisa LANGSUNG mengganti password mereka seperti pada gambar 4 berikut:
Gambar 4 Gagal Update Password User

Berikut langkah2 instalasi Poppassd. Saya menggunakan Ubuntu 14.04 64 bit. OS yang lain silahkan menyesuaikan.

Instalasi Poppassd

1. Install terlebih dulu Poppassd dengan peritah:
# apt-get install poppassd

lihat gambar 5

Gambar 5 Instalasi Poppassd

2. Buat sebuah file untuk meng-enable-kan Poppassd di layanan xinetd.d dengan perintah:
# vim /etc/xinetd.d/poppassd

service poppassd
{
        disable                  = no
        socket_type          = stream
        wait                      = no
        user                      = root
        server                   = /usr/sbin/poppassd
        log_on_success  += USERID
        log_on_failure     += USERID
}
3. Aktifkan port 106 di /etc/services
# vim /etc/services

poppassd        106/tcp

4. Aktifkan layanan xinetd dengan perintah:
# /etc/init.d/xinetd restart

Pastikan port 106 telah dibuka untuk layanan pop3pw seperti pada gambar 6 berikut:

Gambar 6 Service pop3pw Telah Berjalan

5. Selesai urusan kita dengan layanan Poppassd

Seting Plugin Poppassd di Rainloop

6. Seperti pada Gambar 3, kita klik nama Plugginnya (poppassd-change-password) seperti pada gambar 7 berikut:
Gambar 7 Pilih Plugin yang akan dikonfigurasi

7. Pastikan nama Host anda sesuai dengan Host yang anda seting di menu Domains

Gambar 8 Konfigurasi Plugin Poppassd


9. Selesai urusan kita dengan Plugin Poppassd. Saatnya Uji Coba

Testing

1. Login Pada Rainloop Webmail sebagai Pengguna (User) seperti pada gambar 9


Gambar 9 Login ke Webmail RainLoop

2. Pilih menu Settings -> Password kemudian isikan Password saat ini dan Password baru seperti pada gambar 10 berikut:

Gambar 10 Proses Penggantian Password

3. Proses Penggantian Password berhasil (ditunjukkan warna hijau) pada gambar 11 berikut:
Gambar 11 Penggantian Password Berhasil

Selamat Mencoba.

Tested On: Ubuntu 14.04 64 bit, Apache 2, Poppassd 1.8.5-4 dan PHP5.


Thursday, September 29, 2016

Inotify Cron (InCron) untuk membangun Sistem Reaktif di Ubuntu 14.04

Pendahuluan

Sebuah sistem reaktif adalah sistem yang peka (aware) dengan sebuah kejadian dari luar (external event). Sebagai contoh:
  1. Pernahkah kita menginginkan sebuah sistem yang dapat mengamati sebuah usaha penetrasi (hijacking) dengan mempelajari pola serangannya (misalnya bruteforcing) kemudian mengambil tindakan atas usaha tersebut misalnya memasukkan intruder tersebut di daftar blacklist, atau menutup sementara layanan tersebut untuk domain atau network tersebut?
  2. Memasukkan file melalui layanan file transfer (FTP, SFTP atau LFTP) dan setelah file tersebut selesai ditransfer, file tersebut langsung di-rename atau di-move pada directory public dengan diatur permisinya sedemikian rupa sehingga file tersebut dapat langsung dapat diakses orang banyak (public).
  3. Mengamati perubahan sebuah file/ direktori yang seharusnya TIDAK boleh dirubah tanpa seijin administrator, seperti file /etc/sudoers atau /etc/passwd atau /home/user/penelitian.docx. Sehingga jika "akan" ada perubahan oleh user non administrator, sistem dapat langsung memberitahu (lewat SMS atau e-mail, atau membunyikan alarm atau melakukan backup file tersebut).
  4. Mengamati matinya layanan utama (primary service) dan secara otomatis membangkitkan server sementara (temporary server) sehingga mengurangi waktu mati (downtime) sebuah layanan.
  5. Dan sebagainya.
Cukup banyak hal yang dapat dilakukan dan dimudahkan dengan sistem reaktif seperti ini. Istilah lain otomatisasi.


Teori

Di sistem operasi linux, kita mengenal cron job sebagai akronim dari chronograph. Cron job adalah sebuah sistem penjadwalan pekerjaan dimana kita bisa mengatur kapan sebuah "kegiatan"  dilakukan. Misalnya jadwal untuk restart sistem secara berkala, update patch, backup dan maintenance database dan sebagainya, sehingga kita tidak perlu melakukannya secara manual yang kadang lupa.
Permasalahan pada cron job adalah sebuah pekerjaan dilakukan menggunakan time based (berbasis waktu), misalnya sistem perawatan database (analyze dan vacuum) kita jadwal setiap bulan tanggal 1 setiap bulan jam 2 pagi. Proses backup data kita laksanakan setiap 6 bulan (per semester) jam 2 pagi dimana sistem biasanya paling tidak sibuk. Dan seterusnya.

Cron job sangat efektif untuk pekerjaan berbasis waktu, tetapi tidak berbasis kejadian (event based). Misalnya kita punya prosedur pengecekan hidup atau mati sebuah layanan yang dilakukan setiap hari pada jam 13.30. Apabila sistem ditengarai mati (misalnya RTO saat di-ping), maka nyalakan sistem pambantu (backup server). Nah disini timbul permasalahan baru. Apabila layanan server mati pada pukul 13.31. (satu menit setelah sistem melakukan pengecekan terakhir), maka sistem backup baru hidup jam 13.30 di hari berikutnya. Artinya down time-nya 23 jam 59 menit!

Solusi yang bisa dilakukan adalah mempercepat proses pengecekan itu misalnya pengecekan dilakukan per menit (waktu terpendek yang bisa dilakukan oleh cron job). Tetapi hal ini memaksa sistem terus menerus melakukan pekerjaan tiap menit!. Sistem menjadi sibuk (karena melakukan rutin pengecekan) dan TETAP saja down time-nya bisa 59 detik.

Event State

Jauh lebih sederhana jika kita memiliki sistem yang reaktif terhadap perubahan state sebuah kejadian yang dijelaskan sebagai berikut:

Saat event state (X) sistem bernilai true maka dibangkitkan sebuah Event E. Pemodelan kondisi X saat Event E di-generate saat context state bernilai true.
Event E berlangsung dalam durasi waktu T yang diilustrasikan pada gambar berikut:
 Gambar 1. Event State

Delta Waktu (T2-T1) adalah waktu dimana sebuah kejadian berlangsung. Misalnya kita mengamati sebuah aktifitas perpindahan file dari satu folder ke folder lainnya. Delta T adalah waktu yang diperlukan dari saat mulai proses perpindahan hingga file tersebut "completely moved".

Sebuah event memiliki sebuah proses aktivasi dan de-aktivasi. Aktivasi sebuah event akan menyebabkan kondisi "sedang berada" (at) bernilai true atau dengan kata lain, proses aktivasi dan de-aktivasi akan merubah kondisi event dari status sebelum (before), sedang (at) atau setelah (after). Hal ini perlu dilakukan pada sequential event  sebagai "tanda" event berikutnya bisa dikerjakan.

Ini berarti sebuah event dapat memiliki 3 kemungkinan kondisi yaitu:
  1. Before (T1)
  2. At (T1<T<T2)
  3. After (T2)
Contoh:
Sebuah file A akan diamati Event State-nya:
  1. Saat file A tersebut dibuka.
  2. Saat file A tersebut dimodifikasi.
  3. Saat file A tersebut disimpan.
Inotify Cron

Incron atau inotify cron adalah software (service lebih tepatnya) pengembangan dari software cron biasa. Pada dasarnya kedua jenis cron job ini (cron dan incron) adalah sebuah subsistem pada kernel Linux yang digunakan untuk melakukan task secara otomatis dengan kondisi tertentu. Letak perbedaannya adalah: inotify cron bertindak terhadap perubahan dari file system (event based), sedangkan cron bertugas untuk penjadwalan yang memungkinkan eksekusi sebuah aksi dalam interval waku tertentu. 

Incron menyediakan cara sederhana bagaimana memecahkan banyak kejadian dengan banyak solusi. Keadaan disini dimaksud dengan jenis event pemicu dijalankannya aksi, karena setiap kejadian yang terjadi di file system merupakan pekerjaan untuk incron. Sedangkan solusi pengerjaan job menggunakan perintah-perintah monitoring yang didukung oleh incron, seperti monitoring terhadap manipulasi file.

Metode-metode dalam Incron

Incron memiliki metode sebagai berikut:


Metode   Event Trigger
IN_ACCESS  File/ Folder yang diamati sedang diakses.
IN_ATTRIB  Perubahan Metadata pada sebuah File/ Folder yang diamati (read/write/execute).
IN_CLOSE_WRITE  File/ Folder yang diamati selesai ditulis dan selesai di-save.
IN_CLOSE_NOWRITE  File/ Folder yang diamati dibuka tetapi tidak untuk ditulis dan selesai di-save.
IN_CREATE  File/ Folder yang diamati selesai dibuat.
IN_DELETE  File/ Folder yang diamati selesai dihapus.
IN_DELETE_SELF  File/ Folder yang diamati selesai dihapus di dirinya sendiri.
IN_MODIFY  File/ Folder yang diamati sedang di-edit.
IN_MOVE_SELF  File/ Folder yang diamati selesai dipindahkan di dirinya sendiri.
IN_MOVED_FROM  File/ Folder selesai dipindahkan dari tempat yang sedang diamati.
IN_MOVED_TO  File/ Folder selesai dipindahkan ke tempat yang sedang diamati.
IN_OPEN  File/ Folder yang diamati sedang dibuka.

Aturan Penulisan:
Aturan penulisan yang diberikan untuk menjalankan aksi tertentu adalah sebagai berikut:

direktori_yang_diamati     INCRON_METHOD     aksi_yang_dijalankan

misalnya:
/home/haruno/public/ IN_CLOSE_WRITE sudo chmod 777 -R /home/haruno/public/

Implementasi

Operating System yang saya gunakan untuk menjalankan program incron ini adalah Ubuntu 14.04 64 bit.

1. Tahapan Instalasi

Untuk instalasi layanan incron pada OS Ubuntu 14.04 cukup sederhana:
# apt-get install incron



Gambar 2: Instalasi Incron

2. Tahapan Konfigurasi

Setelah proses instalasi, tahapan berikutnya adalah mengijinkan siapa yang boleh dan tidak boleh menjalankan layanan incron ini. File yang digunakan untuk konfigurasi adalah:
  • /etc/incron.allow
  • /etc/incron.deny
Jika kita sudah memiliki whitelist dan blacklist user, kita bisa atur user yang bisa melakukan incron dari daftar ini dengan mengaturnya di /etc/incron.conf.
Contoh: Kita tambahkan root untuk bisa melakukan incron
# echo root >> /etc/incron.allow
Gambar 3: User yang dapat menjalankan Incron

3. Menambahkan Aturan incron Baru
Setelah kita daftarkan user "root" ke dalam /etc/incron, kita dapat menambah aturan incron baru dengan perintah:
# incrontab -e

Nah disini kita terapkan metode di atas yang tepat untuk memicu aksi apa yang diharapkan.

Contoh: kita akan membuat permisi untuk setiap file yang datang ke watched directory (misalnya: direktori /home/haruno/public/) dengan permisi 777. Perintah yang diberikan adalah:

/home/haruno/public IN_CLOSE_WRITE sudo chmod 777 -R /home/haruno/public/
4. Melihat Table incron
Kita dapat melihat table incron dengan perintah:
# incrontab -l

Gambar 4: Tabel Aturan Incron
5. Memperbarui table incron
Setelah aturan baru dibuat, jangan lupa layanan incron di direstart agar aturan baru tersebut dapat berjalan.
# /etc/init.d/incron restart

Testing

Untuk menguji apakah aturan tersebut berjalan atau tidak, kita coba copy sebuah file ke directory /home/haruno/public seperti pada gambar berikut:



Gambar 5:Pengujian Incron


Penggunaan incron ini bisa sangat luas asal kita dapat berimajinasi dan berinovasi.

Selamat Mencoba

Sunday, June 12, 2016

Deteksi Tepi Dengan Metode Sobel (bagian 2)

Pendahuluan

Pada tulisan sebelumnya, kita telah membahas ruang lingkup pengolahan citra dan hubungannya dengan Grafika Komputer dan Pengenalan Pola.

Pada tulisan ini, kita akan mempelajari Metode Deteksi Tepi Sobel.

Dasar Teori
Metode Sobel adalah sebuah metode pendeteksian tepi yang tergolong kategori gradient edge detection (Murdianto, 2007), dimana metode ini akan mendeteksi nilai maksimum dan nilai minimum dari tepi sebuah gambar sesuai ditunjukkan pada gambar 1 di bawah ini:
Gambar 1. Pendeteksian Tepi Gambar Asli (a) menjadi Pola (b)

Apabila threshold (batas) dari sebuah obyek sudah sesuai dengan nilai yang ditetapkan, maka dapat ditentukan apakah nilai tersebut merupakan batas dari sebuah obyek atau bukan. Proses pendeteksian ini dilakukan terhadap seluruh cell matrik dari sebuah citra 2 dimensi. Artinya sistem akan melakukan mapping terhadap sebuah citra sehingga diperoleh seluruh tepi dari obyek-obyek dalam citra tersebut.
Setelah seluruh tepi obyek dari citra tersebut telah dipetakan, proses berikutnya adalah melakukan penyaringan terhadap obyek yang perlu diolah dan obyek yang tidak perlu diolah seperti noise seperti ditunjukkan pada gambar 2 sebagai berikut. Noise pada gambar dapat muncul dari beberapa sebab, kualitas cahaya saat pengambilan gambar menggunakan kamera, noise pada obyek yang diambil seperti debu, batu atau obyek-obyek lain yang tidak seharusnya muncul saat gambar diambil atau bisa juga noise berasal dari kualitas kamera yang digunakan, misalnya kamera yang tidak memiliki fitur auto focus sehingga gambar yang diambil memiliki “bayangan” atau duplikasi obyek. Noise pada gambar digital dapat diperbaiki dengan beberapa tools dari perangkat lunak pengolah citra seperti Adobe Photoshop dan lain-lain.
Pada Gambar 2 dijelaskan, walaupun pada citra asli (a) memiliki banyak noise baik noise yang berada di latar belakang maupun noise yang berada di dalam obyek, akan tetapi noise-noise tersebut memiliki dimensi yang kurang dari nilai yang ditetapkan sebagai sebuah obyek, maka noise tersebut akan dihilangkan dan terbentuklah pola yang tergambar pada gambar (b).
Noise adalah gangguan dalam citra yang dapat membuat kesalahan pendeteksian yang kemudian berujung pada kesalahan pengenalan pola dari citra yang diolah. Noise merupakan tantangan terbesar dalam konsep pengolahan citra. Sistem dapat mengira noise sebagai obyek (kesalahan negatif) maupun sebaliknya obyek sebagai noise (kesalahan positif).
                             

 Gambar 2. Pembersihan Noise dari Citra

Metode deteksi tepi sobel cukup baik dalam pendeteksian noise sebelum noise yang ada dalam citra tersebut memiliki toleransi yang cukup besar. Pada gambar 2 di atas, noise dipandang sebagai sebuah obyek yang memiliki dimensi (ukuran) tertentu yang kemudian “diabaikan” oleh sistem sehingga tidak akan diproses kemudian. Akan tetapi apabila dimensi noise ini melebihi ukuran yang diijinkan, maka noise tersebut akan dianggap sebagai sebuah obyek seperti pada gambar 2.8 di atas.
Noise bisa juga muncul sebagai warna toleransi yang cukup mirip seperti ditunjukkan pada gambar 3 di bawah ini.
   Gambar 3 Hasil pengolahan Citra dengan Metode Deteksi Tepi Sobel

Metode deteksi tepi Sobel dilakukan dengan operasi matriks terhadap piksel-piksel di sekitar piksel yang sedang di-scan. Sebuah citra tersusun atas matriks 2 dimensi yang masing-masing  sel matrik tersebut berisi kombinasi warna merah, hijau dan biru seperti ditunjukkan pada gambar 4 sebagai berikut.
   Gambar 4 Matriks Warna dalam Piksel Gambar 2D

Matriks Sobel merupakan matriks 3x3 dengan koefisien nilai RGB yang telah ditentukan seperti pada gambar 5 sebagai berikut.
 Gambar 5 Matrik Sobel

Setiap sel dari matriks di gambar 4 akan diolah menggunakan koefisien matriks di gambar 2.12 sehingga diperoleh jarak antar warna. Jika jarak antar warna tersebut kurang dari nilai yang ditentukan maka konversi nilai RGB pada pixel tersebut menjadi putih dan jika lebih dari nilai yang ditentukan, maka konversi nilai RGB pada pixel tersebut sebagai hitam sehingga diperoleh matriks warna baru seperti ditunjukkan pada gambar 4 di atas.
Pendeteksian tepi obyek menggunakan metode Sobel dijelaskan pada diagram alir gambar 6 di bawah ini:
Gambar 6 Diagram Alir Metode Sobel dalam Penentuan Warna Piksel

Source Code

Setelah kita memahami Algorima Deteksi Tepi Sobel, kita akan menulis kode program (saya tulis dalam bahasa PHP)

<?php

// Tentukan citra yang akan diolah
$gambar_awal = "coba.jpg";

// pembentukan citra digital
$gambar_digital = imagecreatefromjpeg($gambar_awal);

//Cari dimensi gambar
$data_gambar = getimagesize($gambar_awal);

$akhir = imagecreatetruecolor($data_gambar[0],$data_gambar[1]);

// Proses semua piksel
for($x=1;$x<$data_gambar[0]-1;$x++){
    for($y=1;$y<$data_gambar[1]-1;$y++){
    // Hitung semua nilai abu-abu di matrik sobel disekitar piksel yang discan
    $piksel_atas = luminansi(imagecolorat($gambar_digital,$x,$y-1));
    $piksel_bawah = luminansi(imagecolorat($gambar_digital,$x,$y+1));
    $piksel_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y));
    $piksel_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y));
    $piksel_atas_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y-1));
    $piksel_atas_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y-1));
    $piksel_bawah_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y+1));
    $piksel_bawah_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y+1));
       
      // Hitung nilai x dan y
$rubah_x = ($piksel_atas_kanan+($piksel_kanan*2)+$piksel_bawah_kanan)-($piksel_atas_kiri +($piksel_kiri*2)+$piksel_bawah_kiri);
$rubah_y = ($piksel_atas_kiri+($piksel_atas*2)+$piksel_atas_kanan)-($piksel_bawah_kiri+($piksel_bawah*2)+$piksel_bawah_kanan);
       
    // hitung jarak
    $abu_abu = sqrt($rubah_x*$rubah_x+$rubah_y*$rubah_y);
    $abu_abu = 255-$abu_abu;
       
    // Proses Menentukan nilai abu-abu
        if($abu_abu > 255){
            $abu_abu = 255;
        }
        if($abu_abu < 0){
            $abu_abu = 0;
        }
       
        $abu_abu_baru  = imagecolorallocate($akhir,$abu_abu,$abu_abu,$abu_abu);
       
        imagesetpixel($akhir,$x,$y,$abu_abu_baru);           
    }
}

// Beritahu browser bahwa ada data citra yang akan ditampilkan
header('Content-Type: image/jpeg');

imagejpeg($akhir);

function luminansi($pixel){
    $pixel = sprintf('%06x',$pixel);
    $red = hexdec(substr($pixel,0,2))*0.30;
    $green = hexdec(substr($pixel,2,2))*0.59;
    $blue = hexdec(substr($pixel,4))*0.11;
    return $red+$green+$blue;
}

?>

Hasil:

Citra Asli
Citra Sobel


Semoga Bermanfaat

Referensi
  1. Murdianto A, Ekstraksi Fitur Wajah dengan Metode Gabor Wavelet, Fasilkom UI, 2007