Zimbra Zimlet Eklentisi Kurulum ve Yönetimi

Zimlet’leri ilk gördüğümde “bu ne işe yarıyor ki” diye geçirmiştim aklımdan. Zimbra kurulumu yapmış, kullanıcıları taşımış, MX kayıtlarını düzeltmiş, SPF-DKIM her şeyi ayarlamıştım. Ama o küçük eklenti sistemi hep geri planda kalmıştı. Ta ki bir müşteri “Outlook’taki gibi CRM entegrasyonu olsun” deyene kadar. O günden sonra Zimlet’ler benim için bambaşka bir anlam kazandı.

Bu yazıda Zimbra Zimlet sistemini gerçek dünya senaryolarıyla ele alacağız. Teorik anlatım değil, sahada ne gördüysek onu aktaracağız.

Zimlet Nedir, Ne Değildir?

Zimlet, Zimbra’nın web istemcisine eklenti eklemek için kullandığı framework’tür. Düşünün ki Zimbra’nın arayüzüne bir “parça” ekliyorsunuz. Bu parça sol panelde bir bölüm olabilir, bir e-postanın üstüne gelen bir buton olabilir ya da belirli kelimelerin üzerine gelindiğinde açılan bir popup olabilir.

Zimlet’ler iki ana kategoriye ayrılır:

  • Com_zimbra_* zimletleri: Zimbra’nın kendi geliştirdiği, kurulumla birlikte gelen resmi zimletler
  • Üçüncü parti zimletler: Topluluk tarafından geliştirilen ya da kendi yazdığınız özel zimletler

Zimlet’lerin çalışma mantığını anlamak için şunu bilmek yeterli: Her zimlet aslında bir ZIP dosyasıdır, içinde XML tanımları, JavaScript kodları ve isteğe bağlı olarak Java backend kodu bulunur. Zimbra bu paketi okur, web istemcisine entegre eder.

Mevcut Zimlet’leri Görüntüleme

Sunucuya bağlandığınızda ilk yapmanız gereken mevcut durumu görmektir. zimbra kullanıcısıyla çalıştırın:

su - zimbra
zmzimletctl listZimlets all

Bu komut hem yüklü hem de kullanılabilir zimlet’lerin listesini verir. Çıktı biraz kalabalık gelir ilk başta. Daha temiz bir görünüm için:

zmzimletctl listZimlets server

Sadece sunucuya yüklenmiş zimlet’leri görmek için bu yeterli. Bir de admin console üzerinden bakabilirsiniz ama komut satırı her zaman daha hızlı ve betik yazımına daha uygun.

Zimlet durumlarını kontrol ederken dikkat etmeniz gereken bir nokta var: “enabled” ile “deployed” farklı şeyler. Bir zimlet sunucuya deploy edilmiş ama belirli bir COS (Class of Service) için etkinleştirilmemiş olabilir.

Zimlet Kurulum Süreci

ZIP Paketini Sunucuya Yükleme

Diyelim ki bir zimlet indirdiniz, dosya adı com_example_crm.zip olsun. Bunu önce sunucuya kopyalayın, ardından:

su - zimbra
zmzimletctl deploy /tmp/com_example_crm.zip

Bu komut zimlet’i Zimbra’nın zimlet dizinine çıkarır (/opt/zimbra/zimlets-deployed/), gerekli yapılandırmaları yapar ve sunucuyu yeniden başlatmadan aktif hale getirir. Ama işin püf noktası şu: Deploy sonrasında zimlet her kullanıcı için hemen görünmez. Cache meselesini aşağıda ele alacağız.

Deploy sırasında hata alırsanız genellikle iki sebep olur. Birincisi zimlet paketinin bozuk olması, ikincisi zimlet’in Zimbra sürümünüzle uyumsuz olması. Sürüm kontrolü için:

zmzimletctl getConfigTemplate /opt/zimbra/zimlets-deployed/com_example_crm/

Zimlet’i COS’a Atama

Zimlet deploy edildi, ama hangi kullanıcılar görecek? Bunu COS üzerinden yönetiyoruz:

# Mevcut COS listesini görün
zmprov getAllCos

# Zimlet'i belirli bir COS'a etkinleştirin
zmprov mc default +zimbraZimletAvailableZimlets com_example_crm

# Zimlet'i zorunlu yapın (kullanıcılar kapatamasın)
zmprov mc default +zimbraZimletMandatoryZimlets com_example_crm

“default” yerine kendi COS adınızı yazın. Birden fazla COS’unuz varsa ve farklı kullanıcı gruplarına farklı zimlet setleri vermek istiyorsanız bu yöntem son derece işe yarar. Örneğin satış ekibine CRM zimlet’ini verirken muhasebe ekibine vermemek gibi.

Belirli Kullanıcıya Zimlet Atama

COS seviyesinde değil, kullanıcı bazlı da yapabilirsiniz:

zmprov ma [email protected] +zimbraZimletAvailableZimlets com_example_crm

Ama dikkat: Bu yaklaşım büyük ortamlarda yönetimi zorlaştırır. 200 kullanıcılı bir ortamda kullanıcı bazlı zimlet yönetimi yapmaya kalkarsanız kafanız karışır. COS temelli yaklaşmak daha sağlıklı.

Cache Sorunu ve Çözümü

Bu konuyu ayrı bir başlık açarak ele almak zorunda hissettim kendimi çünkü Zimbra kurulumu yapan hemen herkes bunu yaşıyor. Zimlet deploy ettiniz, her şey tamam görünüyor, ama kullanıcılar yeni zimlet’i görmüyor. İşte klasik cache problemi.

su - zimbra
zmprov fc all

Bu komut Zimbra önbelleğini temizler. Ama bazen bu da yetmez. O zaman bir adım daha:

zmcontrol restart

Sunucuyu tamamen yeniden başlatmak istemiyorsanız sadece web istemcisi sunucusunu yeniden başlatabilirsiniz:

zmapachectl restart

Kullanıcı tarafında da tarayıcı cache’ini temizlemeleri gerekebilir. Shift+F5 genellikle işi görür ama bazı kullanıcılar için tam temizlik gerekebilir. Bunu kullanıcılara anlatmak bazen teknik destek sürecinin en zorlu kısmı olabiliyor.

Zimlet Kaldırma İşlemi

Yüklediğiniz bir zimlet’i kaldırmak deploy kadar basit ama dikkat edilmesi gereken bir sıralaması var:

# Önce COS'tan kaldırın
zmprov mc default -zimbraZimletAvailableZimlets com_example_crm

# Sonra undeploy yapın
zmzimletctl undeploy com_example_crm

Sıralamayı ters yaparsanız, yani önce undeploy edip sonra COS’tan kaldırmaya çalışırsanız hata alabililirsiniz. Küçük bir detay ama pratik deneyimle öğrenilen türden.

Kendi Zimlet’inizi Geliştirmek

Hazır zimlet bulamadığınız durumlar için kendi zimlet’inizi yazabilirsiniz. Basit bir örnek üzerinden gidelim. Diyelim ki e-posta içinde telefon numarası gördüğünde tıklanabilir hale getiren bir zimlet yazmak istiyorsunuz.

Zimlet paketi şu yapıya sahip olmalı:

com_example_phone/
├── com_example_phone.xml
├── com_example_phone.js
└── config_template.xml

Ana XML tanımı (com_example_phone.xml):

<zimlet name="com_example_phone" version="1.0" description="Phone Number Highlighter" 
        label="Phone Zimlet">
    <include>com_example_phone.js</include>
    <zimletPanelItem label="Phone Tools" icon="Icon">
        <toolTipContent>Telefon numarası araçları</toolTipContent>
    </zimletPanelItem>
    <contentObject type="phone" 
                   matchOn="regex" 
                   regex="b(+?90|0)?[0-9]{10}b"/>
</zimlet>

JavaScript dosyası:

function Com_example_phone() {
}

Com_example_phone.prototype = new ZmZimletBase();
Com_example_phone.prototype.constructor = Com_example_phone;

Com_example_phone.prototype.match = function(node, config) {
    return node.nodeValue && /b(+?90|0)?[0-9]{10}b/.test(node.nodeValue);
};

Com_example_phone.prototype.clicked = function(spanElement, contentObjText, matchContext, canvas) {
    var phoneNumber = contentObjText.replace(/s/g, '');
    var dialog = this.getSimpleDialog();
    dialog.setTitle("Telefon: " + phoneNumber);
    dialog.setContent("<a href='tel:" + phoneNumber + "'>Ara: " + phoneNumber + "</a>");
    dialog.popup();
};

Bu iki dosyayı hazırladıktan sonra ZIP’e paketleyin:

cd /tmp
mkdir com_example_phone
# Dosyaları kopyalayın
zip -r com_example_phone.zip com_example_phone/
su - zimbra -c "zmzimletctl deploy /tmp/com_example_phone.zip"

Basit bir zimlet için bu kadarı yeterli. Tabii daha karmaşık senaryolarda Java backend’i de devreye girer, Zimbra SOAP API’siyle haberleşme olur, ama başlangıç için bu yapı işe yarar.

Gerçek Dünya: Şirket Rehberi Zimlet Senaryosu

Bir müşteri ortamında yaşanan gerçek bir senaryoyu anlatayım. 150 kişilik bir şirket, aktif dizin entegrasyonu var, kullanıcılar e-posta yazarken şirket içi rehbere tek tıkla erişmek istiyor.

Zimbra’nın kendi gelen com_zimbra_contactsapp zimlet’ini aktif ettik önce. Ama bu zimlet sadece Zimbra kontaklarını gösteriyor, LDAP’tan çekmiyor. Özel bir çözüm gerekti.

Şirketin LDAP şemasına göre özel sorgu yapan, sonuçları kullanıcıya gösteren bir zimlet geliştirdik. Zimlet’in backend kısmı bir Java servlet olarak çalışıyor, Zimbra’nın LDAP bağlantısını kullanıyor:

# Zimlet'i yükledikten sonra zimlet config'ini güncellemek için
zmzimletctl configure /tmp/com_example_ldapdir_config.xml

Config XML dosyası zimlet’e LDAP bağlantı bilgilerini aktarıyor. Bu bilgileri zimlet kodu içine gömmek yerine config üzerinden yönetmek çok daha esnek bir yaklaşım. Sunucu değiştiğinde sadece config’i güncellemek yeterli oluyor.

Sonuç olarak kullanıcılar e-posta yazarken “Kişi Ara” panelinden şirket dizinine sorgu yapabiliyor, çıkan sonuçları tıkla ekleyebiliyor. Bu entegrasyon üretkenliği ciddi ölçüde artırdı.

Zimlet Sorun Giderme

Zimlet sorunları genellikle üç kategoride toplanır: deploy sorunları, görünüm sorunları ve işlevsellik sorunları.

Deploy Sorunları

Deploy sırasında hata aldığınızda ilk bakacağınız yer Zimbra logları:

tail -f /opt/zimbra/log/mailbox.log | grep -i zimlet

Ayrıca zimlet’in düzgün çıkarıldığını kontrol edin:

ls -la /opt/zimbra/zimlets-deployed/

Zimlet klasörü orada mı? İçindeki dosyalar tam mı? Bazen ZIP paketi bozuk gelir, özellikle FTP ile binary modda transfer yapılmamışsa.

Zimlet Çakışmaları

Birden fazla zimlet kurduğunuzda bazen çakışmalar çıkabilir. Hangi zimlet’in sorun çıkardığını bulmak için:

# Tüm zimletleri geçici devre dışı bırakın
zmprov mc default zimbraZimletAvailableZimlets ""

# Sonra birer birer etkinleştirerek sorunluyu bulun
zmprov mc default +zimbraZimletAvailableZimlets com_zimbra_phone

Bu basit ama etkili bir yaklaşım. Özellikle yeni zimlet kurduktan sonra sorun yaşıyorsanız doğrudan o zimlet’i devre dışı bırakmakla başlayın.

JavaScript Hataları

Zimlet JavaScript üzerinde çalıştığı için tarayıcı geliştirici araçları en iyi dostunuz. Chrome DevTools’u açın, Console sekmesine bakın. Zimlet kaynaklı hatalar genellikle zimlet adıyla başlar ve kolayca tespit edilir.

Zimlet Güncelleme Prosedürü

Üretim ortamında zimlet güncellemesi yaparken dikkatli olmak gerekiyor. Özellikle yoğun kullanım saatlerinde güncelleme yapmayın.

# Mevcut zimlet'i yedekleyin
cp -r /opt/zimbra/zimlets-deployed/com_example_crm /tmp/com_example_crm_backup

# Yeni sürümü deploy edin (üzerine yazacak)
su - zimbra
zmzimletctl deploy /tmp/com_example_crm_v2.zip

# Cache temizle
zmprov fc all

Eğer yeni sürüm sorun çıkarırsa yedeği geri yükleyebilirsiniz:

su - zimbra
zmzimletctl undeploy com_example_crm
cp -r /tmp/com_example_crm_backup /opt/zimbra/zimlets-deployed/com_example_crm
zmprov fc all

Bu işlem sonrasında kullanıcılara tarayıcıyı yenilemeleri gerektiğini bildirin.

Çoklu COS Ortamında Zimlet Yönetimi

Birden fazla COS’unuz varsa zimlet yönetimi biraz daha karmaşık hale gelir. Bir betikle bunu otomatikleştirebilirsiniz:

#!/bin/bash
# Tüm COS'lara belirli zimlet'i ekle

ZIMLET_NAME="com_example_crm"
COS_LIST=$(su - zimbra -c "zmprov getAllCos" | awk '{print $1}')

for cos in $COS_LIST; do
    echo "COS ekleniyor: $cos"
    su - zimbra -c "zmprov mc $cos +zimbraZimletAvailableZimlets $ZIMLET_NAME"
    if [ $? -eq 0 ]; then
        echo "$cos - Basarili"
    else
        echo "$cos - HATA"
    fi
done

echo "Islemi tamamlandi, cache temizleniyor..."
su - zimbra -c "zmprov fc all"

Bu betiği cron’a ekleyebilir ya da zimlet güncellemelerinde manuel çalıştırabilirsiniz. Küçük bir otomasyon ama büyük ortamlarda çok zaman kazandırıyor.

Zimlet Konfigürasyon Yönetimi

Bazı zimletler konfigürasyon parametrelerine ihtiyaç duyar. Bu parametreler config_template.xml dosyasında tanımlanır ve zmzimletctl configure komutuyla uygulanır.

Mevcut zimlet konfigürasyonunu görüntülemek için:

su - zimbra
zmzimletctl getConfigTemplate com_example_crm

Konfigürasyonu güncellemek istediğinizde önce mevcut konfigürasyonu dışa aktarın, düzenleyin, sonra tekrar uygulayın:

zmzimletctl getConfigTemplate com_example_crm > /tmp/crm_config.xml
# Düzenleyin
vi /tmp/crm_config.xml
# Uygulayın
zmzimletctl configure /tmp/crm_config.xml

Konfigürasyon değişikliklerinde genellikle sunucu yeniden başlatması gerekmez. Ama kullanıcıların tarayıcılarını yenilemesi gerekebilir.

Güvenlik Notları

Zimlet güvenliği sıkça atlanan bir konu. Şunlara dikkat edin:

  • Kaynak kodu incelenmemiş zimlet’leri asla üretim ortamına almayın. Zimlet, sunucu ve istemci tarafında kod çalıştırabilir.
  • Üçüncü parti zimlet’ler için güvenilir kaynakları tercih edin. Zimbra Gallery artık aktif değil ama GitHub’da birçok zimlet bulunuyor.
  • Zimlet’lerin hangi SOAP komutlarını çağırdığını kontrol edin. Aşırı yetki isteyen zimletlerden kaçının.
  • Kendi geliştirdiğiniz zimletlerde LDAP ya da veritabanı bağlantı bilgilerini zimlet koduna gömmek yerine Zimbra konfigürasyon sistemi üzerinden yönetin.

Bir zimlet’in ne yaptığını anlamak için JS dosyasını incelemek yeterli çoğu zaman. JavaScript bilginiz yoksa geliştirici birine baktırın, üretim ortamında göz yummayın.

Sonuç

Zimbra’nın Zimlet sistemi, mail sunucunuzu kurumun ihtiyaçlarına göre şekillendirmenin en esnek yollarından biri. Hazır zimletlerle başlayıp zamanla kendi zimletlerinizi geliştirmeye kadar uzanan bir yolculuk bu.

Sahadaki gözlemim şu: Çoğu Zimbra kurulumunda zimletler ya hiç kullanılmıyor ya da varsayılan haliyle bırakılıyor. Oysa kullanıcı deneyimi açısından doğru zimlet kombinasyonu ciddi bir fark yaratıyor. CRM entegrasyonu, şirket rehberi, ticket sistemi bağlantısı gibi eklentiler kullanıcıların mail istemcisinden çıkmadan daha fazla iş yapmasını sağlıyor.

Deploy, configure, cache temizleme ve sorun giderme döngüsünü bir kez iyice kavradıktan sonra zimlet yönetimi artık karmaşık gelmiyor. Asıl iş, kurumun neye ihtiyaç duyduğunu doğru analiz edip doğru zimlet’i bulmak ya da geliştirmek. Teknik kısım bunun çok daha kolay parçası.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir