Home Gentoo Server

аз пиша скриптове – ха ха ха

13.09.2012 Posted by Александър Христов

Последно време доста ми се наложи да се науча как се пишат скриптове на bash :), и мисля че е време вече да почна да си ги събирам, се оказва после трудно да възпроизведа което съм написал :D. Самото писане се оказа не толкова сложно, и bash като език за писане на скриптове доста ми харесва, макар като съм говорил с колеги програмисти много да не го харесват защото им е леко „странен“ или различен от класическите езици за писане на сорс. Като цяло скриптове които се наложи да роди моята гениалност 🙂 са за наблюдение и архивиране на системите. Едно от важните неща който един уважаващ себе си системен администратор. Всичко което съм сътворил или ще сътворя е в тази секция :), дано да са полезни на някой освен мен :).

Script за архивиране

 Posted by Александър Христов

Това е скрипт за архивиране на файл или файлове на отдалечен компютър. Скрипта е писан на bash и е разработен на модули с цел по голяма гъвкавост.

По долу е скрипта под Linux, освен него има и малък скрипт под Windows.

[code lang=“bash“]

#!/bin/bash
####################################################################
fdrv=“/mnt/f_drive“
# Home folder on remote server to user ext_backup
bdd=“/home/ext_backup/Backup_Dir_`date +%d%m%Y`/“
counter=0
users_doc_file=“Users.rar“
#
# Path to failDB
source_users_doc=“$fdrv/$users_doc_file“
#####################################################################
echo
echo „Begin time is `date +%H:%M“ – „%d.%m.%y`“
echo

check_server () {
echo
if [ „$counter“ -gt 5 ] ; then
echo
echo „Backup server is OFFLINE“
echo
echo „Edn time is `date +%H:%M“ – „%d.%m.%y`“
echo
exit 0
else
open_port=`nmap XXX.XXX.XXX.XXX -p 22 | grep „22“ | awk ‘{print $2}’`
if [ „$open_port“ = „open“ ] ; then
echo „Remote Server is ONLINE“
echo
mountf
else
echo
echo „No signal to the backup server, waiting 60 seconds“
echo
sleep 10
counter=$(( $counter + 1 ))
check_server
fi
fi
}

# mount /shared_server drive F to $fdrv
mountf () {
echo „Mount drive F on shared_server to $fdrv“
mount -t smbfs -o username=administrator or user admin access,password=password //IP_win_serv/f$/ $fdrv
if [ $? -eq 0 ]; then
echo „Drive F on shared_server mount to $fdrv“
echo
else
echo “ ! Drive F on shared_server NOT mount to $fdrv“
exit
fi
}

check_user_doc_ok () {
cd $fdrv
echo „Change Directory to $fdrv“
if [ „$counter“ -gt 5 ] ; then
echo “ ! Number of attempts – $counter“
echo “ ! File USER_DOC.txt not found.“
echo “ ! File $users_doc_file is not copied.“
touch $source_users_doc
echo “ ! Create zero $pmsdb_file“
echo
check_size
else
if [ -e „USER_DOC.txt“ ]; then
echo „File USER_DOC.txt exist and remove“
rm USER_DOC.txt
else
echo „File USER_DOC.txt does not exist, wait 10 minutes, time is `date +%H:%M:%S`“
echo „Check the file number – $counter“
echo
sleep 600
counter=$(( $counter + 1 ))
check_user_doc_ok
fi
fi
}

check_size () {
echo
echo „Chek free space on remote server“
size_users_doc=`du „$source_users_doc“ |awk ‘{print $1}’`
size_files=$(($size_users_doc))
size_disk=` ssh -p 22 ext_backup@XXX.XXX.XXX.XXX df -a | grep -n 2 -m 1 | awk ‘{ print $4 }’`
echo
echo „Size of backup disk is `ssh -p 22 ext_backup@XXX.XXX.XXX.XXX df -ah | grep -n 2 -m 1 | awk ‘{ print $2 }’`“
echo „Used space of backup disk is `ssh -p 22 ext_backup@XXX.XXX.XXX.XXX df -ah | grep -n 2 -m 1 | awk ‘{ print $3 }’`“
echo „Free space of backup disk is `ssh -p 22 ext_backup@XXX.XXX.XXX.XXX df -ah | grep -n 2 -m 1 | awk ‘{ print $4 }’`“
echo
echo „Size of backup files is $size_files “
echo
if [ „$size_disk“ -gt „$size_files“ ] ; then
copy_files
umountf
else
remove_files
fi
}

copy_files() {
echo „Create directory $bdd“
ssh -p 22 ext_backup@XXX.XXX.XXX.XXX mkdir $bdd
echo „Start copy $users_doc_file “
scp -P 22 $source_users_doc ext_backup@XXX.XXX.XXX.XXX:$bdd
echo „Checking the copied file $users_doc_file“
remotMD5=`md5sum „$source_users_doc“ |awk ‘{print $1}’`
localMD5=`ssh -p 22 ext_backup@XXX.XXX.XXX.XXX md5sum „$bdd/$users_doc_file“ |awk ‘{print $1}’`
echo „$users_doc_file was copied“
if [ „$remotMD5“ = „$localMD5“ ] ; then
echo „Checksum file $users_doc_file is successfully verified“
rm $source_users_doc
else
echo “ ! Checksum file $users_doc_file is NOT successfully verified“
fi
}

remove_files () {
DA7=`date –date=’7 days ago’ +%d%m%Y`
bdd_minus_seven_dey=“Backup_Dir_$DA7″
remote_bdd=`ssh -p 22 ext_backup@XXX.XXX.XXX.XXX ls | grep „$DA7″`
#DA14=`date –date=’14 days ago’ +%Y%m%d`
#DA21=`date –date=’21 days ago’ +%Y%m%d`
#DA28=`date –date=’28 days ago’ +%Y%m%d`
if [ „$bdd_minus_seven_dey“ = „$remote_bdd“ ]; then
echo „Delete old backups of directory $bdd_minus_seven_dey “
echo
ssh -p 22 ext_backup@XXX.XXX.XXX.XXX rm -rf $bdd_minus_seven_dey
check_size
else
echo „$bdd_minus_seven_dey directory does not exist! “
echo “ Size of backup files is $size_files “
echo “ No exist disk space ! Free disk space is `ssh -p 22 ext_backup@XXX.XXX.XXX.XXX df -ah | grep -n 2 -m 1 | awk ‘{ print $4 }’`“
echo
umountf
fi
}

umountf () {
sleep 60
cd /
umount $fdrv
fdrive=`df -a | grep „//IP_win_serv/f$/“ -m 1 | awk ‘{ print $6 }’`
if [ „$fdrive“ = „/mnt/f_drive“ ]; then
echo „Unmount the filesystem $fdrv“
umountf
else
echo „Filesystem $fdrv was unmounted“
echo
echo „End time is `date +%H:%M“ – „%d.%m.%y`“
echo
exit
fi
}

# Check the server is online
check_server

# Check the file Users_DOC.rar has been archived
check_user_doc_ok

# Check for free space and copy backups
check_size

# umount shared drive F
umountf

[/code]

Следва скрипта под Windows под формата на .bat файл. Идеята е да не кара linux да чете и архивира файлове на български език под Windows. След разархивиране е голяма боза.

backup_USER_DOC.bat

[code lang=“bash“]

@echo on
c:
cd c:\Program Files\WinRAR\
set year=%date:~6,4%
set yr=%date:~8,2%
set month=%date:~3,2%
set day=%date:~0,2%
rar.exe a -m1 -hp[%day%%month%%yr%] -ilog[Users_[%day%%month%%yr%].log] F:\Users.rar F:\Users
echo > F:\USER_DOC.txt

[/code]