«Возьми вишневый мамин плащ и кружку молока» – вспомнился мне фрагмент моего любимого стиха из книги Григория Остера «Вредные советы». И я понял, что у меня для вас тоже есть пара советов. Конечно, мои советы  не такие «сочные», но все же использовать их стоит с умом и большой осмотрительностью.

Мы рассмотрим три приема работы с XWiki, которые скорее всего выбиваются из хорошей практики, но могут быть полезны в ваших экспериментах. В любом случае, если вы пересели с иглы Confluence на его open source аналог (со слов разработчиков). То вам, точно не помешает знать о возможностях доработки его напильником.

Начнем мы с получения доступа к командной оболочке прямо из XWiki, а закончим обхождением ограничений CORS с помощью скрипта на Python.

Оглавление:

Прежде чем начать, еще сделаю привычный дисклеймер.
Я не программист и даже не гуру XWiki, примеры которые будут представлены в статье скорее всего будут не самыми лучшими и их точно не стоит бездумно использовать в продуктовой среде.

Все примеры проверены в XWiki версии 15.10.14. 

Доступ к командной оболочке Linux с помощью Groovy

Был у меня как-то случай, когда я пытался автоматизировать работу с git в XWiki. В результате у меня внутри структуры вики скопилась куча клонированных репозиториев.

Прямого доступа на сервер у меня не было и тогда я открыл для себя необычное решение. 

Оказывается Groovy с помощью функции execute() может работать с командной оболочкой (shell). В том числе удалить ненужные папки.

Groovy встроен в XWiki по умолчанию, ничего устанавливать не потребуется.

Просто создайте новую страницу и найдите в макросах Groovy.

Чтобы проверить работоспособность скрипта, запустите команду просмотра каталога (ls).

Если оставите включенным чек-бокс «Output», то скрипт выполнится, даже без сохранения страницы.

Cодержимое каталога с XWiki отобразилось в окне редактора страницы.

Как я понимаю командная оболочка запускается от имени пользователя, запустившего XWiki. Я тестировал только в Linux, если протестируете в другой ОС, отпишитесь пожалуйста в комментариях. 

Думаю, это не самое безопасное решение, поэтому не советую им злоупотреблять.

Установка Python и библиотек

Вот вы и попались на мой кликбейтный подзаголовок. Нет, не подумайте, что я вас обманываю. Писать скрипты на Python в XWiki вполне себе можно, но как и в случае с покупкой товаров в телемагазине есть нюансы.

Давайте ненадолго сохраним интригу и для начала напишем пробный скрипт на Python.

Создайте новую страницу и по аналогии с Groovy выберите Python Macro (он должен быть установлен по умолчанию)

Введите код:

import sys
print(sys.version)

Теперь мы знаем версию интерпретатора:

Это наше первое разочарование.

Добавим еще ложку дегтя. В системе используется Jython. 

Если я правильно понял, это приводит к тому, что большинство библиотек не будут работать нормально.

Но попытаться стоит.

В XWiki установить библиотеки Python можно двумя способами.

Первый, с помощью расширения Extension Repository Connector - Pypi.

Установите его через менеджер расширений (я уже установил).

 

После установки в репозитории появятся совместимые библиотеки Python.

На мой взгляд это не самый лучший путь. Весь менеджер расширений забьется абсолютно бесполезными библиотеками, которые кто-то начал писать и забросил на версии 0.0.1.

«Штош, если это не лучший вариант, значит второй точно лучший?» – могли бы подумать вы. Увы, ситуация, как в нашумевшем анекдоте про два стула.

В качестве второго варианта можно ставить библиотеки напрямую.

К сожалению, большинство библиотек скорее всего установятся, но при импорте или использовании выдадут какую-нибудь ошибку.

Но это не повод отступать от наших планов.

Для начала нам надо узнать, где хранятся библиотеки.

Вставьте в макрос Python следующий код:

import sys
print sys.path

Получим:

Для установки нам нужен будет первый адрес.

Вы можете установить библиотеки любым удобным способом.

У меня уже было настроено окружение conda с нужной версией python, поэтому я использовал установленный там pip с атрибутом target. 

Выше пример установки библиотеки httplib2, это одна из немногих рабочих библиотек, поэтому именно её мы используем на следующем шаге.

Делаем страницу для вызова стороннего API

Как-то раз в ходе экспериментов, я захотел отправить с помощью JavaScript запрос на сторонний ресурс и тут же узнал, что он заблокирован CORS политикой. 

Девопсы отказались ковырять настройки сервера ради меня, поэтому мне пришла в голову «гениальная» идея сделать запрос к другой странице XWiki, на которой будет серверный код для запроса нужной страницы. 

Давайте рассмотрим последний вредный совет, на примере запроса к Swagger Petstore API.

Для начала создадим страницу «swagger» с кодом отправки GET запроса. 

Разместите на ней Python макрос со следующим кодом:

import httplib2
h = httplib2.Http(".cache")
resp, content = h.request("https://petstore.swagger.io/v2/pet/findByStatus?status=available", "GET")
print (content)

Получим следующий результат:

Запрос отработал успешно, на страницу добавился текст.

Теперь создайте еще одну страницу под названием «js» и вставьте в неё HTML макрос со следующим содержанием:

<script>

  fetch('http://localhost:8080/xwiki/bin/get/Habr/swagger/?xpage=plain&ouputSyntax=plaint') // Replace with your XML endpoint URL

  .then(response => response.text())

  .then(xmlString => {

    const parser = new DOMParser();

    const xmlDoc = parser.parseFromString(xmlString, 'text/xml');

    // Access XML elements using DOM methods (Example)

    const elements = xmlDoc.getElementsByTagName('p'); // Replace 'element' with your tag name

    for (let i = 0; i < elements.length; i++) {

      console.log(elements[i].textContent); // Access text content

      // Access attributes using elements[i].attributes

    }

  })

  .catch(error => {

    console.error('Error fetching XML:', error);

  });

</script>


Уберите галочку с «Clean»

В данном макросе мы внутрь обработки HTML кода вставляем скрипт.

Скрипт делает запрос на страничку «swagger».
Обратите внимание на URL (http://localhost:8080/xwiki/bin/get/Habr/swagger/?xpage=plain&ouputSyntax=plaint) мы заменили в URL /view/ на /get/. Это позволит получить только контент страницы без панелей и прочих виджетов.

Также мы добавили ?xpage=plain&ouputSyntax=plaint, чтобы нам вывелся только текст.

Остается только отфильтровать HTML теги, получить чистый JSON и вывести результат в консоль.

Бонус и Гамовер

Вы наверное заметили, что в примере выше жестко зашиты параметры запроса к Petstore API. 

Это потому, что в данном случае проблематично получить параметры из запроса.

К счастью есть более простое решение. Которое мы рассмотрим в качестве небольшого бонуса к статье.

Из примера со Swagger это не очевидно, но XWiki умеет обрабатывать query параметры, а также параметры формы (x-www-form-urlencoded).

Например, если установить PHP Macro, то следующий код отобразит содержимое query параметра action.

{{velocity}}
#set ($action=$request.action)
{{/velocity}}

{{php}}
<? echo $action   ?>
{{/php}}

Результат:

Доступ к POST параметрам осуществляется через обработку отправки Web-формы.

Например, данный код:

{{velocity}}
  #set ($allParameters = $request.getParameterNames())
  #foreach ($parameter in $allParameters)
    $request.getParameterValues($parameter)
  #end
{{/velocity}}

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

Заключение:

Как же приятно вспомнить старые деньки и за один вечер набросать статью с мемами, без выверки фраз и тщательной редактуры. На этот короткий вечер я прям помолодел лет на 10. Чего и вам всем желаю.

Надеюсь материал будем полезным в ваших экспериментах с XWiki. 

Комментарии (1)


  1. blackwood-dayzru
    05.12.2024 00:22

    Полезно!!