DIY: Membuat Aplikasi Sederhana Pemantau VPS


Status
Not open for further replies.

Doel

Beginner 2.0
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( $file, NULL, NULL, 10);
    $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:

Doel

Beginner 2.0
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
 

Doel

Beginner 2.0
@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... :)
 

Doel

Beginner 2.0
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.
 

Kampunghosting

Beginner 1.0
Mantebs nieh pi masih bingung makenya, lom ada VPS soalnya... ehehehehee
nunggu lo ada VPS ah, sambil dipelajarin scriptnya sapa tau bisa jadi hamburger...
 

cpserv

Expert 1.0
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).
 
Status
Not open for further replies.

Top