Сервер приложений Zope

Андрей Орлов

Краткое руководство пользователя пакета

Андрей Орлов

Основная идея нашего варианта пакета — дать возможность эксплуатации нескольких независимых друг от друга экземпляров Zope (в пакете rpm, полученном в рамках проекта Zope, такой возможности нет). Для каждого такого экземпляра создается домашний каталог, содержащий специфические для него файлы: прикладные пакеты, внешние процедуры и собственно базу данных — ZODB3.

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

  • перезапуск сервера при перезагрузке системы,

  • переупаковка базы данных,

  • создание нового экземпляра сервера.

Особенности пакета

В нашем пакете, код Zope версии 2.6.1 изменен применением нескольких патчей, исправляющих ошибки, затрудняющие его эксплуатацию.

«Юникодный» патч

В Zope 2.6.0 появилась и продолжает развиваться поддержка unicode. Из-за особенностей ее реализации, сервер потерял возможность нормальной работы с национальными языками (в т.ч. с русским) в режиме, отличном от unicode.

Это патч устраняет ошибки в новом коде Zope и делает возможной полноценную работу с сервером в любой кодировке (подробнее см. файл UnicodePatch.txt).

«Экспорт» патч

Обычно, экспортируемые реплики попадают в каталог ./var экземпляра Zope, что вызывает некоторые проблемы: это тот же каталог где лежит сама база Z-объектов, и любые операции над файлами в этом каталоге чреваты ошибками, приводящими к полной потере данных.

Применение данного патча вынуждает сервер экспортировать реплики в каталог ./export экземпляра Zope, если таковой был предварительно создан. Это снижает возможный ущерб от ошибок при выполнениии различных технических операций.

Формат и расположение файлов настройки

Привязка пакета к операционной среде определяется следующими конфигурационными файлами:

/etc/sysconfig/zope_default

Конфигурация экземпляров сервера по умолчанию, параметры из этого файла загружаются до файла конфигурации экземпляра;

/etc/sysconfig/zope/*

Каждый файл в этом каталоге является конфигурационным файлом экземпляра сервера;

/etc/sysconfig/zope_hosts.cfg

Список виртуальных хостов Zope, доступных через модуль proxy веб-сервера Apache, если он используется (см. также /etc/httpd/conf/zope_proxy.conf).

Формат файла — две колонки: первая колонка содержит имя виртуального хоста, вторая — URL соответствующего объекта в Zope. URL url может содержать протокол http или localhttp (условный протокол, разрашающий обращение только с адресов, перечисленных в файлк /etc/sysconfig/zope_local.cfg).

/etc/sysconfig/zope_local.cfg

Список ip-адресов хостов и сетей, из которых разрешен доступ к виртуальным хостам Zope, для которых указан протокол localhttp. Обратите внимание: доступ к контрольной панели Zope разрешен только через протокол localhttp.

Формат файла — две колонки: первая колонка содержит IP-адрес хоста или сети (указывается префикс сети, например 192.168.0), вторая - слово "allow", если доступ разрешен.

/etc/httpd/conf/zope_proxy.conf

Дополнительный конфигурационный файл к веб-серверу Apache, его использование должно быть явно разрешено в конфигурационном файле Apache. Конфигурационный файл описывает использование модулей proxy и rewrite для доступа к виртуальным серверам, хранимым в Zope. Список виртуальных серверов вносится в /etc/sysconfig/zope_hosts.cfg.

Переменные конфигурационных файлов экземпляров сервера

Каждый из конфигурационных файлов zope_default и /etc/sysconfig/zope/* содержит строки вида:

        <СТРОКА> :== <ПЕРЕМЕННАЯ> '=' <ЗНАЧЕНИЯ>

Предполагается наличие следующих переменных:

INSTANCE_HOME=/var/lib/zope/<ИДЕНТИФИКАТОР>

Рабочая зона экземпляра Zope. Содержит все данные, расширения и продукты уникальные для этого экземпляра;

ZOPE_HOME=/usr/share/zope

Каталог, в котором расположен шаблон домашнего каталога. Из этого каталога утилита addzopesite.py копирует файлы при создании нового домашнего каталога;

ZOPE_INSTANCE_HOME=/var/lib/zope

Каталог, в котором расположены рабочие зоны экземпляров серверов. Если при создании экземпляра не указывать полный путь, а указать только идентификатор, то рабочая зона для этого экземпляра будет создана в этом каталоге и её имя будет совпадать с идентификатором;

user=zope

пользователь, под которым запускается Zope;

port=8000

базовый порт, относительно которого захватываются порты Zope:

port + 80

http-сервер;

port + 21

ftp сервер;

threads=8

количество тредов в стартующем сервере;

days=7

количество дней между переупаковками сервера;

ignore=0

игнорировать наличие данного экземпляра сервера при старте, если данный сервер не был указан явно (0 — запускать, 1 — игнорировать);

name="Основной Z-сервер"

имя сервера, отображаемое в сообщениях скриптов и др.;

LC_ALL=ru_RU.KOI8-R

локаль сервера по умолчанию. Если не указана — сервер стартует без ключа -L и игнорирует какие-либо установки локали. Для не-англоязычных серверов это может оказаться фатальным: не будет работать поиск посредством ZCatalog и форматирование с использованием StructuredText. Кроме того, начиная с версии 2.6.0, будет невозможно использовать страницы управления свойствами.

ZOPE_PROFILE_PUBLISHER=0

если установлена и не равна 0, то Zope будет работать в режиме профилирования. Посмотреть текущий профиль Zope можно на вкладке ControlPanel/DebugInfo/manage_profile. Для профилирования используется файл /var/tmp/zope.<ИДЕНТИФИКАТОР>.profile; Убедитесь, что в этом каталоге достаточно места.

ZOPE_TRACE=0

включить трассировку запросов: будет создан специальный лог /var/log/zope/<ИДЕНТИФИКАТОР>.trace.log, в котором будет сохраняться подробная трассировка запросов к серверу с указанием отметок времени;

ZOPE_STUPID_LOG=0

включить журналирование отладочной информации (/var/log/zope/<ИДЕНТИФИКАТОР>.stupid.log), в котором будет сохраняться вывод отладочной информации о работе сервера. Содержимое журнала является подмножеством того, что выводится на консоль при старте в отладочном режиме;

ZOPE_READONLY=0

если установлена и не равна 0, то при старте в отладочном режиме Zope будет монтировать хранилище в режиме READONLY: все завершённые транзакции будут сохраняться во временной памяти и при рестарте Zope произойдет автоматический откат изменений.

ZOPE_STORAGE=ZODB

тип хранилища;

ZOPE_STDOUT=/dev/null

Файл, в который перенаправляется вывод по каналам STDERR и STDOUT - редко когда нужно, но при тяжелой отладке Z-продукта идущей далеко не первый день - незаменимо. При старте в отладочном режиме опция игнорируется : все выводится на терминал.

Поддерживаемые типы хранилищ

Существует несколько типов хранилищ для Zope, практически все из них находятся в состоянии вечных бета-версий, тем не менее при некоторых обстоятельствах оказывается интересным использовать хранилище, отличное от стандартного ZODB или же ZODB, смонтированное в нестандартном режиме (например «только для чтения»).

Обычный способ нестандартного монтирования хранилищ — размещение в каталоге /usr/lib/zope/lib/python модуля custom_zodb.py, который и выполняет собственно монтирование. Мы включили в наш дистрибутив готовый модуль custom_zodb.py, управлять которым можно посредством переменных ZOPE_STORAGE и ZOPE_READONLY конфигурационных файлов экземпляра сервера.

Переменная ZOPE_STORAGE может принимать одно из следующих значений:

ZODB

обычное хранилище ZODB;

BSDPackless

хранилище BerkeleyDB в режиме Packless;

BSDMinimal

хранилище BerkeleyDB в режиме Minimal;

BSD или BSDFull

хранилище BerkeleyDB в стандартном режиме;

Для любого из этих хранилищ может быть установлена переменная ZOPE_READONLY, после чего все закрываемые транзакции будут записываться во временное хранилище и исчезнут при перезапуске сервера (таким образом работает сервер http://demo.neural.ru).

Серьезному тестированию работоспособности подвергалось только хранилище ZODB — как в нормальном режиме, так и в режиме «только для чтения» (READONLY), остальные типы хранилищ добавлены исключительно для тех, кто знает, что делает. Мы не поддерживаем хранилище ZEO (хотя частично протестировали возможность такой поддержки), так как считаем, что большая часть пользователей не заинтересована в нём, а остальные могут собрать пакет сами.

Состав и назначение утилит

Создание экземпляра Zope

С помощью этой утилиты вы можете создать новую рабочую зону для сервера Zope, установить права доступа к файлам и зарегистрировать зону в конфигурационных файлах. При создании экземпляра Zope в него копируется файл inituser, что вызывает при старте сервера установку суперпользователя admin с паролем 12345678 — помните, сразу после старта сервера вы должны создать другого пользователя, дать ему роль Manager и стереть пользователя admin.

Вызов

    addzopesite.py [-sl] <КАТАЛОГ_ДЛЯ_УСТАНОВКИ> <ПОРТ>
Параметры

КАТАЛОГ_ДЛЯ_УСТАНОВКИ

каталог, в котором будет установлена рабочая зона экземпляра сервера, в простейшем случае указывается идентификатор экземпляра, при этом установка производится в каталог /var/lib/zope/<КАТАЛОГ_ДЛЯ_УСТАНОВКИ>, если параметр начинается с символа «/» — то он рассматривается как путь к каталогу для установки от корня сервера;

ПОРТ

базовый порт, от которого будут отсчитываться рабочие порты Zope.

Ключи

-u <UID>

пользователь;

-g <GID>

группа;

--zope_home=<path>

путь к прототипам;

--cfg_default=<path>

конфигурация по умолчанию;

--cfg_dir=<path>

каталог с конфигурациями серверов;

--instance_name=<str>

название сервера;

--instance_id=<str>

идентификатор сервера;

--threads=<int>

количество тредов;

--force

вносить в новую конфигурацию все переменные (иначе вносятся только необходимые);

--locale=<locale>

локаль, которая будет установлена для сервера;

--storage="ZODB"|"BSDFull"|"BSDPackless"|"BSDMinimal"

тип используемого хранилища;

--[no]readonly

хранилище [не]должно монтироваться в режиме readonly;

--[no]profile[=<path>]

в[ы]ключить профилирование;

--[no]log[=<path>]

в[ы]ключить отладочный логинг;

--[no]trace[=<path>]

в[ы]ключить трассировку запросов;

Переупаковка ZODB

Эта утилита должна вызываться на регулярной основе, чтобы выполнять переупаковку ZODB

Вызов

    zope_pack.py [ключи] [<zope1> [<zope2> ... ]]
Параметры

zope1, zope2

конфигурационные файлы Z-сервера;

Ключи

-v

трассировка выполнения;

-h

помощь;

-i

игнорировать все операции;

-d <days>

количество дней при упаковке данных;

--max_ratio=<float>

доля свободного пространства по отношению к размеру базы, при котором запускается переупаковка;

--min_ratio=<float>

доля свободного пространства по отношению к размеру базы, при котором переупаковка считается невозможной;

--force = (1|2|3)

принудительная упаковка, модификаторы: 1 — игнорировать игнор, 2 — игнорировать max_ratio, 3 — игнорировать min_ratio;

--cfg_default=<path>

конфигурация по умолчанию;

--cfg_dir=<path>

каталог с конфигурациями серверов.

Перезапуск сервера

Сценарий для System V init scripts, выполняющий запуск сервера Zope в различных режимах и его останов.

Вызов

    zope <КОМАНДА> [<zope1> [<zope2> ... ]]
Параметры

zope1, zope2

экземпляры Zope, которые будут затронуты командой; если параметр не передан, то команда последовательно выполняется для всех экземпляров;

Команды

-u <UID>

Пользователь;

start

запуск сервера;

stop

остановка сервера;

reload, restart

остановка и повторный запуск сервера;

status

статус Zope;

debug

перезапуск сервера в отладочном режиме, нажатие Ctrl-C вызывает повторный перезапуск сервера;

help

помощь по командам и переменным Z;

Создание новой базы

Утилита используется для создания хранилища с последующим его использованием в Zope в качестве основного или монтируемого хранилища.

Вызов

    zope_storage.py [-sl] <zope> [<path>]
Параметры

zope

экземпляр Zope, в котором будет создана база;

path

путь к базе;

Ключи

-u <UID>

пользователь;

-g <GID>

группа;

--cfg_default=<path>

конфигурация по умолчанию;

--cfg_dir=<path>

каталог с конфигурациями серверов;

--external

создать точку монтирования;

--external_name=<id>

идентификатор точки монтирования;

--storage="ZODB"|"BSDFull"|"BSDPackless"|"BSDMinimal"

тип создаваемого хранилища;

Быстрый старт

Установка и первоначальная настройка Zope включает в себя следующие шаги.

Установка пакетов

Для установки пакетов необходимо дать команду вида :

rpm -ivh Zope-2.6.*rpm \
    Zope-Module-2.6.*.i586.rpm \
    Zope-core-2.6.*.i586.rpm \
    Zope-DateTime-2.6.*.i586.rpm \
    Zope-DocumentTemplate-2.6.*.i586.rpm \
    Zope-RestrictedPython-2.6.*.i586.rpm \
    Zope-StructuredText-2.6.*.i586.rpm \ Zope-TAL-2.6.*.i586.rpm \
    Zope-Testing-2.6.*.i586.rpm \ Zope-ZHome-2.6.*.i586.rpm \
    Zope-ZODB-2.6.*.i586.rpm \
    Zope-ZPublisher-2.6.*.i586.rpm \ Zope-ZServer-2.6.*.i586.rpm \
    Zope-ZUtils-2.6.*.i586.rpm

Если вы используете APT, то более простой и правильный способ установки:

apt-get install Zope

В процессе установки этих пакетов проводится ряд настроек:

  • создаётся пользователь и группа Zope, под которыми, по умолчанию, будет работать сервер;

  • создаётся рабочая зона Zope: /var/lib/zope;

  • устанавливаются вспомогательные пакеты Zope, эти пакеты могут использоваться без использования Zope;

  • устанавливается сам Zope;

Добавление рабочей зоны сайта

После установки пакетов одна рабочая зона уже будет создана — var/lib/zope/basic. Вы можете добавить дополнительные рабочие зоны вызовом скрипта addzopesite.py (например, сама зона basic была создана командой addzopesite.py basic 8000).

здесь 8000 — номер базового порта, от которого отсчитываются порты веб-сервера (базовый порт + 80) и ftp (базовый порт + 21)

Настройка рабочей зоны сайта

По умолчанию, вновь созданная рабочая зона не является автоматически запускаемой, т.е. при перезагрузке системы сервер для этой рабочей зоны не будет запущен. Изменить ситуацию можно установив в значение 0 параметр ignore в файле /etc/sysconfig/zope/<ИМЯ РАБОЧЕЙ ЗОНЫ> (/etc/sysconfig/zope/basic для основной зоны).

Старт сервера

Первый раз стартовать сервер лучше в отладочном режиме, командой /etc/rc.d/init.d/zope debug <ИМЯ РАБОЧЕЙ ЗОНЫ>, например /etc/rc.d/init.d/zope debug test.

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

Создание пользователей

В любой вновь созданной рабочей зоне есть пользователь admin с паролем 12345678. Единственная операция, которая может быть выполнена от имени этого пользователя — редактирование других пользователей. Поэтому рекомендуется создать пользователя с ролью «Manager» и удалить пользователя admin, после чего все работы проводить от имени пользователя с ролью «Manager». Чтобы сделать это, стартуйте сервер и проделайте следующие шаги:

  1. Запустите ваш любимый броузер

  2. Введите URL http://127.0.0.1:8080/manage

  3. В появившемся запросе на ввод логина и пароля введите логин «admin» и пароль «12345678».

  4. Перейдите в папку acl_users (http://127.0.0.1:8080/acl_users/manage)

  5. Нажатием кнопки «Добавить» добавьте пользователей, хотя бы один из которых должен иметь роль «Manager» и «Owner».

  6. Удалите пользователя admin. При возникновении аварийных ситуаций вы сможете создать его заново утилитой /usr/sbin/zpasswd, так что его удаление вполне безопасно, чего нельзя сказать о противоположном случае: дело в том, что из-под этого пользователя нельзя создавать какие-либо объекты, т.к. работать нормально они всё равно не смогут. Обычно Zope блокирует такие попытки, но есть способы это обойти

  7. Введите URL

  8. В появившемся запросе на ввод логина и пароля введите логин и пароль пользователя с ролью "Manager".

В дальнейшем, пользователь с ролью Manager всегда может изменить логины и пароли других пользователей. Если будут утеряны все логины и пароли пользователей с ролью Manager, то можно создать пользователя admin, используя утилиту zpasswd.py, и затем повторить все шаги данного раздела.

Интеграция с веб-сервером Apache

Все сайты, создаваемые с использованием сервера приложений Zope, рекомендуется запускать за proxy-сервером, в качестве которого может использоваться веб-сервер Apache с активированным модулем mod_proxy. Такое решение позволяет обеспечить более высокую производительность, создавать сайты для виртуальных доменов и защитить Zope от некоторых направленных против него атак.

В пакет Zope-ZUtils-2.6.*.i586.rpm входит дополнение к конфигурационному файлу Apache, /etc/httpd/conf/zope_proxy.conf, содержащее пример настройки web-сервера. С этими настройками веб-сервер будет читать содержимое файла /etc/sysconfig/zope_hosts.cfg и для перечисленных в нём виртуальных серверов запросы будут отображаться на каталоги Zope, при этом контекст обработки запроса настраивается экземпляром класса VirtualHostMonster, предварительно созданного в корне сайта: иначе базовые URL будут строиться неверно.

Активация модулей mod_proxy и mod_rewrite

Чтобы активировать mod_proxy необходимо:

  1. В конфигурационном файле /etc/httpd/conf/httpd.conf раскомментировать следующие строки:

    LoadModule rewrite_module modules/mod_rewrite.so
    LoadModule proxy_module modules/libproxy.so
    AddModule mod_rewrite.c
    AddModule mod_proxy.c
    

    Желательно убрать из файла существующее определение прокси, хотя всё будет работать и с ним.

  2. В конец файла добавить вызов конфига прокси директивой:

    Include conf/zope_proxy.conf
    

    (Обратите внимание на то, что данный файл должен существовать. Он входит в пакет ZUtils).

  3. Перезапустить web-сервер командой /etc/rc.d/init.d/httpd restart

Добавление виртуального сервера в конфигурацию

Список виртуальных серверов хранится в файле /etc/sysconfig/zope_hosts.cfg, каждая строка которого соответствует одному виртуальному серверу и содержит два параметра: URL, видимый при обращении к прокси, и URL, на который такие обращения будут отображаться. Например, для сервера zope.localdomain:

 zope.localdomain  http://localhost:8080/VirtualHostBase/http/zope.localdomain:80/Zope/Main/VirtualHostRoot

Каталоги VirtualHostBase и VirtualHostRoot не должны специально создаваться: это псевдоимена, активирующие объект класса VirtualHostMonster, расположенный в корневом объекте Zope, и вызывающие переопределение среды таким образом, что в качестве базового URL при обработке запроса будет использоваться http://zope.localdmain:80/, а пути будут отсчитываться от каталога /Zope/Main. Это совсем не тоже самое, что chroot на файловой системе, но приводит к сходным последствиям при программировании.

Создание контейнера под виртуальный сервер в Zope

После того, как отображение виртуального сервера добавлено в Конфигурацию прокси, можно создать контейнер под этот сервер в Zope. Мы рекомендуем для любого виртуального сервера создавать в иерархии Zope два уровня контейнеров:

  • контейнер служебного уровня («подвал»), имя которого совпадает с именем виртуального сайта;

  • вложенную в него каталог Main, содержащую корень сайта.

При таком планировании сервера, в контейнере служебного уровня будут размещаться файлы, необходимые для дизайна, коннекторы к базам данных и почтовым серверам, контейнеры авторизации пользователей (acl_users) и хранимые процедуры, а в каталоге Main Main — собственно контент-наполнение сайта.

Настройка VirtualHostMonster

Вы должны создать объект класса VirtualHostMonster в корне сайта, для этого нужно набрать в броузере URL http://localhost:8080/manage и добавить объект (пункт меню Add VirtualHostMonster) с именем VirtualHostMonster. Без добавления этого объекта при обращении к серверу через proxy не произойдет смещение корня виртуального сайта, и вы получите ошибку 404 (not found);

Проверка

После выполнения предыдущих шагов, при вводе URL http://zope.localhost вы должны увидеть страницу index_html означенную в контексте папки Zope/Main. Обратите внимание, все вычисляемые ссылки (конструкцией вида <dtml-var absolute_url>) должны указывать на URL сайта .

Настройка сервера для работы через https-соединение

Достаточно привлекательной кажется идея использования для закрытия канала между сервером и пользователем модуля mod_ssl веб-сервера Apache. Входящий в наш пакет конфигурационный файл Apache zope_proxy.conf предусматривает такой механизм. Для его активации вы должны проделать следующее (предполагается, что вы уже настроили сервер для обычной работы):

  1. Установить модуль mod_ssl для веб-сервера Apache. >При установке модуля будет создан каталог /etc/httpd/conf/ssl, содержащий конфиги mod_ssl;

  2. После установки модуля вы должны сгенерировать ключи к серверу обычным способом — т.е. так, как это описано в руководстве к apache, mod_ssl и openssl;

  3. Файл /etc/httpd/conf/ssl/ssl.default-vhost.conf содержит конфигурацию доступа к сайту по умолчанию. Вы должны добавить в эту конфигурацию непосредственно перед закрывающей скобкой вызов того же конфигурационного файла, что и для обычного сайта, чтобы в защищённом режиме также происходила обработка виртуального хостинга. Конец файла после добавления должен выглядеть так:

    Include conf/zope_proxy.conf 
    </VirtualHost>
    

    Такая конфигурация, возможно, не совсем идеальна, но достаточна для демонстрации принципа решения.

  4. Перезапустите Apache;

Для проверки попробуйте ввести в броузере URL вида http://zope.localdomain/ и https://zope.localdomain/.

В обоих случаях вы должны увидеть ваш сайт, в последнем случае может (а может и должно) появиться предупреждение об установлении защищённого канала.

Как должна была показать проверка, проведённых настроек вполне достаточно для того, чтобы пользователи могли работать с сайтом как через http, так и через https. Но желательно, чтобы через https работали только зарегистрированные пользователи, тогда как обычным лучше работать через http (кеширование, нагрузка на аппаратное обеспечение при выполнении процедуры шифрования и т.п.). Кроме того, желательно гарантировать, чтобы никто из авторизованных пользователей вследствие ошибок или же злого умысла не начал работать через http.

Простейший способ добиться этого — выполнить перенаправление на https-канал при попытке авторизации. Если на вашем сайте используется http-авторизация, то раскомментируйте в файле zope_proxy.cfg следующие строки:

RewriteCond           %{SERVER_PORT}                !^443$
RewriteCond           %{HTTP:Authorization}        ^Basic.*
RewriteRule          ^(.*)                        https://%{HTTP_HOST}$1        [R,L]

Теперь, увидев в запросе заголовок авторизации, Apache инициирует перенаправление на защищённый канал.

Для проверки такого перенаправления попробуйте ввести в броузере URL вида http://zope.localdomain/manage. Обычно этот URL используется для входа в интерфейс управления Zope. Если сайт использует http-авторизацию, то вы увидите запрос для ввода логина и пароля, а после удачного ввода обнаружите что уже работаете в с URL вида https://zope.localdomain/manage.

Обратите внимание, что уведомление о входе в https-режим появилось уже после ввода пароля: это означает, что вы, к сожалению, всё же передали пароль по открытому каналу. Такое автоматическое перенаправление не гарантирует сокрытия вашего пароля, но гарантирует, что авторизованные пользователи после ввода пароля будут работать только по https.

Для гарантированного сокрытия пароля вы должны либо явно вызывать https сразу при попытке обращения к закрытой части ресурса (попробуйте настроить соответствующим образом ссылки на вашем сайте), либо вызывать редирект на https до выполнения авторизации, по факту обращения к защищаемой странице.

Это было бы легко сделать, если бы не гибкая система настройки прав в Zope: любая страница может быть защищена. Таким образом, мы не можем предложить универсального решения, но можем предложить решение частного случая: редирект при попытке доступа к ZMI.

Чтобы включить такой редирект, раcкомментируйте в zope_proxy.cfg следующие строки:

RewriteCond           %{SERVER_PORT}        !^443$
RewriteCond        $1                .*/manage_.*
RewriteRule          ^(.*)                https://%{HTTP_HOST}$1        [R,L]

Этот код будет инициировать перенарправление при обращении к странице вида «.*manage.*», т.е. странице интерфейса ZMI.

Хотя работа через https возможна и для других способов авторизации, автоматический редирект в момент авторизации будет организовать несколько труднее. Для частного случая использования mysqlUserFolder можно попробовать раскомментировать следующие строки в zope_proxy.conf:

RewriteCond           %{SERVER_PORT}        !^443$
RewriteCond           %{HTTP_COOKIE}        .*__ac_user.*                                        
RewriteRule          ^(.*)                https://%{HTTP_HOST}$1        [R,L]

Эксплуатация сервера

Дальнейшая эксплуатация сайта требует регулярного выполнения таких операций, как переупаковка базы данных и репликация каталогов сайта. Объектная база ZODB3, поверх которой построен сервер приложений, предоставляет возможность отменяемых транзакций: любая последовательность операций, изменяющих содержимое базы данных, может быть отменена без потери целостности сайта. Это полезное свойство имеет побочный эффект: при любых изменениях размер базы данных увеличивается. Именно поэтому, на регулярной основе, должна инициироваться процедура переупаковки базы, стирающая старые версии объектов. Эта процедура может быть инициирована со страницы http://zope.localhost/Control_Panel/Database/manage_pack, где можно указать параметры упаковки, но, так как процедура должна проводится на регулярной основе, в состав нашего пакета Zope-ZUtils входит скрипт, инициирующий процедуру переупаковки по crontab посредством утилиты zope_pack.py.

Скрипт запускается ежедневно, но переупаковка базы инициируется при соблюдении двух условий:

  1. База занимает объем не меньше указанного в процентах от свободного пространства на диске;

  2. Свободное пространство на диске не меньше указанного в процентах от размера базы.

Эти параметры хранятся в конфигурационном файле /etc/sysconfig/zope_default.cfg. Скрипт проверяет все экземпляры сервера, конфигурационные файлы которых размещены в /etc/sysconfig/zope.

Профилактическое архивирование сайтов, размещённых в Zope, может осуществляться сохранением базы ZODB3 /var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>/var/Data.fs или репликацией отдельных папок сервера приложений. В первом случае ряд источников рекомендует пользоваться утилитой rsync (см. http://www.zope.org), но второй подход существенно более удобен и может выполняться, например, регулярным запуском команды wget со строкой вида :

wget -sS -O <ID> $(date +%Y%m%d).zexp \
  "http://<LOGIN>:<PASSWD>@localhost:8080/manage_exportObject?download:int=1&id=<ID>"

ID

идентификатор сохраняемой папки в корне Zope;

LOGIN

логин пользователя в Zope;

PASSWD

пароль пользователя в Zope;

При этом сервер отдаёт файл реплики в формате zexp. Вы можете получать реплику в формате *.xml, но: это будет работать более медленно, процесс репликации при ряде условий может сбоить и полученная реплика может занимать существенно больший объём — иными словами, это не выгодно.

Реплика может быть восстановлена импортом в Zope — в тот же самый экземпляр сервера или в любой другой. Для этого реплика должна быть размещена в каталоге /var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА/import, после чего импорт может быть инициирован нажатием на кнопку «import/export» в любом контейнере менеджерского интерфейса. Подробно импорт реплик описан в ImportSite.txt.

Эксплуатация сайта также включает в себя решение ряда административных проблем, связанных с устранением ошибок и противостоянием вторжению. Существует ряд пакетов, помогающих справится с этими проблемами, часть которых подробно описана в InstallExtensionPackages.txt, кроме того, Digital Creations регулярно выпускает так называемые Hotfixes к текущим версиям Zope: Hotfix не изменяет сервер и не требует выполнения сложных процедур миграции сервера, он лишь в момент старта сервера переопределяет часть методов, исправляя таким образом ошибки, связанные, как правило, с дырами в защите. Hotfixes должны размещаться в каталоге /usr/lib/zope/lib/python/Products, более подробно процедура их установки описана в InstallExtensionPackages.txt и на сайте .

Заключение

В заключении просто дадим ряд ссылок:

  • http://www.zope.org — сайт Zope, содержит продукты расширения и много подробной документации;

  • http://www.python.org — Zope реализован на языке Python, этот сайт содержит всю необходимую документацию;

  • http://www.neural.ru — мой сайт, я на нём вывешиваю некоторую информацию по поддерживаемым пакетам.

Установка ранее разработанного сайта

Андрей Орлов

Сервер приложений Zope позволяет делать реплики базы данных и сохранять содержимое сайта в переносимом формате. При соблюдении ряда условий, такая реплика может быть впоследствии импортирована в новый сервер. Благодаря этому возможна разработка сайтов «под заказ» на сервере исполнителя и передача готового сайта заказчику в виде реплик базы данных, внешних процедур и определений объектов. Данный документ описывает обычную процедуру восстановления реплик такого сайта и проблемы, которые могут при этом возникнуть.

Виды передаваемых файлов

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

  1. Реплики базы ZODB3, содержащие сам сайт — обычно файлы с расширением *.zexp, импортируемые в корень Zope.

  2. Реплики базы ZODB3, содержащие определения Z-объектов — обычно файлы с расширением *.zexp, импортируемые в папку /Control_Panel/Products.

  3. Внешние процедуры — обычно файлы с расширением *.py, размещаемые в каталоге Extensions экземпляра Zope.

  4. Специализированные модули расширения Zope — архивы модулей расширения, идентичные описанным в InstallExtensionPackages.txt.

  5. Реплики внешних баз данных — обычно используются реплики базы MySQL.

  6. Вспомогательные скрипты и утилиты серверной части — состав, формат и правила установки определяются производителем.

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

Установка реплик внешних баз данных

Поставщик должен предупредить вас, какие именно значения параметров подключения (хост, порт, логин, пароль и т.п.) используются со стороны Zope, в противном случае установка реплик, содержащих некоторые продукты (например, mysqlUserFolder) может оказаться невозможной. Подавляющее большинство баз данных не поддерживаются стандартной поставкой Zope (единственное исключение — ZGadFly, демонстрационная SQL-база). Поэтому вы должны установить коннекторы к используемой вами базе данных. Для Zope 2.6.1 рекомендуемые коннекторы:

MySQL

Пакеты ZMySQLDA-2.0.8, MySQL-python-0.9.2: в варианте, поддерживаемом нами, отключено порождение исключений при невозможности отката транзакций, кроме того, пакет ZMySQLDA-2.0.8 был доработан для совместимости с MySQL-python-0.9.2: обычный пакет работать правильно не будет;

PostgreSQL

Пакеты psycopg-1.0.12, psycopg-ZPsycopgDA-1.0.12: пожалуйста, не используйте другие коннекторы, или, по крайней мере, не пишите нам о том, что они не работают: наш выбор — коннектор psycopg

Установка специализированных модулей расширения Zope

Как правило, процесс установки таких модулей идентичен описанному в InstallExtensionPackages.txt и не вызывает проблем какого-либо рода за исключением необходимости установить другие пакеты, на которые ссылаются данные.

Установка внешних процедур

Если не указано обратное, просто разместите внешние процедуры в каталоге /var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>/Extensions

Установка реплик ZODB3

В первую очередь должны импортироваться реплики с определениями Z-объектов, следом за ними — реплики, содержащие сам сайт. Для выполнения импорта, все реплики нужно положить в каталог /var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>/import

Определения Z-объектов импортируются в папку /Control_Panel/Products, для этого:

  1. Введите URL /Control_Panel/Products/manage.

  2. Нажмите на кнопку «import/export».

  3. Внизу страницы найдите форму импорта.

  4. В поле «import file name» введите имя файла реплики.

  5. Выберите «Take Owner Ship of imported objects».

  6. Нажмите кнопку «OK».

  7. Если продукт импортирован удачно, папка продукта должна появиться на вкладке /Control_Panel/Products/manage_main.

Сами сайты, как правило, импортируются в корневую папку, для этого:

  1. Введите URL /manage;

  2. Нажмите на кнопку «import/export».

  3. Внизу страницы найдите форму импорта.

  4. В поле «import file name» введите имя файла реплики.

  5. Нажмите кнопку «OK».

  6. Если сайт импортирован удачно, папка с ним должна появиться на вкладке /manage_main;

Если импортируемый сайт содержит SiteRoot, то скорее всего вы должны изменить настройки прокси, чтобы переадресовывать обращения к этому сайту. Если вы используете Apache mod_proxy и наш конфигурационный файл Apache, то конфигурационный файл должен быть включен в /etc/httpd/conf/httpd.conf директивой Include conf/zope_proxy.conf, а доступ к новому сайту прописывается в файле /etc/sysconfig/zope_hosts.cfg в следующем формате:

        <ИМЯ ВИРТУАЛЬНОГО ХОСТА> <URL реального хоста>

, например:

        zope.localdomain        http://10.0.0.9:8080/Zope/Main

Помните, что единственный способ отредактировать SiteRoot — это стереть его, а ухищрения типа SUPPRESS_SITEROOT=1 — лишь способ, облегчающий его стирание.

Если для доступа к импортируемому сайту использовался VirtualHostMonster, то строчки в файле /etc/sysconfig/zope_hosts.cfg будут немножко длиннее:

        zope.localdomain        http://localhost:8080/VirtualHostBase/http/zope.localdomain:80/Zope/Main/VirtualHostRoot

.

Как-либо редактировать или стирать VirtualHostMonster не надо, просто убедитесь, что в корневой папке Zope есть объект этого типа.

Типичные проблемы при импорте сайтов

Права пользователей и Proxy роли

Если каким-либо методам назначены proxy-роли (т.е. проверка допусков при их обработке осуществляется так, как будто вызывавший их пользователь обладает такой ролью), то при выдаче прав будет выполняться проверка того, обладает ли этой ролью владелец этого метода. Если при импорте была изменена информация о владельцах таких методов, то обязательно проверьте, чтобы новый владелец существовал и обладал требуемыми ролями.

Связанные с этим проблемы чаще всего проявляются в запрете выполнения на сайте анонимным пользователем таких операций как регистрация, отправка сообщений в форум, использования почтовых и других форм. Если проблема возникла — попробуйте исправить поля Proxy Roles и Ownership для метода, выполняющего запрещенную операцию.

Особый случай — mysqlUserFolder. Без подробных комментариев: нужно создавать учётную запись администратора, логин которой совпадает с логином разработчика, создавшего объект mysqlUserFolder. Иначе использование mysqlUserFolder может приводить к труднообъяснимым ошибкам.

Изменение SiteRoot

Сайт имеет SiteRoot и вписанное в него доменное имя нужно изменить. Рекомендуемые действия:

  1. Перезапустите сервер с установленной переменной SUPPRESS_SITEROOT, например командой

            SUPPRESS_SITEROOT=1 /etc/rc.d/init.d/zope restart <ИМЯ СЕРВЕРА>
    
  2. Сотрите существующий объект SITE_ROOT (не тратьте время на его редактирование, не выйдет).

  3. Создайте новый объект SITE_ROOT и при создании введите правильные данные.

  4. Перезапустите сервер без переменной SUPPRESS_SITEROOT, например командой

            /etc/rc.d/init.d/zope restart <ИМЯ СЕРВЕРА>.
    

Без подробных комментариев: редактирование объекта SITE_ROOT не работает. Всегда стирайте и создавайте его заново;

Отсутствующий продукт

Какой-либо используемый продукт не существует. Тогда при попытке входа на страницу управления экземпляром класса этого продукта вы увидите надпись «This object is broken, because ...», исправить можно только одним способом — установить недостающий продукт.

Не настроена внешняя система авторизации

Логичный выход — настроить её. К сожалению, это не всегда возможно: система авторизации может не поддерживаться в вашей среде, вам могут быть неизвестны пароли и тому подобные вещи. В тех случаях, когда есть или может быть получена XML-реплика, можно воспользоваться двумя способами. Способ первый: открыть реплику при помощи редактора и вычеркнуть из ObjectManager ссылку на идентификатор acl_users. Способ второй: сделать так:

  sed -s "s/acl_users/acl_sonofbitch/g" <входная_реплика.xml >выходная_реплика.xml

После этого объекты acl_users перестанут быть таковыми, вы можете попробовать импортировать реплику обратно и стереть объекты acl_sonofbitch.

Использование таких подходов рекомендуется только в качестве последнего средства.

Установка и использование дополнительных пакетов

Андрей Орлов

Сервер приложений Zope позволяет устанавливать расширения, дающие пользователям дополнительные возможности, такие как использование внешних баз данных, фильтрация и преобразование запросов, вспомогательные объектные модели для создания сайтов. Ниже описана процедура установки таких расширений и перечислен список расширений, рекомендуемых нами. Все эти расширения проверяются на совместную работу и тестируются на совместимость с текущей версией сервера. Если вы хотите расширить список поддерживаемых нами расширений, то свяжитесь с нами — .

Общее описание установки пакета расширения

Любой пакет расширения может быть установлен либо для использования всеми серверами, либо для использования одним из серверов. В первом случае корневой каталог пакета (т.е. каталог содержащий файл __init__.py) должен быть скопирован в каталог /usr/lib/zope/lib/python/Products, во втором — в каталог /var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>/Products.

В любом случае сервер должен быть перезапущен.

Пакет расширения может быть получен в виде архива tar (в частности, в таком виде пакеты доступны на www.zope.org) или в виде пакетов RPM (в таком виде пакеты лежат в нашем дистрибутиве).

Пакеты RPM — из-за ряда ограничений, присущих как RPM, так и Python, устанавливаются только для всего сервера, для чего нужно дать команду rpm -ivh <ИМЯ ПАКЕТА>. При необходимости можно скопировать файлы продукта из каталога /usr/lib/zope/lib/python/Products в каталог /var/lib/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>/Products. Однако после этого вам необходимо стереть файлы с расширением *.pyc: rm -i *.pyc. По данным ряда источников, использование файлов *.pyc, построенных в другом каталоге, может приводить к сбоям в работе Python.

Есть ещё один вариант пакета расширения — пакеты в форматах zexp (xml), их установка подробно описана в ImportSite.txt.

Каким бы путём вы не устанавливали пакет, как правило, в результате его установки должен появится продукт в списке продуктов запущенного сервера, получить доступ к этому списку можно введя URL http://zope.localdomain:8080/Control_Panel/Products/manage_main и логин и пароль пользователя, имеющего роль «manager».

AqGuard: Защита от неограниченного заимствования

Особенностью, порождаемой концепцией заимствования в сервере приложений Zope, является то, что любой сайт имеет в принципе неограниченное множество допустимых URL. Такие URL могут строится, например, повторением элемента пути любое количество раз. Например, для URL http://zope.locadomain/Search/Forum существует бесконечное множество допустимых URL вида

"http://zope.locadomain/Search/" + "Search/" * n + "Forum"

, где n = [0:+inf]. Это не представляло бы проблемы, если бы не упорство роботов, выполняющих зеркалирование и индексирование сайтов и не ошибки в HTML и самих поисковых роботах: на сайте может появится ссылка на «неподвижную точку», т.е. ссылка вида

"http://zope.locadomain/Search/" + "Search/" * n + "Forum"

, вызывающая получение той же самой страницы, но содержащей ссылку вида:

"http://zope.locadomain/Search/" + "Search/" * (n + 1) + "Forum"

,

Очевидно, робот, перешедший по такой ссылке, попадает в бесконечный цикл, что вызывает проблемы не только у самого робота, но и у сайта: при достижении n величин порядка десятков и сотен такая деятельность робота больше напоминает DoS-атаку. Характерные примеры неподвижных точек — конструкции вида:

<a href="<dtml-var URLPATH0>/<dtml-var "getId()">"> _. </a>;

<a href="<dtml-var "getId()">"> _. </a>

Или более сложные конструкции, использующие теги base и подобные возможности. Ситуацию осложняет то, что не все парсеры HTML обрабатывают относительные ссылки одинаково — причём именно дешёвые парсеры используемые в роботах страдают ошибками в этой области. Из-за этого проблема не может быть решена устранением ошибки в HTML, да и поиск неподвижной точки — достаточно сложная задача.

Продукт AqGuard позволяет решить проблему иначе: запретить использование url-ов в которых идентификатор одного и того же объекта повторяется больше некоторого порогового значения. Если такая ситуация обнаруживается, то AqGuard генерирует исключение AqGuardBlocked или вызывает специальный метод.

Установка и настройка AqGuard включает следующие шаги:

  1. Установить пакет, как описано в начале документа;

  2. Перезапустить защищаемый экземпляр Zope командой # service zope restart <ИМЯ_ЭКЗЕМПЛЯРА>

  3. Войти в менеджерский интерфейс Zope введя URL вида http://zope.localdomain/manage

  4. Войти в контейнер, в который вложены объекты и при отображении которых наблюдается это неприятное явление.

  5. Создать в этом контейнере объект типа AqGuard. Желательно назвать его AqGuard — иначе возможны проблемы в старых версиях Zope.

  6. Войти в объект AqGuard и выбрать вкладку «Настройка».

  7. Подробно настройка AqGuard описана в файле помощи, здесь заметим только возможность указать пороговое количество повторений объектов установкой атрибута max_repeats: с атрибутами по умолчанию AqGuard будет блокировать появление любых имён в пути при обращении к объектам ниже содержащего его контейнера более четырёх раз.

  8. Включить AqGuard установкой флага use_aqguard.

  9. Ввести запрещённый теперь URL, чтобы проверить работоспособность — вы должны увидеть страницу с ошибкой: текст ошибки может быть изменён редактированием или перекрытием DTML-метода :

    standard_error_message 
    

    или явным указанием обработчика ошибок.

Не рекомендуется оставлять в AqGuard настройки по умолчанию — это всегда работает, но далеко от оптимального.

FloodGuard: Защита от флуда

Флуд — малоприятное явление, состоящее в том, что какой-то субъект заходит к вам на сайт, пишет двадцать сообщений в гостевой книге, начинает писать сам себе сообщения в форуме или даже пытается подобрать пароль к чьей-то учётной записи. По нашему опыту, такой субъект скорее всего на ваш сайт не зайдёт, но уж если зайдёт, то вам придётся пережить немало неприятных минут, объясняя высшему руководству вашей компании особенности протокола HTTP, HTML, TCP/IP и выслушивая основные положения КЗОТ.

Продукт FloodGuard даёт, возможно, не лучшее, но обобщённое решение проблемы: предоставляется возможность задать маску повторяющегося события и разрешённую частоту его повторений за указанный период времени с данного IP-адреса. Маска события включает в себя путь к объекту, возможно, заданный как регулярное выражение и ноль или более имён переменных.

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

Установка и настройка

После установки пакета так, как описано в начале документа, вы должны его настроить и активировать, предприняв следующие шаги:

  1. Войти в менеджерский интерфейс Zope введя URL вида

  2. Войти в контейнер, содержащий объекты, в отношении отображений которых может быть предпринят флуд.

  3. Создать объект типа FloodGuard, желательно с именем FloodGuard, иначе в ряде версий Zope возможны ошибки.

  4. Войти в объект FloodGuard и выбрать вкладку «Настройка».

  5. Подробно настройка описана в файле помощи, здесь отметим лишь возможность указать флаг use_referer — если он установлен, то при обращении с опознанной сигнатурой проверяется атрибут HTTP_REFERER запроса, и если он не указывает на тот же самый сайт, что и текущий, то запрос отбрасывается (это останавливает только особенно тупых злонамеренных флудеров, но их доля в общей массе может достигать заметных величин.

  6. Вы должны указать сигнатуру запроса: по умолчанию, указана сигнатура запрещающая интенсивную работу с интерфейсом менеджера.

  7. Установить флаг use_floodguard.

  8. Отдать несколько раз запрос, удовлетворяющий сигнатуре атаки;

  9. После перехода порогового значения должна отобразится страница с ошибкой, текст ошибки может быть изменен редактированием или перекрытием DTML-метода:

    standard_error_message
    

    или явным указанием обработчика ошибок.

Продукт FloodGuard позволяет посмотреть лог обращений с IP-адресами. Если Zope закрыт прокси-сервером, то прокси должен передавать IP-адрес в переменной ip, как это сделано, например, в нашем конфигурационном файле /etc/httpd/conf/zope_proxy.conf: прокси устанавливает переменную ip, если путь в URL заканчивается строчкой :ipset. Для нормальной работы FloodGuard все опознаваемые маски событий должны запрашиваться с такой строчкой и переменная ip должна быть указана в маске события: будьте внимательны в своих настройках!

Другой вариант передачи IP-адреса возможен при использовании HTTP/1.1 proxy (например apache > 1.3.27). Если такой прокси имеет место, вы должны установить флаг use_http11. Подразумевается, что прокси-сервер будет передавать IP-адрес в специальном заголовке.

Какой бы способ передачи IP вы не использовали, продукт будет устанавливать в запросе переменную REMOTE_ADDR в значение, равное этому адресу.

RequestDecoder: Перекодирование запросов и защита от мата ;)

Особенностью пользователей российского Интернета является не только использование шести кодировок, но и то, что из всех доступных броузеров всегда выбирается тот, который обрабатывает их наиболее некорректным образом. При отсутствии ошибок, проблема кодировок полностью решается установкой заголовка charset, к сожалению, жизнь оказывается более суровой и ошибки имеют место. Устав объяснять счастливым обладателям решения от Microsoft причины непристойного поведения их броузера, мы написали этот продукт.

Цель продукта

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

Метод

Частотный анализ признаков.

Достижения

Использование продукта на нескольких коммерческих сайтах продемонстрировало его способность противодействовать ошибкам в реализации работы с кодировками в броузерах некоторых известных компаний.

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

Установка и настройка

После обычной процедуры установки выполните следующие шаги:

  1. Войти в менеджерский управления Zope введя URL вида http://zope.localdomain/manage

  2. Войти в контейнер, содержащий объекты, при обработке запросов к которым запрос должен перекодироваться (например, корневой контейнер).

  3. Создать объект типа RequestDecoder (желательно с именем RequestDecoder, иначе в ряде версий Zope возможны ошибки).

  4. Войти в объект RequestDecoder и выбрать вкладку «Настройка».

  5. Подробно настройка описана в файлах помощи, здесь отметим лишь возможность указать флаг use_censor — если он установлен, то запрос будет проверяться на наличие нецензурных выражений, рекомендуем вам сбросить этот флаг, если вы хотите использовать продукт на реальном сайте: флаг введен как опция, включающая прототип продукта SemanticGuard — любые предложения по ней приветствуются.

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

  7. Если вы хотите, чтобы RequestDecoder был по умолчанию активен, вы должны установить флаг use_decoder.

  8. Если установлен продукт CrayFIX, то в левом фрейме появится кнопка, позволяющая включить или выключить RequestDecoder для текущей сессии.

  9. Вы можете перейти на вкладку «тест» и ввести текст в неверной кодировке, протестировав таким образом перекодировщик. В текущей версии, RequestDecoder обслуживает только кодировки KOI8-R и Windows1251.

SemanticGuard: Семантический фильтр

RequestDecoder содержит модельный прототип продукта SemanticGuard — продукта, проверяющего текст запроса в поиске запрещённых выражений и при их появлении генерирующий прерывание Uncensored. Разработчики обладают необходимыми знаниями в области лингвистических технологий, чтобы довести этот функционал до промышленного уровня, если пользователи найдут его полезным. В текущей версии это просто игрушка, позволяющая запретить ввод матерных выражений на сайте — эксперименты в её использовании крайне приветствуются, если будут отзывы, предложения и пожелания, то, возможно, работы над продуктом будут продолжены.

psycopg

API для работы с базами PostgreSQL из утилит на языке Python. Должен быть установлен для использования любых продуктов Z, ориентированных на использование postgresql. Устанавливается установкой пакета rpm ;)

psycopg-ZPsycopgDA: Коннектор к базе данных postgresql

Коннектор используется для описания подключения экземпляра сервера приложений Zope к серверу баз данных PostgreSQL. Установка требует выполнения пунктов, перечисленных в начале документа.

Несмотря на все достоинства этого продукта, он не содержит явного способа установить кодировку клиента при работе с базой данных PostgreSQL с кодировкой, отличной от кодировки сервера. Лучший способ решения данной проблемы — добавление строчки вида:

export PGCLIENTENCODING=<КОДИРОВКА КЛИЕНТА>

в файл /etc/sysconfig/zope/<ИМЯ ЭКЗЕМПЛЯРА СЕРВЕРА>, подробности такого решения можно узнать в документации на postgresql.

Пожалуйста, не пытайтесь добавлять команду set clientencoding при отправке каждого запроса: мало того, что это методологически неверно, это ещё и приведёт к нерациональному расходу сил и появлению трудно диагностируемых ошибок.

MySQL-python

API для работы с базами MySQL из утилит на языке Python. Должен быть установлен для использования любых продуктов Zope, ориентированных на использование MySQL. Устанавливается установкой пакета RPM.

ZMySQLDA: Коннектор к базе данных mysql

Коннектор используется для описания подключения экземпляра сервера приложений Zope к серверу баз данных MySQL. Установка требует выполнения пунктов, перечисленных в начале документа. Предупреждение: в нашей версии отключена генерация исключения при невозможности откатки транзакции. Дело в том, что это исключение генерируется всегда при ошибочном завершении любой транзакции, заканчивающейся ошибочно по каким-либо причинам, что и не дает возможности ни диагностировать, ни корректно обработать исходную ошибку.

Если вы считаете такой патч пакета неверным — свяжитесь с нами.

mysqlUserFolder: «Папка пользователей», хранимая в mysql

В сервере приложений Zope существует единое API для хранения учётных записей пользователей. Один из вариантов использования этого API — mysqlUserFolder, позволяющий хранить учетные записи в базе данных MySQL. Предлагаемый пакет mysqlUserFolder полностью совместим с оригинальным пакетом, но существенно доработан нами для работы в России. Подробности доработок пакета см. в документации на пакет.

Установка и настройка

После установки пакета необходимо выполнить следующие шаги по его настройке:

  1. Создать базу MySQL под список учётных записей пользователей;

  2. Залить начальную версию базы из файла /usr/lib/zope/lib/python/Products/mysqlUserFolder/sql/create_tables.sql

  3. Войти в менеджерский интерфейс Zope введя URL вида ;

  4. Войти в контейнер, в котором будут действовать учётные записи, хранимые в этой базе;

  5. Создать в этом контейнере объект типа mysqlUserFolder, объекту будет присвоен идентификатор acl_users. При создании объекта нужно указать параметры подключения к базе mysqlUserFolder;

  6. Войти в acl_users и перейти на вкладку «Manage Users»;

  7. Нажать кнопку «Create User» и заполнить поля формы, в поле Role указав Manager.

  8. Перезапустите броузер и обратившись к контейнеру, содержащему этот объект, попробуйте войти в менеджерский интерфейс, введя логин и пароль только что созданного пользователя.

  9. По умолчанию, в базу пользователей добавляются две роли — Manager и Anonymous. Для более тонкой настройки прав вы должны либо добавить дополнительные роли в таблицу Roles через интерфейс командной строки MySQL, либо использовать локальные роли Zope.

Заключение

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