Перед миграцией пользователей между серверами DirectAdmin, уже имеющими других клиентов и домены, необходимо удостовериться, что данные не будут утеряны, и все пользователи и данные будут корректно перенесены. В этом поможет наш скрипт. Для работы скрипта необходим другой скрипт, обеспечивающий связку с API DirectAdmin (скрипт для работы с API можно скачать здесь http://code.google.com/p/python-directadmin/)

Задача скрипта состоит в том, чтобы найти всех пользователей и все домены, и сравнить полученные списки с другими серверами.

В переменную servers необходимо вписать свои данные для подключения. Для работы необходимо минимум два сервера.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import logging
import directadmin

from logging.handlers import RotatingFileHandler

# Логирование
logger = logging.getLogger('DirectAdmin')
logger.setLevel(logging.DEBUG)

handler = RotatingFileHandler('directadmin.log', maxBytes=10000, backupCount=1)
handler.setLevel(logging.INFO)

LONG_LOG_FORMAT = '%(asctime)s - [%(name)s.%(levelname)s] [%(threadName)s, %(module)s.%(funcName)s@%(lineno)d] %(message)s'
formatter = logging.Formatter(LONG_LOG_FORMAT)
handler.setFormatter(formatter)

logger.addHandler(handler)

# Данные для подключения
servers = [
    {
        'hostname': 'XX.XX.XX.XX',
        'username': 'admin',
        'password': 'PASSWORD'
    },
    {
        'hostname': 'YY.YY.YY.YY',
        'username': 'admin',
        'password': 'PASSWORD'
    }
]

if len(servers) < 2:
    print('Для работы необходимо наличие минимум двух серверов')
    sys.exit(1)

# Подключение и извлечение данных
for server in servers:
    logger.info('Подключение к серверу: ' + server['hostname'])
    server['connect'] = directadmin.Api(username = server['username'],
    password = server['password'],
    hostname = server['hostname'])

    server['users'] = []
    server['domains'] = {}

    logger.info('Получение списка админов')
    for user in server['connect'].list_admins():
        server['users'].append(user)
        logger.info('Получение списка доменов админов')
        for domain in server['connect'].get_user_domains(user):
            server['domains'][domain] = user
    logger.info('Получение списка реселлеров')
    for user in server['connect'].list_resellers():
        server['users'].append(user)
        logger.info('Получение списка доменов реселлеров')
        for domain in server['connect'].get_user_domains(user):
            server['domains'][domain] = user
    logger.info('Получение списка пользователей')
    for user in server['connect'].list_all_users():
        server['users'].append(user)
        logger.info('Получение списка доменов пользователей')
        for domain in server['connect'].get_user_domains(user):
            server['domains'][domain] = user

    msg = ' '.join(['На сервере', server['hostname'], 'найдено',
        str(len(server['users'])), 'пользователей и',
        str(len(server['domains'])), 'доменов'])
    logger.info(msg)
    print(msg)


def compare_users(serverX, serverY):
    """
    Сравнение списка пользователей на двух серверах
    """
    for userX in serverX['users']:
        for userY in serverY['users']:
            if userX == userY:
                result = ' '.join(['Совпадение имени пользователя:', userX,
                    'на серверах',
                    serverX['hostname'],
                    'и',
                    serverY['hostname']
                ])
                logger.info(result)
                print(result)

def compare_domains(serverX, serverY):
    """
    Сравнение списка доменов на двух серверах
    """
    for domainX in serverX['domains']:
        for domainY in serverY['domains']:
            if domainX == domainY:
                result = ' '.join(['Совпадение имена домена:', domainX,
                    'на серверах:',
                    serverX['hostname'],
                    'пользователь',
                    serverX['domains'][domainX],
                    'и сервер',
                    serverY['hostname'],
                    'пользователь',
                    serverY['domains'][domainY]
                ])
                logger.info(result)
                print(result)

logger.info('Поиск совпадений')
for iX,serverX in enumerate(servers):
    if iX+1 < len(servers):
        for iY,serverY in enumerate(servers[iX+1:]):
            logger.info('Сравнение списка пользователей на сервере: ' + serverX['hostname'] + ' и ' + serverY['hostname'])
            if serverX['hostname'] != serverY['hostname']:
                compare_users(serverX, serverY)

            logger.info('Сравнение списка доменов на серверах: ' + serverX['hostname'] + ' и ' + serverY['hostname'])
            if serverX['hostname'] != serverY['hostname']:
                compare_domains(serverX, serverY)</pre>

Пример вывода работы утилиты:

$ python migrate.py 
На сервере XX.XX.XX.XX   найдено 14 пользователей и 31 доменов
На сервере YY.YY.YY.YY найдено 336 пользователей и 538 доменов
Совпадение имени пользователя: admin на серверах XX.XX.XX.XX   и YY.YY.YY.YY
Совпадение имена домена: justhost.ru на серверах: XX.XX.XX.XX   пользователь userX и сервер YY.YY.YY.YY пользователь userY

Добавить комментарий