2. [**lider-ahenk-archetype**](https://github.com/Pardus-Kurumsal/lider-ahenk-archetype) üzerinden yeni plugin için projeleri [bu dokümanda](https://github.com/Pardus-Kurumsal/lider-ahenk-archetype) belirtildiği gibi oluşturun.
3. Lider Ahenk'te archetype aracılığı ile yeni bir plugin projesi oluşturduğumuzda bu proje pluginimizin lider,console ve ahenk kısımlarını aynı dizin yapısı altında barındırır. Lider ve Console ile ilgili kısımları geliştirdiğimiz projeler maven modulü veya projesi iken, Ahenk kısmı debian paket yapısına uygun bir script dizinidir. Ahenk uygulaması çalışmaya başladığında `/etc/ahenk/ahenk.conf` dosyasında belirtilmiş olan,([**ahenk.conf** dosyasında hangi parametre ne işe yarar?](http://docs.liderahenk.org/lider-ahenk-docs/developers/ahenk/sss/)) eklentilerin bulunduğu dizin yolu bilgisine erişir. Eklentilerin bu dizinde olması beklenir. Eklentinin tüm bileşenleri yeni oluşturduğumuz eklenti klasöründeyken, ahenk-eklenti kısmını oluşturan dizini projeden dışarıya çıkarmamak için **ahenk.conf** dosyasında belirtilen eklentilerin yoluna ahenk-eklenti klasörü için soft link vermemiz işimizi kolaylaştıracaktır. Bunun için:
3.1 `/etc/ahenk/ahenk.conf` dosyasında **pluginfolderpath** parametresinde `/opt/ahenk/plugins/` yolunun olduğunu varsayalım
3.2 Yeni oluşturduğumuz eklentinin adının **sample**, bu eklentinin ahenk kısmının yolunun da `/home/user/git/lider-ahenk-sample-plugin/ahenk-sample/sample` olduğunu varsayalım.
3.3 `/home/user/git/lider-ahenk-sample-plugin/ahenk-sample/sample` dizinini `/opt/ahenk/plugins/` dizini içine link vermemiz için çalıştırmamız gereken terminal kodu şöyledir:
4. Eklentimizin Console ve Lider kısımlarını tamamlayıp Console'a ve Karaf'a eklentilerimizi eklediysek task veya policy'ler çalıştırıldığında, gönderilen datalar artık eklentinin ilgili py dosyasının handle fonksiyonlarına gelmesi gerekmektedir.
5.**sample** adlı eklentimizde bulunması gereken py dosyaları şunlardır:</br>**main.py**</br>**policy.py** (Politika eklentisi ise bulunmalı)</br>**command_id.py** (Görev çalıştıran eklenti ise eklentinin command_id'si adında olmalı -Birden çok command_id'li eklenti olabilir.) </br>**safe.py** (isteğe bağlı- Kullanıcı oturum açarken ve kapatırken tetiklenir.) </br>**login.py** (isteğe bağlı- Kullanıcı oturum açarken tetiklenir) </br>**logout.py** (isteğe bağlı - Kullanıcı oturum kapatırken tetiklenir) </br>**init.py** (isteğe bağlı - Ahenk çalışmaya başladığında tetiklenir.)</br>**shutdown.py** (isteğe bağlı - Ahenk servisi kapatılırken tetiklenir)
6.**policy.py** politika çalıştıran eklentilerde bulunması gerekir. Güncel profiller **login** işlemi sonrasında alınır ve ilgili eklentinin **policy.py** dosyasındaki **handle_policy** fonksiyonu Ahenk çekirdeği tarafından çağırılır ve bu fonksiyon **profile_data** ve **context** diye iki argüman alır.
7.**command_id.py** görev çalıştıran eklentilerde olmalıdır. Bu script'in adı Lider'de tanımlanan **command_id** ile aynı olmak **zorundadır**. Lider'de tanımlı command id'ye **sample** eklentisi için **lider-sample** projesi **tr.org.liderahenk.sample.commands** paketi içinde tanımlanmış class'larda **getCommandId()** metodunda static olarak tanımlanmış halde bulabilirsiniz. Burada dikkat edilmesi gereken noktalar: bir eklentinin birden fazla görevi olabilir. Bu amaçla **tr.org.liderahenk.sample.commands** paketi altında birden fazla class ve command id tanımlanmış olabilir. Buna paralel olarak tanımlanan her command id için Ahenk eklentisinde de command_id isimleriyle py scriptleri oluşturmanız gerekir. Böylece aynı eklenti üzerinden gönderilen her farklı görev, Ahenk eklentisinde farklı command_id isimleriyle oluşturulmuş scriptlerce karşılanır.Bu scriptler dışardan **handle_task** fonksiyonu ile çalıştırılır ve bu fonksiyon **task** ve **context** diye iki argüman alır.
8. Politika ya da görev çalıştırdıktan sonra çeşitli işlemler gerçekleştirilen makine üzerinde, oturum kapatılırken geri almak istenilen bir yapılandırma ayarı, silinmesi gereken bir dosya ya da eski haline getirilmek istenen herhangi bir dosya için ,duruma göre, **init.py**, **shutdown.py**, **login.py**, **logout**, veya **safe.py** kullanılabilir.
9. Yukarda değinilen handle_policy ve handle_task fonksiyonlarının aldığı parametreleri açıklamak gerekirse: **context** Ahenk çekirdeği ile veri alışverişini sağlar. Şimdilik ahenk tarafından eklentiye, kullanıcı adı göndermek; eklenti tarafından çekirdeğe, çalıştırılan görev ya da profilin sonucunun/verinin döndürülmesi için kullanılır. Örneğin `context.get('username')` ile eklentinin üzerinde çalışması gereken kullanıcı adına erişebilir. `context.create_response(*args)` ile işlemin çalışma sonucunun (başarılı ya da başarısız olması gibi) döndürülmesi sağlanır.
**task ve profile_data** bu iki argümanda benzer işleve sahiptir. **task** görev çalıştırılırken gönderilen verilerin **profile_data** ise çalıştırılmak istenen profil bilgilerinin **json** formatındaki halidir. Console tarafından gönderilen veriler bu argümanlarla json formatında eklentiye ulaşır. Burdan sonra sadece gelen veriyi parse edip gerekli işlemleri gerçekleştimek kalıyor.
10. Archetype ile generate edilen eklentinin Ahenk kısmındaki politika ve görevleri karşılayan scriptler AbstractPlugin class'ını extend ederler. </br>**AbstractPlugin** sayesinde ahenk çekirdeğinin sağladığı bazı sevis ve özelliklere erişebilir. Örneğin `self.get_logger()` gibi... </br>Aynı zamanda AbstractPlugin üzerinden temel python operasyonlarının kolaylıkla gerçekleştirilmesi için **Util** kullanılabilir. Util'i kullanmak için AbstractPlugin'i extend etmek yeterlidir. Util'i kullanarak temel dosya işlemleri başta olmak üzere terminal komutlarını çalıştırmak gibi işlemler kolaylıkla gerçekleştirilebilir. Örneğin `self.execute('ls')`. İncelemek için [Util](https://github.com/Pardus-Kurumsal/ahenk/blob/master/opt/ahenk/base/util/util.py)'e bakılabilir.</br> Ahenk'in üzerinde çalıştığı makinenin temel sistem bilgilerine direk erişebilmek için AbstractPlugin üzerinden **System**'i kullanabiliriz. Örneğin: `self.Hardware.Network.interfaces()` ile network arayüzlerine erişilebilir. İncelemek için [System](https://github.com/Pardus-Kurumsal/ahenk/blob/master/opt/ahenk/base/system/system.py)'e bakılabilir.
####Dikkat Edilmesi Gereken Hususlar
-- Eklenti geliştirdikten sonra **BeniOku**, **Kullanıcı** ve **Geliştirici** için ayrı dokümanlar oluşturun ve bu belgeleri görsellerle destekleyiniz. </br>**BeniOku**'da eklenti hakkında kısaca temel bilgiler verilmeli. Bu bilgiler eklentinin politika veya görev çalıştırabilirliği, görev çalıştırıyorsa kaç farklı görev çalıştırdığı; kişi mi makine tabanlı mı olduğu , herhangi bir bileşene ya da mimariye bağımlı olup olmadığı; herhangi bir paket gereksinimi var olup olmadığı gibi bilgiler barındırmalı.
</br>--**Kullanıcı Kılavuzu**nda eklentinin ne işe yaradığı; hangi durumlarda nasıl kullanılacağı ekran görüntüleriyle desteklenerek açıklanmalıdır.
</br>--**Geliştirici Kılavuzu** için eklentinin kullandığı altyapı ve izlediği işleyiş, kullanılan harici bileşen-teknolojiler ve yöntemlerden bahsedilebilir.
</br>--**Eklenti gereksinimleri ve tanımını yapınız.** Eklenti dizininizde Debian klasörü altında **control** dosyasında **Description** değerinde eklentinin kısaca tanımını yazınız. **Depends** alanında ise bağımlı olduğu paketleri yazınız. (Eklenti çalışırken bu paketlerin bulunduğu varsayılmamalı, kontrol edilmeli, gerekiyorsa kurulmalı.)
</br>--Python kodunu [PEP-8](https://www.python.org/dev/peps/pep-0008/) standartına göre geliştirmeye özen gösterin.