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.
[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
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
Neler yapılmış burda? Temel amaç ne anlayamadım...??? Çok mu ileri bir konu yoksa???
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.
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.
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.
Makale
Haber
Ders
İlişkili ders bulunamadı.
Etkinlikler
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ı
Kimler Burada? 
Son 1 dakika içinde MMIstanbul' da 60 (50 kayıtlı, 10 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:
MMIstanbul Blog'undan
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)











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.