Hyper-V üzerine Debian Lenny kurulumu July 31st, 2010
Hyper-V üzerinde Lenny guest kurulumu yapacaksanız dikkat etmeniz gereken sadece iki ufak nokta vardır.
Bunlardan birincisi Lenny üzerinde henüz default kernel 2.6.26 olduğu için Hyper-V tarafından sağlanan synthetic device’lar ile konuşamamktadır (kernel 2.6.32 upgrade’i ile de bunu aşabilirsiniz). Bunun için sanal makineye normal bir ethernet kartı değil “Legacy Network Adapter” eklemeniz gerekmektedir.

Böylece problemsiz olarak ethernet kartlarını kullanmaya başlayabilirsiniz.
Bir diğer problem ise öntanımlı olarak framebuffer device’tan dolayı installer ekranlarının geç render olması. Bunun için boot etmeden önce fb=off parametresi ile framebuffer device’ı disable edebilir ve console ortamında daha rahat çalışabilirsiniz.

Debian üzerinden MySQL back-end’e sahip Bind yapılandırmak June 13th, 2010
Dağıtık projelerde genellikle yaşanılan sıkıtılardan biri kullanmış olduğunuz yazılımların yapıları gereği bir API’ye sahip olmamasından kaynaklanmaktadır. Bununla beraber yazılımların izin verdiği derece alt arayüzler ve genellikle ek yazılımlar üreterek çözümler geliştirilir.
Örneğin multi node’dan oluşan bir web-host farm’ında her noktadan gelecek değişilikleri bind üzerinde güncellemek/eklemek istiyorsunuz. Bunun için ya bir veritabanı üzerinden çalışan bir queue mantığı ile yönetmeniz ya da bu işi yapan bir RPC Interface ile gerçekleştirmeniz gerekecektir.
Bunun yerine diğer bir seçenek ise Bind’ın config dosyaları üzerinde değişiklik yapmaktan ziyade daha pratik bir uygulamaile host detay kayıtlarının MySQL üzerinde tutulduğu ve anlık olarak buradan değiştirildiği bir DNS sunucuya sahip olmak olabilir.
Bunun için sourceforge üzerinde yayınlan mysql-bind adlı projeyi kullanabiliriz. Debian bir sistem üzerinde yapmamız gereken adımlar şu adımlardan oluşmaktadır;
İşleme gerekli paketlerin yüklenmesi ile başlayalım;
| Bash | | copy code | | ? |
| 1 | cd /usr/src |
| 2 | apt-get install mysql-server libmysqlclient15-dev |
| 3 | apt-get install build-essential |
| 4 | apt-get install libssl-dev libtool libdb-dev libldap2-dev libxml2-dev libcap2-dev hardening-wrapper libkrb5-dev debhelper fakeroot bison |
| 5 |
Bu işlem sırasında MySQL size bir root parolası soracaktır. Belirlemiş olduğunuz bu parola tüm MySQL yönetimsel işlemlerinde kullanılacağından sağlam ve unutmayacağınız bir parola vermeniz gerekmektedir.
Bundan bir sonraki adımda bind source ve bind-mysql’i edinmek;
| Bash | | copy code | | ? |
| 1 | apt-get source bind9 |
| 2 | wget http://downloads.sourceforge.net/project/mysql-bind/mysql-bind/mysql-bind-0.2%20src/mysql-bind.tar.gz?use_mirror=garr |
| 3 | tar zxf mysql-bind.tar.gz |
| 4 |
mysql-bind kodunu bind’a ekliyoruz;
| Bash | | copy code | | ? |
| 1 | cd mysql-bind |
| 2 | cp mysqldb.c ../bind9-9.5.1.dfsg.P3/bin/named/ |
| 3 | cp mysqldb.h ../bind9-9.5.1.dfsg.P3/bin/named/include/named/ |
| 4 | cd ../bind9-9.5.1.dfsg.P3/ |
| 5 |
Bind’a Database driver’ını ekelemek için gerekli bilgileri MySQL’den almamız gerekiyor. Bu komutların vermiş olduğu çıktıları bir kenara not etmemiz gerekmektedir.
| Bash | | copy code | | ? |
| 1 | mysql_config --cflags |
| 2 | mysql_config --libs |
| 3 | cd ../bind9-9.5.1.dfsg.P3/ |
| 4 | nano bin/named/Makefile.in |
| 5 |
Açılan dosyamız içerisinde DBDRIVER_OBJS yazan satıra gitmemiz gerekiyor. Bu satırda yer alan değişkenleri aşağıdaki gibi doldurmamız gerekiyor;
| C | | copy code | | ? |
| 01 | |
| 02 | DBDRIVER_OBJS = |
| 03 | DBDRIVER_SRCS = |
| 04 | DBDRIVER_INCLUDES = |
| 05 | DBDRIVER_LIBS = |
| 06 | |
| 07 | DBDRIVER_OBJS = mysqldb.@O@ |
| 08 | DBDRIVER_SRCS = mysqldb.c |
| 09 | DBDRIVER_INCLUDES = -I'/usr/include/mysql' //mysql_config --cflags ciktisi |
| 10 | DBDRIVER_LIBS = -L'/usr/lib/mysql' -lmysqlclient //mysql_config --libs ciktisi |
| 11 |
dosyayı kaydederek kapatıyoruz.
Bir sonraki aşamada ise bind’ın MySQL bağlantısını açabilmesini sağlamak için gerekli eklemeleri bin/named/main.c içinde değişiklik yapmamız gerekiyor.
| Bash | | copy code | | ? |
| 1 | |
| 2 | nano bin/named/main.c |
| 3 |
Dosya içerisinde öncelikle mysqldb header dosyasının dahil olmasını ardından ns_server_create fonksiyonunun çağırıldığı satırın öncesine mysqldb_init(); ekleyerek veritabanı bağlantısının yapılmasını, ns_server_destroy fonsksiyonundan hemen sonraki satırda mysqldb_clear(); ile açılan bağlantının kapatılmasını sağlamamız gerekiyor.
| C | | copy code | | ? |
| 01 | #include <dns/view.h> |
| 02 | /* |
| 03 | * |
| 04 | * |
| 05 | */ |
| 06 | |
| 07 | #include <dst/result.h> |
| 08 | |
| 09 | #include "bin/named/include/named/mysqldb.h" |
| 10 | |
| 11 | /* |
| 12 | * |
| 13 | * |
| 14 | */ |
| 15 | |
| 16 | #endif |
| 17 | |
| 18 | mysqldb_init(); |
| 19 | ns_server_create(ns_g_mctx, &ns_g_server); |
| 20 | } |
| 21 | |
| 22 | /* |
| 23 | * |
| 24 | * |
| 25 | * |
| 26 | */ |
| 27 | |
| 28 | destroy_managers(); |
| 29 | |
| 30 | ns_server_destroy(&ns_g_server); |
| 31 | mysqldb_clear(); |
| 32 | |
| 33 | ns_builtin_deinit(); |
| 34 | |
| 35 |
Artık hazırlamış olduğumuz yapılandırmayı bir debian paketi haline getirebilir ve oluşturduğumuz paketleri yükleyebiliriz.
| Bash | | copy code | | ? |
| 1 | |
| 2 | dpkg-buildpackage -rfakeroot -b |
| 3 | cd .. |
| 4 | dpkg -i *.deb |
| 5 |
Bu işlemden sonra bind’ı durdurarak MySQL üzerinde gerekli kullanıcı ve tablolaları yaratıroyuruz;
| Bash | | copy code | | ? |
| 1 | |
| 2 | /etc/init.d/bind stop |
| 3 | mysql -u root -p |
| 4 |
%nbsp;
| SQL | | copy code | | ? |
| 01 | |
| 02 | CREATE DATABASE dns; |
| 03 | CREATE USER 'dnsuser'@'localhost' IDENTIFIED BY 'password'; |
| 04 | GRANT SELECT ON dns.* TO 'dnsuser'@'localhost'; |
| 05 | |
| 06 | CREATE TABLE mydomains ( |
| 07 | name varchar(255) DEFAULT NULL, |
| 08 | ttl int(11) DEFAULT NULL, |
| 09 | rdtype varchar(255) DEFAULT NULL, |
| 10 | rdata varchar(255) DEFAULT NULL |
| 11 | ) TYPE=MyISAM; |
| 12 | |
| 13 | INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'SOA', 'mydomain.com. www.mydomain.com. 200309181 28800 7200 86400 28800'); |
| 14 | INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'NS', 'ns0.mydomain.com.'); |
| 15 | INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'NS', 'ns1.mydomain.com.'); |
| 16 | INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'MX', '10 mail.mydomain.com.'); |
| 17 | INSERT INTO mydomains VALUES ('ns0.mydomain.com', 259200, 'A', '192.168.1.1'); |
| 18 | INSERT INTO mydomains VALUES ('ns1mydomain.com', 259200, 'A', '192.168.1.1'); |
| 19 | INSERT INTO mydomains VALUES ('www.mydomain.com', 259200, 'A', '192.168.1.1'); |
| 20 | INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'A', '192.168.1.1'); |
| 21 |
Hem kullanacağımız veritabanı hem de örnek bir domain için gerekli kayıtları oluşturmuş olduk. Artık sadece named.conf’a bu domain’i belirterek bind’ı başlatmamız yeterli olacaktır.
| Bash | | copy code | | ? |
| 1 | |
| 2 | zone "mydomain.com" { |
| 3 | type master; |
| 4 | notify no; |
| 5 | database "mysqldb dns mydomains localhost dnsuser password"; |
| 6 | }; |
| 7 |
Konsoldan nslookup ile sorguladığınızda dns sunucunuzun verdiği sonuçları kontrol edebilirsiniz;
| Bash | | copy code | | ? |
| 01 | |
| 02 | >nslookup |
| 03 | >server 127.0.0.1 |
| 04 | Default server: 127.0.0.1 |
| 05 | Address: 127.0.0.1#53 |
| 06 | >www.mydomain.com |
| 07 | Server: 127.0.0.1 |
| 08 | Address: 127.0.0.1#53 |
| 09 | |
| 10 | Non-authoritative answer: |
| 11 | Name: www.mydomain.com |
| 12 | Address: 192.168.1.1 |
| 13 |
Ve işte artık zone kayıtlarını MySQL üzerinde tutan bir bind sunucuya sahip durumdayız.
Not:
- Boot sırasında MySQL sunucunun bind’tan önce başlamak zorunda olduğunu unutmayınız.
- Çıkabilecek bind açıklarına karşı bind updatelerini kesinlikle takip etmenizi öneririm.
Apache üzerinde Geo-IP filtering June 5th, 2010
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
Ubuntu 10.04 Lucid Lynx üzerinde sun-java6-jdk kurulumu June 3rd, 2010
Ubuntu; Lucid Lynx release notlarında duyurduğu üzere [1] Sun JDK6′yı non-free software reposu olan multiverse üzerinden çekmiş ve bunu partner reposuna taşımış durumda.
JDK ile bağıl herhangi bir yazılım kurmak istediğiniz otomatik olarak main repo’dan openjdk yüklenecektir. Eğer ki kullanmış olduğunuz yazılımlarda SUN’ın javasına bağlı iseniz aşağıdaki adımları izleyerek sun-java6-jdk paketini yükleyebilirsiniz.
| Bash | | copy code | | ? |
| 1 | |
| 2 | leoman@leotown:~$ sudo echo "deb http://archive.canonical.com/ lucid partner" >> /etc/apt/sources.list |
| 3 | leoman@leotown:~$ apt-get update |
| 4 | leoman@leotown:~$ apt-get install sun-java6-jdk |
| 5 |
[1] https://wiki.ubuntu.com/LucidLynx/ReleaseNotes#Sun Java moved to the Partner repository
qmail kuyruk temizleme ve kuyruk yönetimi June 3rd, 2010
Mail sunucu yönetenler için sıkça yaşanabilecek bir problem olarak sevgili kullanıcılarınızın bir botnet zombisi haline gelmiş olması ya da bir şekilde mail şifresini çaldırmış olmasıdır. Buna bağlı olarak kullanıcının bilgisayarı üzerinden ya da farklı bir noktadan yüklü bir spam mail gönderimi ile sonuçlanır.
Eğer ki MTA olarak qmail kullanıyorsak takım çantanızda sürekli barındırmanız gereken iki adet edevat bulunmaktadır. Bunlardan birincisi qmHandle, daha bir güzeli ise qmail-remove
qmHandle detaylı bir çıktı verebilen, local ve remote queue’yu sadece bir parametre ile güzelce listeleyebilen güzel bir perl script’idir. Eğer ki queue’da biriken mailleriniz onbinlerin üzerinde ise maalesef ki queue üzerinde işlem yapmanız demek pek te mümkün olmayacaktır.
qmHandle’ı http://sourceforge.net/projects/qmhandle/ adresi üzerinden edinebilir ve queue directory yapısında değişiklik yapılmamış bir qmail kurulumu üzerinde problemsiz olarak kullanabilirsiniz.
Download adresinden indireceğiniz dosyayı tar ile açmanız yeterlidir. Script bash üzerinde çalışmaya nazır ve hazırdır.
(Plesk kontrol panel kullanılan sunucularda qmHandle’ı indirmeye gerek bulunmamaktadır. Çakma bir isim değiştirme yöntemi ile duplicate edilmiş script’in kendisini /usr/local/psa/admin/sbin/mailqueuemng adıyla çağırabilirsiniz.)
Bash üzerinde perl ile birlikte şu şekilde çalıştırabilirsiniz.
| Bash | | copy code | | ? |
| 1 | |
| 2 | perl qmHandle |
| 3 |
Bu işlem sonunda kullanabileceğiniz parametrelere dair aşağıdaki gibi bir çıktı görüntülenecektir;
| Bash | | copy code | | ? |
| 01 | |
| 02 | qmHandle v1.2.0 |
| 03 | Copyright 1998-2003 Michele Beltrame |
| 04 | Available parameters: |
| 05 | -a : try to send queued messages now (qmail must be running) |
| 06 | -l : list message queues |
| 07 | -L : list local message queue |
| 08 | -R : list remote message queue |
| 09 | -T : list todo message queue |
| 10 | -s : show some statistics |
| 11 | -mN : display message number N |
| 12 | -dN : delete message number N |
| 13 | -Stext : delete all messages that have/contain text as Subject |
| 14 | -D : delete all messages in the queue (local and remote) |
| 15 | -V : print program version |
| 16 | |
| 17 | Additional (optional) parameters: |
| 18 | -c : display colored output |
| 19 | -N : list message numbers only |
| 20 | (to be used either with -l, -L, -R or -T) |
| 21 | |
| 22 | You can view/delete multiple message i.e. -d123 -v456 -d567 |
| 23 |
Yardım içeriğinde de bahsettiği üzre “-l”, “-L”, “-R”, “-T” ile queue üzerindeki tüm mesajları ve queue’daki çeşitlerine göre listeleyebilmektesiniz.
Örneğin qmHandle -R ile listelemiş olduğunuz remote queue’da aynı kullanıcının defalarca mail gönderdiğini gördünüz fakat içeriğini merak ediyorsunuz.
| Bash | | copy code | | ? |
| 01 | |
| 02 | 65732975 (10, R) |
| 03 | Return-path: spammer@damnit.com |
| 04 | From: |
| 05 | To: |
| 06 | Subject: Viagra Cialis |
| 07 | Date: Thu, 3 Jun 2010 19:17:37 +0300 |
| 08 | Size: 11273 bytes |
| 09 | Message-Id: <000f01cb0338$484a6c80$0302a8c0@emlak5a8613ad1> |
| 10 | Queue Time: 1275581860 sec |
| 11 | Envelope Recipients (R): mazlum@yandim.com, daha_bir_cok_mail_adresi |
| 12 | |
| 13 | 65736822 (16, R) |
| 14 | Return-path: spammer@damnit.com |
| 15 | From: |
| 16 | To: |
| 17 | Subject: Viagra Cialis |
| 18 | Date: Thu, 3 Jun 2010 19:17:37 +0300 |
| 19 | Size: 11273 bytes |
| 20 | Message-Id: <000f01cb0338$484a6c80$0302a8c0@emlak5a8613ad1> |
| 21 | Queue Time: 1275581860 sec |
| 22 | Envelope Recipients (R): mazlum@tiallahcezani.com, daha_bir_cok_mail_adresi |
| 23 |
Yukarıdaki görmüş olduğunuz queue çıktısında mail header’larının hemen üstünde yer alan numara unique bir queue id’sidir. Yine qmHandle yardımı ile mesajın içeriğini aşağıdaki gibi görüntüleyebiliriz.
| Bash | | copy code | | ? |
| 1 | |
| 2 | perl qmHandle -m65736822 |
| 3 |
DİKKAT : Gerek qmHandle, gerek qmail-remove ile kuyruktan herhangi bir maili silmeden önce muhakkak ve muhakkak qmail’i durdurmanız gerekmektedir.
Yine bu maili dilerseniz mesaj id’si ile, dilerseniz de subject’ine göre silebilirsiniz;
| Bash | | copy code | | ? |
| 1 | |
| 2 | perl qmHandle -m65736822 |
| 3 |
veya
| Bash | | copy code | | ? |
| 1 | |
| 2 | perl qmHandle -SViagra\ Cialis |
| 3 |
Eğer ki normal işleyen bir mail sistemi ise queue’nuz da çok kabarık olmayacağından bu şekilde çok rahat kuyruk maillerini yönetebiliriz. Ya bekleyen 263000 mail biriktiyse?
Bu gibi durumlarda qmHandle sizin için yeterli olmayacaktır. queue okuma işini qmail’in kendi binary’si olan qmail-qread’a ve silme işini de qmail-remove’un eline bırakacağız.
Kurulumu sadece bir C dosyası build etmekten ibaret olan basit ve 3 adımlı bir süreçten geçeceğiz; download – untar – make ve make install
| Bash | | copy code | | ? |
| 1 | |
| 2 | wget http://www.linuxmagic.com/opensource/qmail/qmail-remove/qmail-remove-0.95.tar.gz |
| 3 | tar zxf qmail-remove-0.95.tar.gz |
| 4 | make &amp;&amp; make install |
| 5 |
Bu işlemin ardından /usr/local/sbin altında emirlerimize amade bir qmail-remove bulunmakta. Artık queue’ya göz atmaya hazır ve spam olması muhtemel mailleri silmeye geldi;
| Bash | | copy code | | ? |
| 01 | |
| 02 | /var/qmail/bin/qmail-qread |
| 03 | |
| 04 | 03 Jun 2010 21:21:21 GMT #65732975 468772 bouncing |
| 05 | |
| 06 | done remote zavalli@insancik.com |
| 07 | remote vahtuh@spamyedik.com |
| 08 | done remote mazlum@tiallahcezani.com |
| 09 | remote ulan@spamgondereninben.com |
| 10 | |
| 11 | 03 Jun 2010 21:21:22 GMT #65732975 468772 bouncing |
| 12 | |
| 13 | done remote zavalli@insancik.com |
| 14 | remote vahtuh@spamyedik.com |
| 15 | done remote mazlum@tiallahcezani.com |
| 16 | remote ulan@spamgondereninben.com |
| 17 | |
| 18 | 03 Jun 2010 21:21:25 GMT #65732975 468772 bouncing |
| 19 | |
| 20 | done remote zavalli@insancik.com |
| 21 | remote vahtuh@spamyedik.com |
| 22 | done remote mazlum@tiallahcezani.com |
| 23 | remote ulan@spamgondereninben.com |
| 24 |
gibi bir çıktıda spammer@damnit.com’un spam yaptığını gördünüz. Bundan sonrası qmail’i durdurmak ve qmail-remove’a pattern olarak mail adresini vererek sil demek kadar basit olacaktır.
| Bash | | copy code | | ? |
| 1 | |
| 2 | /etc/init.d/qmail stop |
| 3 | qmail-remove -d -p spammer@damnit.com |
| 4 |
silinen maillere karşılık şöyle bir çıktı alırsınız.
| Bash | | copy code | | ? |
| 01 | |
| 02 | remove mess/20/65732975 |
| 03 | remove remote/20/65732975 |
| 04 | remove info/20/65732975 |
| 05 | 65733100: no |
| 06 | 65732893: no |
| 07 | 65733156: yes |
| 08 | remove mess/7/65732975 |
| 09 | remove remote/7/65732975 |
| 10 | remove info/7/65732975 |
| 11 | 65733087: no |
| 12 | 65736008: yes |
| 13 | remove mess/7/65732975 |
| 14 | remove remote/7/65732975 |
| 15 | remove info/7/65732975 |
| 16 | remove bounce/65732975 |
| 17 | 263482 file(s) match |
| 18 |
Artık qmail’i start ederek mutlu mesut günlerinize kaldığınız yerden devam edebilirsiniz.
Not:
- -d parametresini vermediğiniz sürece qmail-remove silme işlemi yapmayacaktır.
- -d -p parametresini vererek bir pattern belirtmezseni qmail-remove komple queue’nuzu boşaltacaktır.
- Dosyaların incelemek üzre silinmemesini istiyorsanız -y parametresi ile bir klasör belirtebilirsiniz.
- Eğer ki queue directory’niz /var/qmail/queue ‘den farklıysa -q parametresi ile bu klasörün yerini bildirebilirsiniz.
Mikrotik’te uzak noktaya otomatik yedek nasıl alınır? June 11th, 2009
Bir çok uzak noktada Mikrotik cihaz/PC’ye sahip olduğumuzu düşünelim. Bunları belirli periyotlarla elle yedeklemek unutulma, dosya isimlerinde çıkacak karışıklık vb. türlü türlü problem yüzüden pek mümkün olmayacak, ayrıca bu her noktaya bağlanarak tek tek yedek almak ta ciddi bir zaman kaydı olacaktır.
Bunun yerine otomatik olarak Mikrotik’lere “Şu kadar günde bir yedek al! Aldığın yedekleri bana mail at!” diyebilme seçeneğiniz mevcut.
Bu işlem için öncelikle bir SMTP sunucuya sahip olmalı, Mikrotik cihazlarının bu SMTP server’a erişebilmesi, SMTP server’ın da Mikrotik için kullanıcı doğrulaması gerektirmeden mailleri kabul edebilmesi gerekmektedir.
Tüm bu şartların sağlanmış olduğunu düşünürsek, Mikrotik üzerinden yapılacak iş iki adımdan oluşmakta. Birinci adım olarak kayıtlı bir script yaratma, ikinci adım olarak kayıtlı olan bu script’i belirli zaman aralıklarında çalıştırmak.
| Bash | | copy code | | ? |
| 1 | |
| 2 | /system script add name="Oto-Yedek" \ |
| 3 | policy=ftp, read, write, policy, test \ |
| 4 | source="/system backup save=oto_yedek \ |
| 5 | /tool e-mail send body=\"yedek\" to=\"alici@domain.com\" file=\"oto_yedek\" \ |
| 6 | server=\"xxx.xxx.xxx.xxx\" from=\"gonderen@domain.com\" \ |
| 7 | subject=\"XXX Mikrotik Yedegi\"" |
| 8 |
İle yeni Oto-Yedek adından bir yedekleme script’i oluşturduk ve;
| Bash | | copy code | | ? |
| 1 | |
| 2 | /system scheduler add comment="Otomatik yedekleme scriptini zamanlar"\ |
| 3 | name="Oto-Yedek-Zamanla" on-event=Oto-Yedek \ |
| 4 | start-date="Jun/11/2009" start-time="01:00:00" interval="1d" \ |
| 5 | disabled=no |
| 6 |
zamanlaması ile hergün saat gece 1′de yedekleme scriptinin çalışmasını sağlayabiliriz. Bu işlem sonucunda artık Mikrotik’e login olmaya gerek kalmadan otomatik olarak yedekler belirttiğiniz e-mail adresine gelecek ve yedek alma zamanını sıfıra indirecektir.
MySQL’de karakter seti problemi yoktur! June 10th, 2009
Bir çok insan tarafından şu sözleri duyuyorum; “MySQL’de veritabanı aktarınca karakter problemi çıkıyor.”, “MySQL’de karakter seti problemi var.”
Hayır efendim MySQL’de karakter seti problemi yoktur, MySQL’in huyunu suyunu bilmeyen insan vardır.
MySQL veritabanı çalışmasında iki tane farklı karakter seti kullanır. Bunlardan birincisi veritabanı motoruna (database engine; MyISAM, InnoDB) verilir. İkincil olarak bağlantı karakter setidir ve MySQL Client’a verilir.
Öntanımlı MySQL kurulumlarında (Örneğin; Distro repolarından, cPanel, Plesk, vb. hosting otomasyon yazılımları ile) bağlantı ve veritabanı karakter seti latin1 olarak gelmektedir.
En sık yapılan hatayı şöyle basit bir hatadır. Kişi gider veritabanını UTF-8 olarak yaratır. Sonra PHP ile sadece bağlanır ve sürekli veri yazar fakat bu veriyi yazdıran zat-ı muhterem bu sunucuya bağlantı sırasında MySQL Client’ın kullandığı karakter seti merak etmez. Bunu irdelemediği için de UTF-8 veritabanına Latin1 ile bağlanır ve verileri böyle yazar. Sonuç! absürt karakterlere sahip bir veritabanı.
Ne yapıyormuşuz demek ki, veritabanını istediğimiz karakter seti ile yaratıyormuşuz, daha sonra bağlanırken de veritabanının sahip olduğu karakter seti ile bağlanıyormuşuz. Evet tam olarak böyle.
Mesela UTF-8 bir veritabanı yarattığımızı varsayalım. Buna bağlanırken kesinlikle şunu yapmıyoruz;
| PHP | | copy code | | ? |
| 1 | |
| 2 | mysql_connect("server","kullanici","sifre"); |
| 3 | mysql_select_db("veritabani"); |
| 4 | mysql_query("insert into tablo ('a','b') values ('ÇÖPĞÖÜĞÜ','İŞÜĞÜMÖMÖM')"); |
| 5 |
Bunun yerine; bağlantıdan hemen sonra bir seferlik;
| PHP | | copy code | | ? |
| 1 | |
| 2 | mysql_connect("server","kullanici","sifre"); |
| 3 | mysql_select_db("veritabani"); |
| 4 | mysql_query("SET NAMES UTF8"); |
| 5 | mysql_query("SET CHARACTER SET UTF8"); |
| 6 | |
| 7 | mysql_query("insert into tablo ('a','b') values ('ÇÖPĞÖÜĞÜ','İŞÜĞÜMÖMÖM')"); |
| 8 |
durumu MySQL’e bildiriyoruz.
Tabi ki bir projede 50 yerde bağlantı kuranlar bu noktada OOP’nin neden varolduğunu anlayabilirler.
- “Ee bilmem ne SQL Server bunu otomatik seçiyormuş”.
- Peki multi collation olan bu sistemde farklı farklı tablolar için ne yapmayı düşünüyorsun? diye sormazlar mı kişiye.
Önemli olan nasıl yediğin değil, o yoğurdu yemek!
Mikrotik betiklerinde döngüler ve koşullar January 20th, 2009
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 programcılığı – Değişkenler January 20th, 2009
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 üzerinde betik programcılığı January 20th, 2009
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.



