«Вредные советы» или еще несколько приемов работы с XWiki

0bf4a734879ca5917d366050f1ff5e7c.png

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

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

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

Оглавление:

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

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

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

77115d8fa2bf800e2e0cf631394a95dc.png

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

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

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

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

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

fc81b9e55aac155ffe02ae6fda392d48.png

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

a02b7c6cb673391bcf41d2f823e462e3.png

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

ea99ab44ff12e6bfa3788df73146caf0.png

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

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

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

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

cbd513c4d69373ca9efd7f786da5c1e2.png

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

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

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

Введите код:

import sys
print(sys.version)

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

67f773ac7856b0a153c5b3460df6004a.png

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

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

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

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

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

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

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

0f9ee94978cccf41f7dd39f2806da04d.png

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

fb8857e7f94f59207eb01ac65ed0d340.png

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

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

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

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

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

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

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

import sys
print sys.path

Получим:

9dbeda0a8f06091904fd7038d0140df4.png

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

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

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

732497ef174d42769f17bc9e32b8a2bc.png

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

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

4e48f7c4cda2eac44f51e6e2a71882dd.png

Как-то раз в ходе экспериментов, я захотел отправить с помощью 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)

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

f0366ca2a772f48aeeda310cb382b280.png

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

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


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

e0557a68c6cc0dc7d82da24aa0e6827a.png

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

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

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

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

0bdf224cb957248ee876fa1f5d99f453.png

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

f6ac3c51214f8a7d69d569271856e670.png

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

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

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

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

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

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

{{php}}

{{/php}}

Результат:

28bd2e1109ddd310c028db811e2e6f3f.png

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

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

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

Выведет на страницу параметры отправление к ней с помощью Web формы.

Заключение:

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

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

© Habrahabr.ru