Перед миграцией пользователей между серверами 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