Для разработчиков

/
/
/
Пример плагина. Добавление нового S3 хранилища

Пример плагина. Добавление нового S3 хранилища

В панели ispmanager доступно создание самописного плагина, который позволит:

  • добавить новое S3 хранилище вашего провайдера для резервного копирования;
  • автоматизировать процесс настройки резервного копирования. 

Настройка плагина

  1. Авторизуйтесь в панели под учётной записью с правами суперпользователя.
  2. Откройте раздел Менеджер файлов.
  3. Создайте и отредактируйте XML-файл и файл-обработчик.
  4. Перейдите в раздел Резервные копии.
  5. В панели инструментов нажмите  Настройки резервного копирования.
  6. В Типе хранилища выберите вариант Новое хранилище.
    Заполнять пустые поля формы настроек не нужно.
  7. Перейдите по ссылке из баннера:

    После перехода по ссылке адрес сервера предоставляет информацию для доступа к новому хранилищу и выполняет обратный переход в панель. Поля формы в панели заполняются автоматически.

    Подробнее
  8. Сохраните настройки.

XML-файл

  1. Перейдите в директорию: /usr/local/mgr5/etc/xml.
  2. Создайте файл с именем вида ispmgr_mod_<имя плагина>.xml.
  3. Отредактируйте 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">Для получения данных для подключения к хранилищу перейдите по &lt;a href="__url__" target="_self"&gt;ссылке&lt;/a&gt;. Необходимые поля будут заполнены автоматически.</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 &lt;a href="__url__" target="_self"&gt;link&lt;/a&gt;. Necessary fields will be filled automatically.</msg>
    	</messages>
      </lang>
    </mgrdata>
    
  4. Сохраните изменения.

При необходимости замените значения на свои собственные.

Подробнее

Файл-обработчик

  1. Перейдите в директорию: /usr/local/mgr5/addon.
  2. Создайте файл-обработчик с именем, которое было указано в XML-файле. По умолчанию используется имя plugin.py.
  3. Отредактируйте файл с плагином по примеру:
    #!/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-файле.

  4. Сохраните изменения.
Оцените статью
Оцените статью

В этой статье