DIY: Membuat Aplikasi Sederhana Pemantau VPS

Discussion in 'VPS (Virtual Private Server)' started by Doel, 23 Sep 2012.

Thread Status:
Not open for further replies.
  1. Doel

    Doel Beginner 2.0

    Messages:
    72
    Likes Received:
    26
    Trophy Points:
    18
    kebetulan sedang ada waktu luang, iseng bikin script sederhana.
    maap, kalau code-nya sedikit berantakan (atau tidak standar). harap maklum, lagi belajar :)
    kritik atau saran akan diterima dengan senang hati. semoga bermanfaat. ;)


    prerequisites:
    - package sysstat


    1. membuat file crontab di VPS. misalnya seperti:
    Code:
    #!/bin/bash
    # filename: uptime.sh
    
    mydir=/direktori/untuk/menyimpan/data
    f1="my-uptime.txt"
    f2="my-memory.txt"
    f3="my-storage.txt"
    f4="my-iostat.txt"
    
    
    uptime > $mydir/$f1
    free -m > $mydir/$f2
    df -h > $mydir/$f3
    iostat > $mydir/$f4
    jalankan (schedule) script ini di crontab, misalnya setiap 10 menit sekali.

    Code:
    */10 * * * * /usr/local/bin/uptime.sh

    2. membuat script PHP untuk membaca (parsing) hasil output dari crontab. seperti:
    PHP:
    <?php
    // filename: tools.php

    $data_dir "/direktori/untuk/menyimpan/data";

    // file uptime (disesuaikan dengan nama di crontab)
    $file  $data_dir."/"."my-uptime.txt";

    // file memory (disesuaikan dengan nama di crontab)
    $file2 $data_dir."/"."my-memory.txt";

    // file storage (disesuaikan dengan nama di crontab)
    $file3 $data_dir."/"."my-storage.txt";

    // file iostat (disesuaikan dengan nama di crontab)
    $file4 $data_dir."/"."my-iostat.txt";

    function 
    cleanup$t ) {
        
    $t trim$t );
        
    $t str_replace( array( '\r\n','\n','\r'), ''$t );
        return 
    $t;
    }

    function 
    my_filter$array ) {
        
    $new_array = array();
        foreach( 
    $array as $k => $v ) {
            if( 
    $v =='' || $v =='Mem:' || $v =='-/+' || $v =='buffers/cache:' ) {
                
    // nothing to do...
            
    } else {
               
    $new_array[] = cleanup$v );
            }
        }
        return 
    $new_array;
    }

    function 
    vps_uptime(){
        global 
    $file;
        
    $tmp  file_get_contents$fileNULLNULL10);
        
    $data explode','$tmp );
        
    $a    str_replace'up'''$data[0] );
        
    trim$a );
        
    $up   explode' '$a );
        
    $uptime["hari"] = $up[1];
        if( 
    preg_match("/([0-9]{1,2}):([0-9]){1,2}/"$data[1] ) ) {
            
    $up2 explode':'$data[1] );
            
    $uptime["jam"]   = cleanup$up2[0] );
            
    $uptime["menit"] = cleanup$up2[1] );
        } else {
            
    $uptime["jam"]   = "";
            
    $uptime["menit"] = "";
        }    return 
    $uptime;
    }

    function 
    vps_memory() {
        global 
    $file2;
        
    $tmp    file$file2 );
        
    $memory explode' '$tmp[1] );
        
    $mem    my_filter$memory );
        
    $a["memory"]["total"] = $mem[0];
        
    $a["memory"]["used"]  = $mem[1];
        
    $a["memory"]["free"]  = $mem[2];
        
    $cache  explode' '$tmp[2] );
        
    $cac    my_filter$cache );
        
    $a["cache"]["used"]  = $cac[0];
        
    $a["cache"]["free"]  = $cac[1];
        return 
    $a;
    }

    function 
    vps_storage() {
        global 
    $file3;
        
    $tmp     file$file3 );
        
    $storage explode' '$tmp[1] );
        
    $sto     my_filter$storage );
        
    $s["total"]   = $sto[1];
        
    $s["used"]    = $sto[2];
        
    $s["free"]    = $sto[3];
        
    $s["percent"] = $sto[4];
        return 
    $s;
    }

    function 
    vps_iostat() {
        global 
    $file4;
        
    $tmp    file$file4 );
        
    $iotmpa explode' '$tmp[2] );
        
    $iotmp  explode' '$tmp[3] );
        
    $a      my_filter$iotmp );
        
    $io["cpu"]["user"]   = $a[0];
        
    $io["cpu"]["nice"]   = $a[1];
        
    $io["cpu"]["system"] = $a[2];
        
    $io["cpu"]["wait"]   = $a[3];
        
    $io["cpu"]["steal"]  = $a[4];
        
    $io["cpu"]["idle"]   = $a[5];
        return 
    $io;
    }

    function 
    collect_data() {
        
    $data = array();
        
    $data["uptime"] = vps_uptime();
        
    $data["storage"] = vps_storage();
        
    $data += vps_memory();
        
    $data += vps_iostat();
        return 
    $data;
    }

    function 
    show_uptime$echo true ) {
        global 
    $sysinfo;
        
    $a["uptime"] = vps_uptime();
        
    $uptime  $a["uptime"]["hari"] . " hari, ";
        if( !empty( 
    $a["uptime"]["jam"] ) )
            
    $uptime .= $a["uptime"]["jam"] . " jam, ";
        if( !empty( 
    $a["uptime"]["menit"] ) )
            
    $uptime .= $a["uptime"]["menit"] . " menit";

        if( 
    $echo )
            echo 
    $uptime;
        else
            return 
    $uptime;
    }

    function 
    show_memory$what "memtotal" ) {
        
    $memory vps_memory();
        switch ( 
    $what ) {
            case 
    "memtotal":
                echo 
    $memory["memory"]["total"];
                break;
            case 
    "memused":
                echo 
    $memory["memory"]["used"];
                break;
            case 
    "memfree":
                echo 
    $memory["memory"]["free"];
                break;
            case 
    "cacused":
                echo 
    $memory["cache"]["used"];
                break;
            case 
    "cacfree":
                echo 
    $memory["cache"]["free"];
                break;
        }
    }

    function 
    show_storage$what 'used' ) {
        global 
    $sysinfo;
        switch ( 
    $what ) {
            case 
    "total":
                echo 
    $sysinfo["storage"]["total"];
                break;
            case 
    "used":
                echo 
    $sysinfo["storage"]["used"];
                break;
            case 
    "free":
                echo 
    $sysinfo["storage"]["free"];
                break;
            case 
    "percent":
                echo 
    $sysinfo["storage"]["percent"];
                break;
        }
    }

    3. membuat file PHP (mini-API) untuk menerima request dari luar (JSONP). seperti:
    PHP:
    <?php
    // filename: json.php

    require_once "tools.php";

    // sunting dimari
    $vpsnode "Nama VM";

    header("content-type: application/json; charset=utf-8");

    $data["node"][$vpsnode] = collect_data();

    echo 
    $_GET["callback"] . "(".json_encode($data).")";
    ?>
    buka file "json.php" dari web (mis: http://website/apps/json.php). bila ok, akan tampil seperti ini:

    Code:
    [COLOR=#000000]({"node":{"[/COLOR]Nama VM[COLOR=#000000]":{"uptime":{"hari":"1","jam":"2","menit":"58"},"storage":{"total":"15G","used":"768M","free":"15G","percent":"5%"},"memory":{"total":"256","used":"87","free":"168"},"cache":{"used":"87","free":"168"},"cpu":{"user":"0.01","nice":"0.00","system":"0.00","wait":"0.08","steal":"0.00","idle":"99.91"}}}})[/COLOR]
    selesai. mudah sekali kan? selanjutnya tinggal membuat aplikasi user-nya ;)
    tapi, sepertinya terlalu panjang kalau ditulis dimari. lagipula, terlalu banyak teori, tidak asik... :p

    ini demo sederhana, untuk aplikasi webapps.


    file:
    - uptime.sh: http://mungil.or.id/pantau/src/uptime.txt
    - tools.php : http://mungil.or.id/pantau/src/tools.txt
    - json.php : http://mungil.or.id/pantau/src/json.txt
     
    Last edited: 23 Sep 2012
    mgilank, Sanisa, mojopahit and 6 others like this.
  2. mixmaxspace

    mixmaxspace Hosting Guru

    Messages:
    1,235
    Likes Received:
    99
    Trophy Points:
    48
    Wah mas berguna banget nih buat kontroling load server :D
    Yang bener kan bukan hanya VPS aja khan :D, Ijin download yah.
     
  3. Doel

    Doel Beginner 2.0

    Messages:
    72
    Likes Received:
    26
    Trophy Points:
    18
    iya sih pak. bukan hanya untuk VPS aja. tapi masih banyak kurangnya. belum keoprek semuanya.

    - cuma nampilin 1 CPU
    - vSwap ga ada (karena di VPS saya ga ada vSwap-nya) .. hehehe

    silahkan pak. bebas kok. diobrak-abrik juga gpp. lisensi GPaL (Gratis, Pake aja Langsung) ... :D
     
  4. PusatHosting

    PusatHosting Hosting Guru Web Hosting

    Messages:
    3,337
    Likes Received:
    326
    Trophy Points:
    83
    Jadi pengen pakai juga tapi sepertinya bisa dijual jika jadi satu paket applikasi monitoring multiserver dengan memanfaatkan API nya.
     
  5. Doel

    Doel Beginner 2.0

    Messages:
    72
    Likes Received:
    26
    Trophy Points:
    18
    @pak PH
    iya pak... bisa dikembangkan. diserahkan ke kreatifitas masing-masing.
    untuk kebutuhan yang lebih besar, saya angkat tangan. hahahah.. belum sampai kesitu ilmunya - saya memakai ini hanya sebatas keperluan pribadi + media pembelajaran + berbagi... :)
     
  6. 1stserver

    1stserver Hosting Guru Web Hosting

    Messages:
    1,801
    Likes Received:
    174
    Trophy Points:
    63
    scriptnya sederhana, tapi manfaatnya keren boz ... great jobs!
    Apa lagi kalau bisa untuk memonitor banyak server dan VPS dalam satu screen, wah mantap boz
     
  7. Doel

    Doel Beginner 2.0

    Messages:
    72
    Likes Received:
    26
    Trophy Points:
    18
    Perbaikan Bash Script

    selamat subuh... terima kasih semuanya atas response positif-nya :)


    @pak 1stserver:
    bisa banyak kok pak. karena ini memakai AJAX, koneksi yang dipakai dalam melakukan request adalah koneksi dari browser user itu sendiri. jadi, tidak ada limitasi, kecuali dari browser (ref: max connection per host - kena delay/queue) - ini alasan saya memilih memakai AJAX (client-side), bukan PHP-CURL (server-side). karena beban sebagian besar ada di user browser (termasuk rendering HTML)


    Perbaikan Bash Script

    agak kurang sreg dengan script awal, saya coba sedikit memperbaikinya agar lebih efisien dari shell script awal -membuat 4 file-, sekarang diperbaiki jadi hanya 1 file dan ter-format dengan rapih. seandainya, ada kesalahan/kekurangan, silahkan ditambahkan/berikan masukkan (terutama para "shell-scripting ninja"). terima kasih :)


    Code:
    #!/bin/bash
    # filename: uptime.sh
    
    dataupt=`awk '{printf("%d:%02d:%02d:%02d",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime`
    datamem=`free -m | grep 'Mem:' | sed -e 's/Mem://' -e 's/  */:/g' -e 's/^://'`
    datacac=`free -m | grep 'buffers/cache:' | sed -e 's/\-\/+//' -e 's/buffers\/cache//' -e 's/  */:/g' -e 's/^:*//'`
    dataswap=`free -m | grep 'Swap' | sed -e 's/Swap//' -e 's/  */:/g' -e 's/^:*//'`
    datasto=`df -H | grep -vE '^Filesystem|udev|tmpfs|cdrom|none' | awk '{ print $2":"$3":"$4":"$5":"$1 }'`
    datacpu=`iostat | awk 'NR==4' | sed -e 's/  */:/g' -e 's/^://'`
    
    # penamaan [xxxxx] ini hanya untuk referensi/demo/development. biar tidak membingungkan :)
    echo "[uptime]"$dataupt > coba.txt
    echo "[cpu]"$datacpu >> coba.txt
    echo "[mem]"$datamem >> coba.txt
    echo "[cac]"$datacac >> coba.txt
    echo "[swap]"$dataswap >> coba.txt
    echo "[stor]"$datasto >> coba.txt
    output yang dihasilkan, jadinya seperti ini:
    Code:
    [uptime]0:07:57:30
    [cpu]8.63:0.04:3.36:0.42:0.00:87.55
    [mem]2004:1705:298:0:64:953
    [cac]687:1316
    [swap]3513:0:3513
    [stor]50G:5.9G:42G:13%:/dev/sda1
    selanjutnya tinggal dilakukan penyesuaian di file "tools.php" agar dapat membaca format baru.
     
  8. Kampunghosting

    Kampunghosting Beginner 1.0

    Messages:
    13
    Likes Received:
    1
    Trophy Points:
    3
    Mantebs nieh pi masih bingung makenya, lom ada VPS soalnya... ehehehehee
    nunggu lo ada VPS ah, sambil dipelajarin scriptnya sapa tau bisa jadi hamburger...
     
  9. cpserv

    cpserv Expert 1.0

    Messages:
    866
    Likes Received:
    123
    Trophy Points:
    43
    ada website utamanya nda? klo ga ada boleh tak donlot + simpen ditempatnya j*alvps ga? nanti linknya tak kirim kesini (atau webnya jenengan klo ada).
     
  10. Tujuh.NSX

    Tujuh.NSX Beginner 2.0

    Messages:
    59
    Likes Received:
    5
    Trophy Points:
    8
    Nice share mas bro, biar script sederhana tapi sangat bermanfaat. izin Copas dulu ya ke notepad, mau disave :D
     
Loading...
Thread Status:
Not open for further replies.

Share This Page

Loading...