30 Ekim 2010 Cumartesi

qt vs. gtk+ devam


Bir önceki yapmış olduğumuz testin ise görselleri şu şekilde:

Qt:


Gtk:



qt vs. gtk+ devam


Tekrar Merhaba,

Daha önce yapmış olduğumuz testlerin yanına bir de daha fazla görsellik içeren uygulamanın testini yaptık.

Bilgisayarların teknik özelliklerini tekrar yazıyorum.

Pardus 2009 Gnome ve 2011 Kde yüklü bilgisayarlarda 4GB RAM Intel Core i3 310 işlemci, Pardus 2009 Kde yüklü bilgisayarda İntel Core Duo T2370 @ 1.73 işlemci, 2GB RAM bulunmakta, Ubuntu yüklü bilgisayarda
6GB RAM, Intel Core 2 Duo E6420 @ 2.8Ghz işlemci var.

Pardus 2009'da Python 2.6.5, Qt 4.7.3, Gtk 2.16, Pardus 2011'de Python 2.7, Qt 4.8_20100928, Gtk 2.16, Ubuntu 10.10'da Python 2.6.6, Qt 4.7.4, Gtk 2.21 var.

[0] adresindeki dosyadaki;

2009gnometest dizininde -> Pardus 2009 yüklü, Python 2.6.5, Qt 4.6.3, Gtk 2.18.9
bulunan bilgisayardaki test sonuçları,
2009kdetest dizininde -> Pardus 2009 yüklü, Python 2.6.5, Qt 4.6.3, Gtk 2.18.9
bulunan bilgisayardaki test sonuçları,
2011kdetest dizininde -> Pardus 2011 yüklü, Python 2.7, Qt 4.7.0, Gtk 2.22.0
bulunan bilgisayardaki test sonuçları,
ubuntutest dizininde -> Ubuntu 10.10 yüklü, Python 2.6.6, Qt 4.7.4, Gtk 2.21
bulunan bilgisayardaki test sonuçları bulunmaktadır.

Bu dosyalardaki;
fr_idle_qt.txt, fr_idle_gtk.txt dosyaları bilgisayarların boştaykenki free çıktıları,
ps_idle_qt.txt, ps_idle_gtk.txt dosyaları bilgisyarların boştaykenki ps aux çıktıları,

dosyalardaki idle yerine run1 olanlar betikler ilk kez çalışıyorkenki çıktılar, run2 olanlar ise ikinci kez çalıştırdığımızdaki çıktılar.
end1 olanlar betikler ilk kez kapatıldıktan sonraki çıktılar, end2 olanlar ise ikinci kez kapatıldığındaki çıktılardır.

Ayrıca /proc/$PID/status dosyaları da comak-test-gtk-status.txt ve comak-test-qt-status.txt olarak bulunmaktadır.

---------------------------------------------------------------------------------

Bunların yorumlanmış hali ise şu şekilde:

Pardus 2009 Gnome bilgisayarında:

QT için:

ps aux çıktısı:

1226 2.1 0.7 52168 23948 pts/1 S+ 21:46 0:00 python comak-test-qt.py

free çıktısında:

çalışırken 14MB civarı bellek kullanıyor. Kapattıktan sonra ise 8MB fazla gözüküyor.
Yani betik kapatıldığında sadece 6MB sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa, çalışırken 8MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı belleğin 7MB'sini boşaltıyor.

GTK için:

ps aux çıktısı:

1207 0.5 0.4 25528 15272 pts/1 S+ 21:39 0:00 python comak-test-gtk.py

free çıktısında:

çalışırken 5MB civarı bellek kullanıyor. Kapattıktan sonra ise 5MB civarı fazla gözüküyor.
Yani betik kapatıldığında neredeyse tamamı bellekte duruyor.

Eğer aynı uygulama tekrar çağırılırsa, çalışırken üzerine nereyse hiç bellek kullanmıyor.
Kapattıktan sonra ise toplam kullandığı 5MB belleği tamamen boşaltıyor.

Pardus 2011 Kde bilgisayarında:

QT için:

ps aux çıktısı:

1604 1.8 0.7 295232 31116 pts/2 S+ 23:09 0:00 python comak-test-qt.py

free çıktısında:

çalışırken 12MB civarı bellek kullanıyor. Kapattıktan sonra ise 2MB fazla gözüküyor.
Yani betik kapatıldığında sadece 10MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa, çalışırken 12MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı belleğin 11MB'sini boşaltıyor.

GTK için:

ps aux çıktısı:

1617 0.2 0.9 332536 36980 pts/2 S+ 23:19 0:00 python comak-test-gtk.py

free çıktısında:

çalışırken 26MB civarı bellek kullanıyor. Kapattıktan sonra ise 13MB ye yakın fazla gözüküyor.
Yani betik kapatıldığında kullandığı belleğin 13MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa, çalışırken 14MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı belleğin tamamını boşaltıyor.

Ubuntu bilgisayarında:

QT için:

ps aux çıktısı:

engin 2060 1.1 0.5 361104 32268 pts/1 Sl+ 21:31 0:00 python comak-test-qt.py

free çıktısında:

çalışırken 31MB civarı bellek kullanıyor. Kapattıktan sonra ise 20MB fazla gözüküyor.
Yani betik kapatıldığında sadece 11MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa, çalışırken 12MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı belleğin 11MB'sini boşaltıyor.

GTK için:

ps aux çıktısı:

2073 1.3 0.4 323416 24540 pts/1 Sl+ 21:25 0:00 python comak-test-gtk.py

free çıktısında:

çalışırken 13MB civarı bellek kullanıyor. Kapattıktan sonra ise 1MB ye yakın fazla gözüküyor.
Yani betik kapatıldığında hemen hemen hepsini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa, çalışırken 12MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 12MB belleğin 10MB ini boşaltıyor.

Pardus 2009 Kde bilgisayarında:

QT için:

ps aux çıktısı:

1620 0.6 1.0 72652 21608 pts/2 S+ 21:27 0:00 python comak-test-qt.py

free çıktısında:

çalışırken 16MB civarı bellek kullanıyor. Kapattıktan sonra ise 11MB fazla gözüküyor.
Yani betik kapatıldığında sadece 5MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa, çalışırken 12MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 12MB belleğin 5MB ini boşaltıyor.

GTK için:

ps aux çıktısı:

1448 2.7 0.7 25388 15344 pts/2 S+ 21:37 0:00 python comak-test-gtk.py

free çıktısında:

çalışırken 23MB civarı bellek kullanıyor. Kapattıktan sonra ise 19MB fazla gözüküyor.
Yani betik kapatıldığında sadece 4MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa, çalışırken 9MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 9MB belleğin 3MB ini boşaltıyor.

Bu sonuçların görselleştirilmiş halleri ise şu şekilde:

Bu testin sonuçlarının, bir önceki hello world testine göre biraz daha farklı olduğunu fark ettikten sonra her 2 testi de bir kez daha yaptık. Fakat değişen bir şey yok. Değerler hakikatten buna çok yakın. Bir gariplik var evet, incelemeye devam...

[0] http://www.mesutcankurt.com/dosyalar/comak-testler2.tar.bz2

29 Ekim 2010 Cuma

qt. vs. gtk


Merhabalar,

ÇOMAK projesinde hangi teknolojiyi kullanacağız sorusu bizi bu karşılaştırmaya itti: Qt vs. Gtk+

Bu konuda daha önce karşılaştırma yapanlar da var.[1], [2], [3]

Bizim Karşılaştırmamız:

[0] adresindeki dosyadaki;

2009gnometest dizininde -> Pardus 2009 yüklü, Python 2.6.5, Qt 4.6.3, Gtk 2.18.9
bulunan bilgisayardaki test sonuçları,
2011kdetest dizininde -> Pardus 2011 yüklü, Python 2.7, Qt 4.7.0, Gtk 2.22.0
bulunan bilgisayardaki test sonuçları,
ubuntutest dizininde -> Ubuntu 10.10 yüklü, Python 2.6.6, Qt 4.7.4, Gtk 2.21
bulunan bilgisayardaki test sonuçları bulunmaktadır.

Ayrıca bir bilgisayarda daha test yaptık. Bu bilgisayarın özellikleri;
İntel Core Duo T2370 @ 1.73 işlemci, 2GB RAM bulunmakta.

2009kdetest dizininde -> Pardus 2009 yüklü, Python 2.6.5, Qt 4.6.3, Gtk 2.18.9
bulunan bilgisayardaki test sonuçları bulunmaktadır.

Bu dosyalardaki;
fr_idle_qt.txt, fr_idle_gtk.txt dosyaları bilgisayarların boştaykenki free çıktıları,
ps_idle_qt.txt, ps_idle_gtk.txt dosyaları bilgisyarların boştaykenki ps aux çıktıları,

dosyalardaki idle yerine run olanlar betikler çalışıyorkenki çıktılar,
end olanlar ise betikler kapatıldıktan sonraki çıktılar.

Bunların yorumlanmış hali ise şu şekilde:

Pardus 2009 Gnome bilgisayarında:

QT için:

ps aux çıktısı:

17848 0.9 1.5 117004 48208 pts/0 S+ 22:16 0:00 python pyqt-hello.py

free çıktısında:

çalışırken 46MB civarı bellek kullanıyor. Kapattıktan sonra ise 21MB fazla gözüküyor.
Yani betik kapatıldığında sadece 25MB sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa,
çalışırken 23MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 23MB belleği tamamen boşaltıyor.
GTK için:

ps aux çıktısı:

1264 0.4 0.4 23856 13976 pts/0 S+ 22:09 0:00 python pygtk-hello.py

free çıktısında:

çalışırken 6.5MB civarı bellek kullanıyor. Kapattıktan sonra ise 2MB ye yakın fazla gözüküyor.
Yani betik kapatıldığında hemen hemen hepsini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa,
çalışırken 5MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 5MB belleği tamamen boşaltıyor.

Pardus 2011 Kde bilgisayarında:

QT için:

ps aux çıktısı:

1783 1.5 1.0 385784 41620 pts/0 S+ 22:20 0:00 python pyqt-hello.py

free çıktısında:

çalışırken 25MB civarı bellek kullanıyor. Kapattıktan sonra ise 10MB fazla gözüküyor.
Yani betik kapatıldığında sadece 15MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa,
çalışırken 15MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 15MB belleği tamamen boşaltıyor.
GTK için:

ps aux çıktısı:

1631 1.5 0.8 325084 35192 pts/0 S+ 22:25 0:00 python pygtk-hello.py

free çıktısında:

çalışırken 25MB civarı bellek kullanıyor. Kapattıktan sonra ise 1MB ye yakın fazla gözüküyor.
Yani betik kapatıldığında hemen hemen hepsini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa,
çalışırken 15MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 15MB belleğin 7MB ini boşaltıyor.

Ubuntu bilgisayarında:

QT için:

ps aux çıktısı:

2047 0.5 0.6 476628 41488 pts/0 Sl+ 22:31 0:00 python pyqt-hello.py

free çıktısında:

çalışırken 73MB civarı bellek kullanıyor. Kapattıktan sonra ise 60MB fazla gözüküyor.
Yani betik kapatıldığında sadece 13MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa,
çalışırken 15MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 15MB belleği tamamen boşaltıyor.

GTK için:

ps aux çıktısı:

2043 0.3 0.3 299932 22056 pts/0 Sl+ 22:27 0:00 python pygtk-hello.py

free çıktısında:

çalışırken 22MB civarı bellek kullanıyor. Kapattıktan sonra ise 4MB ye yakın fazla gözüküyor.
Yani betik kapatıldığında hemen hemen hepsini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa,
çalışırken 11MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 11MB belleğin 3MB ini boşaltıyor.

Pardus 2009 Kde bilgisayarında:

QT için:

ps aux çıktısı:

1412 1.3 1.2 113148 26560 pts/2 S+ 23:23 0:00 python pyqt-hello.py

free çıktısında:

çalışırken 22MB civarı bellek kullanıyor. Kapattıktan sonra ise 18MB fazla gözüküyor.
Yani betik kapatıldığında sadece 4MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa,
çalışırken 10MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 10MB belleğin 8MB ini boşaltıyor.

GTK için:

ps aux çıktısı:

1510 2.0 0.6 23560 14036 pts/2 S+ 23:29 0:00 python pygtk-hello.py

free çıktısında:

çalışırken 24MB civarı bellek kullanıyor. Kapattıktan sonra ise 19MB fazla gözüküyor.
Yani betik kapatıldığında
sadece 5MB'sini boşaltıyor.

Eğer aynı uygulama tekrar çağırılırsa,
çalışırken 9MB civarı daha bellek kullanıyor.
Kapattıktan sonra ise ikinci çağrıda kullandığı 9MB belleğin 3MB ini boşaltıyor.

Bu testin basit bir hello world uygulaması olduğunu göz önünde bulundurursanız bu
sonuçlar daha anlaşılır olacaktır.

Basit bir hello-world dışında, daha fazla görsel ögelerin kullanıldığı testler de yapacağız fakat şimdilik elimizde karşılaştırabileceğimiz bir şeyler oldu.

Bu sonuçların grafiksel karşılaştırmaları ise şu şekilde:




Devamı gelecek...



[0] http://www.mesutcankurt.com/comak/comak_testler.tar.bz2


22 Eylül 2010 Çarşamba

spamassassin ve saz arkadaşları

Uzunca bir süre yazamadım ama gezmek, UPEM, başka işler falan internete de pek nadir girebildim. :)

Neyse, okulun ilk gününde Necdet Hoca ile spamassassin ve saz arkadaşları konusunda el sıkıştık. Artık ben bakıyorum bunlara :)

Spamassassin + 60 Perl bağımlılığı konu olunca insan biraz düşünüyor ama zevkli ya. Öncelikle pspec.xml dosyalarındak Pacakger tagındaki Name ve Email taglarını düzenlemem gerekiyordu. 60+1 paket + bir de 3 tane depoda da uygulamam gerekiyordu. Tek tek yapmak pek de mantıklı değildi. Sonradan da takeover betiğini kullanmak aklıma geldi ama onun yerine daha çok işe (işime) yarayacak bir betik hazırlayayım dedim. Python ile yazdım.

betiğin adı takePisiPackages. Şu an Pardus deposundaki playground'umda[0]. Kullanımı şu şekilde:

takePisiPackages paketlerin_isimleri_bulundugu_dosya yeni_paketci_adi yeni_paketci_eposta

buradaki "paketlerin_isimleri_bulundugu_dosya" ismindeki dosyada paketlerin listesi bulunuyor. Bu dosyada

ffmpeg

şeklinde

ya da

multimedia/video/ffmpeg

ya da

multimedia/video/ffmpeg/pspec.xml

şeklinde olabilir. Yarısı öyle yarısı öbür türlü de olabilir. Eğer sadece ffmpeg var ise bulunduğunuz dizinden itibaren içeri doğru özyinelemeli (recursive) olarak arıyor. Bulduğu yere göre de pspec.xml dosyaları tekrardan düzenleniyor. Arama fonksiyonunu da kendim yazdım.

Eğer isterseniz belirli dosyaları istediğiniz editör ile açabiliyorsunuz. Mesela her açtığınız paketteki actions.py'lere de bakmak isterseniz çalıştırdıktan sonra sorulan soruya 'y' diyorsunuz sonra editör'e vim, dosyaya da actions.py dediğiniz zaman her actions.py de vim ile açılmış oluyor.

Bunlar aslında sadece benim istediğim özellikler, eğer başkalarının da istekleri olursa onları da betiğe eklerim.

Şimdilik betik, sed'leme şeklinde değil de satır satır okuyup ona göre yapıyor. Bunu değiştirip değiştirmeme konusunda kararsız kaldım.

Hepsinin haricinde diğer projelerden:

guestlogin'in isminin değişmesi işi var. Bu işlemi de şöyle yapıyormuşuz. (Serdar'a teşekkürler)

önce sürüm yöneticilerine haber veriyormuşuz. Sonra

eğer paket pardus depolarındaysa paketin ismini devel'de değiştiriyoruz, devel root'undaki distribution.xml dosyasına

yorum satırı içerisinde ( !-- -- tagları) replaced by yeni_paket

ve Package tagı içerisinde eski paket



gibi ekliyoruz. ( burayı düzgün yazamıyorum çünkü blogger bunun öyle yazılmasını istemiyor :)

burada dikkat edilmesi gereken

************************************************************
not gone to binary stable yet, please don't remove this mark
************************************************************


satırlarının altına yazmak. Ondan sonra da devel'i stable ile birleştirmek kalıyor. (stable şu an için sadece Pardus 2009 Deposunda olduğu için sadece 2009 da stable ile birleştirmek var)

python-guestlogin paketinin ismini de pam_guestlogin yapacağım.

Guestlogin'in bir de bug'u mevcut. Aslında bug değil de yeni bir özellik isteği.[1] Onu da yakında tamamlayacağım. Bir de KDM'ye buton eklemek var. (hmm. bitireyim bi ara bunları ya)


[0] https://svn.pardus.org.tr/pardus/playground/mesutcan/takePisiPackages
[1] http://bugs.pardus.org.tr/show_bug.cgi?id=14233

3 Eylül 2010 Cuma

guestlogin ve ptsp_installer projeleri

Öncelikle ptsp_installer projesinden başlayayım.

Hazırlamış olduğum betik zaten çalışıyordu fakat dosya düzenlemelerinde bir kaç iyileştirme yapmam gerekiyordu. (Mesela, gerekli girdi varsa bunun üzerine yazmak gibi)

Bunları tamamladım. Ben henüz bir sorunla karşılaşmadım. Proje aşağıdaki adreste mevcut:

https://svn.pardus.org.tr/uludag/trunk/playground/intern/ptsp_installer

Çalıştırmak için root iken

python ptsp_installer.py

komutunu çalıştırmanız yeterli.

Bunun haricinde de guestlogin projesi artık pardus depolarında. Projenin ismi python-guestlogin oldu.

Şu anki Kurumsal2, Pardus 2009 ve Pardus 2011 test depolarında mevcut.

Kurmak için:

pisi it python-guestlogin

yapmanız yeterli. Bunu kurarken pam_python paketini de bağımlılığı olduğu için kuruyor.

Bunu kurduktan sonra yapmanız gereken değişiklikler:

/etc/pam.d/system-auth dosyasında

auth sufficient pam_unix.so içeren satırın üstüne (genellikle en üstlerde olur):

auth sufficient pam_python.so guestlogin.py

--

session required pam_unix.so içeren satırın üstüne(genellikle en altta olur):

session sufficient pam_python.so guestlogin.py

satırlarını eklemeniz yeterli.

Bu işlemden sonra herhangi yapacağınız bir girişte "/etc/security/guestlogin.conf" dosyasındaki guestname değişkeninde yazanı yazdığınızda parola sormadan giriş yapılacaktır. (Yeni bir misafir kullanıcı oluşturulup)

Şimdilik kdm desteği yok. Bunun için kdebase-workspace'ye bir yama koymamız gerekiyor. Yama burada da bahsettiğim gibi hazır. Bunu depoya da yakında alırız.

Diğer yandan da başka alacağım paketler de olacak. (Projeler ile ilgili değil, Pardus'a katkı olarak)

Şimdilik durum böyle. Yapılması gerekenler şu an kdm'ye buton eklemek. Bunu da halledince buradan yine bilgi vereceğim.

30 Ağustos 2010 Pazartesi

ptsp_installer ve guestlogin projeleri çalışmaları

ptsp_installer projesi ile ilgili, daha önce de yapacağım dediğim, dosyaları düzenlerken girdilerin varlığı kontrolünü ekledim.

Şimdilik hosts ve exports dosyasındakilere bakıyor, dhcpd.conf dosyasında eskisi gibi kalıyor. Bu kontrolü ilk başta:

for line in file_pointer.readlines()

şeklinde yapıyordum. Fakat bu şekilde yapmanın bir açık/sorun yaratabileceğine karar verdim ve bu döngülerden önce:

orig_exports = file_pointer.readlines()

ya da

orig_hosts = file_pointer.readlines()

yapıyor ve ondan hemen sonra da:

file_pointer.close()

yaparak dosya ile işimi bitiriyorum.

Bundan sonra da for döngüsü ile satır satır okuyarak içinde IP'leri arıyorum. Eğer yok ise bunları bir string'e aktarıyorum. En son ise dosyayı "w" modunda oluşturarak (yok ise yarat var ise üzerine yaz) hepsini:

file_pointer.writelines(new_hosts)

veya

file_pointer.writelines(new_exports)

ile yazıyordum. Şimdilik bunlar sorunsuz çalışıyor. Bir sonraki iş olarak dhcpd.conf dosyasını da bu şekilde düzenlemek var.

Guestlogin projesinde de en son Onur'un fikri olan girişte parola sorma fikrini nasıl uygularız diyordum ve aklıma daha önce de gelmiş olan başka birisinin o kullanıcı adı ile giriş yapmasını nasıl engelleriz diye düşündüm. Ben, guestlogin.py üzerinden eğer kullanıcı adı guestX şeklinde ise reddet desem bile bir sonraki modül olan pam_unix burdan giriş yapılmasına izin verecektir.

Şimdilik aklıma bununla ilgili bir çözüm gelmiyor ama bunun bir sorun olacağı kanaatindeyim çünkü bu kullanıcı çıkış yaparken bütün verileri de silinecek ve öbür oturumdaki kullanıcının oturumu muhtemelen kilitlenecek. Bunu önlemenin bir yolunu bulmak lazım.

28 Ağustos 2010 Cumartesi

Pardus Yaz Stajı

Son olarak kısa bir kaç şey yazmak istedim.

Bence bir bilgisayar mühendisinin ve ya Linux ile ilgilenen, kendini geliştirmek isteyen herhangi birisinin kesinlikle gelip görmesi/staj yapması/çalışması gereken bir yer. Ben 20 iş günlük staj süresi boyunca bir çok şey öğrendim. Geliştiriciler hakikatten çok iyi insanlar. Yani kelimeler ile anlatmak gerçekten mümkün mü bilmiyorum ama süper diyelim şimdilik. (bir kelime bulursam ya da bulunursa yazacağım bunu :) )

Buradan herkese tek tek teşekkür ediyorum. Bana bu staj süresinin çok zevkli geçmesini sağladılar. Her gün yeni bir şeyler öğrenme heyecanı gerçekten çok güzel bir şey. (zaten böyleydi ama burada ve Necdet Hoca'nın yanında gerçekten bir başka oluyor bu)

Süper ya :)

27 Ağustos 2010 Cuma

Pardus 2010 Yaz Stajı 20. (Son) Gün

Eveeeet, işte geldik stajın son gününe. Bugün ayrıca yaptığımız projeler ile ilgili bir sunum yapacaktık. Sunumlarımızı yaptık ve stajlarımızı tamamladık.

Sunumlara geçmeden önce yaptıklarımdan bahsedeyim. Öncelikle kdm için yapmış olduğum yamadaki ufak bir hata (aslında blog'a doğru yazmış olduğum ama yamaya yanlış geçirdiğim) sorunu çözmemi biraz geciktirdi. Bugün Fatih'in göstermesi sayesinde SVN'deki yamayı düzelttim. Son yama, Pardus 2009 için hem guestlogin'in hem de AutoLogin'in sorunsuz çalışmasını sağladı.

Yamanın eski hali şu şekilde idi

if (!curuser || psrv != "kde4-np" )

burda psrv'nin tipi char'a pointer olduğu için bir adres döndürüyordu ve "kde4-np" dizgisi (string) de bir adres döndürüyordu ve doğal olarak bunlar aynı olmuyordu. Bu yüzden yama yüzünden AutoLogin çalışmıyordu. Fakat bunu denemek için yazılan ufak C kodu çalışabilir çünkü psrv = "kde4-np" dediğinizde sanırım bir eniyileştirme (optimizasyon) yapılarak adresler eşitleniyor böylece yukarıdaki if sorunsuz çalışıyor. Ama kesinlikle yanlış. Demek ki dikkat etmek gerekiyormuş, dalgınlığa gelmiyor :)

Yamanın sondan bir önceki hali şu şekilde idi: (sadece if kısmı, zaten sadece burası değişiyor)

if (!curuser || strcmp(psrv, "kde4-np") ) {

Fakat sunum sırasında Onur bunun yerine strncmp kullanmamın daha güvenli olduğunu söyledi, anladığım kadarıyla strncmp ile strcmp arasındaki fark da strncmp yaparken ikinci verdiğimiz parametrenin uzunluğu kadar karşılaştırma yapıyor. Yamada bu olay daha iyi anlaşılıyor. Yamanın son hali:

if (!curuser || strncmp(psrv, "kde4-np", strlen("kde4-np"))) {

yani burda karşılaştırma "kde4-np" nin boyutu kadar olacak. Tabiki de bu yamayı da upstream'a yolladım. Upstream'a bizim yama haricinde KDM'deki bug'un çözümü olan yamayı da yolladım. Aradaki tek fark || yerine && kullanıyor olmam. Bunun sebebi de bizde PluginsLogin=generic iken curuser NULL olması gerekirken bir değer atanıyor. (kullanıcı adı) Bu yüzden OR kullanıyorum. KDM'deki bugda da buraya girmesini engellemek gerekiyor. (AutoLogin aktif iken) Bunun için de AND ile "kde4-np" ye eşit olup olmadığını kontrol ediyorum.

Ayrıca bugün bir de bu projeyi Pardus 2011'de de denedim. İlk olarak pam_python paketini oluşturmam gerekiyordu. Zaten review'de olan paketin inşa dosyalarını SVN ile çektikten paketini yapmaya çalıştım fakat henüz python-sphinx paketi daha depoya girmediği için hata veriyordu. Makefile içerisinde dökümantasyonu kapatıp bunu bir yama ile inşa dosyalarına koydum ve paket sorunsuz oluştu. Kurulum da sorunsuz tamamlandı. Guestlogin ile ilgili yapılandırma ve betik dosyalarını gerekli yerlere koyduktan sonra /etc/pam.d/system-auth dosyasında gerekli eklemeleri yaptım. Konsolda sorunsuz çalışıyordu. Sırada KDM vardı. KDM'de çalışabilmesi için kendi yamamı 2011'deki kdebase-workspace'in içine koyup derlemem gerekiyordu. Derleme sırasındaki bir kaç bağımlılıkla ilgili olan sorun sebebiyle (derleme zamanı bağımlılığı eksikliği: akonadi-devel ve docbooc-xml4_2) derlenmiyordu. Bunları Fatih'in yardımıyla hallettim. Aynı zamanda da bu eksiklikleri paket sorumlusuna da bildirdim. İkilik dosyalar oluştuktan sonra KDM'yi sistemden kaldırıp yeni oluşturduğum halini kurdum ve sorunsuz çalıştı. Yani projem Pardus 2011'de de çalışıyordu.

Bir de Onur'dan gelen bir istek olan, misafir kullanıcı giriş yaptığında kullanacağı parolanın sorulmasını araştıracağım. Mesela KDE'de oturup kilitlendiği zaman kullanıcının parolası soruluyor. Aslında misafir kullanıcı sırasında bu kapatılabilir ama parola işlemi mantıklı gözüküyor. Bunu araştırıp uygulamaya çalışacağım.

Şimdilik aklıma gelenler böyle, tabi ki de Pardus'a vereceğim desteğe her zaman devam edeceğim. Bu zaten staj ile sınırlı değildi (daha öncesinden) ve bundan sonrasında da devam edecek.

Ayrıca yapmış olduğum sunumu SVN'e koyacağım. Koyduktan sonra buraya yine adresi vereceğim.

Staj boyunca bana her konuda yardımcı olan herkese, bütün Pardus çalışanlarına çok teşekkür ediyorum.

Staj bitti diye de yazmayı bırakmayacağım tabi ki. Araştırmaya, kendimi geliştirmeye, bir şeyler öğrenmeye devam edeceğim. Ve bunları da buradan aktarmaya çalışacağım.

26 Ağustos 2010 Perşembe

Pardus 2010 Yaz Stajı 19. Gün

Artık Pardus 2010 Yaz stajında son günlere geldik. Proje ile ilgili son sorunlardan birisi olan KDM'ye giriş yapamama ile ilgili başka gelişmeler oldu. Aslında dün hallettim dediğim KDM hallolmamıştı. Başka sorunlar çıktı.

Daha önceden Oswald ile konuştuğum kadarıyla PluginsLogin'i generic yaptığımda istediğim gibi çalışması gerekiyordu. Fakat bizim depoya aldığımız KDM'nin 2 yaması:

same-pam-generic-classic.diff

ve

kdm-fix-generic-greeter.diff

PluginsLogin generic olsa bile classic'miş gibi davranmasına sebep oluyor. Yani kdm/backend/client.c dosyasındaki curuser değişkenine bir şey atamaması gerekirken bir şeyler atıyor. Bununla ilgili nasıl bir çözüm bulabileceğimizi Oswald'a sordum ve haftasonundan sonra halledebileceğimizden bahsetti.

Şimdilik kendi eklediğim yama ile sorunsuz çalışıyor. Biraz daha düzeltme yapmam gerekecek tabi. Tam olarak çalıştığına karar verdiğim halini yine buraya yazmayı düşünüyorum.

Bir de KDM'nin açılış ekranında ek bir menü mü yoksa buton mu koysak konusunda kararsız kalıyorum. Eğer buton koyar isek görünür olup olmamasını kdmrc dosyasına koyacağımız

guestlogin

değişkeni ile sağlayabiliriz. Yani eğer guestlogin true ise buton görünecek, değil ise görünmeyecek. Tabi hem bunun için hem de PluginsLogin için pardus-air temasının xml dosyasını buna göre düzenlemem gerekecek.

Ya da başka bir fikir olarak kdmrc dosyasının içine herhangi bir değişken koymadan, xml dosyasından 2 tane oluşturup biri guestlogin'li diğeri ise guestlogin'siz yapabilirim. Guestlogin'lide buton olur.

Bugün Pardus 2011'in Alpha'sı çıktı. Bunu test etmek için sanal makina'ya bunu kurdum. Öncelikle X'in açılabilmesi için sistem açılırken (ve kurulurken) kernel'e (grub sırasında)

xorg=driver:fbdev

parametresini giriyorum. Bu parametre sayesinde kurulumu tamamladıktan sonra yeniden başlatınca sistem açılmadı. Onur'un ve Gökçen'in çalışmaları sonucu sorunu çözüldü. Anladığım kadarıyla sorun, YALI'da sistem saatinin değiştirilmesinden kaynaklanıyor. YALI saati yanlış ayarladığı için onu düzeltmiştim.

Ayrıca bugün bir şey daha oldu. Serdar'ın uğraştığı ve configure işlemi tamamlandıktan sonra make sırasında tekrar configure dosyasını çağırması sonucu make işlemi patlayan bir paket var, libmpcdec.

En sonunda hatayı çözmüşler ama bana söylemeden hadi bu kodu derle dedi Onur. :). Hmmm diyerek başladım uğraşmaya, sorun aslında basit gibi görünüyordu ilk configure'de sorun olmadığına göre ikinci kez yapılan configure'ü bir şekilde kapatırsam sorun çözülecekti. Configure'ün çağırıldığı yerdeki yazan yazıyı grep'leyip kaynak kodda araştırdım. config.status'de çağırılıyor. Ve düzeltmek için ./configure sırasında oluşturulan "config.status" dosyası içinde ufak bir değişiklik yaptım. Sorunsuz derleniyordu ama neden configure'u tekrar çağırıyordu? Tam olarak bir çözüm bulamıyordum. Onur geldi ve benim bunun neden olabileceği konusunda düşünmeme yardımcı oldu. Sonuç olarak sorun configure.ac dosyasının configure'den yeni olmasıymış. Yani makefile bir yerde bu dosyanın tarihini kontrol ediyor ve tarihi yeni olduğu için bu dosyanın değiştirildiğine kanaat getirip tekrar configure'ü çalıştırıyor.

Bana yukarıda yazdığım deneyimi yaşattığı için buradan tekrar Onur'a teşekkür ediyorum. Ayrıca sabahki yapmış olduğu disk kurtarma operasyonu ile kendisinin bu konulardaki (Linux vb.) bilgisine olan +sonsuzdaki saygımı yine +sonsuz ekleyerek +sonsuza götürmüştür.

25 Ağustos 2010 Çarşamba

Pardus 2010 Yaz Stajı 18. Gün

Artık Pardus 2010 Yaz Stajının son günlerine yaklaştık. Elimde bir adet sorun vardı. Ve yeterince büyüktü. KDM üzerinden giriş yapamıyordum.

Daha önce düşündüğüm gibi

if (!curuser)

yazan yere şimdilik

if (!curuser || strcmp(curuser, "guest") )

olarak değiştirdim ve çalışacak mı diye denedim. Çalıştı. Fakat bu biraz kötü bir çözüm yoluydu. Bununla ilgili upstream ile konuştum.(Oswald Buddenhagen) Bunun yanlış bir yöntem olduğunu ve kdmrc dosyasında

PluginsLogin=generic

yaparsam zaten curuser ataması yapılmadığı için o bloğa girileceğinden bahsetti. Denediğimde çalışmadı çünkü bizim (Pardus) varsayılan temamız "pardus-air" bu kimlik doğrulama metodunu kabul etmiyordu. Değiştirip "oxygen-air" yaptığımda sorunsuz çalıştı. Ama bu sefer de AutoLogin aktif iken çalışmıyordu.

Bununla ilgili hata mesajlarını Oswald'a yolladım ve bunun bir bug olduğuna karar verdik.

Bu hata mesajlarını incelerken dikkatimi çeken şey ise AutoLogin aktif iken PAM doğrulama metodu "kde4-np" yani nopassword girişi. Bu "kde4-np" değerini tutan değişken ise psrv değişkeni. Bunun pam dosyasına baktığımda ise:

#%PAM-1.0

auth required pam_nologin.so
auth required pam_permit.so

satırlarını görüyorum auth bölümünde. Sadece bunlar olduğu için ve bu modüller de kullanıcı adını pek önemsemeden girişe izin verdiği için pam_get_item() fonksiyonunda çakılıyor KDM.

AutoLogin kapalı iken PAM doğrulama metodu "kde4" olarak seçili. Bunun üzerine bir başka yama daha yaptım.

Bu yama

if (!curuser) {

satırını

if (!curuser && psrv != "kde4-np" ) {

olarak değiştiriyor. Bu şekilde denediğimde sorunsuz olarak çalıştı. Bunu upstream'a da yolladım. Aslında doğru bir yöntem değil ama en azından çözüm yolundan bahsetmek açısından yaptım bunu. Bunun yerine de eğer AutoLogin aktif ise curuser in boş olmaması gibi değişiklikler yapılırsa sorunun halledilebileceğinden de bahsettim.

Son aldığımız başka bir karar da KDM ekranında alttaki menüler gibi ayrı bir menü olsun ve simgesi anahtar olsun. (girişi simgelemek adına)

Bu menünün içine bir yandaki kapat, x i yeniden başlat'ın olduğu yerin ordaki konsol girişi ve uzaktan girişi alıp bir de misafir girişini ekleyecektim.

Bu misafir girişi temel olarak kullanıcı adını /etc/security/guestlogin.conf dan alıcak ve kullanıcı adına yazacak sonra da giriş yapacak.

Şimdilik bunun üzerine araştırmalar yapıyorum. Oswald'ın da yardımları sayesinde sanırım menü ekleme işi gayet kolay olacak.

24 Ağustos 2010 Salı

Pardus 2010 Yaz Stajı 17. Gün

Bugün ptsp_installer projesine ufak bir ekleme yaptım. Bu ekleme her adım çalışmadan önce çalıştırılsın mı diye sormak. Henüz bunun kesinlikle kalıp kalmaması konusunda emin değilim ama bence böyle olması daha iyi çünkü bazı dosyaları güncellemek istemeyebilir. (daha önceden güncellenmişi olabilir)

Bunu yaptıktan sonra Pardus Bugzilla'sında benim eklemiş olduğum yamadan sonra oluşan hatayı inceledim. Kendim hatayı tekrarlayamıyordum. Hatayı alan arkadaşın kdmrc dosyasını incelediğimde "AutoLogin" özelliğinin aktif hale getirildiğini fark ettim. Bunun için kendi kdmrc dosyamda da bunu açtım. Fakat yine hata ile karşılaşamadım. Biraz daha araştırdıktan sonra AutoLoginDelay=0 olduğunu gördüm. Bunu uyguladığımda hakikatten kdm'nin çöktüğünü fark ettim. Kdm yi tekrar:

kdm -debug 1

ile açtıktan sonra "/var/log/syslog" dosyasını inceledim. Benim kaldırdığım if bloğu her zaman çalıştığı için orada çakılıyor.

Yaptığım yamayı kaldırdığımda ise bu sorun düzeliyor. Bunun için çözüm arayışlarındayım.

AutoLoginDelay aslında 0 haricinde bir değer olsa sorunsuz çalışıyor ve kdmrc dosyasında '#' lı halinde AutoLoginDelay=10 olarak verilmiş ve varsayılan da 0 gözüküyor. Bunu kullanıcının elle mi oluşturduğunu araştırırken YALI'da eğer otomatik giriş seçilirse bunun 0 olarak ayarlandığını fark ettim.

Öncelikle tahminime göre AutoLoginDelay=0 ise KDM, PAM'i ya çağırmıyor ya da başka bir şekilde çağırıyor ki pam_get_item() fonkisoyunda sorun çıkıyor.

Bunu önlemek için de aklıma bir kaç yöntem geldi.

Başlangıç olarak kdmrc ye

guestlogin=true

satırını ekleyip buna göre o if bloğunu çalıştırmak olabilirdi

if(!curuser || guestLogin)

şeklide mesela. Ama burada da hem guestlogin aktif olup hem de AutoLoginDelay=0 olduğunda sorun olurdu ki bu da istenebilecek bir şey bir şey.

İlk olarak sorunu anlamamıştım ama o if bloğu ile ilgili bir şey olduğunu düşünüp oraya girip girmemesini kontrol etmek adına kullanıcı adını pam_get_item() ile çekiyor ve daha önce çekilmiş olan kullanıcı ismi olan curuser ile karşılaştırıyordum. Fakat bu kodda da kullanıcı adını çekerken sorun olduğunu fark ettim ve sorunun yukarıda da dediğim gibi PAM'ın çağrımı ile ilgili olduğunu düşündüm.

Şimdilik aklımda 2 çözüm var, bunları uygulayacağım.

1. si eğer kdmrc dosyasında

guestlogin=true

ise ve PAM'dan gelen kullanıcı adı eğer

/etc/security/guestlogin.conf (aslında burayı da kdmrc ye koyabiliriz, sonuçta günün birinde bunu değiştirmek istediğimizde kodda tekrar değişiklik yapmamız gerekecek) dosyasındaki

guestname=

satırındaki eşitliğin sağ tarafına eşit ise if bloğu çalışsın diyebilirim. Ya da

yine kdmrc dosyasında

guestlogin=true

ise bir şekilde PAM'in çalışıp çalışmadığını kontrol edip (pamh değişkeninden olabilir belki) ona göre if bloğu çalıştırılabilir.

Bunlar ile ilgili araştırma ve uygulamayı yarın yapmayı düşünüyorum.

23 Ağustos 2010 Pazartesi

Pardus 2010 Yaz Stajı 16. Gün

Eklemem gereken fonksiyonların tamamını ekledim. Şimdilik ptsp_installer projesi de temel hatlarıyla tamamlandı diyebilirim sanırım.

Tabi ki bunun üzerine iyileştirmeler yapmam gerekecek. Şimdilik iyice test ettikten sonra bunlara bakmayı düşünüyorum. Ağ profili oluşturma işi biraz uğraştırdı ama MÜDÜR'ün network.py betiğine bakarak hallettim.

Ayrıca Ağ Profili oluştururken, durumu değiştirme(up/down), ağ kartını listeleme, profilleri listeleme gibi işlemleri fonksiyon fonksiyon yapmanın da bayağı faydasını gördüm. Mesela hem yeni profil oluştururken hem de var olanı aktif ederken durum değiştirme fonksiyonunu kullanıyorum. İleride başka şeyler lazım olduğunda da çok fazla uğraşmadan ekleyebileceğim. Bunların yanı sıra kodun okunabilirliği de artıyor.

Daha önceden de yazmış olduğum yapılandırma dosyasındaki boşluk sebebiyle oluşturmuş olduğum set_key_with_spaces ile set_key fonksiyonlarını birleştirdim.

En sonuna da white_spaces == true ise ona göre işlem yap dedim.

Bir önceki proje olan guestlogin'de sevgili Gökçen ve Koray ile ufak bir şeyler ekleme kararı aldık.

KDM ekranındaki kapat ikonunu açıldığı listeye Misafir Girişi diye bir şey ekleyip, orada tıklandığında giriş yapılmasını sağlamak.

Bunun için bir de kdmrc dosyasına:

guestlogin = true

gibi bir satır eklenerek o listede Misafir Girişinin olup olmayacağı ve KDM için Misafir Girişinin sağlanıp sağlanamayacağını kontrol edeceğim.

Bu arada da ptsp_installer projesinin iyileştirme çalışmaları devam edecek.

ptsp_installer projesi çalışmaları

Ptsp_installer projesinin çalışmaları iyiye gidiyor diyebilirim.

Hafta sonunda bir kaç fonksiyon daha ekledim. Şimdilik en önemli ihtiyacım olan ağ profili oluşturma ve gerekli bilgileri alma fonksiyonunu sonraya bıraktım. Yeni eklediğim fonksiyonlar:

hosts dosyası güncelleme
exports dosyası güncelleme
pts-client.conf dosyası güncelleme

fonksiyonları. Bu dosyaları güncelleyebilmem için sunucu adresi (ip address), ağ maskesi adresi (netmask), ağ geçidi adresi (gateway) gibi adreslere ihtiyacım var. Bunları ilerde ÇOMAR ile alacağım ama şimdilik elle verdim.

Bir de hosts dosyasını düzenlerken kullandığım bir yöntem var. IP adresini aldıktan sonra onun en sonunu alıyorum ve ona istemci sayısına gelene kadar o anki istemciyi ekliyorum.

10.0.0.1(+1)
10.0.0.1(+2)

gibi. IP den maskelerken bunu int() in içinde yapıyorum. Yoksa onu da string olarak algılıyor ve ekleme yapamıyorum.

Karşılaştığım bir sorun ise pts-client.conf dosyasındaydı. Kdmrc dosyasını düzenlemek için kullandığım fonksiyon bunda pek işe yaramıyor çünkü bunda eşittir('=')'den önce ve sonra birer boşluk var. Bunu çözmek için şimdilik set_key fonksiyonunun yanına bir de set_key_with_spaces diye bir fonksiyon daha yarattım. Daha iyi bir çözümü olabilir ona da bakacağım. Bunlardan biri mesela set_key fonksiyonuna bir tane daha değişken alıp oradan dosya ismi pts-client.conf ise ona göre boşluklu atama yap ya da boşluksuz atama yap derim.

Şimdilik durum böyle. Eklemem gereken sanırım 3 tane fonksiyon kaldı. Çalışmaya devam.

21 Ağustos 2010 Cumartesi

Pardus 2010 Yaz Stajı 15. Gün

PTSP installer projesinde, paketlerin kurulu olup olmadığını kontrol ettikten sonra sıradaki iş olarak "kdmrc" dosyasını güncellemeyi yaptım.

Bunu yaparken ilk başta aklıma ConfigParser ile o dosyayı okuyup, gerekli değişikliği de set() fonksiyonu ile sağlamaktı. Fakat bu komut tam olarak istediğim işi yapmıyor. Ben, verdiğim parametrelere uyan değişkeni dosyanın içinde bulup değiştireceğini düşünüyordum fakat yanılmışım.

Bununla ilgili araştırmaya devam ettim. Sonuç olarak, Gökçen'in YALI için yazmış olduğu kdmrc düzenleme fonksiyonunu kullandım. Tam olarak işimi görüyor bu fonksiyon. Bu fonksiyon, YALI'nın kaynak kodundaki users.py betiğinin içindeki setKey fonksiyonu.

Bunu da hallettikten sonra sıradaki iş olarak servisleri başlatmayı yazmaya başladım. Bunun için ÇOMAR API'si kullanacağımı biliyordum.

ÇOMAR API'si ayrıca bana ağ profilinde de lazım olacaktı. Temel olarak bunu kullanabilmek için:

link = comar.Link()

satırını ekledikten sonra,

link.System.Service["servisadi"]

şeklinde erişebiliyordum. info() ile gerekli bilgilere erişiyordum, bununla çalışıp çalışmadığını kontrol edip eğer çalışıyorsa stop() ile durdurup sonra da start() ile başlatıyordum.

Yani:

link.System.Service["dhcp"].info()[2].find("on") veya .find("started") ile çalışıp çalışmadığını kontrol ediyor. Eğer çalışıyorsa:

link.System.Service["dhcp"].stop() ve sonra da

link.System.Service["dhcp"].start() satırlarını ekleyerek, servis başlatma fonksiyonunu tamamlıyorum. Tabi ki de bu servis işlemlerini bir try-except bloğu içerisinde yapıyorum ki herhangi bir servis başlatılamadığı zaman onunla ilgili uyarı verdirip betiği sonlandırabileyim.

Bunu da tamamladıktan sonra sırada ağ profili oluşturma var. Bu sefer de yine ÇOMAR API'sini kullanacağım.

Henüz bunu bitirmedim ama uygularken MÜDÜR'ün network.py adlı betiğinden ve iptables paketinin firewall.py betiğinden de yararlanıyorum.

Şimdilik bütün ağ aygıtlarını listeleyip (kablosuz ağ aygıtları şimdilik desteklenmediği için onları listelemiyorum) o aygıtı seçtirebiliyorum. Sıradaki iş ise o aygıt üzerinde var olan profilleri listelemek olacak.

Bir de servisleri ve gerekli paketleri en yukarıya bir listede tutmamın bana büyük faydası oldu. Öncelikle "for x in y" şeklinde hepsini sırayla gezebiliyorum, bu kolaylığı sağladı hem de ilerde bir gün bir paket ekleneceği zaman en yukarıya sadece eklemek yeterli olacak. Tek tek nerede bakıyor buna diye aramaya gerek olmayacak.

19 Ağustos 2010 Perşembe

Pardus 2010 Yaz Stajı 14. Gün

Yapmaya karar vermiş olduğum /etc/pam.d/ içerisindeki dosyaları düzenleme projesinin epostalaşmış olduğum Debian geliştiricisi tarafından Perl ile yazıldığını öğrendikten sonra bu projeden vazgeçtim.

Var olan projeye "http://bazaar.launchpad.net/~ubuntu-core-dev/pam/ubuntu/files/head%3A/debian/local/" adresinden ulaşabilirsiniz.

Bu adresteki pam-auth-update adlı betik bu işi yapıyor. Ayrıca pam-auth-update.8 isminde bir man dosyası var.

Bunun üzerine başka proje arayışlarına geçtim ve Bahadır ile PTSP kurulum betiği hazırlamaya karar verdim.

Öncelikle PTSP nedir ile başlayayım.

PTSP, ince istemciler için bir çözümdür. Yani bir tane sunucu üzerinde PTSP sunucu çalışacak ve diğer istemciler ağ kablosu üzerinden ona bağlanacak. Bu bağlantı ile X üzerinden de işlemler yapmak mümkün, yani bildiğiniz Pardus kullanıyor olacaksınız ama bir sunucu üzerinde. Aynı zamanda da benim hazırlamış olduğum Misafir Kullanıcı projesi de PTSP ile çalışması çok faydalı olacak.

Bununla ilgili bir belge pardus wikisinde var.

Adresi: http://tr.pardus-wiki.org/NASIL:PTSP

İlk iş olarak ben bu adres üzerindeki işlemleri yapıp PTSP sunucu yaratıp, hem nasıl çalıştığını anladım hem de PTSP ile beraber Misafir Kullanıcı'yı deneme fırsatı buldum.

Sonuç güzel, gördüğüm kadarıyla sorunsuz çalışıyor. Hem sunucudan hem de istemciden "guest" ismi ile bağlandım. İkisine de ayrı isimler ve ev dizinleri belirleyip sorunsuzca çalıştırdım.

Şimdi ise sırada bu yaptığım işlemleri yapacak bir betik hazırlamak.

Hazırlıklara başladım. http://svn.pardus.org.tr/uludag/trunk/playground/intern/ptsp-installer içerisindeki TODO dosyasındaki işlemleri sırasıyla yapacağım. Bu TODO dosyasını yukarıda vermiş olduğum Pardus wikisindeki belgeden yararlanarak oluşturdum.

Şimdilik gerekli olan paketler kurulu mu diye kontrol eden bir metot yazdım. Bu metotta PiSi'nin API'sini kullandım.

Yapılandırma dosyalarını düzenlerken dikkatli olmam gerekiyor. Diğer ihtimalleri göz önünde bulundurarak bunu yaptıktan sonra geriye kalan işlemler pek de zor gözükmüyor.

18 Ağustos 2010 Çarşamba

Pardus 2010 Yaz Stajı 13. Gün

Bugün halihazırda tamamlamış olduğum kod üzerinde bir kaç iyileştirme yaptım. README, AUTHORS ve COPYING dosyalarını düzenledim.

Yaptığım iyileştirmeler, eğer yapılandırma dosyasında değer atanmamış ise varsayılan değerleri kullanacak. Başlangıçta eğer sistemde guest_name isminde bir kullanıcı var ise modülü çalıştırmayacak, guest_group isminde bir grup yok ise bunu oluşturacak ve en önemlilerinden birisi ise ev dizinini bağlarken noexec özelliği ile bağlamak.

noexec bize önemli derecede güvenlik sağlıyor. Bu özellik sayesinde kullanıcı bağlandığı ev dizini içerisinde ikilik dosya çalıştıramayacak. Aynı zamanda da kendisi de ikilik dosya yazıp bunu çalıştıramayacak.

Varsayılan değerleri kullanma kısmını da, yapılandırma dosyasını okurken bir hata oluşursa except bloğuna geçip aktarıyor ve hata ayıklama (debug) modunda ekrana dosya okunamadı diye hata veriyor ya da değerleri okurken boş çıkar ise onun varsayılan değerlerini aktarıyorum.

Kullanıcının varlığını ise pwd.getpwnam() ile sorguluyorum. Bunu try-except bloğu içerisinde yapıyorum. try içerisinde bu başarılı olur ise geriye başarısız diye değer döndürüyor, eğer başarısız olur ise except bloğuna geçiyor ve burada da hiç bir şey yapmadan normal koda devam ediyor.

Grubun varlığını da grp.getgrnam() ile sorguluyorum. Yok ise yine hata ayıklama modunda ekrana grup bulunamadı, grup oluşturulacak yazıyor ve grubu "groupadd %s" % guest_group ile oluşturuyorum.

Ayrıca daha önceden /etc/pam.d/ içerisindeki dosyalardaki control yerine uzun uzun yazılar yazıyorduk. Sadece sufficient yazmak yeterli şu an. Daha önceden de yazdığım yazıda bunu düzelteceğim.

Bahadır'ın aklındaki bir proje olan /etc/pam.d/ içerisindeki yapılandırma dosyalarını düzenleme projesini biraz araştırdım ve bunu Ubuntu'da yapmakta olan birileri olduğunu öğrendim.

İstek ise şu adreste: https://blueprints.launchpad.net/ubuntu/+spec/pam-config-framework

Ayrıca 2003 yılında da http://www.mail-archive.com/debian-wnpp@lists.debian.org/msg18384.html adresinde belirtildiği gibi istenmiş fakat zaman aşımından kapanmış.

Ubuntu'daki bu projeyi hazırlayan arkadaşa eposta yolladım. Bana bu paketin Ubuntu ve Debian için pam içerisine koyduklarını söyledi. Bunu biraz daha araştırıp Pardus'a uygulanabilirliğini araştırmayı düşünüyorum.

Sırada bir de PiSi paketi yapmak var. Daha önceden almaya karar verip paketini yaptığım paketleri düzenleyip ve yeni alacağım paketleri belirleyip bunlar üzerine çalışmalar yapacağım.

Yani Pardus 2010 Yaz Stajı, benim için tam hızıyla, zevkli, heyecanlı, öğretici yani her şeyiyle çok güzel devam ediyor.

17 Ağustos 2010 Salı

Pardus 2010 Yaz Stajı 12. Gün

Bugün içerisinde iyi gelişmeler oldu. KDM sorununu hallettim. Oswald ile epostalaşma sonucunda bir çözüme ulaşamınca kendim KDM'nin kaynak kodunu inceleyerek bir çözüme ulaşmaya çalıştım.

Ve aşağıdaki gibi bir çözüme ulaştım, aşağıdaki yama dosyası tam olarak PAM'dan bir kez daha PAM_USER'i alıyor. Bu şekilde hem 2 kez kontrol edilmiş oluyor hem de misafir kullanıcı hesabı çalışmış olur.

yama dosyası:

--- kdm/backend/client.c.old 2010-08-17 11:43:02.775903757 +0300
+++ kdm/backend/client.c 2010-08-17 11:43:19.548533659 +0300
@@ -474,14 +474,13 @@
* the module needs an own conversation plugin which does not cause
* curuser being set.
*/
- if (!curuser) {
- debug( " asking PAM for user ...\n" );
- pam_get_item( pamh, PAM_USER, &pitem );
- reInitErrorLog();
- strDup( &curuser, (const char *)pitem );
- gSendInt( V_PUT_USER );
- gSendStr( curuser );
- }
+ /* Always check username from PAM */
+ debug( " asking PAM for user ...\n" );
+ pam_get_item( pamh, PAM_USER, &pitem );
+ reInitErrorLog();
+ strDup( &curuser, (const char *)pitem );
+ gSendInt( V_PUT_USER );
+ gSendStr( curuser );
if (pretc != PAM_SUCCESS) {
/* Log the failed login attempt */
log_to_audit_system (curuser, td->remoteHost, td->name, AU_FAILED);


Bu yamayı kaynak koda uygulayıp, derleyip kurduğumuzda Misafir Kullanıcı sorunsuz olarak çalışıyor.

Şimdilik projede sadece ssh ile bağlantı sorunu kaldı, o da önemli bir sorun olarak görülmüyor.

Ayrıca PAM yapılandırma (/etc/pam.d/ içerisindeki) dosyaları düzenleme aracı yazmak gibi bir plan var. README dosyasını düzenledikten sonra burada yayınlamayı düşünüyorum.

Yama ise Pardus SVN depolarında mevcut. KDM nin de bir parçası olduğu "kdebase-workspace" paketinin bakımcısı olan Gökçen ile bu durumu konuştuktan sonra yamayı ona yolladım.

Paket Adresi: http://svn.pardus.org.tr/pardus/2009/devel/desktop/kde/base/kdebase-workspace/
Yama Adresi: http://svn.pardus.org.tr/pardus/2009/devel/desktop/kde/base/kdebase-workspace/files/pardus/kdm-pam-fix-for-guest-account.patch

16 Ağustos 2010 Pazartesi

Pardus 2010 Yaz Stajı 11. Gün

Bugün pam_python'u geliştiren kişiye yani Russell Stuart'a eposta yolladım. Bu epostada kısaca yazdığım modülün ne işe yaradığını, nerelerde sorunsuz çalıştığını, nerelerde sorun yarattığını, sorunların nerelerden kaynaklandığını, gerekli yapılandırma dosyalarının içeriklerini yazdım.

Kendisi gayet yardımcı olacak bir şekilde epostalarımı yanıtladı. Sorunun benim kodumda değil de KDM'nin kendi kodunda olduğundan bahsetti. Yani KDM, eğer PAM modülü içerisinde kullanıcı adı değişiyorsa değişen kullanıcı adını yok sayıp eski girilen ile devam ediyor.

Bunu denemek için, sistemde var olan iki kullanıcı arasında PAM modülü yardımıyla kullanıcı adlarını değiştirdim. Yani "pars" ve "parsik" sistemde var olan iki kullanıcı olsun. PAM modülünü eğer kullanıcı adı "pars" ise onu "parsik" olarak değiştirip PAM_SUCCESS geri döndürdüm.

Sonuç olarak kde ye ilk girdiğim kullanıcı adı olan "pars" ile giriş yaptım. Yani KDM, PAM modülü içerisinde yapılan değişikliği yok sayıyor.

Bunun üzerine açılışta kdm yerine xdm ile deneyeyim dedim. Bunun için /etc/default/xdm içerisinde:

DISPLAY_MANAGER="kdm"

satırını

DISPLAY_MANAGER="xdm"

olarak değiştirdim. Ekran açıldığında kullanıcı adına "guest" yazıp entere bastıktan sonra kde açıldı. Yani sorun KDM'deymiş. Bunun üzerine ofiste önce Bahadır ile sorunu nasıl çözebiliriz diye konuştuk sonra Ozan ile bunun üzerine önce bunu başka türlü nasıl çözebiliriz, acaba böyle bir çözüm uygun bir çözüm değil mi üzerine konuştuk sonra da kısa bir süre kodları inceledik. Tam olarak bir çözüme ulaşamadık, biraz daha fazla incelememiz gerekiyor.

Bu blog girdimi girmeden yaklaşık 1 saat önce de KDE KDM geliştiricisi olan Oswald Buddenhagen'a eposta attım. Ona da yazdığım modülü ve karşılaştığım hatalar ile ilgili bilgi içeren bir eposta attım. Onun cevabını bekleyene kadar da KDM'nin kaynak kodunu inceleyip Russell Stuart'ın dediği gibi PAM_USER ile ilgili olan yerleri inceleyeceğim.

Herhangi bir gelişmeyi yine buraya yazacağım.

15 Ağustos 2010 Pazar

Guestlogin projesi gelişmeleri

Haftasonumu projedeki sıkıntıları araştırmakla geçirdim diyebilirim. 2 tane sorun var şimdilik bilinen. Bunlardan biri ssh bağlantı sağlanamaması, öteki ise kdm den bağlantı sağlanamaması.

Ssh'daki sorun da şu şekilde: Eğer normal bağlanmaya çalışırsam kesinlikle bağlanmıyor ve

Connection closed by ::1

Şeklinde hata alıyorum. Sanırım bunun sebebi var olmayan bir kullanıcı ile bağlanmaya çalıştığım için oluyor dedim ve "/etc/ssh/sshd_config" dosyasında bununla ilgili bir şeyler aradım. Sonuç olarak yapılandırma dosyasında 3 tane değişken ile oynamak gerekiyormuş. Bunlar:

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication no

Bunları bu şekilde düzelttikten sonra (kimisinin başında # vardı kimisi yes idi no yaptım) tekrar denedim. Bu sefer de:

Permission denied (publickey).

Hatası aldım. Bunu da araştırdığımda openssh'ın PAM'daki kullanıcı ismi değişikliğini kabul etmemesinin buna sebep olabileceğini öğrendim. Bununla ilgili bir yama buldum ve Pazartesi günü (16.08.2010) bunu uyguladıktan sonra sonuçları ile birlikte buraya yazacağım.

XDM sorununun çözümünü bulmak için başta google'da ayrıntılı bir arama yaptım, fakat hala bir çözüm yoktu. Sonra xdm/kdm'de kullanılan benim projeme benzer modülleri araştırdım. Zaten benimki gibi bir proje bulmak çok zordu ama parmak izi gibi kimlik doğrulama modülleri kullananlara baktım. Kaynak kodunu indirip inceledim, bir kaç şey gözüme çarptı.

Kaynak kod içerisinde $XAUTHORITY ortam değişkenine "$HOME/.Xauthority" değerini atıyorlar ve $DISPLAY ortam değişkenine de pam_tty değerini atıyorlar(pam_python'daki karşılığı pamh.tty oluyor). Ben de bunları gördükten sonra. os.environ[]'u kullanarak bu ortam değişkenlerine gerekli değerleri atadım ama hala sorun çözülmemişti.

Sonra sorun acaba kullanıcıyı PAM modülü üzerinden oluşturduğum için mi oluyor diye şüphelendim. Bunun için yarattığım kullanıcı adını da girilen kullanıcı adıyla aynı yaptım (yani guest adında kullanıcı oluşturdum guestX değil) ve sorunsuz bir şekilde çalıştı.

Kullanıcıyı PAM modülü içerisinde yaratmanın da bir sıkıntı yaratmadığını anladıktan sonra aklıma acaba kullanıcı adı değiştirmenin bir sorun yaratıp yaratmadığı geldi. Bunun için de kullanıcı adını varolan bir kullanıcı adına yönlendirdim. Yani:

pamh.user = sistemde_varolan_bir_kullanici

şeklinde atadım. Ve bunda da sorunsuz bir şekilde açıldı. Benim aklıma gelenler arasında geriye tek bir seçenek kalmıştı. Bu da girilen kullanıcı adı ile PAM tarafından verilen kullanıcı adının aynı olmamasıydı. Yani bir şekilde KDM, girilen kullanıcı adını alıyor bir yerlere yazıyor ya da onunla ilgili kimlik doğrulaması yapmaya çalışıyordu.

KDM nin de kendi kimlik doğrulamaları vb. şeyler var mı diye bir araştırma yaptım. Xauth'u biraz inceledim. Burada cevap bulamayınca "/etc/X11/kdm/" içerisindeki yapılandırma dosyalarında işime yarayacak herhangi bir şey aradım ama nafile. Sanırım şimdi yapmam gereken şey KDM nin kendi kimlik doğrulamasını kapatmak veya bunu PAM dan sonra yapmasını sağlamak. Bunun için de KDM nin kaynak kodunu indirdim ve incelemeye başladım. Şimdilik kodu inceleyip anlama kısmındayım. Gerçi daha yeni başladım KDM nin kaynak kodunu incelemeye ama yarın Pardus ofisinde bu incelemeyi hızlandırıp bu KDM sorununu da çözmeyi düşünüyorum.

14 Ağustos 2010 Cumartesi

Pardus 2010 Yaz Stajı 10. Gün

Bugün, Misafir kullanıcı modülüne eğer işlemlerde bir sorun varsa ona göre işlemleri geri alıp geri değer döndürme fonksiyonu hazırladım.

Bu fonksiyon ayrıca sadece geri değer döndürme işine de yarıyor. Aldığı integer tipindeki değere göre işlem yapıyor. Böylece geri döndürülen değer sırasında bir işlem yapma veya diğer işlemlerde büyük esneklik kazandırmış oldu.

İşlemleri geri alma da şu şekilde oluyor. Her adım sırasında yapılan işlemi kontrol ediyor ve bir önceki adımların zıttını uyguluyorum. Mesela eğer klasör oluşturulup bağlama sırasında bir sorun olursa dizini silip, bir hata kodu gönderiyorum. Bu şekilde bütün kodda kontroller var artık.

Ayrıca tüm komutları subprocess ile kullanamamak gibi bir sorunla karşılaştım demiştim. Aslında o öyle değilmiş, o işlemin bitmesini beklemek gerekiyormuş yani

a = subprocess.Popen([..........])

a.wait()

buradaki wait komutu bütün işi halletti. Yani koddaki bütün os.system leri Popen ile hallettim.

Ayrıca sistem politikaları gereği chown, usermod ile değişiklik yapmak yerine kullanıcı oluştururken ev dizinini belirlemenin daha uygun olduğunu düşündük. Bunun için bunları kaldırıp, rastgele isim üreten bir fonksiyon oluşturup kullanıcıya bu dizini vermek gibi bir plan yaptık.

Fakat burada bir güvenlik açığı oluşuyordu. O dizini kullanıcıya verene kadar bir şey olup olmayacağını bilmiyorduk. flock vb. komutları incelememize rağmen bir çözüme ulaşamıyorduk çünkü flock ile kilitlesek bile useradd komutu sırasında bir şeyler olabilirdi ve useradd komutu eğer ev dizini varsa bile 0 değerini geri döndürüyor. Bunun için başka bir çözüm arayışına girdik.

Sonuç olarak yine mktemp ile rasgele dizin oluşturup onun içerisinde home diye bir dizini o kullanıcıya vermek kararına vardık.

Kod ise aşağıdaki şekilde:

"mktemp -td %s.XXXXXX" % username

"mount -t tmpfs -o size=%sm -o mode=711 none %s" % (guest_home_dir_size, home_dir)

useradd -m -d %s/home -g %s %s" % (home_dir, guest_group_name, username)

Burada mode=711 sayesinde useradd ile ev dizinini oluşturabiliyoruz.
guest_home_dir_size -> ev dizin boyutu, home_dir -> ev dizininin konumu, username -> kullanıcı adı (guestX şeklindeki)

bu şekilde bu sorunun da üstesinden geldik. Pardus 2010 Yaz Stajının 2. haftası da bitti. Her şey çok güzel gidiyor. Burada çalışmak gerçekten çok zevkli ve çok güzel.

Şimdilik çözülmesi gereken sorunlar:

ssh üzerinden bağlantı sağlanmıyor.

kdm ile de bağlanılamıyor.

12 Ağustos 2010 Perşembe

Pardus 2010 Yaz Stajı 9. Gün

Misafir kullanıcı çalışmaları son hızda devam ederken öbür yandan da pam_python'un PiSi paketini oluşturdum. Kurarken karşılaştığım bir sorun olan libpython2.6.so.1'in bulunamaması için de bir yama yaptım.

Bu yama kaynak koddaki src/setup.py dosyasında libpython2.6.so.1 yerine libpython2.6.so.1.0 yapıyor. (aslında versiyonu sistemden alıyor)

Bu paket üzerinden kurulduğu zaman herhangi bir sorun olmadan pam_python'u kullanabiliyorsunuz.

Paketi oluşturduktan sonra yapılacak işlerden olan hata çözümleme modu yaratmakla başladım. Bunun için argv değişkeninin içerisinde debug var ise debugging değişkenini True yapmak en mantıklısı olacak diye düşünüp bu şekilde uyguladım.

Kod içerisinde de if(debugging) ile kontrol ederek eğer doğru ise hazırlamış olduğum log fonksiyonuna bir çıktı gönderiyor.

log fonksiyonu ise bu şekilde

def log(text):
sys.stdout.write(text)
sys.stdout.flush()

burda sys.stdout.write şeklinde yazmak en mantıklısı olacak çünkü eğer X açıkken yapılacak olursa bu işlemler print ya da başka fonksiyonlar işe yaramayabilir. Stdout ise her durumda işimize yarayacak bir şey. Tabi bu işlemler için de sys modülünü kullandığım için yukarıda import sys yapıyorum.

İçeride de loglama şu şekilde:

if(debugging):
log("Yazı")

kodda aşama aşama ilerlemeler bu şekilde yapılıyor.

Debugging işlemini hallettikten sonra da bir sonraki iş olarak os.system yerine subprocess.popen ile yapabileceklerimi belirleyip onları değiştirdim.

Bir de girilecek kullanıcı adı, ev dizini boyutu ve girebilecek en fazla kullanıcı sayısını tutmak için bir yapılandırma dosyası oluşturdum. Bunu da /etc/security/ nin içerisine koydum.

Dosya adı guestlogin.conf. Üzerinden değişkenleri almak için ConfigParser modülünü kullanıyorum. Kod ise aşağıdaki şekilde:

try:
config = ConfigParser.ConfigParser()
config.read('/etc/security/guestlogin.conf')
guest_name = config.get('guest', 'guestname')
guest_limit = config.getint('guest', 'guestlimit')
guest_home_dir_size = config.getint('guest', 'homedirsize')

except:
return pamh.PAM_AUTHINFO_UNAVAIL
guestlogin.conf dosyası ise aşağıdaki gibi:

[guest]
guestname = guest
guestlimit = 50
homedirsize = 100

Bu şekilde biraz daha esneklik kazandırmış olduk.

Şimdilik aklıma gelenler bunlar fakat projeye eklemeler yapılacak.