Пример плагина. Добавление нового S3 хранилища
В панели ispmanager доступно создание самописного плагина, который позволит:
- добавить новое S3 хранилище вашего провайдера для резервного копирования;
- автоматизировать процесс настройки резервного копирования.
Настройка плагина
- Авторизуйтесь в панели под учётной записью с правами суперпользователя.
- Откройте раздел Менеджер файлов.
- Создайте и отредактируйте XML-файл и файл-обработчик.
- Перейдите в раздел Резервные копии.
- В панели инструментов нажмите
Настройки резервного копирования.
- В Типе хранилища выберите вариант Новое хранилище. Заполнять пустые поля формы настроек не нужно.
- Перейдите по ссылке из баннера:
После перехода по ссылке адрес сервера предоставляет информацию для доступа к новому хранилищу и выполняет обратный переход в панель. Поля формы в панели заполняются автоматически.
ПодробнееДля возврата в панель используется шаблон ссылки:
https://<ip>:1500/ispmgr?startformdrawer=backup2.settings&starttab=backup2.superlist&storage_type=<тип хранилища>&url_s3=<адрес хранилища>&id_amazon=<идентификатор ключа>&secret_amazon=<секретный ключ>&s3_storage_class=<класс хранилища>&bucket_addressing_model=<метод адресации корзин>&s3_auto_region=<авто определение региона корзины>&s3_region=<регион корзины>
Значения, которые подставляются из созданного XML-файла и файла-обработчика:
storage_type=<тип хранилища>
— отвечает за выпадающий список Тип хранилища. Если меняется хранилище, то доступ к текущим резервным копиям теряется. Для восстановления доступа верните предыдущий тип хранилища. По умолчанию: значениеstype_new
, если ранее оно не было заменено.url_s3=<адрес хранилища>
— ссылка для API-запросов к хранилищу. Обязательно к заполнению.id_amazon=<идентификатор ключа>
— поле Идентификатор ключа. Обязательно к заполнению.secret_amazon=<секретный ключ>
— поле Секретный ключ. Обязательно к заполнению.s3_storage_class=<класс хранилища>
— отвечает за выпадающий список Класс хранилища. Доступны значения:sclass_DEFAULT
— значение По умолчанию;sclass_STANDARD
— значение Стандартное;sclass_STANDARD_IA
— значение Холодное;sclass_GLACIER
— значение Ледяное.
Если ваш облачный сервис не поддерживает указанные классы хранилища, то могут возникнуть ошибки при загрузке.bucket_addressing_model=<метод адресации корзин>
— отвечает за выпадающий список Метод адресации корзин. Доступны значения:- subdomain — значение поддомен. Обращается к корзине по ссылке вида: http[s]://bucket.host[:port][/path];
- urlpath — значение URL-путь. Обращается к корзине по ссылке вида: http[s]://host[:port][/path]/bucket/.
s3_auto_region=<авто определение региона корзины>
— чекбокс Автоматически определять регион корзины. Установите галочку, если ваш провайдер поддерживает автоматическое определение региона хранилища. Уберите галочку, чтобы указать значение вручную.s3_region=<регион корзины>
— поле Регион корзины. Обязательно к заполнению. Если установлена галочка на чекбоксе Автоматически определять регион корзины, то значение указывать не нужно.
- Сохраните настройки.
XML-файл
- Перейдите в директорию:
/usr/local/mgr5/etc/xml
. - Создайте файл с именем вида ispmgr_mod_<имя плагина>.xml.
- Отредактируйте XML-файл по примеру:
<?xml version="1.0" encoding="UTF-8"?> <mgrdata> <handler name="plugin.py" type="xml"> <event name="backup2.settings" before="yes"/> <event name="backup2.settings" after="yes"/> </handler> <metadata name="backup2.settings" type="form" eqdist="1"> <form progress="yes"> <page name="banners"> <field name="token_new_info" noname="yes" fullwith="yes" base="yes"> <textdata type="banner" name="token_new_info" status="info"/> </field> </page> <page name="storage"> <field name="storage_type" base="yes"> <select name="storage_type" setvalues="yes"> <if value="stype_new" hide="localstorage"/> <if value="stype_new" hide="dropboxstorage"/> <if value="stype_new" hide="yandexstorage"/> <if value="stype_new" hide="ftpstorage"/> <if value="stype_new" hide="warn_ftp_space_no_control"/> <if value="stype_new" hide="sftpstorage"/> <if value="stype_new" hide="googledrivestorage"/> <if value="stype_new" hide="token_amazon"/> <if value="stype_new" hide="token_dropbox_info"/> <if value="stype_new" hide="token_googledrive_info"/> <if value="stype_new" hide="token_amazon_info"/> <if value="stype_local" hide="token_new_info"/> <if value="stype_dropbox" hide="token_new_info"/> <if value="stype_googledrive" hide="token_new_info"/> <if value="stype_yandex" hide="token_new_info"/> <if value="stype_amazon" hide="token_new_info"/> <if value="stype_s3" hide="token_new_info"/> <if value="stype_ftp" hide="token_new_info"/> <if value="stype_sftp" hide="token_new_info"/> </select> </field> </page> </form> </metadata> <lang name="ru"> <messages name="backup2.settings"> <msg name="stype_new">Новое хранилище</msg> <msg name="token_new_info">Для получения данных для подключения к хранилищу перейдите по <a href="__url__" target="_self">ссылке</a>. Необходимые поля будут заполнены автоматически.</msg> </messages> </lang> <lang name="en"> <messages name="backup2.settings"> <msg name="stype_new">New storage</msg> <msg name="token_new_info">To receive parameters for connecting to the storage foollow the <a href="__url__" target="_self">link</a>. Necessary fields will be filled automatically.</msg> </messages> </lang> </mgrdata>
- Сохраните изменения.
При необходимости замените значения на свои собственные.
plugin.py
— имя плагина.stype_new
— имя нового пункта Настроек резервного копирования. Добавляет новый элемент в выпадающий список Тип хранилища. Для замены имени используйте формат:stype_<новое значение>
.token_new_info
— имя нового баннера в форме с Настройками резервного копирования.<msg name="stype_new">
— сообщение для элемента из выпадающего списка Тип хранилища на русском и английском языках. Сообщение по умолчанию: «Новое хранилище».<msg name="token_new_info">
— сообщение внутри баннера на русском и английском языках. Для работы ссылки в баннере, внутри тега обязательно должен быть фрагмент:<a href="__url__" target="_self"><новый текст></a>
.
Сообщение по умолчанию: «Для получения данных для подключения к хранилищу перейдите поссылке
. Необходимые поля будут заполнены автоматически».
Файл-обработчик
- Перейдите в директорию:
/usr/local/mgr5/addon
. - Создайте файл-обработчик с именем, которое было указано в XML-файле. По умолчанию используется имя plugin.py.
- Отредактируйте файл с плагином по примеру:
#!/usr/bin/env python from sys import stdin import os import subprocess import xml.etree.ElementTree as etree def GetEndpoint(): #Получаем ip адрес панели output = subprocess.check_output("/usr/local/mgr5/sbin/mgrctl -m ispmgr ihttpd out=xml", shell=True, encoding="utf8") ip = etree.fromstring(output).find(".//elem/port").text return "https://example.com/endpoint?ip=" + ip #Заполнение формы значениями def Get(root): #Ищем элемент селекта select = root.find(".//slist[@name='storage_type']") if select is not None: #Добавляем свой элемент elem = etree.Element("msg") elem.text = "stype_new" #Помещаем элемент после Локального хранилища select.insert(1, elem) #Формирование сообщения со ссылкой msg = root.find(".//messages/msg[@name='token_new_info']") if msg is not None: text = msg.text msg.text = text.replace("__url__", GetEndpoint()) #Обработка нажатия на кнопку "Сохранить" def Set(root): #Нужно изменить параметр, чтобы работала настройка для S3 совместимого хранилища param = root.find(".//storage_type") if param is not None and param.text == "stype_new": param.text = "stype_s3" if __name__ == "__main__": #получение значения параметра, переданного панелью из переменных окружения func = os.getenv('PARAM_func') #Проверка, что вызывается нужная функция if func == 'backup2.settings': #Чтение xml, переданного из панели, из stdin root = etree.parse(stdin).getroot() #Проверка до или после действия вызывается обработчик type = os.getenv("EVENT_TYPE") #Проверка, что нажата кнопка "Сохранить" if os.getenv('PARAM_sok') == 'ok' and type == 'before': Set(root) elif type == 'after': Get(root) #Записываем xml в stdout etree.dump(root) quit(0)
Замените в скрипте ссылку https://example.com/endpoint на адрес вашего сервиса, который будет направлять параметры для подключения к S3 хранилищу.Убедитесь, что значения из XML-файла соответствуют значениям из файла обработчика. Для XML-файла и файла-обработчика должны соответствовать имена параметров
stype_new
иtoken_new_info.
Если значения были изменены, то имена должны быть одинаковыми в обоих файлах.Рекомендуется использовать предложенный файл-обработчик, но вы можете написать свой аналогичный обработчик, изменив его название в содержимом XML-файле.
- Сохраните изменения.