четверг, 8 ноября 2018 г.

Синхронизация в разные места по определённым дням недели

Расклад такой:

- Есть сервер, с которого необходимо делать синхронизацию по понедельникам и пятницам на локальный сервер, причём в понедельник в одну директорию, а в пятницу - в другую... Директория сервера с которого мы будем делать синхронизацию примонтированна к локальному серверу по cifs.

Делать буду всё на 3-м питоне...




Что делает скрипт:

1. Проверяет на существование источника и назначение на чтение и запись.
2. Проверяет можно ли читать/писать из/в них.
3. Проверяет доступен ли сервер пингом его.
4. Проверяет объём примонтированной директории удалённого сервера и если её объём менее 250 гигабайт, то операция прерывается.


Листинг скрипта:

 #!/usr/bin/env python3

import os
import datetime
import sys

controlsize=250 #minimum size of dir when synchronization can be started
sourcesync="/mnt/alby-office-f/" # what directory we need to sync
alloweddays=[0,4] # days when we can make synchronization (monday and friday)
sourceserver="10.0.0.3" # server what we need to check what the server is online

# set destinations of sync process by week day (specify here output directories for sync)
def get_weekday_backup_dest_description(dow):
        return {
                dow == 0: '/backup/monday-backup/', # destination sync of monday
                dow == 1: 'Tuesday',
                dow == 2: 'Wednesday',
                dow == 3: 'Thursday',
                dow == 4: '/backup2/friday-backup/', # destination sync of friday
                dow == 5: 'Saturday',
                dow == 6: 'Sunday',
    }[True]

def getFolderSize(folder):
    total_size = os.path.getsize(folder)
    for item in os.listdir(folder):
        itempath = os.path.join(folder, item)
        if os.path.isfile(itempath):
            total_size += os.path.getsize(itempath)
        elif os.path.isdir(itempath):
            total_size += getFolderSize(itempath)
    return total_size

# test of source server is alive
def test_source_server(source):
        res = os.system("ping -c 1 " + source + " 2>&1 >/dev/null")
        if res == 0:
                return True
        else:
                return False

# checking directories for read, write and existing
def dirchecker():
        if os.path.exists(sourcesync) == True and os.path.exists(get_weekday_backup_dest_description(datetime.datetime.today().weekday())) == True:
                pass
        else:
                print ('Error! Source or destination directory is not in system!')
                print ('Process ended at:')
                print (datetime.datetime.now().strftime("%d-%m-%Y_%H-%M-%S"))
                sys.exit(1)
        if os.access(sourcesync, os.R_OK) == True:
                pass
        else:
                print ('Source directory is not readable! Exiting..')
                print ('Process ended at:')
                print (datetime.datetime.now().strftime("%d-%m-%Y_%H-%M-%S"))
                sys.exit(1)
        if os.access(get_weekday_backup_dest_description(datetime.datetime.today().weekday()), os.W_OK) == True:
                pass
        else:
                print ('Destination directory is not writeable! Exiting...')
                print ('Process ended at:')
                print (datetime.datetime.now().strftime("%d-%m-%Y_%H-%M-%S"))
                sys.exit(1)

# Main body
if __name__ == '__main__':
        print ('Process started at:')
        print (datetime.datetime.now().strftime("%d-%m-%Y_%H-%M-%S"))
        dirchecker()
        sourcesize=getFolderSize(sourcesync)/(1e+9)
        if test_source_server(sourceserver) == True:
                print ('Source server is alive, checking size of source and destination...')
                if sourcesize >= controlsize:
                        print ('Source dir ('+str(sourcesize)+'gb) is bigger than minimum control size ('+str(controlsize)+'gb) so let\s trying to sync...')
                        os.system("rsync -vzrh --delete-before --exclude 'System Volume Information' "+sourcesync+" "+get_weekday_backup_dest_description(datetime.datetime.today().weekday())+" | sed '0,/^$/d'")
                        print ('Process ended at:')
                        print (datetime.datetime.now().strftime("%d-%m-%Y_%H-%M-%S"))
                        print ('Syncing complete!')
                else:
                        print ('Something wrong, because source dir ('+str(sourcesize)+'gb) is smaller than minimum control size ('+str(controlsize)+'gb), exiting...')
                        print ('Process ended at:')
                        print (datetime.datetime.now().strftime("%d-%m-%Y_%H-%M-%S"))
                        sys.exit(1)
        else:
                print ('Source server is offline, exiting...')
                print ('Process ended at:')
                print (datetime.datetime.now().strftime("%d-%m-%Y_%H-%M-%S"))
                sys.exit(1)


Как использовать:

1. Установить на локальную машинку rsync
2. Можно вызывать когда угодно сделав файл выполняемым (chmod +x pysync.py) и запуская его как то так: /path/pysync.py
3. А можно скажем по крону с отправкой результатов его работы на почту:

Установить пакет для отправки почты mutt:

sudo apt install mutt

Добавить в крон (2 часа ночи 2 минуты по понедельникам и пятницам):

2 2 * * 1,5 /etc/sync.sh
 
Со следующим содержанием:

#!/bin/bash
/etc/pysync.py | /usr/bin/mutt -s "disk synchronization status" it@superhost.tld

Комментариев нет:

Отправить комментарий