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

от автора

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

Мы рассмотрим три приема работы с XWiki, которые скорее всего выбиваются из хорошей практикиi, но могут быть полезны в ваших экспериментах. В любом случае, если вы пересели с иглы 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. 


ссылка на оригинал статьи https://habr.com/ru/articles/863972/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *