Monday, October 29, 2012

XMail E-POSTA SUNUCUSUNUN 64-Bit Windows MAKİNALARA KURULUMU

Kurumsal uygulamaların bir parçası olarak bazen test ortamlarında hafif-sıklet e-posta sunucusuna ihtiyaç duyarız. Bu amaçla XMail e-posta sunucusu kullanılabilinir. XMail açık kaynak kodlu bir projedir ve projenin sayfasına bu bağlantıdan erişebilirsiniz. Windows XP, Windows Server 2003/2008, Windows 7 makinalara kurulum yapılabilinir. Windows işletim sistemi için çalıştırılabilir dosyaları bu bağlantıdan  indirebilirsiniz. Ancak bu çalıştırılabilir dosyalar 32-bit Windows için oluşturulmuştur ve 64-bitlik Windows makinalar için Windows kayıtlarında aşağıdaki gibi bir düzenleme yapılması gerekir:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GNU] 
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GNU\XMail]
MAIL_ROOT=d:\XMail
MAIL_CMD_LINE=

Kurulum ve temel ayarlar için aşağıdaki betiği kullanabilirsiniz:


@echo off
setlocal
REM  Note: Port used include 25 for SMTP, 110 for POP, 6017 for Admin services

set INSTALLDIR=%CD%
set MAIL_ADMIN=demoadmin
set DOMAIN=example.com

if not defined DRV          set DRV=D:
if not defined HOSTNAME     set HOSTNAME=%COMPUTERNAME%
if not defined DOMAIN       set DOMAIN=example.com
if not defined MAILROOT     set MAILROOT=%DRV%\XMail
if not defined MAILROOT_REG set MAILROOT_REG=%DRV%\\XMail

if exist %MAILROOT% (
  echo Stopping XMail Service
  net stop xmail
)

unzip -oq %INSTALLDIR%\XMail.zip -d %MAILROOT%
REM
REM Generate and install a registry entries from a .reg file for XMail
REM
echo Generating and setting Xmail registry entries

if not defined XMAIL_REG_FILE set XMAIL_REG_FILE=XMail_gen.reg

echo Windows Registry Editor Version 5.00 > %XMAIL_REG_FILE%
echo. >> %XMAIL_REG_FILE%
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GNU] >> %XMAIL_REG_FILE%
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GNU\XMail] >> %XMAIL_REG_FILE%
echo "MAIL_ROOT"="%MAILROOT_REG%" >> %XMAIL_REG_FILE%
echo "MAIL_CMD_LINE"="" >> %XMAIL_REG_FILE%

regedit /s %XMAIL_REG_FILE%
del/q %XMAIL_REG_FILE%
REM
REM Create the (1) domains.tab (2) smtpreply.tab (3) server.tab (4) aliasdomain.tab in the mail root directory
REM
REM 1. domains.tab
echo Creating Xmail domains.tab file
echo "%HOSTNAME%.%DOMAIN%" > %MAILROOT%\domains.tab

REM 2. Create empty smtprelay.tab
echo Creating Xmail smtpreplay.tab file
echo. > %MAILROOT%\smtprelay.tab

REM 3. server.tab
echo Creating Xmail server.tab file

echo # > %MAILROOT%\server.tab
echo # Server configuration file >> %MAILROOT%\server.tab
echo # Note : remember to use _REAL_ TABs and double quotes to format this file >> %MAILROOT%\server.tab
echo # >> %MAILROOT%\server.tab
echo "RootDomain" "%HOSTNAME%.%DOMAIN%" >> %MAILROOT%\server.tab
echo "SmtpServerDomain" "%HOSTNAME%.%DOMAIN%" >> %MAILROOT%\server.tab
echo "POP3Domain" "%HOSTNAME%.%DOMAIN%" >> %MAILROOT%\server.tab
echo "HeloDomain" "%HOSTNAME%.%DOMAIN%" >> %MAILROOT%\server.tab
echo "PostMaster" "%MAIL_ADMIN%@%HOSTNAME%.%DOMAIN%" >> %MAILROOT%\server.tab
echo "ErrorsAdmin" "%MAIL_ADMIN%@%HOSTNAME%.%DOMAIN%" >> %MAILROOT%\server.tab

REM
REM Add other settings
REM
echo "RemoveSpoolErrors" "0" >> %MAILROOT%\server.tab
echo "MaxMTAOps" "16" >> %MAILROOT%\server.tab
echo "ReceivedHdrType" "0" >> %MAILROOT%\server.tab
echo "FetchHdrTags" "+X-Deliver-To,+Received,To,Cc" >> %MAILROOT%\server.tab
echo "DefaultSmtpPerms" "MRVZ" >> %MAILROOT%\server.tab
echo. >> %MAILROOT%\server.tab

REM 4. aliasdomain.tab
echo Creating Xmail aliasdomain.tab file

echo "server1.example.com" "%HOSTNAME%.%DOMAIN%" > %MAILROOT%\aliasdomain.tab

REM 5. Create ctrlaccounts.tab with administrator username
echo "admin" "120009060a080054" > %MAILROOT%\ctrlaccounts.tab

echo Mail server: %HOSTNAME%.%DOMAIN%
echo Creating XMail User accounts

mkdir %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%

set USRLIST=user1 user2 sking jcooper wfaulk jstein istone mtwain jlondon cdickens ltolstoy fkafka szweig mmitch jausten achrist rsteven cdoyle wshake sfitzger
set USRPWD=120009060a080054

for %%i in (%MAIL_ADMIN% %USRLIST%) do (
  echo  Creating user: %%i
  echo "%HOSTNAME%.%DOMAIN%" "%%i" "%USRPWD%" 1 "%%i" "U" >> %MAILROOT%\mailusers.tab
  mkdir %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%\%%i
  echo "ReceiveEnable" "1" > %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%\%%i\user.tab
  echo "PopEnable" "1" >> %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%\%%i\user.tab
  mkdir %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%\%%i\mailbox
  mkdir %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%\%%i\Maildir
  mkdir %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%\%%i\Maildir\cur
  mkdir %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%\%%i\Maildir\new
  mkdir %MAILROOT%\domains\%HOSTNAME%.%DOMAIN%\%%i\Maildir\tmp
)

echo Installing XMail Server as a service

%MAILROOT%\bin\XMail --install-auto
echo Starting XMail Server service
net start xmail

echo XMAil Server service started.
endlocal

Kurulum tamamlandığında servisler listesinde XMail adlı bir servis görülecektir.
İstenildiğinde bu servis net stop xmail komutu ile durdurulabilinir.

Wednesday, October 17, 2012

MD-2012-III

Matematik dünyası dergisinin 2012-III sayısı çıktı. Abone olmak için bağlantıyı takip edin. Yeni sayının içeriğine buradan bakabilirsiniz. MD-2012-III sayısının giriş yazısını aşağıda alıntıladım:

George Bernard Shaw’un meşhur sözüdür: “Pek az kişi yılda iki üç kez düşünür. Ben ise haftada bir iki kez düşünerek dünya çapında bir üne kavuştum!” Aaa ne güzel, biz de haftada birkaç kez düşünelim o zaman... diyesi geliyor insanın.
Çok çabalayıp da anlatamadığım zaman, çok çaresiz kaldığımda, bazen kendimi
tutamayıp öğrencilere “düşünün” diyorum!
Sanki düşünmeyi ben çok iyi biliyormuşumu geçtim, sanki biri bana düşün dese,
ne yapacağımı biliyormuşum gibi...
Birine kolunu kaldır deseniz, o kişi eğer isterse kolunu kaldırır. Kolu yoksa bile kolunu kaldırması için ne yapması gerektiğini bilir ve kolunu kaldırmaya çalışabilir. Koş dersin koşar, yürü dersin yürür, dur dersin durur. En azından ne yapması gerektiğini bilir. Ama “düşün” denildiğinde kişinin ne yapması gerekiyor? Düşünmek ne kadar iradeyle ilgili?
Düşün dediğim öğrenci,
- Düşünüyorum hocam! dese - ki diyor bazen - ne cevap vereceğim?
- Hayır, düşünmüyorsun! Öyle mi düşünülür!
- Ya nasıl düşünülür?
- Bak işte böyle düşünülür...
Keşke bu senaryonun devamını getirebilsem. Zaten devamını getirebilsem kitabını yazardım. Okuyanlar da böylece sayemde düşünmeyi öğrenirlerdi!
Nasıl düşünüleceğini bilmesem de düşünmek için neler gerektiğini aşağı yukarı biliyorum.
Düşünmek için her şeyden önce kavramlara ihtiyaç vardır, tabii bir de bu kavramlar arasındaki ilişkilere. Kavram olmadan düşünülecek şey de olmaz zaten.
Matematikte kavramlar ve aralarındaki ilişkiler simgelerle ifade edilir. Simgeler de düşünceyi kaydetmeye yarar. Böylece hafızanın yükü önemli miktarda azalır ve düşüncede daha derine inilir, derine inilmese de daha ileri gidilir. Düşünceyi kaydetmek, yani yazıya geçirmek, bir dereyi geçmek için su yatağına yerleştirilen taşlar gibidir, o taşlara basıp daha ileri gidilir. Hatta geri dönüp silgiyle taşları siler, daha sağlam taşlarla yepyeni bir güzergâh belirleyebiliriz.
Matematik dışındaki alanlarda simge dünyası o kadar gelişmemiştir. Gene de bildiğimiz harflerle düşünce kaydedilebilir. Formüllerin ifade gücünün yanına yaklaşamasa da bildiğimiz düzyazı da düşünceyi simgeyle kaydetmeye yarar.
Lise öğrencisiyken bir deneme yazacaktım. Her hafta yaptığımız bir şeydi de neme yazmak. O zamanlar tahrir denirdi. Konuyu unuttum şimdi ama “eğitim herkese lazım” filan gibi doğruluğu bariz olan oldukça sıkıcı bir konuydu. Geceli gündüzlü üç hafta uğraştım. Sonunu bağlayamıyor, istediğim sonuca bir türlü ula şa mı yordum, hep bir yerlerde bir eksiklik beliriyordu. Üç hafta sonunda bir şimşek çaktı beynimde, yanılıyormuşum meğer! Savunduğum tez yanlışmış! 
Yazmak doğru düşünmeye yetmeyebilir. Ama yazmadan da doğru düşünülemez.
Ali Nesin

Wednesday, October 10, 2012

APACHE TOMCAT 6'DA GÜNLÜKLERİN SYSLOG SERVİSİNE YÖNLENDİRİLMESİ

Apache Tomcat 6'da günlükler $CATALINA_HOME/logs dizininde saklanmaktadır. Günlüğün yapılandırılması ise $CATALINA_HOME/conf/logging.properties dosyası üzerinden gerçeklenmektedir. Apache Tomcat günlük için tomcat-juli.jar paketini kullanmaktadır. İstenirse günlük oluşturmak için log4j kütüphanesi de kullanılabilinir. log4j kütüphanesi kullanılarak, günlükler veritabanı, syslog gibi farklı hedeflerde saklanabilir. Hem veritabanı hem de syslog servisi istemci-sunucu mimarisinde çalıştığı için günlükler merkezileştirilebilir. Böylelikle, çoklu tomcat sunucusunun olduğu bir yapıda, sunucuların yönetimi kolaylaşır, izlenebilirliği de iyileşir. Bunun yanında log4j ile ERROR yada üzeri seviyedeki günlüklerin e-posta olarak sistem ya da uygulama yöneticisine göndermek mümkün olabilir.

log4j ile günlükleri syslog servisinde toplamak için aşağıdaki adımları izlemek gerekir:

1. İlk olarak $CATALINA_BASE/lib dizininde log4j kütüphanesinin yapılandırma dosyasını (log4j.properties)  oluşturuyoruz:

log4j.rootLogger=INFO, CATALINA

# Define all the appenders
log4j.appender.CATALINA=org.apache.log4j.net.SyslogAppender
log4j.appender.CATALINA.layout= org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.CATALINA.SyslogHost=127.0.0.1
log4j.appender.CATALINA.Facility=local0
log4j.appender.CATALINA.threshold=DEBUG

log4j.appender.LOCALHOST=org.apache.log4j.net.SyslogAppender
log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.LOCALHOST.SyslogHost=127.0.0.1
log4j.appender.LOCALHOST.Facility=local0
log4j.appender.LOCALHOST.threshold=DEBUG

log4j.appender.MANAGER=org.apache.log4j.net.SyslogAppender
log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.MANAGER.SyslogHost=127.0.0.1
log4j.appender.MANAGER.Facility=local0
log4j.appender.MANAGER.threshold=DEBUG

log4j.appender.HOST-MANAGER=org.apache.log4j.net.SyslogAppender
log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.HOST-MANAGER.SyslogHost=127.0.0.1
log4j.appender.HOST-MANAGER.Facility=local0
log4j.appender.HOST-MANAGER.threshold=DEBUG

log4j.appender.CONSOLE=org.apache.log4j.net.SyslogAppender
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.CONSOLE.SyslogHost=127.0.0.1
log4j.appender.CONSOLE.Facility=local0
log4j.appender.CONSOLE.threshold=DEBUG

# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]=INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]=INFO, HOST-MANAGER

2. log4j kütüphanesinin güncel sürümünü (log4j-1.2.9.jar) projenin sayfasından indirip $CATALINA_BASE/lib dizinine kopyalıyoruz.

3. Apache tomcat'in proje sayfasında "extras" bölümünden tomcat-juli.jar ve tomcat-juli-adapters.jar dosyalarını indiriyoruz. tomcat-juli.jar dosyasını $CATALINA_BASE/bin dizinine tomcat-juli-adapters.jar dosyasını ise $CATALINA_BASE/lib dizinine kopyalıyoruz. Bu dosyalar adı geçen dizinlerde mevcuttur, dolayısı ile üzerinlerine yazmanız gerekecektir.

4. syslog servisinin 2,3,4,5 çalışma seviyelerinde açık olduğundan emin olun:



[root@station1 lib]# chkconfig --list syslog
syslog  0:off   1:off   2:on    3:on    4:on    5:on    6:off

5. syslog servisinin yapılandırması için iki dosya vardır. 
  • /etc/syslog.conf dosyasına aşağıdaki satırı ekliyoruz:
    local0.*   /var/log/tomcat/messages.log
  • /etc/sysconfig/syslog dosyasında SYSLOGD tanımının yapıldığı satırı aşağıdaki gibi düzenliyoruz:

          SYSLOGD_OPTIONS="-r -m 0"

6. Bu değişiklikleri yaptıktan sonra syslog servisini yeniden başlatıyoruz:

[root@station1 lib]# service syslog restart
Shutting down kernel logger:        [  OK  ]
Shutting down system logger:        [  OK  ]
Starting system logger:             [  OK  ]
Starting kernel logger:             [  OK  ]

7. Son olarak tomcat servisini başlatabiliriz.

Günlükleri veritabanında tutmak için MySQL sunucusunda tomcat_logs adında bir veritabanı yaratıyoruz:


mysql> create database tomcat_logs;
Query OK, 1 row affected (0.02 sec)


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| test               | 
| tomcat_logs        | 
+--------------------+
3 rows in set (0.00 sec)

Günlüklerin saklanacağı tabloyu ise aşağıdaki create table ifadesi ile yaratıyoruz:

mysql> CREATE TABLE LOGS
    ->    (USER_ID VARCHAR(20) NOT NULL,
    ->     DATED   VARCHAR(40) NOT NULL,
    ->     LOGGER  VARCHAR(50) NOT NULL,
    ->     LEVEL   VARCHAR(10) NOT NULL,
    ->     MESSAGE VARCHAR(1000) NOT NULL
    ->    );
Query OK, 0 rows affected (0.01 sec)

Yukarıdaki sıralanan adımlardan ilkinde verilen log4j.properties dosyasında net.SyslogAppender yerine jdbc.JDBCAppender yazıyoruz:

log4j.rootLogger=WARN, DB

log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout
log4j.appender.DB.URL=jdbc:mysql://localhost:3306/tomcat_logs
log4j.appender.DB.driver=com.mysql.jdbc.Driver
log4j.appender.DB.user=tomcat
log4j.appender.DB.password=tomcat
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')

Son adım olarak MySQL Jdbc sürücüsünü $CATALINA_BASE/lib dizinine kopyalamak gerekir.