Bir web projesinde gelen ziyaretçinin geo-location kaynağına göre farklı durumlar yaratmak isteniyor ise bunun için kullanabileceğimiz çözümün adı MaxMind-GeoIP [1].

Ne?

MaxMind bu konuda birden farklı veritabanı sunuyor. Eğer kaynak ülkeye göre işlem yapmak isterseniz GeoIP [2], şehire göre işlem yapmak istiyorsanız GeoCity [3] veritabanını kullanabilirsiniz. Ücretli satılan bu veritabanları yerine ücretiz kullanıma sahip olan GeoLite [4] [5] serilerini de kullanmak mümkün. Yalnız bu serileri belirli aralıklarda elle güncellemeniz gerekeceğini unutmamalısınız.

Nasıl?

Bu işlemlerin tamamı için PHP, Python, C, C# gibi MaxMind’ın sağlamış olduğu kütüphaneleri ya da Apache modülü gibi API’leri kullanabilmektesiniz.

Apache için geo-ip modülünü aktif etmek 3 adımlık bir süreçten ibaret;

 Bash |  copy code |? 
1
2
apt-get install libapache2-mod-geoip
3
nano /etc/apache2/mods-available/geoip.conf
4

ile yüklediğimiz geoip modülünü açarak aşağıdaki satırlarla aktif olmasını ve bu işlemleri yaparken kullanacağı veritabanının yolunu belirteceğiz;

 Apache configuration |  copy code |? 
1
2
GeoIPEnable On
3
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
4

Bu işlemin ardından güncel GeoIP veritabanını belirttiğimiz path’e indirerek mod’u kullanılabilir hale getirmemiz yeterli olacaktır.

 Bash |  copy code |? 
1
2
cd /tmp
3
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
4
gunzip GeoIP.dat.gz
5
mkdir -p /usr/share/GeoIP
6
mv GeoIP.dat /usr/local/GeoIP/
7
a2enmod geoip
8
apache2ctl restart
9

Artık GeoIP  modülümüz kullanıma hazır dilerseniz .htaccess içerisinde ya da direkt olarak apache config’i içerisinde işleme sokabiliriz. Örneğin;

 Bash |  copy code |? 
1
2
RewriteEngine on
3
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(CA|US)$
4
RewriteRule ^(.*)$ http://us.domain.com$1 [L]
5
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(TR|DE|SE)$
6
RewriteRule ^(.*)$ http://eu.domain.com$1 [L]
7

Gibi big kod ile Kanada ve USA’den gelen kullanıcılaru us subdomain’ine, Türkiye, Almanya ve İsviçreden gelen kullanıcıları eu domain’ine yönlendirmiş oluruz.

Başka bir örnek olarak BTK tarafından anlmasızca siteleri bloklanan Google kısasa kısas yaparak Türkiye’den gelen kullanıcıları bloklamak isteseydi eğer, Apache içerisine şöyle bir ekleme yapması

 Apache configuration |  copy code |? 
1
2
SetEnvIf GEOIP_COUNTRY_CODE TR MalUlkeler
3
Deny from env=MalUlkeler
4
Allow from all
5

Bunun türevlerini GeoCity gibi veritabanlarını kullanarak genişletmeniz de mümkündür.

Neden?

Peki neden bunu yazılım içerisinden değil de Apache üzerinden yapıyoruz? Tamamen kişisel bir tercih ve performans kaygısıdır. PHP interpreter’ına girirek bu işlemleri yapmaktansa daha web sunucuya bağlantı kurulduğu anda bu işlemi gerçekleştirmek bir çok yönüyle daha hızlı olacaktır.

Linkler;

[1] http://www.maxmind.com/app/ip-location
[2] http://www.maxmind.com/app/country
[3] http://www.maxmind.com/app/city
[4] http://www.maxmind.com/app/geolitecountry
[5] http://www.maxmind.com/app/geolitecity

11-13 Şubat 2009 tarhleri arasında Harran Üniversitesi’nde yapılacak olan Akademik Bilişim Konferasında Arda Çetin ile birlikte Mikrotik Router OS, Mikrotik Router Board ve Appliance cihazları tanıtıp anlatacağız hatta ve hatta 30dk. süremiz içerisine sığdırabilirsek ufak bir uygulamada yapacağız.

Canis aureus izlenimleri February 5th, 2009

Evet Pardus 1.0′dan beri kurup kullanmak için pek fırsatım olmamış idi. Şu anda bir test için kurup Pardus kullanmam gerekti ve şu noktaları gözüme çarpan noktalar şunlar;

  1. Ubuntu’nun çalıştırmak için 40 takla attıran ekran ve kablosuz ağ kartım canavar gibi çalışıyor.
  2. Sevgili Kaptan “Windoze ile aynı disk ile kurulu olduğundan burdaki verilerinizi göç ettirmek ister misiniz?” dedi. Bunu test etmek için vaktim olmasa da bir ara deneyeceğim.
  3. Yine sevgili Kaptan Internet’e ağ ayarlarınızı yapılandıralım dedi ve bunu profil bazlı yapacağım dedi. Bu da ayrı bir güzel fakat keşke profil oluşturduktan sonra hemen ağa kendi bağlansaydı sanki daha hoş olacak idi.
  4. mp3, divx, dvd vs. gibi medyalar için beni uğraştırmadı kesinlikle ben hepsini çalar, oynatırım yeterli aralar bozulmasın dedi.
  5. Ön tanımlı konsol renklendirmesi hoş, hele ki grep’lediğimde sonuçları renklendirmesi gayet iyi bir cilve idi. Keşke bunu daha önce ben de yapsaymışım.
  6. NTFS olarak biçimlendirilmiş harici diskim yazılabilir mount edilmiş, yazabiliyorum evet. :D
  7. Pisi ile paket kurmak istediğimde 3 paket seçtiniz fakat 7 paket kurulacak dedi ama diğer ek paketler nedir açıklama gereğinde bulunmadı! Paketler yüklenirken türlü maymunluklarla güldürmeyi unutmadı.
  8. Üzerinde IM olarak Kopete kurulu gelmiş. Her nasıl oluyorsa tek bir IM hesabımı eklemiş olmama rağmen login olmamla birlikte bilgisayarım kitlenlenmesi aynı ana denk gelme olasığını yok varsayıyorum. Bir IM nasıl komple bilgisayarı down eder enteresan.

Zannedersem test maceramız bu kadar kısa sürecekmiş. :)   Bir daha ki boş vaktime kadar kurulu bekleyecek. O zaman biraz daha detaylı da inceleyebiliriz.

Sonradan gelen edit : Kurulum süresi Ubuntu’ya göre çok çok daha kısa sürdü :)

Belli bir öğe dizisi için bir özelliği belli koşullara göre ayarlamamız gerekiyorsa bunu winbox üzerinden defalarca tıklayarak yapmak bir çözüm olabileceği gibi aynı işi bir betik aracılığı ile de yapmak mümkün olacaktır.

Kabuk üzerinde koşul dizilimi şu şekildedir.

[sourcecode language="bash"]
[admin@Mikrotik] > :global deger1 “degerli”
[admin@Mikrotik] > :global deger2 “degersiz”
[admin@Mikrotik] > :if ($deger1 = $deger2) do={:put “Eslesiyor”}\
[admin@Mikrotik] > else={:put “Eslesmiyor”}
[/sourcecode]

Bu şekilde şartlara göre seçimimizi yapabilir ve işlemlerimizi gerçekleştirebiliriz.

Döngüler; belirtmiş olduğumuz durum sağlanıncaya kadar işlem tekrarıdır.
Kabuk içerisindeki söz dizimi ise şu şekildedir;

[sourcecode language="bash"]
[admin@Mikrotik] > :for i from=1 to=10 do={:put $i}
[/sourcecode]

ile 1′den 10′a kadar sayıları ekrana bastırabiliriz.

Daha reel bir uygulama yapacak olursak kuyruk listemizde ekli olan tüm kuralların maksimum download ve upload’ını 1Mb ile limitlendirelim;

[sourcecode language="bash"]
[admin@Mikrotik] > :local queueLen [ :len [ /queue simple find ]]; \
:for i from=0 to=$queueLen do={ /queue simple set $i max-limit=1000000/1000000}
[/sourcecode]

Bu örnekte öncelikle :len ile tüm kuyrukta yer alan kuralların sayısı aldık. Bu değeri daha sonra kullanabilmek için lokal bir değişken olan queueLen’e atadık. Bir sonraki komut dizesinde ise tüm kuyruk boyunca max-limit değerini 1Mb olarak atamış olduk.

Yine diğer programlama dillerinden aşina olduğumuz diziler üzerinde çalışabilmeyi mümkün kılan foreach döngüsünü de kabuk üzerinde kullanabilmekteyiz.

[sourcecode language="bash"]

[admin@Mikrotik] > :local toplamIP [/ip address find interface="ether1"];\
:foreach idIP in=$toplamIP do={\
:local durum [/ip address get $idIP disabled];\
:local IPadresi [/ip address get $idIP address];\
:if ($durum=”false”) do={:put ($IPadresi . ” Kapali\n”)}\
else={:put ($IPadresi . ” Acik\n”)}}
[/sourcecode]

Burdaki örnekle beraber ether1 üzerindeki IP adreslerinin Kapalı ya da Açık olması durumuna dair bir listesi alınabilir.

Sadece belli sayıdaki işlemler için değil belirli bir koşula göre işleyebilecek bir döngümüz de var. Bu döngümüz do..while ya da while…do döngüsü. Bu döngüye ait söz dizilimi de şu şekildedir.

[sourcecode language="bash"]

[admin@Mikrotik] > :global ethernetCount [:len [/interface find type=ether]]; :global $i 0;
[admin@Mikrotik] > :while ($i < $ethernetCount) do={\
:put [/interface ethernet $i name]; :set i ($i+1);}
[/sourcecode]

[sourcecode language="bash"]
[admin@Mikrotik] > :global i 11;
[admin@Mikrotik] > :do {:put $i; :set i ($i – 1);} while=($i > 0)
[admin@Mikrotik] > :unset i;
[/sourcecode]

Mikrotik betik dili üzerinde iki tip değişken bulunmaktadır.

  • global – Tüm aktif kullanıcılar ve betikler tarafından erişilebilen değişken tipidir. global deyimi ile tanımlanır.
  • local – Sadece tanımlandığı blok içerisinden erişilebilen değişken tipidir, yine local deyimi ile tanımlanır.

[sourcecode language="bash"]
[admin@Mikrotik] > :local testDegiskeni; :set testDegiskeni “Test ediyoruz”; :put $testDegiskeni
[/sourcecode]
Aynı kod bloğu içerisinde öncelikle local bir testDegiskeni adında bir değişken oluşturduk, değerini Test ediyoruz olarak atadık, daha sonrada değişkenimizin değerini ekrana bastırdık.

Peki bu değişkeni daha birden fazla satırı ve/veya kod bloğu olan bir betik içerisinde kullanma ihtiyacımız olsa idi?
[sourcecode language="bash"]
[admin@Mikrotik] > :global testDegiskeni
[admin@Mikrotik] > :set testDegiskeni “Mikrotik dunyasina hosgeldin\n”
[admin@Mikrotik] > :for i from=1 to=3 do={:put $testDegiskeni}
[/sourcecode]
Bu örnekte de görülebileceği gibi testDegiskeni adında bir global değişken tanımladık ve daha sonraki kod bloklarımızdan değişkenimize ulaşarak gerekli işlemleri yaptık.

Mikrotik bildiğiniz üzre kolay kullanımı için güzel bir görsel kullanıcı arayüzüne sahiptir.  Bu arayüz sayesinde çok kolay ayarlanabilen, takip edilebilen, kullanıcı dostu bir işletim sistmidir.

Bu kadar kolaylık arasında ya kendimize/duruma özel işlemler yapmak istersek? Ya aynı işlemi defalarca yapmak zorunda isek? Ya da bir işlemi sayısız kere belirli aralıklarla yapmak zorunda isek?

Bu kadar esnek bir sistem tabi ki de buna da imkan tanıyacaktır. Mikrotik güçlü kabuğu sayesinde tüm işlerinizi otomatik hale getirmenize ya da durumlara özel çareler üretmenize yardımcı olacaktır.  Kabuk üzerinden (Telnet/SSH/Winbox/Serial) işinize uygun bir betik yazarak dilediğiniz gibi tüm işlemlerinizi gerçekleştirebilirsiniz.

Genel anlamda kullanacağımız kabuk *nix üzerinde yer alan kabuklardan pek te farklı değildir. Bash ya da sh’ta kullanmış olduğumuz “\”, “;” ,”#”,”{}”,”[]“  sınırlayıcılar pek fark olmadan yine bu kabuk üzerinde kullanılabilir.

Veri tipleri

Betik yazımı sırasında sık sık kullanacağımız değişkenler için önceden belirlenmiş tipler mevcuttur. Bunlar;

  • number – 64 bitlik Integer tipi değişken türü (işaretli +/-), aynı zamanda hexadecimal veri girişi de mümkündür.
  • boolean – doğru/yanlış veri tipi, true ya da false değerlerini alabilmektedir.
  • string – karakter dizisidir. “test verisi” gibi bir değer alabilir.
  • IP – IP adresi barındırabilen veri tipidir.
  • time – tarih ve zaman tutan veri tipidir.
  • array – dizi verileri tutabilen veri tipidir.
  • nil – öntanımlı veri tipidir, değişken değer verilmediği sürece değeri nil’dir.

Ayrımlama işaretleri

  • \”       -  çift tırnak
  • \\     – ters bölü
  • \n     – yeni satır
  • \r     – satır başı
  • \t     – yatay sekme
  • \$
  • \?
  • \_     – boşluk
  • \a     – zil
  • \b     – gerisilme
  • \f     – sayfa ileri
  • \v     – yatay sekme
  • \xx     – onaltılık düzende değer

Operatörler

Aritmetiksel Operatörler

  • +  toplama
  • -   çıkarna
  • /  bölme
  • *  çarpma
  • -  negatif

Karşılaştırma Operatörleri

  • < küçükse
  • > büyükse
  • <= küçük ve eşitse
  • >= büyük ve eşitse
  • = eşitse
  • != eşit değilse

Mantıksal Operatörler

  • “!” / “not”  değilse
  • “&&” / “and” ve
  • “||” / “or” veya

Bitsel Operatörler

Bitsel operatörler yanlızca number ve IP veritiplerindeki değişkenler/değerler için kullanılabilmektedir.

  • “~”  değil, bitin tersini alma
  • “&” ve (1 ve işleminde etkisiz, 0 biti ise yutan elemandır)
  • “|” veya (0 ve işleminde etkisiz, 1 biti ise yutan elemandır)
  • “^” özel veya (aynı bitler için 0, farklı bitler için 1 elde eder)
  • “<<” sola kaydırma  (belirtilen değer kadar bitleri sola kaydırır)
  • “>>” sağa kaydırma (belirtilen değer kadar bitleri sağa kaydırır)

Birleştirme operatörleri

  • “.” İki karakter dizisini birbirine bağlar.
  • “,” Dizi elemanlarını birbiri ardına sıralar/Diziye yeni değer ekler.