Пример плагина. Добавление нового S3 хранилища
В панели ispmanager доступно создание самописного плагина, который позволит:
- добавить новое S3 хранилище вашего провайдера для резервного копирования;
- автоматизировать процесс настройки резервного копирования.
Настройка плагина
- Авторизуйтесь в панели под учётной записью с правами суперпользователя.
- Откройте раздел Менеджер файлов.
- Создайте и отредактируйте XML-файл и файл-обработчик.
- Перейдите в раздел Резервные копии.
- В панели инструментов нажмите
Настройки резервного копирования.
- В Типе хранилища выберите вариант Новое хранилище. Заполнять пустые поля формы настроек не нужно.
- Перейдите по ссылке из баннера:
После перехода по ссылке адрес сервера предоставляет информацию для доступа к новому хранилищу и выполняет обратный переход в панель. Поля формы в панели заполняются автоматически.
Подробнее - Сохраните настройки.
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>
- Сохраните изменения.
При необходимости замените значения на свои собственные.
Файл-обработчик
- Перейдите в директорию:
/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-файле.
- Сохраните изменения.