«Возьми вишневый мамин плащ и кружку молока» – вспомнился мне фрагмент моего любимого стиха из книги Григория Остера «Вредные советы». И я понял, что у меня для вас тоже есть пара советов. Конечно, мои советы не такие «сочные», но все же использовать их стоит с умом и большой осмотрительностью.
Мы рассмотрим три приема работы с 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.
blackwood-dayzru
Полезно!!