Son zamanlarda naçizane ve kendi çapımda kablosuz ağ yönetimi ile ilgili Ubuntu üzerinde bir bash script oluşturmaya çalışıyorum. Daha önce de zaten “ZENITY İLE KABUK PROGRAMLAMA MUCİZESİ” adlı yazımda da bahsetmiştim projeden. Zaman geçti projeyi tamamladım, bu süreçte Linux üzerinde derinlere dalarken Gnome masaüstü Ubuntu da hergün kullandığımız o ikonların, programların nerelerden nasıl çağırıldığı husunda güzel şeyler öğrendim ve sizlerle paylaşmak istedim.
Öncelikle hepimiz hergün bilgisayarın başına geçince birçok programı çalıştırıyoruz ve amacımıza göre onu kullanıyoruz. Ama o program ne yapıyor, nerelerden yaralanıyor, nerelere erişiyor diye pek ben de dahil sormuyoruz. Fakat iş programı yazmaya gelince birden bire bunların hepsini düşünmeye başlıyorsunuz mecburen. Çünkü insanlar (son kullanıcılar) artık işlerini kodla halletmek istemiyorlar. Evet özellikle Linux kullanıcıları işlerini terminal aracalığı ile yapmayı seviyorlar ama bütün herkese hitap etmek istiyorsak bu özelliğimizi değiştirmemiz gerekiyor. Herneyse biz konumuza geri dönelim. Her işini grafik ekrandan yapan kullanıcı bir programdan neler ister bunları düşünelim ilk önce. Çünkü bu soru basit gibi duruyor ama aslınca çok önemli bir soru. Ben hala tam olarak cevabını bulamadım. Güya cevabını aldığım durumları sizlerle paylaşacağım örneğin ;
- Program kolay kurulmalı ve kurulum aşamasında kullanıcı iyi yönlendirilmeli.
- Eğer program hayati önem taşıyorsa (Network Manager gibi) her açılışta kendiliğinden çalışmalı. Yani autostartup özelliğine o programı eklemeli.
- Masaüstünde kısayolu olmalı ve adam gibi bir icon’u olmalı.
- Applications menüsü altına kendi kategorisine göre eklenmeli.
- Program yaptığı iş hakkında kullanıcıyı bilgilendirmeli ve bunları yaparkende işlemciyi yormamalı.
- Program istenildiği anda kaldırılmalı. Yani uninstall özelliği eklenmeli.
- Bunları yaparken de kullanıcıyı çok gerekli olmadıkça terminalle muhattap etmeden herşeyi GUI ile yerine getirilmeli.
Benim bulabildiğim birkaç madde bunlar. Yapmaya çalıştığım bash /sh scriptlerinde bunlara nasıl çözüm bulabilirim diye araştırdım. Tabiki pekçok madde eklenebilir ama bir kullanıcının temel ihtiyaçlarına karşılık verecek durumları çözdükçe diğerleri versiyon artıkça eklenebilir. Bu konuda ki önerileri her daim bekliyorum kesinlikle. İlk maddemizle başlayalım. İlk maddemiz zenity veya programcının isteğine göre herhangi bir görselleştirme aracıyla algoritmik bir şekilde hazırlanabilir. Diğer maddeler hazırlandıktan sonra ilk madde sadece hazırlanan araçların kopyalanması işlemidir. Ama kesinlikle görsellikten ödün verilmeden kullanıcıyı en güzel şekilde yönlendirecek şekilde hazırlanmalıdır. Bu konu için özellikle Human computer interaction başlığına bir göz atılmalıdır.
Diğer maddemiz autostartup;
Eğer bir uygulamanın her açılışta açılmasını istiyorsak Ubuntu/Gnome System>Applications Startup menüsü ile bize çok güzel bir ortam sunuyor. İstediğimiz uygulamayı ekleyebilir ve kaldırabiliriz ve öncelik atayabiliriz. Fakat eğer siz bir uygulama yapıyorsanız ve her açılışta açılmasını istiyorsanız bunun için Applications Startup’ın geri planda yaptığını yapmak zorundasınız. İyi tamam ama ne yapıyor bu Applications Startup.
Figür 1 “Startup Applications” Menüsü
Aslında yaptığı, uygulamanın cinsine göre konfigürasyon dosyaları tutup içerisindeki verilere göre işlem yapması. Bu tür konfigurasyon dosyalarını sisteme daha önce kurduğumuz uygulamalar sayesinde daha ayrıntılı inceleyebiliriz. Nitekim ben de öyle yaptım. Dropbox kişisel dosya paylaşım uygulamasıdır. Bu programın nerelere konfig. Dosyaları attığını inceleyelim;
Terminalde ;
# cd /home/kullanici_adi/.config/autostart/ # ls au_wifi.sh.desktop bluetooth-applet.desktop dropbox.desktop print-applet.desktop wicd-tray.desktop
ilk iki komutu verdikten sonra sizinde kullanım şeklinize göre otomatik açılış konfigurasyon dosyalarını göreceksiniz. Biz şu an biz Dropbox’la ilgileniyoruz. Çünkü dışarıdan kurduğumuz profesyonel bir yazılım ve amacımız profesyonel bir yazılım oluşturmak ve profesyonel bir yazılımdan örnek almak. Tekrar komut satırında ;
# nano dropbox.desktop [Desktop Entry] Name=Dropbox GenericName=File Synchronizer Comment=Sync your files across computers and to the web Exec=dropbox start -i Terminal=false Type=Application Icon=dropbox Categories=Network;FileTransfer; StartupNotify=false
Dikkat ederseniz programın çalıştırılması ve GUI ortamının sağlanması için bütün ayarlar bu sihirli dosyanın içerisinde. Yapmamız gereken sadece bizim programımızda bunları kendi amaçladığımız şekilde değiştirmek, hadi yapalım:) ;
Komut satırında ;
# nano ornek_program.desktop [Desktop Entry] Name= ÖRNEK PROGRAM GenericName=ÖRNEK PROGRAM Comment=Bu program otomatik açılış için bir örnektir. Exec=ornek_program Terminal=false Type=Application Icon=kendi_yaptigimiz_icon Categories=Network;FileTransfer; // Neresini isterseniz. StartupNotify=false
konfigurasyon dosyasını oluşturduktan sonra ;
Figür 2 Startup Applications “ÖRNEK PROGRAM”
görüldüğü gibi Startup Applications menüsünü hiç kullanmadan oraya amacımıza uygun olarak uygulamamızı eklemiş olduk. Yapacağınız uygulamada eğer her açılışta çalışması istenen bir durum olduğunda yapmanız gereken sadece /home/kullanici_adi/.config/autostart/ dizinin altına bir konfigurasyon dosyası oluşturmak veya silmek olacak.
Bir sonraki iki maddemiz benzer, masaüstünde bir kısayol oluşturmak ve Applications menüsünde amaca uygun bir kategoriye eklenmek. Bunun için yine mevcut programlardan yararlanacağız. Benim bazım yine Dropbox. Eğer siz farklı bir kategoride çalışıyorsanız diğer kategoride bulunan birbaşka programın konfigurasyon dosyasını inceleyebiliriz.
Evet şimdi başlayabiliriz. Öncelikle uygulamamız için güzel bir icon düşünelim. Merak etmeyiniz Linux’ta öyle Windows’ taki gibi icon için ayrıca uğraşıp icon uzantılı dosya yapmak gerekmiyor. “PNG” uzantılı her resim sizin için icon olmaya hazırdır:) Yalnız programımıza icon oluşturacaksak nerelerde kullanmamız gerektiğini birazcık düşünmemiz gerekecek. Çünkü icon kalitesi çok önemli. Neden derseniz eğer bir uygulama panele eklenecekse daha küçük bir alan kaplayacaktır. Bu da icon şeklinin anlaşılamamasına yol açar. Veya Applications menüsünün altına çok küçük bir icon eklemeniz görsellik açısından hoş olmayacaktır. Mesela ben Ubuntu Netbook Remix kullanıyorum, onda küçük bir icon çözünürlük açısından hiç hoş durmadı. Bu yüzden programın kullanılma amacına göre iconlar oluşturup aşağıdaki kategorilere uygun şekilde çağırmamız gerekecek.
Terminalde ;
# cd /usr/share/icons/hicolor/ # ls 128x128 192x192 22x22 256x256 36x36 64x64 96x96 index.theme 16x16 20x20 24x24 32x32 48x48 72x72 icon-theme.cache scalable
komutlarını verdiğinizde yıkarıda bulunan kategorilerde boyutlara göre icon dizinleri bulacaksınız. Amacınıza göre icon’unuzu ekleyebilirsiniz. En sık kullanılan Applications menüsü altına eklenen iconladır ve 48×48 lik iconlar buraya uymaktadır. Lakin farklı dizinlerde de icon’lar bulunmaktadır. Yaptığınız icon’u bu dizinin altına da kopyalamanızı öneririm.”/usr/share/pixmaps/” gibi.
Icon’umuzu da hallettikten sonra menümüzün altına uygulamamızı eklemeye geçebiliriz. Yine bahsettiğimiz gibi benim bazım Dropbox. Şimdi konfigurasyon dosyasını bulalım.
Terminalde;
# cd /usr/share/applications/ # ls
Görüldüğü gibi sistemimizde applications menüsü altında ne kadar uygulama varsa hepsi burada 🙂 Buraya nasıl eriştik birazda ondan bahsedelim. System> Main Menu
Evet grafik ekrandan böyle yapılyor ama bunların birde konfigurasyon dosyaları olmalı değil mi? Ama nerede? İşte Figür 3 ‘te verilenler, güzelim görünen bütün “janjanlı” uygulamaların geri planı:) Eee bizde madem profesyonel bir uygulama yapmaya kalktık dalmaya çalışalım bakalım derinlere. Dropbox demiştik ve konf. dosyasını inceleyelim içinde ne var? ;
Terminalde ;
# nano dropbox.desktop [Desktop Entry] Name=Dropbox GenericName=File Synchronizer Comment=Sync your files across computers and to the web Exec=dropbox start -i Terminal=false Type=Application Icon=dropbox Categories=Network;FileTransfer; StartupNotify=false
komutunu verdik ve karşımıza autostartup daki konfigurasyon dosyası ile aynı bir ayar dosyası çıktı. Fakat ben Sound&Video menüsü altında görünmesini istiyorum. O zaman bizim için örnek teşkil eden Rhythmbox müzik programını göz önüne alabiliriz. Ve böylece onun bulunduğu kategoriyi alabiliriz.
Terminalde;
nano rhythmbox.desktop # . . . Categories=GNOME;GTK;AudioVideo; . . . #
Amacımıza göre düzenlersek;
#sudo nano ornek_program.desktop [Desktop Entry] Name=ÖRNEK PROGRAM GenericName=PROGRAM Comment=Bu uygulama applications menüsü altında görünür Exec=ornek_program.sh Terminal=false Type=Application Icon=ornekprogram.png Categories=AudioVideo; StartupNotify=false
Evet konfigurasyon dosyamızı oluşturduk şimdi bakalım yapabildik mi?
Figür 5 “SOUND&VIDEO” Kategorisi
Evet herşey yolunda ve herşey istediğimiz gibi. Güzel bir uygulama oluşturmak için neredeyse herşeye sahibiz:) Tabi “ÖRNEK PROGRAM” ımızın icon’u varsayılan olarak verildi. Yukarıda belirtilen klasörlere oluşturulacak iconlar kopyalanırsa konfigurasyon dosyasında “Icon=” kısmına icon ismi yazıldığında belittiğimiz icon menüde bütün ihtişamıyla görülecektir…
Diğer bi maddemiz ise uygulamamızın kullanıcıyı ne yaptığı ile ilgili bilgilendirmesi demiştik. Bu yaptığınız uygulamaya göre değişecektir elbette. Şöyleki eğer başka bir uygulama için arayüz oluşturmuşsanız o zaman benim gibi “log” lardan yararlabilirsiniz. Yok eğer uygulamayı tamamen kendiniz yazmışsanız. Kullanıcı etkileşimi hususunda biraz çaba sarfetmeniz gerekmektedir. Program çalıştığında, kapandığında, başka bir programı çağırdığında, çağıracağında, durduğunda kullanıcıya bilgiler vermelisiniz. Şöyleki eğer benim gibi betik hazırlamışsanız kullanıcıyı en iyi şekilde bilgilendirmek zorundasınız aksi durumda uygulamanız herkese hitap etmez durumda olacaktır;
#Yeniden başlat seçeneği sonucu çalışır. if [ "Yeniden Başlat" = "$cevap" ]; then gksu /etc/init.d/networking restart zenity --info \ --title="Bilgi" \ --text="Ağ yeniden başlatıldı." fi
gibi.
Ya da aktif bir programı durdurmak istiyorsanız yapmanız gereken adımlar ve bilgilendirme ;
Terminalde ;
#ps aux | grep program_adi #pidof program_adi islem_numarası #kill islem_numarası
şeklindedir. Bunun için bir örnek Figür 7 da verilmiştir.
Figür 7 “process kill”
Bu işlemi betikte belirtmek istersek;
#Durdur seçeneği sonucu çalışır. if [ "Durdur" = "$cevap" ]; then wpagui_pid=$(pidof wpa_gui) kill $wpagui_pid gksu /etc/init.d/network-manager start zenity --info \ --title="Bilgi" \ --text="AU WiFi Net durduruldu. wpa_gui kapatıldı." fi
şeklinde kullanıcıyı bilgilendirmek gerekir.
Diğer bir husus ise başka programı kullandığınız zaman onun sistem tarafından tutulan loglarından yararlanmanız olacaktır. Şöyleki ;
Terminalde ;
#cd /var/log/ #ls
komutlarını verdiğinizde sisteminizde bulunan pekçok uygulamanın logları ile karşılaşacaksınız. Bu logları akıllıca kullanarak kullanıcı bilgilendirme konusunda kullanabilirsiniz. Buradaki şimdiki amacım log dosyalarından nasıl yaralanıyor onu göstermektir. Şöyleki;
Figür 8 “Loglar”
Ben wpa_supplicant’ın logranı kullanarak bir script oluşturdum. wpa_supplicant ‘ın logları daemon.log ve syslog dosyalarına kaydediliyor. Oradaki bağlantı sonuçlarını alarak kullanıcıyı bilgilendirmeye çalıştım ;
#/var/log/daemon.log verileri inceleniyor... echo "" > /home/auwifi/durum while [ $(grep -c "No DHCPOFFERS received." /home/auwifi/durum) != 1 ] do tarih=$(date) ara=${tarih:4:12} tarih2=$(date --date='1 minutes ago') ara2=${tarih2:4:12} grep "$ara2" /var/log/daemon.log > /home/auwifi/durum grep "$ara" /var/log/daemon.log >> /home/auwifi/durum #Ağa bağlanamadığı durum...DHCP alınamıyor... if [ $(grep -c "No DHCPOFFERS received." /home/auwifi/durum) = 1 ]; then zenity --error \ --title="AU WiFi Linux Hata" \ --text="Üzgünüz hiçbir ağa bağlanılamadı." echo "100" ; sleep 1 exit 1 fi #Ağa bağlandığı durum... if [ $(grep -c "Associated" /home/auwifi/durum) = 1 ]; then zenity --info \ --title="Bilgi" \ --text="AU WiFİ Net ile ağa bağlanıldı." echo "100" ; sleep 1 exit 1 fi done
Yukarıdaki script parçasının sizin için birşey ifade etmediğini biliyorum fakat azda olsa birşeyler ifade etmesi açısından paylaşıyorum. Basitçe anlatacak olursak, daemon.log dosyası içinde “ No DHCPOFFERS received.” bilgisi programın çalıştığı anda geçmesi durumda program ağa bağlanma konusunda başarısız demektir. “Associated” kelimesi eş zamanlı geçtiğinde program ağa bağlanmış demektir.
Görüldüğü gibi sistem loglarından da yararlanmak mümkün. Buradaki zenity görselleştirmelerinin nasıl olduğunu merak edeler “ZENITY İLE KABUK PROGRAMLAMA MUCİZESİ” adlı başığa bakabilirler. Çünkü görselleştirme ile ilgili maddemiz orada detaylıca açıklanmıştı.
Yaptığımız uygulamanın kaldırılması hususu en basiti. Eklediğimiz konfigurasyon dosyalarını ve çalışabilir dosyamızı basit bir script ile teker teker sildirebilirsiniz. Çünkü neyi nereye attığımız artık belli:)
Umarım bu çalışmada sizlere yararlı olabilmişimdir.
Yücel K.
Saygılarımla…