22 Kasım 2010 Pazartesi

Amatör Çizimler

Boş vaktimde çizim yaparken biraz özenince çıktılarını buraya koymaya karar verdim. Belki devamı da gelir :) 
  • Koşan adam :
Creative Commons License
Koşan adam by Mustafa Hadi Dilek is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Based on a work at mustafahadi.blogspot.com.
  • Dwit chagi :
Creative Commons License
Dwit chagi by Mustafa Hadi Dilek is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Based on a work at mustafahadi.blogspot.com.
  • Neryo chagi :
Creative Commons License
Neryo chagi by Mustafa Hadi Dilek is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Based on a work at mustafahadi.blogspot.com.

3 Ağustos 2010 Salı

İlk SSH Oturumu Açılışında Fingerprint Kontrolü

SSH, ağ üzerindeki iki bilgisayarın güvenli bir şekilde iletişim kurmasını sağlayan bir iletişim protokolüdür. Aşağıdaki bilgi güvenliğine yönelik hususlar, SSH protokolü tarafından ele alınmaktadır:
  • Oturum açılması esnasında
    • İki tarafın da birbirinin kimliğinden emin olması (birbirlerinin açık anahtarları vasıtasıyla).
    • Oturum açılışında şifre kullanılıyorsa, şifrenin üçüncü taraflar tarafından edinilmesinin önlenmesi.
  • Oturum açıldıktan sonra
    • Transfer edilen verinin üçüncü taraflar tarafından edinilmesinin önlenmesi.
SSH protokolünün sağladığı bu güvenliği boşa çıkarabilecek bir husus, karşı tarafa ilk oturum açma esnasında gerekli güvenlik kontrollerinin yapılmasının ihmal edilmesidir. Bu durum DNS yönlendirmesi veya IP spoofing saldırısı yapılması durumunda bağlanmak istediğimiz sunucu yerine başka bir sunucuya yönlenmemize ve oturum açma bilgilerimizi (kullanıcı adı ve şifre) saldırgan makinaya vermemize yol açabilir.
İlk kez bir SSH oturumu açmaya kalktığımızda SSH istemcimiz bize şu uyarıyı yapar:
user1@host1.x.y:~$ ssh host2.x.y
The authenticity of host 'host2.x.y (10.0.0.1)' can't be established.
RSA key fingerprint is 12:45:1a:b3:81:0d:23:93:35:6a:21:91:ca:24:0b:20.
Are you sure you want to continue connecting (yes/no)?
Burada host1.x.y makinasındaki user1 kullanıcısı host2.x.y makinasına dogru ilk kez bir SSH oturumu açmak istemektedir. Oturum açma isteği aldığında SSH sunucusu, istemci tarafa kendi açık anahtarını ve yine bu açık anahtarın özetinin (fingerprint) kendi gizli anahtarı ile şifrelenmiş halini gönderir. İstemci bu şifrelenmiş özeti sunucunun açık anahtarını kullanarak açar. İstemcinin kendisi de sunucunun açık anahtarını aynı özet alma metoduna (hash algorithm) sokarak özet (fingerprint) üretir. Bu özet ile kendisine ağ üzerinden şifreli olarak gelen özeti karşılaştırır ve eşit olduğu taktirde, bu açık anahtarın karşı tarafa ait olduğundan ve karşı tarafın bu açık anahtara karşılık gelen bir gizli anahtara sahip olduğundan emin olur. Ancak emin olamadığı bir şey vardır: bu açık anahtar gerçekten bağlanmak istediği sunucuya mı ait?
Bu noktada bağlanmaya çalıştığımız kanalın dışında bir kanaldan doğrulama yapmamız gerekmektedir. host2.x.y makinasının konsolundan "root" olarak oturum açarak şu komutu çalıştıralım:
root@host2.x.y:~$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 12:45:1a:b3:81:0d:23:93:35:6a:21:91:ca:24:0b:20 /etc/ssh/ssh_host_rsa_key.pub (RSA)
Burada gördüğümüz özet (fingerprint) değeri SSH istemcisinin bize sorduğu ile aynı ise, gelen açık anahtarın bağlanmak istediğimiz sunucudan geldiğinden emin olabiliriz. SSH oturumu açarken sorulan soruya "yes" diyerek devam edilirse bu açık anahtar ssh tarafından kaydedilir ve sonraki oturum açma isteklerimizde artık bu soru sorulmaz.

1 Ağustos 2010 Pazar

Dinamik DNS Desteği Sunmayan Ağ Erişim Cihazları İçin SNMP Kullanımı ve Dinamik DNS Güncellemesi

Evinde veya ofisinde modem, router gibi cihazlar ile Internet erişimi sağlayan kullanıcılar, ev veya ofis dışından da bu cihazların arkasındaki bilgisayar ve diğer kaynaklara erişmek isteyebilirler. Bu durumda aşılması gereken ilk konu bu cihazlara konumlanabilmek, bir başka deyişle bu cihazların IP adreslerini öğrenmektir. Servis sağlayıcınız erişim cihazınıza statik IP atamış olabilir. Bu durumda zaten belirlenmiş olan bu IP adresini kullanarak ev veya ofis dışından erişim cihazınıza (ve arkasındaki bilgi kaynaklarınıza) bağlanabilirsiniz. Ancak statik IP kullanmıyorsanız, söz konusu IP adresi cihazınızın kapanıp açılması esnasında veya servis sağlayıcı tarafından bir şekilde kontrolünüz dışında değişebilir. Bu durumda cihazın başında olmaksızın güncel IP adresini öğrenmek için bir yol dinamik DNS servislerini kullanmaktır.
Dinamik DNS servisi kullanımında mekanizma, cihazınızın, sizin belirleyeceğiniz bir ağ arayüzündeki IP adresi değişikliklerini algılayarak otomatik olarak Dinamik DNS servisi aldığınız yerin sunucularında almış olduğunuz bir alan adına (domain name), yeni IP adresini bağlamaktan ibarettir.
Günümüz ağ erişim cihazları, özellikle ADSL modemler, dinamik DNS servislerine erişip DNS güncellemesi yapabilme yeteneğine sahiptirler. Ancak bu tür bir yeteneği olmayan cihazlarla aynı işi yapabilmenin bir yolu SNMP kullanmaktır.
SNMP (Simple Network Management Protocol), ağ üzerindeki her tür cihazdan veri toplama ve bu cihazları uzaktan yönetme amacıyla kullanılabilen bir iletişim protokolüdür. Cihazınız dinamik DNS desteği vermese de büyük ihtimalle SNMP desteği veriyor olmalıdır. Burada anlatacağımız yöntemde SNMP, ağ erişim cihazınızın güncel IP adresinin bu cihazın arkasında duran daha akıllı bir cihaz tarafından öğrenilmesi amacıyla kullanılacaktır.
Şu an elimizde şu tür bir konfigürasyon olduğunu varsayalım:
  • Bir adet ADSL modem. Bu modemde aşağıdaki gibi iki temel ağ arabirimini mevcut:
    • İç ağa bakacak şekilde bir adet ethernet arabirimi. (Örnek, eth0 ve IP'si 192.168.0.1)
    • Dış ağa bakacak şekilde bir adet ppp arabirimi.
  • İç ağda bir adet 7x24 çalışan bir sunucu. Örneğimizde bir Debian Linux sunucusu kullanıldı. Bu sunucunun erişim cihazına bağlı şekilde bir adet ethernet arabirimi mevcut.
Bu durumda aşağıdaki adımları uygulayarak, kendi özel dinamik DNS çözümümüze ulaşabiliriz:

ADSL Modemde SNMP Ajanının Aktive Edilmesi

  • SNMP v1 ve v2, erişimde doğrulama (authentication) amaçlı olarak Community tanımlamasını kullanmaktadır. Bu tanımlama erişim şifresi olarak düşünülebilir. Ancak bu tanımlama metni ağ üzerinden açık şekilde cihaza gidecektir. Dolayısıyla dinleyiciler (sniffer) tarafından kolayca elde edilebilir. Bu nedenle söz konusu SNMP versiyonları için sunucunun ADLS modeme kablolu ethernet üzerinden fiziksel olarak bağlı olması tercih edilmelidir.
  • İkinci olarak söz konusu Community tanımını en azından "public"  dışında sadece kendinizin bileceği bir değer atayarak yapmanız iyi olur. Örneğimizde "home" olarak belirlendi.
  • Son olarak bu Community üzerinden bağlantıları salt okunur (read-only) erişim yetkisi ile sınırlamak iyi olacaktır.

 Sunucuya SNMP kurulumu ve SNMP testleri

  • Aslında bu adım test amaçlı olarak kullanılacaktır:
    apt-get install snmp 
  • SNMP araçları sunucuya kurulduktan sonra aşağıdaki SNMP sorgusu ile ADSL modemden arabirim IP adreslerinin alınıp alınmadığı test edilir:
    snmpwalk -Oa -t 5 -c home -v 2c 192.168.0.1 ipAddrEntry.ipAdEntAddr
  • Bu sorgu sonucu aşağıdakine benzer bir rapor alınması muhtemeldir:
    IP-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1
    IP-MIB::ipAdEntAddr.a.b.c.d = IpAddress: a.b.c.d
    IP-MIB::ipAdEntAddr.192.168.0.1 = IpAddress: 192.168.0.1
    ...

SNMP Üzerinden Güncel Ağ Adresinin Öğrenilmesi

  • Bu aşamada yazacağımız perl programcığı SNMP kütüphanesi kullanacaktır. Bu amaçla debian paket yöneticisi üzerinden gerekli modüllerin kurulumu tercih edildi:
    apt-get install libsnmp-perl
  • SNMP üzerinden ADSL modemin ppp arabiriminin güncel IP adresini öğrenecek olan perl programı (snmp-ip-fetcher.pl) :
    #!/usr/bin/perl
    
    use Data::Dumper;
    use SNMP;
    
    $sess = new SNMP::Session(DestHost => "192.168.0.1", Community => "home", Version => "2c", Timeout => 5000000);
    
    $leaf_id = "ipAdEntAddr";
    $invalid_ip_filter = "^(192\.168|127)";
    
    my $ip = "";
    $vb = new SNMP::Varbind();
    $vb->[0] = $leaf_id;
    while ($vb->[0] eq $leaf_id && defined($val = $sess->getnext($vb))) {
      # print Dumper($vb->[0], $val, $leaf_id);
    
      if ($vb->[0] ne $leaf_id || $val =~ m/$invalid_ip_filter/) {
        next;
      }
    
      if ($val =~ m/^\d+\.\d+\.\d+\.\d+$/) {
        $ip = $val;
      }
    }
    
    print "$ip";
    
  •  Bu program çalıştırıldığında yukarıdaki test adımında elde edilen sonuçlardan yanlızca ppp arayüz IP adresini (yukarıda a.b.c.d ile ifade edilmişti) getirmelidir.

Dinamik DNS Güncellemesi

  • Bu adımda dinamik DNS güncellemesinde kullanmak üzere ez-ipupdate aracı tercih edildi:
    apt-get install ez-ipupdate
    
  • Söz konusu araç ile DNS güncellemesi yapılıp yapılamadığı test ediliyor. Örneğimizde dinamik DNS servisi DynDNS'ten alındı ve test amaçlı olarak Internet üzerinde geçersiz (IANA Special Use) bir IP (10.0.0.1) kullanıldı:
    /usr/sbin/ez-ipupdate -S dyndns -u kullanici:sifre -h foo.dyndns.org -a 10.0.0.1

    Dinamik DNS Güncellemesini Yapacak Zamanlanmış Görev

    • Zamanlanmış görev olarak çalıştırılacak shell script (updater.sh):
      #!/bin/sh
      
      ip_fetcher=./snmp-ip-fetcher.pl
      ez_ipupdater=/usr/sbin/ez-ipupdate
      current_ip_file=.current
      dyndns_service=dyndns
      dyndns_auth=kullanici:sifre
      dyndns_hostname=foo.dyndns.org
      
      if [ ! -f $current_ip_file ]; then
        touch $current_ip_file
      fi
      
      read current_ip < $current_ip_file
      new_ip=`$ip_fetcher`
      
      if [ -n $new_ip ]; then
        if [ "$current_ip" != "$new_ip" ]; then
          cmd="$ez_ipupdater -r 10 -S $dyndns_service -u $dyndns_auth -h $dyndns_hostname -a $new_ip"
          result=`$cmd`
          if [ "$result" == "request successful" ]; then
            echo $new_ip > $current_ip_file
            echo "IP adresi DNS'e kaydedildi. Yeni IP : $new_ip"
          else
            echo "IP adresi DNS'e kaydedilemedi. Yeni IP : $new_ip"
          fi
        else
          echo "IP adresi degismemis. IP : $current_ip"
        fi
      fi
      
    • updater.sh ve snmp-ip-fetcher.pl dosyalarının aynı dizinde (örneğin /crontab/dnsupdate dizininde) olmasına özen gösterelim.
    •  Aşağıdaki crontab satırı ile saatlik olarak ADSL modemin ppp ağ arabiriminin IP adresi alınarak dinamik DNS servisi sunucusuna güncelleme emri gönderilecektir:
      0 * * * *     (cd /crontab/dnsupdate && ./updater.sh)

    3 Temmuz 2010 Cumartesi

    Subversion (SVN) Servislerinin HTTPS Üzerinden Sunulması

     Subversion (SVN) servisleri aşağıdaki değişik yöntemlerle verilebilmektedir:
    • Dosya sistemi üzerinden
    • SVN protokolü ile
    • SSH tüneli kullanarak
    • HTTP/HTTPS protokolü üzerinden DAV ek özelliklerini (extensions) kullanmak suretiyle
    Yazılım geliştiriciler, versiyon kontrol sunucusu kullanıyorlarsa çoğunlukla bu sunucular üzerindeki ambarlara (repositories) kendi geliştirme ortamlarından (yani uzaktan) erişmek durumundadırlar. Bu durumda her nekadar dosya sistemi üzerinden erişimin de gerektiği durumlar olmasına rağmen genel olarak dosya sistemi üzerinden erişmeleri söz konusu değildir. Dolayısıyla uzaktan erişimi sağlamak üzere SVN sunucularının vermiş oldukları SVN protokolünü kullanmak düşünülebilir. Güvenli yerel alan ağları bulunan yerlerde yeterli görülebilecek olan bu metod, güvensiz ağ ortamlarında veya uzak ağlardan erişim gerektiği durumlarda yetersiz olmaktadır. Bu durumda da SSH tünelleri üzerinden açık anahtar şifreleme metodları kullanarak hem oturum açılışının hem de transfer edilen verinin güvenliği sağlanmış olacaktır. SVN kullanılan projelerde oldukça popüler olan bu metod, geliştiricilerin bilgisayarlarında SVN istemcisine bütünleşik veya ayrı çalışan bir SSH istemcisi gerektirmektedir. İstemci tarafında bu gereksinimi ortadan kaldırmak için HTTP protokolünün seçilmesi, bunu güvenli hale getirmek için de HTTPS kullanılması iyi bir tercih olacaktır. Bu yazımda da HTTPS protokolü üzerinde DAV ek özelliklerini kullanarak nasıl SVN servisi sunulabileceği anlatmaya çalıştım. Anlatılanlar aşağıdaki yazılımlar kurulu olan bir sistem üzerinde doğrudan uygulanabilir:
    • Debian linux dağıtımı
    • Apache 2.x Web sunucusu
    Apache sunucusuna dav ve authz_svn modüllerinin yüklenmesi için debian'ın apt-get aracını kullanıyoruz:
    apt-get install libapache2-mod-svn
    Apache mods-enabled dizini içinde dav_svn.load ve authz_svn.load linklerinin yaratılmış olduğu ve aşağıdaki satırları içerdikleri görülmelidir:
    LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so
    LoadModule authz_svn_module /usr/lib/apache2/modules/mod_authz_svn.so
    Aynı dizin içindeki dav_svn.conf dosyası SVN servisi ile ilgili ayarları içermek üzere kullanılabilir. Ancak burada söz konusu ayarların aşağıdaki gibi apache'nin HTTPS protokolü üzerinden çalışan virtual host ayar dosyasına konulması tercih edildi:
    ...
    <Location /svn/repo1>
      DAV                svn
      SVNPath            /svn/repo1
      AuthzSVNAccessFile /svn/repo1/conf/authz
    
      # only authenticated users may access the repository
      Require valid-user
    
      # how to authenticate a user
      AuthType Basic
      AuthName "repo1 - svn ambari"
    
      # Dosya tabali kullanici yonetimi:
      AuthUserFile /svn/secret/.htpasswd
    </Location>
    ...
    Yukarıdaki ayarlama aşağıdaki kuralları vermektedir:
    • SVN ambarına erişim adresi, "https://www.foo.com/svn/repo1" gibi bir HTTPS URL adresi olacaktır.
    • Kullanıcı doğrulamasında HTTP basic authentication kullanacak ve kullanıcı/şifre ikilileri /svn/secret/.htpasswd dosyasından alınacaktır.
    • SVN erişim yetkileri için SVN ambar dizinindeki authz dosyası kullanılmaya devam edecektir.
    Kullanıcı doğrulaması için LDAP servisleri de kullanılabilir. Bunun nasıl yapıldığı ile ilgili olarak LDAP ve Apache - Kullanıcı Doğrulaması Pratikleri başlıklı yazıya bakılabilir.
    Linkler:

    2 Temmuz 2010 Cuma

    SVN Repository Yedekleme

    "Subversion ile Salt Okunur Yansılama" başlıklı yazımda bir SVN ambarının salt okunur yansısının alınması konusu üzerinde durmuştum. Söz konusu yaklaşımda yansının olduğu sunucu, "svnsync" aracını kullanarak kısa aralıklarla ana ambarın olduğu makinaya bağlanıp kendisini senkronize etmekteydi.
    Bu metodun avantajları aşağıdaki gibi sıralanabilmekteydi:
    • Uzak makinalar arasında yapılan senkronizasyon işleminde düşük bant genişliği yeterli olmaktadır.
    • Sık yedek alınabilmesi sayesinde yansı, oldukça güncel tutulabilmektedir. Senkronizasyon sıklığı dakikalara indirilebilir.
    • Çok sayıda yansı performans kaybı yaratmaksızın ana ambara bağlanabilmektedir.
    Bu metodun dezavantajı ise sadece ambar içeriğinin senkronize edilebilmesi ve repository'nin ayar dosyalarının yansı ambarına taşınamıyor olması idi.
    Eğer SVN ambarının bulunduğu makinada yedek almamız söz konusu ve güncellik gereksinimi çok sık değilse yukarıdaki türde bir yansılama yapmak yerine birazdan anlatacağım yöntem ile yedek alınması daha uygun olacaktır. Bu yöntem ayrıca ayar dosyalarını da içerecek şekilde ambar'ın bire bir kopyasını alacaktır. "svnadmin hotcopy" aracını kullanacağımız bu metod, "svnsync" aracını kullandığımız yöntemde de olduğu gibi SVN sunucusu hizmet verirken yedek alabilmektedir.
    Yedekleme sürecinin alt adımlarını aşağıdaki gibi kabaca oluşturuyoruz:
    • Önce zamanlanmış crontab görevi çalışıyor
      • Crontab görevi, belirlenen SVN ambar dizinleri için ayrı bir script çalıştırıyor
        • Bir SVN ambarı için geçici bir dizin oluşturuluyor
        • svnadmin hotcopy aracı ile geçici dizinde kopya ambar oluşturuluyor
        • Kopya ambar paketlenerek arşivleniyor
        • Gereğinden eski arşivler silinerek diskte yer açılıyor
    Yedekleme uygulamamızın bulunacağı dizin yapısını aşağıdaki gibi planlıyoruz:
    • /yedek/svn (Buraya kullanacağımız scriptleri koyacağız)
      • /yedek/svn/source (Yedeklenecek ambarlara soft linkler içerecek dizindir. Yedeklenmesini istediğimiz ambara bu dizinden soft link atarak kolayca yedekleme sürecine sokabileceğiz. Silinen linkler için ise artık yedekleme yapılmıyor olacak.)
      • /yedek/svn/target (Yedek arşivlerini içerecek)
    Bu şekilde planlamamızı yaptıktan sonra şimdi uygulama kısmına geldik. Bir tek ambar için yedekleme işlemini gerçekleştirecek olan perl scripti (backup.pl) :
    #!/usr/bin/perl
    
    use Time::localtime;
    
    $BACKUP_TTL = 10;    # Geriye donuk olarak tutulmasi istenen dosya sayisi
    $TEMP_DIR   = ".tmp";
    
    if (!defined($ARGV[0]) || !defined($ARGV[1])) {
      print "\nUsage:\ncd  && svn-hotcopy.pl <repos_home> <repo_name>\n\n";
      exit;
    }
    
    $now = time();
    
    $current_path = `pwd`;
    chomp($current_path);
    
    $repos_home = $ARGV[0];
    $repo_name  = $ARGV[1];
    $repo_path  = "$repos_home/$repo_name";
    $temp_path  = "$current_path/$TEMP_DIR";
    
    # --- su anki zamanin alinisi :
    $cmd   = 'date -d "'.ctime($now).'" +%Y%m%d-%H%M%S';
    $timestamp = `$cmd`;
    
    # --- veya tamamen sistem tabanli cozum:
    # $timestamp = `date +%Y%m%d-%H%M%S`;
    
    chomp($timestamp);
    $backup_file_prefix = "svn.$repo_name";
    $backup_filename    = "$backup_file_prefix.$timestamp.tgz";
    
    # --- gecici dizin olusturulmasi :
    
    $cmd = "rm -rf $temp_path";
    print("$cmd\n");
    system($cmd);
    
    $cmd = "mkdir -p $temp_path";
    print("$cmd\n");
    system($cmd);
    
    # --- svn hotcopy :
    
    $cmd = "svnadmin hotcopy $repo_path $temp_path/$repo_name";
    print "$cmd\n";
    system($cmd);
    
    # --- paketleme islemleri :
    
    $cmd = "tar zcfp $backup_filename -C $temp_path $repo_name";
    print "$cmd\n";
    system($cmd);
     
    # --- temizlik islemleri ve geriye donuk silme islemleri:
    
    $cmd = "rm -rf $temp_path";
    print "$cmd\n";
    system($cmd);
    
    print "Deleting old archives...\n";
    @files = glob("$backup_file_prefix.*");
    
    $i = 1;
    for $file (reverse(@files)) {
      if ($i > $BACKUP_TTL) {
        $cmd = "rm -f $file";
        print("$cmd\n");
        system("$cmd");
      }
      $i++;
    }
    
    print "completed.\n";
    Yukarıdaki perl scriptini tüm ambarlar için çalıştıracak olan shell scripti (backup.sh) :
    #!/bin/bash
    
    BACKUP_HOME=/yedek/svn
    SOURCE_DIR=$BACKUP_HOME/source
    TARGET_DIR=$BACKUP_HOME/target
    BACKUP_SCRIPT=$BACKUP_HOME/backup.pl
    
    for REPO_NAME in $(ls $SOURCE_DIR); do
      (cd $TARGET_DIR && $BACKUP_SCRIPT $SOURCE_DIR $REPO_NAME)
    done
    
    Yukaridaki shell sctiptini tetikleyecek crontab satırı:
    0 2 * * * /yedek/svn/backup.sh  # --- each day at 02:00 AM
    Hepsi bu kadar.

    17 Mayıs 2010 Pazartesi

    Debian Üzerine Trac Kurulumu

    Bu yazıda Trac yazılımının Debian Linux dağıtımı üzerine kurulması ve örnek bir Trac proje ortamı oluşturulması anlatılmıştır.

    Trac, yazılım projelerinin yönetiminde kullanılabilecek Web tabanlı bir sorun takip sistemidir. Bunun yanında version kontrol sistemlerine arabirim, bütünleşik wiki ve çeşitli raporlama araçları içermektedir.

    Kurulu yazılımlar :

    • Debian Stable (Lenny 5.0.4)
    • Apache 2.x

    İşlem adımları :

    • Gerekli paketlerin kurulması. Debian'ın apt aracı ile trac yazılımını ve Apache 2 için Python modülü kuruluyor.
      apt-get install trac
      apt-get install libapache2-mod-python
      
    • Yeni bir proje ortamı oluşturulması için aşağıdaki formata uygun olan bir komut girilmesi gerekiyor.
      trac-admin </path/to/projenv> initenv
      
      Örneğimizde içinde bulunduğumuz dizin altında sample-project adında bir dizin ve proje ortamı oluşturulacak.
      trac-admin sample-project initenv
      
      Yukarıdaki işlem proje ortamının üretim sürecini başlatacaktır. Üretim sürecinde proje adı ve kullanılacak veri tabanı seçimi yapılır. Trac, başka bir veri tabanı türü seçilmemişse proje veritabanını SQLite kullanacak şekilde ( sqlite:db/trac.db ) oluşturuyor. SQLite dosya tabanlı bir veritabanı yönetim sistemidir.
    • Proje ortamının sunulmasında iki ayrı yaklaşımdan biri seçilebilir :
      • Bağımsız "tracd" sunucusu kullanmak.
      • Python desteği olan bir Web sunucusu kullanmak.
    • Burada 2. seçenek tercih edilerek Python modülü entegre edilmiş Apache 2 Web sunucusu kullanıldı.
    • Apache 2 sunucusunun ayarlanması. Apache ayar dosyasında sunumun yapılacağı ilgili VirtualHost bloğu altına aşağıdaki şekilde Location ayarı eklenir. Örneğimizde sunucu adından hemen sonra /trac/sample-project erişim yolu üzerinden Trac projesi sunulacaktır. Bu ayarlarda görülen /disk/trac/sample-project kısmı ise projenin dosya sistemindeki tam yolunu örneklemektedir.
      <Location /trac/sample-project>
        SetHandler mod_python
        PythonHandler trac.web.modpython_frontend
        PythonInterpreter main
        PythonOption TracEnv     /disk/trac/sample-project
        PythonOption TracUriRoot /trac/sample-project
        SetEnv PYTHON_EGG_CACHE /tmp
      </Location>
      
      Bu ayarlamanın etkinleştirilmesi sonucunda Web tarayıcısından "Sample Project" Trac proje sitesinin aşağıdakine benzer bir URL üzerinden açılabildiği görülecektir:
      http://sample.host.name/trac/sample-project/
      
    • Kullanıcı doğrulaması. Trac proje sitesi şu an kullanıcı doğrulaması yapamamaktadır. Dolayısıyla siteyi ziyaret eden herkes "anonymous" kullanıcısıdır. Belirlenen kullanıcı adı ve şifre ikilisini giren kişilerin doğrulanmış kişi olarak Trac tarafından tanımlanabilmesi için bir mekanizma kullanılması gerekmektedir. Burada gizli bir şifre dosyası üzerinden (.htpasswd) HTTP Basic Authentication mekanizması kullanılması örneklenmiştir. Apache 2 ayar dosyasına aşağıdaki Location ayarı ekleniyor.
      <Location /trac/sample-project/login>
        AuthType Basic
        AuthName "Sample Project"
        AuthUserFile /disk/trac/.htpasswd
        Require valid-user
      </Location>
      
      Burada . htpasswd dosyası kullanıcıların şifrelerinin tek yönlü şifrelenmiş olarak tutulabileceği ve Apache sunucusu tarafından okunabilecek şekilde erişim hakları sınırlanmış bir dosyadır. Apache 2 ile birlikte gelen htpasswd programı ile söz kullanıcı şifrelerinin çeşitli algoritmalar (crypt, MD5, SHA) kullanılarak tek yönlü şifrelenmiş hali üretilebilir. Bu ayarın etkinleştirilmesi sonucunda Trac, proje sayfasında "Login" linkini gösterecektir. Bu linke tıklandığında kullanıcı adı ve şifresi soran bir HTTP doğrulama diyaloğu açılacaktır. Örneğimizde "user1" kullanıcı için .htpasswd dosyasında aşağıdakine benzer kullanıcı adı ve şifrelenmiş şifre içeren bir satır olmalıdır.
      user1:IcSyd/ljIYR9Y
      
      Kullanıcı doğrulaması için LDAP servisleri de kullanılabilir. Bunun nasıl yapıldığı ile ilgili olarak LDAP ve Apache - Kullanıcı Doğrulaması Pratikleri başlıklı yazıya bakılabilir.
    • Erişim yetkilerinin ayarlanması. Kullanıcı doğrulaması ile kullanıcılar Trac'a tanıtılabilir hale geldi. Şimdi kullanıcıların Trac uygulamasında neler yapabileceklerini, yani kullanıcı yetkilerini tanımlamak gerekiyor. Bu amaçla trac-admin programı kullanılabilir. Aşağıda trac-admin konsolunun açılması örneklenmiştir.
      root@xyz:/disk/trac/sample-project$ trac-admin .
      Welcome to trac-admin 0.11
      Interactive Trac administration console.
      Copyright (c) 2003-2009 Edgewall Software
      
      Type:  '?' or 'help' for help on commands.
      
      Trac [/disk/trac/sample-project]>
      
      Aşağıda ise trac-admin konsolu içinden kullanıcıların yetkilerinin listelenmesi, anonymous kullanıcıların tüm yetkilerinin silinmesi ve user1 kullanıcısına Trac yöneticisi yetkisi verilmesi için kullanılacak komutlar örneklenmiştir.
      permission list
      permission remove anonymous *
      permission add user1 TRAC_ADMIN
      
    • Yazılım güncellemesi. Biraz önce Debian dağıtımı ile hazır paket olarak kurulan Trac, 0.11 versiyonuna sahipti. Kullanılan Debian dağıtımının paket yönetim tercihlerine dokunmaksızın doğrudan Python'un kendi araçlarını kullanarak güncelleme yapmak aşağıdaki gibi mümkün.
      root@xyz:~# easy_install --upgrade Trac
      Searching for Trac
      Reading http://pypi.python.org/simple/Trac/
      Reading http://trac.edgewall.com/
      Reading http://trac.edgewall.org/wiki/TracDownload
      Reading http://projects.edgewall.com/trac
      Reading http://projects.edgewall.com/trac/wiki/TracDownload
      Best match: Trac 0.12b1
      ...
      
      Yazılımı güncelledikten sonra Trac proje sitesinin güncellemesi için proje sitesinin bulunduğu dizine girilerek aşağıdaki komutlar çalıştırılıyor. Bu komutlar sırayla veritabanı güncellemesi, wiki güncellemesi ve versiyon kontrol yeniden senkronizasyonunu gerçekleştirecektir.
      cd /disk1/trac
      trac-admin sample-project upgrade
      trac-admin sample-project wiki upgrade
      trac-admin sample-project repository resync *
      
    • Eklenti kurulumu. Trac yazılımına eklenti kurmak için öncelikle setup-tools kurulumu yapılır:
      easy_install -U setuptools
      
      Aşağıdaki örnekte wiki sayfalarında WYSIWYG düzenlemesi yapmakta kullanılabilecek bir plugin kurulumu yapılmıştır.
      easy_install http://trac-hacks.org/svn/tracwysiwygplugin/0.12
      Kurulumu yapılan eklentinin aktive edilmesi için Trac proje ortamının bulunduğu dizinde conf dizini altında trac.ini dosyasında components bloğu içine aşağıdaki satir eklenir.
      [components]
      tracwysiwyg.wysiwygmodule = enabled