Ana Sayfa  |  Makaleler  | Programlama  | Haberler Forum  |  İpuçları  |  Download  |  E-Mail
     
       
       
         
           
           
           
           
       
   
   
 
RSYNC : UZAK GÜNCELLEME PROTOKOLÜ
( soner.sag@linuxprompt.com )

 

Sunucu Tarafı
Giriş

Rsync servisi bir güncelleme yazılımıdır. Sunucular arasında veya sunucular ile istemciler arasında çalışabilir. Bu servisin avantajı sadece değişiklik yapılacak dosyaları güncellemesidir. Güncellemenin yanında yedekleme amaçlı olarak da kullanılır. Rsync servisinde en az bir sunucu yüzlerce istemci olabilir. Kullanıcıya rcp 'den daha fazla seçenek sunar. Bu yüzden tercih sebebidir. Rsync direkt komut satırından kullanıldığı gibi kabuk script yazılarak da kullanılması mümkündür.Sunucu tarafında istemcinin taleb ettiği güncellenecek dosyalar bulunur. Bu yapısı sayesinde crontab 'a belirli bir saatte çalıştırılmak üzere rsync scriptinizi yerleştirebilirsiz. Bu dosyalarınız otomatik güncellenerek sizi iş yükünden kurtarir.Bir sunucu da birden çok rsync hizmeti verilebilir. Örneğin BELGELER ve ÇALIŞMALAR adında iki dizininizin olduğunu varsayalım. Bunların ikisini de ayrı lakaplar ile ayrı alanlarda tutarak ayrı zamanlarda rsync işlemini yürütebiliriz.

/etc/rsyncd.conf dosyasının İçeriği :

gid = users
read only = true
use chroot = true
transfer logging = true
timeout = 1800
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
slp refresh = 300
[DOWNLOAD]
path = /root/RSYNC/DOWNLOAD
[PROGRAMLAR]
path = /root/RSYNC/PROGRAMLAR
[PROJELER]
path = /root/RSYNC/PROJELER
[TODO]
path = /root/RSYNC/TODO

/etc/rsync dosyasının İçeriğinin Açıklaması

gid = users rsyncd 'yi çalıştıracak olan gruptur.
read only = true Dosyanın okunabilirmi olduğunu belirtmek için kullanılır.Sadece okunabilir iseniyorsa <true>. Aksi takdirde <false> olmalıdır.
use chroot = true rsync kullanıcısı bulunduğu dizinde sabitlemek için kullanılır. Sabitlemek için <true>. Aksi takdirde <false> olmalıdır.
transfer logging = true Log tutulacak 'sa <true> aksi taktirde <false> olmalıdır.
time out = 1800 Giriş / Çıkış zamanaşımını saniye cinsinden belirmeniz gerekmektedir. 1800 saniye 30 dakka 'ya tekabül etmektedir.
log format = %h %o %f %l %b
%h Uzak istemci ismi.
%o "send", "receive" veya "del." olarak yapılan işlem.
%f Dosya ismi ( gönderici için tam dosya yolu; sonuna "/" gelmez ).
%l Bayt cinsinden dosya uzunluğu.
%b Aktarılan bayt miktarı.
log file = /var/log/rsyncd.log Log dosyasının tutulacağı yeri belirtmeniz gerekiyor.
slp refresh = 300 Başarısızlıkta yeniden deneme süresi
[DOWNLOAD]
path = /root/RSYNC/DOWNLOAD
DOWNLOAD lakabıyla gelen rsync isteklerinin yönlendirileceği dizin belirtilmiştir.

[PRG]
path = /root/RSYNC/PRG

YONETIM lakabıyla gelen rsync isteklerinin yönlendirileceği dizin belirtilmiştir.
[PROJELER]
path = /root/RSYNC/PROJELER
PROJELER lakabıyla gelen rsync isteklerinin yönlendirileceği dizin belirtilmiştir.
[TODO]
path = /root/RSYNC/TODO
rsync servisinin çalışması için

 

linuxprompt~# etc/init.d/rsync start

komutu verilerek çalıştırılmaya hazırdır.

İstemci Tarafı

İstemci tarafında çalıştırılacak script aşağıdaki gibidir. Script zamanı sekronize ediyor, gerekli dosyaları güncelliyor. Her zaman bir önceki yedeği kaydedip eskileri siliyor.

#!/bin/sh
#VERSIYON 8.5


#DEGISKENLER ATANIYOR
dwnlog="/root/YEDEK/LOG/rsdwnlog_obs"
VRS="1.0 27-02-08"
DWNDIR="/root/RSYNC/RSYNC_PRG"
INSTALL="root/Install.PROGRAM"
OSNAME="LINUX"
CMPARAM="-zvcra --progress --backup --delete-after --timeout=25 --exclude="cmp"  --backup-dir=/root/YEDEK/INSTALL_PRG --bwlimit=4 "
RMD5FILE="rsync://85.105.52.13/PROGRAMLAR/cmp/md5list"
SRVPARENT="rsync://85.105.52.13/PROGRAMLAR/ "
SRVLNX="rsync://85.105.52.13/PROGRAMLAR/ "
md5file="${DWNDIR}/cmp/md5list"
md5test="${DWNDIR}/cmp/md5test"
LOCKFILE="${DWNDIR}/cmp/lock"

#SISTEM SAATI SENKRONIZE EDILIYOR.
if [[ -f /usr/sbin/ntpdate ]]
then
/usr/sbin/ntpdate 132.236.56.250 >>$dwnlog
else
echo -e "*********DIKKAT NETDATE YUKLU DEGIL**********">>$dwnlog
fi
if [[ -a $LOCKFILE ]]
then
rm -f ${LOCKFILE}
rm -f ${md5test}
rm -f ${md5test}.install
fi
saat=$(date +%H)
dakika=$(date +%M)
saatmode=$(($saat%2))
if [[ $HOSTNAME == "obis" ]]
then
RMD5FILE="rsync://10.1.0.1/PROGRAMLAR/cmp/md5list"
SRVPARENT="rsync://10.1.0.1/PROGRAMLAR/ "
fi

#DOWNLOAD DIZINI YOKSA OLUSTURULUYOR.
if [[ ! -d ${DWNDIR} ]]
then
mkdir -p ${DWNDIR}/cmp
fi

#LOG DIZINI YOKSA OLUSTURULUYOR
if [[ ! -d /root/YEDEK/LOG ]]
then
mkdir -p /root/YEDEK/LOG
fi
echo -e "-------------------------------------------------------------------------------------------\n|\t\t\t">>$dwnlog
date >>$dwnlog
echo -e $HOSTNAME >>$dwnlog
echo -e $VRS >>$dwnlog
echo -e "|\n------------------------------------------------------------------------------------------\n">>$dwnlog

# md5 DOGRULAMA ICIN /cmp/md5list siteden indiriliyor.
rsync ${CMPARAM} ${SRVPARENT} ${DWNDIR}/ >>$dwnlog
rsync ${CMPARAM} ${RMD5FILE} ${DWNDIR}/cmp/ >>$dwnlog
cd ${DWNDIR}/
chmod 666 $md5file

#MD5SUM DOĞRULAMA cmp/md5TEST DOSYASINA KAYIT EDILIYOR.
md5sum -c < ${md5file} >&${md5test}>&2-
chmod 666 ${md5test}
cmptest=$(egrep -c "BAŞARISIZ|FAILED" ${md5test})
echo -e "Dosya dogrulama islemi yapılıyor" >>$dwnlog
echo -e ${cmptest} >>$dwnlog

#FARKLILIK ICIN INSTALL DIZINI KONTROL EDILIYOR.
#FARKLILIK VARSA ESKI DIZIN YEDEKLENEREK CEKILEN DOSYALAR YENI DIZINE KOPYALANIYOR.
#INSTALL DIZINI YOKSA RSYNC DIZINI INSTALL OLARAK KOPYALANIYOR.
if [[ $cmptest != 0 ]]
then
echo -e "dosya dogrulama islemi basarisiz oldu" >>$dwnlog
echo -e ${md5test} >>$dwnlog
else
if [[ -d "/${INSTALL}" ]]
then
cd /${INSTALL}

# INSTALL ILE RSYNC RSYNC DIZINININ KONTROLU
md5sum -c < ${md5file} >&${md5test}.install>&2-
echo -e "/${INSTALL} dizini ile ${DWNDIR} dizini dosya dogrulama islemi yaplyor" >>$dwnlog
cmptestinstall=$(egrep -c "BAŞARISIZ|FAILED" ${md5test}.install)

#cmptestinstall "0" 'sa INSTALL DIZINI ILE RSYNC DIZINI FARKLIDIR. YANI YENI VERSIYON.
if [[ $cmptestinstall != 0 ]]
then
egrep "BAŞARISIZ|FAILED" ${md5test}.install >>$dwnlog
cd /
echo -e "/${INSTALL} dizini yedekleniyor"

#ESKI VERSIYON INSTALL DIZINININ ICINDEKI VX.XX SEKLINDEKI VERSIYON BILGISI ALINIYOR.
versiyon=$(ls -1 "/${INSTALL}" | grep "V.")
if [[ -d "/${INSTALL}.${versiyon}" ]]
then
rm -fr /${INSTALL}.*
fi
rm -rf /${INSTALL}.*
mv "/${INSTALL}" "/${INSTALL}.${versiyon}">>$dwnlog
echo -e "Yeni Dosyalar ${DWNDIR} dizininden ${INSTALL} kopyalanyor" >>$dwnlog
mkdir "/${INSTALL}"
cp --preserve=timestamps ${DWNDIR}/* /${INSTALL}>>$dwnlog
else
echo -e "/${INSTALL} dizinin icindeki versiyon ile ${DWNDIR}/ dizini iciregi ayn" >>$dwnlog
fi
else

#INSTALL DİZİNİ YENIDEN OLUŞTURULUYOR.
mkdir /${INSTALL}
cp --preserve=timestamps ${DWNDIR}/* /${INSTALL} >>$dwnlog
fi
fi

#DIZIN ICERIKLERI LOG DOSYASINA ATILIYOR.
echo -e "${DWNDIR} DIZINI ICERIGI" >>$dwnlog
ls -al ${DWNDIR} >>$dwnlog
echo -e "/${INSTALL} DIZINI ICERIGI" >>$dwnlog
ls -al /${INSTALL} >>$dwnlog
cat $dwnlog
if [[ -a $LOCKFILE ]]
then
rm -f ${LOCKFILE}
fi

#GECICI DOSYALAR SILINIYOR.
rm -f ${md5test}
rm -f ${md5test}.install

 

Yazan : Soner SAĞ
Email : soner.sag@linuxprompt.com