Jabber, genellikle anında mesajlaşma amaçlı kullanılsa da, bundan çok daha fazlasını sunmaktadır. ``Benim zaten ICQ'um vardı.'' diyorsanız, hemen iştahınızı kabartacak bazı fikirler sunalım: Web sitenizle chat yapmak ister misiniz? Ya da, sunucunuzun sistem yükünü ya da hata mesajlarını sanki bir arkadaşınızmış gibi size mesaj atmasını? Jabber bizlere, esnek protokolü ve hemen hemen tüm popüler programlama dillerinde yazılmış ve özgür yazılım olarak sunulan programlama araçlarıyla, hayal sınırlarımızın genişliğince imkan tanıyor. Bu yazıda, sistem yöneticilerine ve weblog tutarlara bir kaç örnek ile pratik bir giriş amaçlıyoruz.
Jabber Sunucu
Yazımızın amacı her ne kadar Jabber sunucu kurmaya ve ayarlama yapmaya yönelik olmasa da, belitmeliyiz ki kendi bilgisayarınızda kullanmaya yönelik bir Jabber sunucu kurulumu yapmanız mümkün. http://www.jabber.org/software/servers.php adresinden indirebileceğiniz bir Jabber sunucusu ile işe başlayabilirsiniz. Aslında yazının çerçevesi açısından pek bir fark bulunmasa da ``jabberd 1.x'' sunucusunu seçip yükleyebilirsiniz. Yazı yayına hazırlanırken son stabil sürümü 1.4.3 idi. GNU/Linux dağıtımları (Redhat, Debian ve Mandrake), OpenBSD, Solaris ve Windows/XP platformlari için ikilik paketleri mevcut. Debiandaki kurulumu sonrasında en azından kendi makinenizde ayarlama yapmadan çalışabilirsiniz.
Jabber İstemci
http://www.jabber.org/software/clients.php adresinden seçip kuracağınız bir istemci işinizi görecektir. Sonuçta hepsi temelde aynı işi yapıyor. Ancak, hemen hemen diğer tüm anında mesajlaşma platformlarının da desteklendiği Gaim adlı istemciyi şiddetle tavsiye ediyoruz. Aynı anda hem ICQ hem AIM hem MSN hem de Jabber hesaplarını tek bir programda toplamak isteyenler için çok ideal.
Jabber Hesabı Açma
Gaim kullandığınızı ve "localhost" isimli kendi bilgisayarınızda çalışmakta olan Jabber sunucunuz olduğunu varsayarak iki Jabber hesabı açacağız. Eğer kendiniz bir Jabber sunucu kurmadıysanız, tüm ``localhost'' ifadelerinin yerine ``jabber.org'' yazabilirsiniz. Zira, en çok kullanıcı barındıran Jabber sunucu budur.
Gaim'de Tools->Accounts sekmesi üzerinden açılan pencereden ``Add'' tuşuna basın. Yeni açılan pencereden protokolü Jabber olarak seçin. ``Screen Name'' alanına seçeceğiniz bir kullanıcı adı girin, biz ``slartibartfast'' diyelim mesela. ``Server'' alanına ``localhost'' yazın ve ``Register'' tuşuna tıklayın. Yeni açılan pencerede şifre, isim ve email sorulacak. Bunları da doldurduktan sonra tekrar ``Register'' tuşuna tıklayın. Evet, artık bir Jabber hesabınız var. Aynı işlemleri tekrarlayarak bir tane de ``cmsbot'' isimli hesap yaratalım. Ardından bu iki kullanıcı için de online konumuna geçelim ve birbirlerini listelere alalım.
Programlama Araçları
Eğer iki kullanıcı hesabımızı birbirleriyle mesajlaştırabiliyorsak işin en heyecanlı kısmına geldik sayılır. ``cmsbot'' kullanıcısından çıkalım. Çünkü bu kullanıcıyı programımızı yazarken kullanacağız.
Programlama araçları, yani kütüphaneler, http://www.jabber.org/software/libraries.php adresinde erişime hazır. Biz, yazı çerçevesince Ruby programlama dili için tasarlanmış ``Jabber4R'' ve Python programlama dili için tasarlanmış ``jabber.py'' kütüphanelerini kullanacağız. Siz daha sonra ihtiyaçlarınıza göre farklı diller için yazılmış kütüphaneleri de kullanabilirsiniz; mesela PHP için ``PHPJabberClass'' gibi.
Ruby ve Sistem Yöneticileri
Ruby programlama dili, GPL olarak dağıtılan, nesne yönelimli ve sitesinde de belirtildiği gibi gerçek bir programcı dostu dildir. Vesile ile Ruby'yi methedip, ufak da olsa motivasyon babında bir giriş yapalım. http://www.ruby-lang.org adresinden dile ait dökümantasyon ve yorumlayıcılar indirilip incelenebilir. Jabber ile ilk deneyimimizi sistem yöneticileri tarafından çok kullanışlı bulunabilecek bir fikir üzerinde edinelim: Sistem her 10 saniyede bir, sistem yükünü ve ayakta olduğu süreyi bize arkadaşımızdan mesaj geliyormuş gibi göndersin. Bu kod parçası için önceden belirttiğimiz gibi ``Jabber4R'' kütüphanesine ihtiyacımız var. Ruby yorumlayıcısını ve kütüphaneyi kurduğunuzu varsayıyoruz. Şimdi sistem.rb isimli bir dosya açalım ve aşağıdaki kod parçasını yazalım:
require 'jabber4r/jabber4r.rb' $status = {} session = Jabber::Session.bind_digest("cmsbot@localhost/uptime", "jaberpass") session.announce_initial_presence session.add_message_listener{ |msg| if (msg.body.include? "basla") value = msg.body.split[1] $status[msg.from.to_s] = "running" t = Thread.new { while $status[msg.from.to_s] == "running" data = `uptime`.split[7] if (data.to_f >= value.to_f) reply = Jabber::Protocol::Message.new(nil) reply.to = msg.from reply.thread = msg.thread reply.type = msg.type reply.set_body(`uptime`) reply.set_subject("your uptime request") session.connection.send(reply) end sleep 10 end } elsif (msg.body.include? "dur") $status[msg.from.to_s] = "stop" end } Thread.stopBu dosyayı Ruby yorumlayıcısıyla çalıştırabilirsiniz (``ruby sistem.rb'' demeniz yeterli). Umarız her şey yolundadır. Program çalışmaya başladıktan sonra, ``cmsbot@localhost'' isimli kullanıcıya ``basla'' mesajını gönderin. ``cmsbot'' isimli arkadaşınız, size, çalıştığı makinanın anlık sistem yükü bilgilerini ve ayakta kalma süresini postalayacaktır. Kodun üzerinden şöyle bir geçelim. Aynen, bir soket bağlantısı yapıyormuş gibi, session = Jabber::Session.bind_digest("cmsbot@localhost/uptime", "jaberpass") satırıyla Jabber sunucuya bağlantı yapıyoruz. Hemen ardından session.announce_initial_presence diyerek ``roster''ımızdaki, yani kullanıcı listemizdeki tüm kişilere hatta olduğumuzu bildiriyoruz. Daha sonra da, herhangi bir mesaj gelmesi durumuna karşılık, session.add_message_listener{ |msg| ...(aksiyon)...} komutuyla bir aksiyon belirliyoruz. Aksiyonumuz şundan ibaret: Eğer mesajın içeriği ``basla'' ise, ``running'' konumuna geç ve running konumu süresince de mesajı gönderen kişiye her 10 saniyede bir ``uptime'' sistem komutunun sonucunu gönder. Eğer, mesaj içeriği ``dur'' ise, ``running'' konumundan çıkıp, ``stop'' konumuna geç. ``Thread'' komutu ise birden fazla isteğe cevap verebilmek için kullanılıyor.
Bunun ötesinde neler yapılabilir? Sistem yöneticisinin ihtiyaçları doğrultusunda ve yaratıcılık sınırları dahilinde hemen herşey.
Python ve Web Geliştirme
Günümüzde bir çok web içerik yönetim paketi kullanılıyor. Büyük çoğunluğunda, web sitesi sahibi, web üzerinden erişilen bir arayüz aracılığıyla sitesine içerik ekliyor ya da içeriği değiştiriyor. En çok ihtiyaç duyulan şeylerin başında da haber ve bloglar geliyor.
Bu ihtiyacı karşılamanın nasıl daha kolay ve eğlenceli bir yolu olabilir? Mesela anında mesajlaşma yöntemi gibi? Arkadaşlarızla mesajlaştığınız bir program aracılığıyla web sitenizin içeriğine müdahale etmek gibi? Deneyelim, görelim...
Bu sefer Python kullanacağız. Yine Ruby gibi, hızla büyüyen geliştirici topluluğu, öğrenme kolaylığı ve geliştirme zamanını ciddi oranda azaltan özellikleriyle Python geleceğin dillerinden belki de en önemlilerinden. GPL uyumlu lisansı da kendisine olan ilgimizi arttırıyor.
Python kütüphanelerinden ``jabber.py'' internetten indirilebilir. Paketin içerisinden çıkan 3 dosya önemli: jabber.py, debug.py, xmlstream.py. Bu kütüphane dışında ``xmlrpclib'' kütüphanesine de ihtiyacımız var. Bu üç dosyayı kopyaladığımız yerde çalışacağız.
Öncelikle, bir echo sunucu yaratalım. Bizim ona gönderdiğimiz tüm mesajları bize geri atsın. echo.py isimli bir dosya yaratalım ve içerisini aşağıdaki gibi dzenleyelim.
import jabber import xmlrpclib import sys def messageReceived(con, msg): con.send(jabber.Message(str(msg.getFrom()), "Echo: " + msg.getBody())) try: con = jabber.Client(host = "localhost", log = sys.stderr) con.connect() except: sys.exit(0) if(not con.auth("cmsbot", "jabberpass", "echo sunucu")): sys.exit(1) con.sendInitPresence() con.registerHandler("message", messageReceived) while(True): con.process(1)con = jabber.Client(host = "localhost", log = sys.stderr) satırıyla Jabber istemci nesnemizi ilklendiriyoruz ve con.connect() satırıyla da bağlantıyı gerçekleştiriyoruz. Bağlantı gerçekleştikten sonra da con.auth("cmsbot", "jabberpass", "echo sunucu") komutuyla onay alıyoruz. Hata durumunda da program sys.exit() komutuyla sonlandırılıyor. Bu işlemlerin hepsini Rubyde session = Jabber::Session.bind_digest("cmsbot@localhost/uptime", "jaberpass") komutu ile yapmıştık. Daha sonra, con.sendInitPresence() komutuyla listedeki kullanıcılara hatta olduğumuzu söylüyoruz. Bunun ardından con.registerHandler("message", messageReceived) komutu aracılığıyla da, herhangi bir mesaj gelmesi durumunda hangi fonksiyonun çalışacağını bildiriyoruz. Bizim örneğimizde ``messageReceived'' fonksiyonu çalışacak. İş bitti sayılır. En başta tanımladığımız ``messageRecevied'' fonksiyonu da papağan görevini üstleniyor. Kim bize ne söylediyse, biz de ona aynısını söylüyoruz: con.send(jabber.Message(str(msg.getFrom()), "Echo: " + msg.getBody()))
Şimdi ``python echo.py'' diyerek programımızı çalıştıralım. Evet, gönderdiğiniz her mesajı, sanki ilkokulda bizi sinir etmek için her dediğimizi tekrarlayan arkadaşlarımız gibi bize tekrar eden bir program arkadaşımız var. Aslında onu biz programladığımıza göre, ne istersek onu yaptırabiliriz. Ne gibi? Mesela, her gönderdiğimiz mesajı websitemizdeki bir dosyanın sonuna ekleyerek ziyaretçilerin anlık gönderdiğimiz mesajları izlemesine imkan tanımak gibi; bir nevi blog.
Yapacağımız tek bir şey var: messageReceived() fonksiyonunu istediğimiz doğrultuda yani aşağıdaki gibi değiştirmek.
def messageReceived(con, msg): file = open("/var/www/html/blog.html", "a") content = "<p><b>%s</b></p> <p><b>Posted by %s</b></p> <p>%s</p>"% (msg.getTimestamp(), msg.getFrom(), msg.getBody()) file.write(content) file.closeHepsi bu! Biz ona her mesaj gönderdiğimizde, programımız, web sunucumuzun gördüğü ve dosya işlemeye iznimizin olduğu bir klasördeki blog.html isimli bir dosyaya mesajı ekliyor.
Bitirirken
Bu örnekler, daha genişletilebilir ve güvenliği arttırılması gereken betiklerden oluşuyor. Genişletmekten kastımız ne? Örneğin, Python ile MySQL veritabanına erişmek ve yazmak çok kolay. Blog örneğimizi bu şekilde değiştirebiliriz. Üstelik, blog örneğinin web sunucusu tarafında da ``PHPJabberClass'' kullanarak gönderdiğiniz blog girişlerine gelen ziyaretçi yorumlarını onaylama işlemini anında yapabilirsiniz. Böylece istenmeyecek yorumları engellemiş olursunuz. Bu arada unutulmaması gereken nokta; prensipte, Gaim programı da ICQ da bizim bu sayfalarda yaptığımızdan çok farklı şeyler yapmıyorlar. Sonuçta, ihtiyacınıza yönelik bir Jabber istemcisi yazmak elinizde. Mesela, ``Subject'' alanına ihtiyac duyuyor ve resim dosyası gibi bir ikilik dosya göndermek istiyorsanız, istemciyi de kendiniz yazabilirsiniz. Böylece tam anlamıyla bir içerik yönetim platformunun yaratıcısı olmuş olursunuz. Çok daha farklı bir uygulama imkanı daha; istatistiki ve matematiksel hesaplamada faydalı olabilir: siz kodu ya da veriyi yazıp gönderin, programınız da bulunduğu yerde kodu ya da veriyi yorumlasın ve sonucunu size göndersin. Son bir not: bir Jabber sunucunuz varsa, bu sunucuyu diğer tüm anında mesajlaşma protokolleriyle haberleştirme imkanınız da var (bknz: http://www.jabber.org/software/components.php). Daha önce de dediğimiz gibi, aslında yaratıcılığımız el verdiğince Jabber dünyasından dilediğimizce faydalanabiliriz.
Jabber bir XML akım teknolojisidir. RPC kullanarak programlanıyor. Jabber protokolünü kendi kendinize uygulama imkanına da sahipsiniz. Çok daha gelişmiş, ticari ve düşük seviyeli programlama işlerini yapmanıza da olanak tanıyan bu protokol, sağladığı çalışma çerçevesi ile gerçekten iyi bir programlama aracı. Az uğraş ile çok işler yapabileceğimiz şeyler aramıyor muyduk?
Mutlu ve Jabberli günler!
[1] http://www.jabber.org
[2] Dr. Dobbs Journal, Mart 2004
[3] http://jabberpy.sourceforge.net
[4] http://jabber4r.rubyforge.org
Vehbi Sinan Tunalıoğlu