Türkiye Online Medya Araştırması
Profili Göster

Flex ve Python ile Linux icin Disk Kullanim Monitoru Yapmak

Selcuk.Bozdag Tarih: 10/06/2009 Yorum: 5 adet

Okunma : 1616 Tutanlar: Bu yazıyı 2 kişi tuttu.

Java ve Flex kullanarak uzunca bir suredir calisirken, bir yandan da Python ile bir projeye baslamaya karar verdim. Vizyonumu, Python nesnelerine Python icerisinden erisebilmek ve metodlarini cagirabilmek olarak belirledim. Bu asamada bana yardimci olabilecek en hizli arac ve protokolleri kullanmaya karar verdim.

PyAMF PyAMF, Python uygulamalariniza AMF protokolu ile Flex istemcilerin istek alisverisi yapabilmesini sagliyor. Guzel olani, kurulum icin yapmaniz gereken tek seyin "easy_install pyamf" olmasi. PyAMF, bir kutuphane olarak Python kutuphane dizinine kuruluyor. Bu asamadan sonra artik yapmaniz gereken programinizda bir method sozlugu olusturmak ve gelen isteklerin hangi metodlara gidecegini bu sozlukte belirtmek. (Ref: www.pyamf.org)

CherryPy PyAMF ile bircok Python catisini kullanmaniz mumkun. CherryPy gelen istekleri ele almamda bana yardimci olabilecek en iyi cozumlerden biri. Bu nedenle bu deneyde CherryPy'i sectim.

Degrafa Kutuphanesi Flex ile kullanabileceginiz bir grafik kutuphanesidir. Bu kutuphanenin en onemli ozelligi XML tanimlariyla cizim yapabilmeniz. Aslinda burada "declarative" cizim yapabilmenin ne demek oldugunu anlatmaya calisiyorum. Degrafa kullanilarak gelistirilmis bazi yenilikci kontrollere rastladim. Bunlara yine Degrafa'nin web sitesinde ornekler altinda rastlayabilirsiniz.

Monitorun Yapimi Flex istemcisinden gelen istekler AMF protokolu ile Python sunucusuna iletiliyor. Ardindan servis adi-fonksiyon haritasindan ilgili fonksiyon cagriliyor.

MMİstanbul
[Sekil 1: Genel Gorunum, sistem cagri semasi]

Gorevimiz, bazi dizinlerdeki bos alanlari goruntulemek. Tabi bunu gercek zamanli yapabilirsek daha iyi olurdu ancak bunu bir sonraki surume birakalim. Linux komut satirini kullanmak bu acidan cok ama cok faydali. Python ile bos kalan alanlari hesaplamak icin bazi forum sitelerinde yazilanlari okudukca, Bash ile bunun daha kolay oldugunu gordum, bu nedenle Bash komutlarini Python sistem cagrilariyla cagirmaya karar verdim.

Linux Bash Kabugunda Dizindeki Kullanilmis Alanin Hesaplanmasi

Diyelim ki /home dizinindeki kullanilmis alani ogrenmek istiyorsunuz.


"df -k /home"

komutu ile soyle bir ciktiya ulasmaniz mumkun:

Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 15773312 4997400 9974672 34% /

Buradaki 34 katarini bu ciktidan cikarabilmek icin asagidaki borulu (pipelined) komut zincirinden yararlanalim.


df -k /home | awk '{print $5}' | sed -e "s/%//" | egrep -i -v "use"

Boylece "34" u ayiklamis olduk.

Python Servis Sunucusunun Kodlanmasi

 
import cherrypy
from pyamf.remoting.gateway.wsgi import WSGIGateway
import sys, os
import commands
from os.path import *

def kullanim_hesapla(dizin):
    command = 'df -k ' + dizin + ' | awk \'{print $5}\' | sed -e \"s/\%//\" | egrep -i -v \"use\"'
    bos_alan = commands.getoutput(command)  
    return int(bos_alan)

#Servis sozlugu 
services = {
    'disk.kullanim': kullanim_hesapla,
    # digerleri de buraya
}   

class Root(object):
    def index(self):
        return "Ana Sayfa"
    index.exposed = True

config = {
    '/crossdomain.xml': {
        'tools.staticfile.on':True,
        'tools.staticfile.filename': '/home/selcuk/crossdomain.xml'
    }
}

cherrypy.tree.graft(WSGIGateway(services), "/gateway/")
cherrypy.quickstart(Root(), config=config)

Servisin erisim adi "disk.kullanim" olarak sozluge konuldu ve parametre olarak dizin adi aliyor, ornegin "/tmp". Calistirmadan once kod icerisinde belirtildigi uzere "/home/selcuk/crossdomain.xml" dosyasini da olusturmam gerekli. Kendi dosya yolunuzu burada belirtmeniz gerekiyor tabi ki(/path/to/crossdomain.xml).

crossdomain.xml dosyasi da su sekilde:


<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM 
    "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">

    <cross-domain-policy>
            <site-control permitted-cross-domain-policies="all"/>
            <allow-access-from domain="*" secure="false"/>
            <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
    </cross-domain-policy>

"crossdomain.xml" dosyasi ne ise yarar? Bir web istemcisinin farkli makinelerden veri tasimasi icin gerekli izinleri iceren XML dosyasidir. Bu dosya sunucu tarafinda olmalidir. Boylece, servislerinize kimin erisip erisemeyecegini belirtirsiniz. Konu hakkinda ayrintili bilgi almak icin http://www.adobe.com/devnet/articles/crossdomainpolicyfile_spec.html adresine basvurunuz.

Flex istemcimizin kodlanmasi

Degrafa (Declarative Graphics Framework), Flex 2 ve 3 ile uyumlu, MIT lisansina sahip, MXML sozdizimi ile cizim yapmanizi saglayan bir grafik kutuphanesi. Bu kutuphaneyi kullanarak baska bilesenler yaratmak mumkun. Ornegin bir Termometre ya da Gauge. Daha fazla bilgi ve kurulum icin http://www.degrafa.org adresini ziyaret ediniz.

Ornek vermek gerekirse, bir cizgi cizmek icin degrafa kutuphanesiyle su sekilde bir kod yazilabilir:


<degrafa:GeometryGroup> 
    <geometry:HorizontalLine x="0" x1="200"/>     
</degrafa:GeometryGroup>

Goruldugu uzere, MXML ile deklaratif bir kullanim soz konusu. Bu primitiflerden baska bilesenler uretenler de var. Biz bu ornegimizde "Gauge" kullanacagiz.

Flex Projesinin Olusturulmasi Projemizde kutuphaneler bolumune "DegrafaBeta3.1Flex3.swc"(benim kullandigim surum bu, ama siz en yeni surumu kullanabilirsiniz) adli kutuphaneyi eklemeliyiz. Ardindan, kullanacagimiz Gauge bileseninin kaynak kodunu, kaynak kodlarimizin yer aldigi dizine (genellikle "src") koymaliyiz.

Istemci Kodu


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
        xmlns:degrafa="http://www.degrafa.com/2007"
        xmlns:flash.filters='flash.filters.*'
        xmlns:local="*" xmlns:controls="com.brightPoint.controls.*"
        creationComplete="setupGauge();">

    <mx:Style>
                .gaugeSkin {
                    faceSkin:        ClassReference("com.brightPoint.controls.gauge.GaugeSkin");
                    indicatorSkin:        ClassReference("com.brightPoint.controls.gauge.GaugeSkin");
                    indicatorCrownSkin:        ClassReference("com.brightPoint.controls.gauge.GaugeSkin");
                    highlightSkin:        ClassReference("com.brightPoint.controls.gauge.GaugeSkin");
                }

                .gaugeLabel {
                    fontSize:11pt;
                    font-weight:bold;
                    color:#FFFFFF;
                }
    </mx:Style>

    <mx:RemoteObject id="ro" endpoint="http://localhost:8080/gateway" destination="disk">
        <mx:method name="kullanim" result="showResults(event)" fault="showError(event)"/>
    </mx:RemoteObject>
    <mx:RemoteObject id="ro2" endpoint="http://localhost:8080/gateway" destination="disk">
        <mx:method name="kullanim" result="showResults2(event)" fault="showError(event)"/>
    </mx:RemoteObject>

    <mx:Script>
    <![CDATA[
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.effects.easing.*;


        private function setupGauge():void {
                var values:Array=[0, 50, 70, 100];
                var colors:Array=["0x00BB11","0xFFFF00","0xFF0000"];
                var alphas:Array=[".7",".7",".7"];
                // birinci disk icin                
                gauge.setStyle("alertValues",values);
                gauge.setStyle("alertColors",colors);
                gauge.setStyle("alertAlphas",alphas);             
                gauge.invalidateDisplayList();
                // ikinci disk icin
                gauge2.setStyle("alertValues",values);
                gauge2.setStyle("alertColors",colors);
                gauge2.setStyle("alertAlphas",alphas);                
                gauge2.invalidateDisplayList();
        }
        // birinci diskin monitor fonksiyonu
        private function showResults(event:ResultEvent):void {
            gauge.value = Number(event.result);
        }
        // ikinci diskin monitor fonksiyonu
        private function showResults2(event:ResultEvent):void {
            gauge2.value = Number(event.result);
        }
        // hatalari gosterir
        private function showError(event:FaultEvent):void {
             Alert.show(event.fault.faultString);
        }
        // gercek zamanli olmadigindan
        // ve bir "timer" kullanmak istemedigimden
        // tazeleme butonunu yeterli buldum, bu basit ornek icin.
        private function tazele():void {
            ro.kullanim("/home");
            ro2.kullanim("/usr");
        }
    ]]>
    </mx:Script>

        <controls:DegrafaGauge
                id="gauge" diameter="140" liveDragging="false" horizontalCenter="0" 
                verticalCenter="0" styleName="gauge"
                startAngle="45"  minimum="1" maximum="100"
                endAngle="315" labelStyleName="gaugeLabel" labelFormatter="{formatter}"/>
        <controls:DegrafaGauge
                id="gauge2" diameter="140" liveDragging="false" horizontalCenter="0" 
                verticalCenter="0" styleName="gauge" 
                startAngle="45"  minimum="1" maximum="100"
                endAngle="315" labelStyleName="gaugeLabel" labelFormatter="{formatter}"/>   
        <mx:Button label="Tazele" click="tazele()"/>
    <mx:CurrencyFormatter precision="0" id="formatter" currencySymbol="%" alignSymbol="left"/>        
</mx:Application>

Kotu ornek?

  • Iki ayri RemoteObject tanimlamadan nasil yapilabilirdi?
  • Degisken isimleri berbat
  • Gauge icin gerekli olan "labelformatter" CurrencyFormatter olarak kuruldu. Bunun tek nedeni "%" isaretini kullanmak istememdi, daha iyi bir yontem ne olabilir?

Ekran Goruntusu

MMİstanbul [Sekil 2: Ekran Goruntusu]

Neler Ogrendik?

  • PyAMF ile Flex'i AMF protokolu ile konusturduk.
  • Degrafa kutuphanesini tanidik.
  • Dolayli olarak Linux komutlarina Flex uzerinden nasil erisilir.

Ornek Bir Calisma Bu yaziyi yazdigim makinede Ubuntu kurulu ve Gnome'da su menuyu takip ederseniz "Applications > Accessories > Disk Usage Analyser" guzel bir masaustu uygulamasi gorebilirsiniz. Veriyi goruntuleme yontemini web'e tasimak mumkun diye dusunuyorum.

Bundan Sonrasi Aslinda bu projeyi biraz genisletmek isterim. Bakiniz ki, Zengin Internet Uygulamalarini kullanan (RIA) kac tane cevrimici sistem monitor araci var? (Ben bakmadim :) Acik kaynak ve ucretsiz, cok dil destegi olan bir arac yapabiliriz eger boyle birseye ihtiyac oldugunu dusunuyorsaniz. Konuda ben de varim, desteklerim, diyen Linux, Flex, Python ve Tasarim gonullulerinin epostalarini bekliyorum: sbozdag <at> gmail <dot> com

Yukaridaki uygulamadaki aciklari, dezavantajlari ve yapilabilecek iyilestirmeleri de burada tartisalim.

Okudugunuz icin tesekkurler.

Selcuk Bozdag

aç-kapa İçeriğin rss beslemesi kullanımda değil Yorumlar

Profili Göster
Hakan DAMAR 13/06/2009

Güzel bir makale olmuş. Daha detaylı datalar sunulabilirse belki bu uygulama bir remote system monitoring tool'na dönüştürülebilir.

Python konusunda bende destek olabilirim.

İyi çalışmalar diliyorum.

Profili Göster
Selim Sandal 19/06/2009

Neler yapılmış burda? Temel amaç ne anlayamadım...??? Çok mu ileri bir konu yoksa???

Profili Göster
Selcuk.Bozdag 20/06/2009

Bu makalede flex ile bir linux sistem monitory gelistirme amaci var.sunucu tarafinda veritabani olmadan da faydali RIA yazilimlari uretmek mumkun. Kullanilan teknik ve araclar bence yenilikci ve sonucta cikan urun son derece faydali.

Tabiki roket bilimi degil bu ama alaninda cok ozel bir yere sahip olacaktir diye dusunuyorum.

Bugun internetteki cogu yazilim basit fikirler etrafinda gelismis. Olaya bu acidan bakmanizi oneririm.

Profili Göster
Tuncay Özbal 20/06/2009

Bence makale gayet güzel ve açıklayıcıydı. Degrafa kütüphanesini bende kullanmıştım 1-2 projede ancak son 3-4 aydır hiç inceleyip takip etme fırsatım olmadı. RSSden takip ettiğim kadarıylada, Degrafa geşliştiricileri hep Curve uygulamaları yapıyorlardı. Degrafa hakkında bi şeyler yazarsanızda pek çok kişiye yardımcı olacaktır diye düşünüyorum. iyi çalışmalar.

Profili Göster
burak sarac 26/06/2009

Selamlar elinize saglik, peki diyelimki localde mevcut sistem araclarinin buyuk bir bolumunde bu tip uygulamalar kullandik performansta ne tur etkileri olabilir? Bende yeni linux kullanicisiyim ve yaziniz guzel bir kaynak.

http://maliboo.pl/projects/FlexFTP/

adresinde bu polonyali arkadasin da bir flex ftp projesi var. Ubuntuma ftp serverimi kurunca suna bide flash arayuz yapilirmi ki diye meraktayken buldum. Belki ilginizi ceker. Agirlikli tasarim konusunda destek olmaktan zevk duyarim ihtiyac olursa.

yeni üyelik | şifremi unuttum

aç-kapa Toplantı Özgür Yazılım ve Linux Günleri '10

Özgür Yazılım ve Linux Günleri '10

İstanbul Bilgi Üniversitesi Bilgisayar Bilimleri Bölümü ve Linux Kullanıcıları Derneği'nin 9 yıldır düzenlemekte oldukları etkinlikler bu yıl `Özgür Y...
Kategori: Toplantı

aç-kapa Yarışma 3. Uluslararası Ekslibris Yarışması: İstanbul 2010

3. Uluslararası Ekslibris Yarışması: İstanbul 2010

İstanbul Ekslibris Dernegi, Feyziye Mektepleri Vakfı ve Işık Üniversitesi, kitaplar için mülkiyet işareti olarak kabul edilen ve üzerinde estetik dege...
Kategori: Yarışma

aç-kapa Konferans Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Generally speaking, the term "New" brought about debates. We try to open up and elucidate the term "New" along with "Interact...
Kategori: Konferans

aç-kapa Konferans 3. Uluslararası Gelecek İçin Öğrenme Alanında Yenilikler Konferansı 2010: e-Öğrenme

3. Uluslararası Gelecek İçin Öğrenme Alanında Yenilikler Konferansı 2010: e-Öğrenme

Konferans ile ilgili ayrıntılı bilgiye aşağıdaki bağlantıdan ulaşabilirsiniz: http://www.futurelearning.org.tr/katilim_cagrisitr.pdf ...
Kategori: Konferans

üyeler Son Kahramanlar...

stats Kimler Burada? web stats

Son 1 dakika içinde MMIstanbul' da 60 (50 kayıtlı, 10 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:

...

Blog Bölümü Blogevi.com'a Taşınıyor

Selam arkadaşlar MMIstanbul'da , tasarımcı ve programcıların blog yazılarını "feedleyerek" MMIstanbul okurlarını MMIstanbul dışın ...

7.500'üncü üyemiz Cem Koç!

Neler Yapılabilir?

500 Hatası Hakkında!

Reklam, MMIstanbul ve Yeni Projeler (Durumumuz Bu Tarzında)

coldfusion mysql ubuntu
 
sponsor adobe istanbul