Рашид Ачилов
Используем Bugzilla в качестве ServiceDesk
«Программу хочу, – однажды заявляет вам начальник, – чтобы пользователи нам заявки не по телефону делали, а в ней, чтобы время фиксировалось, чтобы можно было исполнителя назначить, чтобы выполненную работу можно было описать, поиск, отчеты видеть, чтобы разные люди видели разные задачи... Да! И чтоб бесплатная или недорогая!». Даже не задумавшись, вы говорите одно слово: «Bugzilla».
Сделано в Mozilla
Что же это за зверь такой – Bugzilla? В диком виде Bugzilla – система сопровождения исходного кода крупных программных продуктов, как правило, с открытым кодом. Была разработана изначально в Mozilla, в те времена, когда на базе браузера Netscape создавался открытый браузер Mozilla, распавшийся впоследствии на Firefox, Thunderbird, Sunbird... Назначение ее – сбор информации от тестеров и девелоперов о замеченных в работе программы ошибках, а также предоставление этим тестерам и девелоперам информации о том, кто этой ошибкой будет заниматься, каково текущее состояние и т. д.
Bugzilla используется, кроме Mozilla, такими гигантами Open Source, как Samba, OpenOffice.org (там она называется IssueZilla, но сути это не меняет). В ней есть система продуктов и компонентов, позволяющая назначить ответственного за некоторый продукт или компонент, система раздачи прав на задачи (в Bugzilla они называются тикетами), система информирования всех заинтересованных в решении такого-то тикета лиц посредством электронной почты, система отчетов и согласований, мощный и гибкий поиск по базе данных тикетов. Отображение списка ошибок можно в известной степени настроить под нужды конкретного пользователя – задать язык шаблонов (если установлено несколько), изменить формат списка, параметры оповещения...
Сама Bugzilla написана на языке Perl с применением языка шаблонов из пакета p5-Template, что позволяет легко адаптировать ее к конкретным нуждам. Вся информация хранится в базе данных. В качестве сервера базы данных могут выступать MySQL или PostgreSQL. Пользовательский интерфейс существует только один – через браузер.
«Но позвольте, – скажете вы, – одно дело система, рассчитанная на профессионалов, другое дело – на офисный персонал». И будете неправы. Хоть Bugzilla создавалась изначально для программистов, людей квалифицированных, с помощью несложных пассов над конфигурационными файлами и исходными текстами можно превратить ее в более-менее полноценный ServiceDesk.
Здесь сразу следует оговориться, что это будет только «более-менее» полноценный ServiceDesk. В нем не будет ни нарядов на работы, ни учета аппаратной конфигурации. Хотя интеграция с Active Directory будет. Зато бесплатно.
Найди десять отличий
Каким же образом мы можем «скрыть программистское предназначение» Bugzilla и убедить пользователя, что это – просто такой ServiceDesk? Внутренних изменений для этого будет проведено немного, зато будет широко применяться главный принцип животного мира – мимикрия. Чтобы скрыть свое «прошлое», нам необходимо:
- локализовать интерфейс;
- всюду заменить слово «ошибка» на слово «задача»;
- избавиться от непонятных пользователю параметров «ОС» и «Платформа»;
- избавиться от непонятных обозначений типа P1, P2.., а также от обозначений серьезности «critical», «major» и прочее;
- настроить Bugzilla так, чтбы она проверяла учетные записи по Active Directory;
- ну и, конечно, заменить эмблему Bugzilla на корпоративный значок.
Как видите, работы не так уж и много, и в основном она вся сводится к полной локализации системы, а также к удалению ненужных полей и внесению нужных в случае необходимости, а также перестановке этих полей в шаблонах отображения.
Приступаем.
Установка и локализация Bugzilla
Устанавливаем ее из пакета devel/bugzilla. Для работы Bugzilla потребуются MySQL и поистине огромная куча модулей на Perl, которая может быть чуть больше или чуть меньше, в зависимости от опций сборки, которые вы выберете. Обязательно отметьте опцию «WITH_LDAP», для того чтобы иметь возможность подключаться к серверу Active Directory для проверки регистрационных имен и паролей. Понадобится также веб-сервер Apache.
Bugzilla может быть оформлена как виртуальным хостом, так и просто установлена в отдельный каталог. Вот как будет выглядеть описание Bugzilla внутри тегов VirtualHost (домен shelton.net, а также подсетка 192.168.0.0/16 используются только в качестве примера). Не следует относится к этому примеру как к эталону – это просто один из способов, возможно, существуют и лучшие:
<VirtualHost _default_:80>
ServerAdmin webmaster@bugzilla.shelton.net
DocumentRoot /usr/local/www/vhosts/bugzilla
ServerName bugzilla.shelton.net
ServerAlias bugs.shelton.ru
ErrorLog /var/log/httpd/bugzilla/httpd-error
TransferLog /var/log/httpd/bugzilla/access
<Directory /usr/local/www/vhosts/bugzilla/>
# ACL's for site
Order deny,allow
Deny from all
Allow from 192.168.0.0/255.255.0.0
# Displaying options
Options +ExecCGI
AllowOverride Limit
DirectoryIndex index.cgi
AddHandler cgi-script .cgi
</Directory>
AddDefaultCharset utf-8
</VirtualHost>
После установки Bugzilla выполняем скрипт checksetup.pl, который находится в корневом каталоге установки Bugzilla (будем предполагать, что это каталог, как в примере – /usr/local/www/vhosts/bugzilla). Если скрипт обнаружит какую-то неразрешенную зависимость, то необходимо будет установить пакет, который содержит требуемый софт.
Редактируем файл localconfig, находящийся здесь же. Целиком его можно не просматривать (хотя, конечно, можно и просмотреть) – достаточно изменить значения трех параметров:
- db_name – имя базы данных Bugzilla;
- db_user – имя пользователя для подключения к базе;
- db_pass – пароль для подключения к базе.
После этого нужно запустить выбранную СУБД, если она еще не запущена, создать в ней учетную запись указанного пользователя (не забыв установить ему записанный в конфигурационном файле пароль), базу данных с выбранным именем и дать пользователю все права на базу даных.
После этого снова запускаем checksetup.pl. Скрипт подключается к только что созданной базе и создает там необходимую структуру таблиц. Сейчас же нам будет предложено ввести адрес электронной почты (который используется по умолчанию в качестве логина) и пароль администратора Bugzilla. Основная инсталляция готова.
Далее идем на сайт http://www.bugzilla.org/download/#localizations и загружаем комплект русифицированных шаблонов для Bugzilla 3.0. Распаковываем полученный архив в каталог установки Bugzilla. Он не переписывает никаких файлов, хотя нам все равно придется это сделать потом вручную. После распаковки снова запускаем checksetup.pl. Обращаю внимание вот именно на это – локализация Bugzilla должна проводиться до того, как в ней появятся записи о задачах, потому что checksetup.pl, обнаружив локализованный комплект шаблонов, необратимо перестраивает базу Bugzilla, откат к английской версии после этого невозможен.
Что ж, большая часть работы по локализации выполнена. Я не зря сказал «большая часть». На самом деле установленная нами локализация неполная – она не изменяет некоторые элементы интерфейса, параметры задач, тексты в оповещениях, отправляемых по электронной почте. Все это нам предстоит сделать самостоятельно.
Сразу же после локализации можно обнаружить два очень разочаровывающих недостатка:
- В сообщениях электронной почты в поле «Тема» вписывается название задачи. Поскольку вся Bugzilla-ru построена с применением кодировки UTF-8, то и название будет вписано в кодировке UTF-8. Но дело в том, что все наиболее популярные почтовые программы не понимают этой кодировки в поле темы и отображают ее непонятными значками!
- Если используется браузер Konqueror, то можно с удивлением обнаружить, что несмотря на проведенную русификацию русским интерфейс не стал. Bugzilla получает информацию от браузера о поддерживаемых языках и использует локализацию только в том случае, если браузер передает информацию (в Browser-Identication) о том, что он поддерживает русский язык. Если вы используете нерусифицированный KDE, то, чтобы использовать локализацию безусловно, придется переписать файлы из каталога templates/ru в каталог templates/en. Хотя в этом тоже можно найти положительный момент – Konqueror, использующий каталог шаблонов templates/en, можно использовать для тестирования изменений в шаблонах до того, как их перенести в основную часть.
Кроме того, крайне желательно установить какую-нибудь программу визуального управления СУБД MySQL – phpMyAdmin или подобную ему; в данной статье очень часто будут даваться рекомендации сделать что-либо, непосредственно редактируя базу Bugzilla. Разумеется, тем, кто хорошо работает с консолью mysql, ничего такого не понадобится, ну а всем остальным настоятельно рекомендую phpMyAdmin, который и сам использовал для этой цели.
Перед тем, как начать самостоятельно вносить изменения в шаблоны, следует немного разобраться в том, как устроена Bugzilla изнутри.
Настройка Bugzilla
Как я уже говорил, вся Bugzilla написана на языке Perl с использованием пакета p5-Template. Любителей объектно-ориентированного программирования, несомненно, порадует тот факт, что Bugzilla написана исключительно с использованием ООП. Шаблоны, необходимые для формирования страниц, находятся в каталоге template. В зависимости от локализации выбирается подкаталог, соответствующий локализации. Если запрошенный файл не может быть найден, он ищется в каталоге en, так что все каталоги локализаций на самом деле не являются полными копиями каталога en. Непосредственно файлы с Perl-классами находятся в каталоге Bugzilla. Их нам тоже придется править, но не очень сильно, основная часть исправлений придется на шаблоны.
Шаблоны представляют собой текстовые файлы, в которых могут содержаться директивы пакета p5-Template или HTML/CSS/Javascript-код, который транслируется в выходную страницу без изменений.
Не забывайте, что все файлы шаблонов содержат текст на языке, отличном от английского, лишь в кодировке UTF-8, поэтому для их редактирования следует использовать только редактор, поддерживающий такую возможность. Например, я использую Quanta, хоть это и не совсем редактор.
Директив пакета p5-Template достаточно много, для их полного описания смотрите документацию по пакету. Начнем мы с очевидного – замены слова «ошибка» на слово «задача» – ведь в ServiceDesk именно задача является базовым обьектом:
--- /tmp/bugzilla-ru-3.0/template/ru/default/global/variables.none.tmpl Sat Jun 2 08:26:12 2007
+++ global/variables.none.tmpl Fri Jul 13 11:01:00 2007
@@ -44,33 +44,33 @@
#%]
[% terms = {
- "bug" => "ошибка",
- "bug_gen" => "ошибки",
- "bug_dat" => "ошибке",
- "bug_acc" => "ошибку",
- "bug_abl" => "ошибкой",
- "bug_obj" => "ошибке",
- "Bug" => "Ошибка",
- "Bug_gen" => "Ошибки",
- "Bug_dat" => "Ошибке",
- "Bug_acc" => "Ошибку",
- "Bug_abl" => "Ошибкой",
- "Bug_obj" => "Ошибке",
# Стараемся не использовать в Bugzilla-ru
- "abug" => "ошибка",
# Стараемся не использовать в Bugzilla-ru
- "ABug" => "Ошибка",
- "bugs" => "ошибки",
- "bugs_gen" => "ошибок",
- "bugs_dat" => "ошибкам",
- "bugs_acc" => "ошибки",
- "bugs_abl" => "ошибками",
- "bugs_obj" => "ошибках",
- "Bugs" => "Ошибки",
- "Bugs_gen" => "Ошибок",
- "Bugs_dat" => "Ошибкам",
- "Bugs_acc" => "Ошибки",
- "Bugs_abl" => "Ошибками",
- "Bugs_obj" => "Ошибках",
- "zeroSearchResults" => "Ошибок не найдено",
+ "bug" => "задача",
+ "bug_gen" => "задачи",
+ "bug_dat" => "задаче",
+ "bug_acc" => "задачу",
+ "bug_abl" => "задачей",
+ "bug_obj" => "задаче",
+ "Bug" => "Задача",
+ "Bug_gen" => "Задачи",
+ "Bug_dat" => "Задаче",
+ "Bug_acc" => "Задачу",
+ "Bug_abl" => "Задачей",
+ "Bug_obj" => "Задаче",
# Стараемся не использовать в Bugzilla-ru
+ "abug" => "задача",
# Стараемся не использовать в Bugzilla-ru
+ "ABug" => "Bug",
+ "bugs" => "задачи",
+ "bugs_gen" => "задач",
+ "bugs_dat" => "задачам",
+ "bugs_acc" => "задачи",
+ "bugs_abl" => "задачами",
+ "bugs_obj" => "задач",
+ "Bugs" => "Задачи",
+ "Bugs_gen" => "Задач",
+ "Bugs_dat" => "Задачам",
+ "Bugs_acc" => "Задачи",
+ "Bugs_abl" => "Задачами",
+ "Bugs_obj" => "Задач",
+ "zeroSearchResults" => "Задач не найдено",
"Bugzilla" => "Bugzilla"
}
%]
То, что переменная terms.ABug имеет значение «Bug» – не ошибка. Эта переменная используется только при формировании темы сообщения при отправке оповещения по электронной почте. Поскольку тема письма в UTF-8 отображается некорректно, мы изменим шаблон письма таким образом, что в теме будет писаться нейтральная английская фраза «New or changed task» («Новая или изменившаяся задача»).
Да, я знаю, что это выглядит неудобно. Вы можете попробовать разобраться сами, как подправить функционал так, чтобы тема перекодировалась, допустим, в Windows-1251, или подождать, пока это сделают другие и в шаблоне будет нормальная тема. Ну и можно просто смириться и оставить так, как сделано сейчас.
Пока что приходится выбирать между строкой непонятного вида значков и английским текстом:
--- /tmp/bugzilla-ru-3.0/template/ru/default/email/newchangedmail.txt.tmpl Thu May 24 20:59:52 2007
+++ newchangedmail.txt.tmpl Fri Jul 13 11:10:40 2007
@@ -24,7 +24,7 @@
[% PROCESS "global/variables.none.tmpl" %]
From: [% Param('mailfrom') %]
To: [% to %]
-Subject: [[% terms.Bug %] [%+ bugid %]] [% neworchanged %][%+ summary %]
+Subject: [[% terms.ABug %] [%+ bugid %]] [% neworchanged %] new or changed task!
Content-Type: text/plain; charset=utf-8
X-Bugzilla-Reason: [% reasonsheader %]
X-Bugzilla-Type: newchanged
@@ -41,6 +41,7 @@
X-Bugzilla-Changed-Fields: [% changedfields %]
[%+ threadingmarker %]
+[%+ summary %]
[%+ Param('urlbase') %]show_bug.cgi?id=[% bugid %]
[%+ diffs %]
Вместо темы письма мы выносим полное и читаемое наименование задачи в начало текста письма.
Поскольку задача не может быть «исправлена», зато должна быть «завершена», мы вводим такой статус задачи. По-хорошему, конечно, статус должен звучать «нормально завершена» или «успешно завершена», но для интерфейса такое выражение слишком длинное. Статус же «исправлена» исчезает – зачем он нам?
--- /tmp/bugzilla-ru-3.0/template/ru/default/global/field-descs.none.tmpl Tue May 29 07:09:51 2007
+++ global/field-descs.none.tmpl Wed Jun 27 16:21:00 2007
@@ -111,7 +111,7 @@
"VERIFIED" => "Принята",
"CLOSED" => "Закрыта" } %]
-[% resolution_descs = { "FIXED" => "Исправлена",
+[% resolution_descs = { "FIXED" => "Завершена",
"INVALID" => "Аннулирована",
"WONTFIX" => "Отказано",
"DUPLICATE" => "Дублирующая",
Поскольку задачи будут ставиться не только относящиеся к компьютерам, убираем поля «ОС» и «Платформа» и заменяем их полями «Город» и «Подразделение» (в предположении, что наша компания достаточно крупная и имеет отделения различного типа, например, оптовые склады и розничные магазины) в других городах. На самом деле, мы, конечно, ничего не меняем, мы просто переименовываем само поле и заменяем его значения нужными нам (см. раздел 3 с описаниями изменений в базе данных). Кроме того, мы добавляем отображение дополнительного поля cf_addr («Адрес») в том месте, где нам этого хотелось бы (см. рисунок):
--- /tmp/1/template/ru/default/bug/create/create.html.tmpl Thu May 24 01:11:07 2007
+++ default/bug/create/create.html.tmpl Mon Aug 13 11:22:04 2007
@@ -231,7 +232,7 @@
[% sel = { description => 'Серьезность', name => 'bug_severity' } %]
[% INCLUDE select %]
- [% sel = { description => 'Платформа', name => 'rep_platform' } %]
+ [% sel = { description => 'Город', name => 'rep_platform' } %]
[% INCLUDE select %]
</tr>
@@ -245,10 +246,20 @@
</td>
[% END %]
- [% sel = { description => 'ОС', name => 'op_sys' } %]
+ [% sel = { description => 'Подразделение', name => 'op_sys' } %]
[% INCLUDE select %]
</tr>
+ <tr>
+ <td style="background-color: white; color: white">test</td>
+ <td align="right" valign="top" id="addr">
+ [% USE Bugzilla %]
+ [% SET field = Bugzilla.get_fields({ name => "cf_addr" }) %]
+ [% SET value = ${field.name} ?
IF ${field.name}.defined %]
+ [% PROCESS bug/field.html.tmpl editable=1 value_span=2 disabled=0 %]
+ </td>
+ </tr>
+
[% IF Param('usetargetmilestone') && Param('letsubmitterchoosemilestone') %]
<tr>
[% sel = { description => 'Запланировано', name => 'target_milestone' } %]
@@ -394,10 +406,12 @@
[% FOREACH field = Bugzilla.get_fields({ obsolete => 0, custom => 1, enter_bug => 1 }) %]
[% SET value = ${field.name} IF ${field.name}.defined %]
+ [% IF field.name != 'cf_addr' %]
<tr>
[% PROCESS bug/field.html.tmpl editable=1 value_span=2 %]
</tr>
[% END %]
+ [% END %]
<tr>
<td align="right"><strong>Аннотация:</strong></td>
Разберем приведенный патч поподробнее. Этот патч изменяет шаблон, используемый при создании новой задачи. Первая часть (строки 231-232) меняет отображение параметра «Платформа» на «Город». Вторая часть (строки 245-246) меняет отображение параметра «ОС» на «Подразделение» и добавляет отображение дополнительного поля cf_addr непосредственно под полем «Подразделение». Третья часть (строки 394-406) пропускает отображение дополнительного поля cf_addr в том месте, где Bugzilla обычно отображает дополнительные поля.
Внешний вид окна просмотра задачи после настроек
Исправляем описания полей в перечне глобальных переменных:
--- /tmp/1/template/ru/default/global/field-descs.none.tmpl Tue May 29 07:09:51 2007
+++ default/global/field-descs.none.tmpl Wed Aug 8 12:39:04 2007
@@ -36,6 +36,7 @@
"bug_status" => "Состояние",
"changeddate" => "Дата последнего изменения",
"cc" => "Подписчики",
+ "cf_addr" => "Адрес",
"classification" => "Раздел",
"cclist_accessible" => "Список подписчиков?",
"component_id" => "Код компонента",
@@ -50,7 +51,7 @@
"groupset" => "Группы",
"keywords" => "Ключевые слова",
"newcc" => "Подписчики",
- "op_sys" => "ОС",
+ "op_sys" => "Подразделение",
"opendate" => "Дата открытия",
"percentage_complete" => "% выполнения",
"priority" => "Приоритет",
@@ -58,7 +59,7 @@
"product" => "Продукт",
"qa_contact" => "Приемка",
"remaining_time" => "Осталось времени",
- "rep_platform" => "Платформа",
+ "rep_platform" => "Город",
"reporter" => "Инициатор",
"reporter_accessible" => "Инициатор доступен?",
"resolution" => "Решение",
Исправляем описания полей в форме поиска задач:
--- /tmp/1/template/ru/default/search/form.html.tmpl Tue May 29 06:45:55 2007
+++ default/search/form.html.tmpl Wed Aug 8 12:40:17 2007
@@ -406,7 +406,7 @@
<table>
<tr>
<th align="left">
- <label for="rep_platform" accesskey="h"><a href="page.cgi?id=fields.html#rep_platform">Платформа</a></label>:
+ <label for="rep_platform" accesskey="h"><a href="page.cgi?id=fields.html#rep_platform">Город</a></label>:
</th>
</tr>
<tr valign="top">
@@ -419,7 +419,7 @@
<table>
<tr>
<th align="left">
- <label for="op_sys" accesskey="o"><a href="page.cgi?id=fields.html#op_sys">ОС</a></label>:
+ <label for="op_sys" accesskey="o"><a href="page.cgi?id=fields.html#op_sys">Подразделение</a></label>:
</th>
</tr>
<tr valign="top">
Исправляем описания полей в форме одновременного редактирования нескольких задач:
--- /tmp/1/template/ru/default/list/edit-multiple.html.tmpl Tue May 22 00:44:10 2007
+++ default/list/edit-multiple.html.tmpl Tue Aug 7 18:59:53 2007
@@ -93,7 +93,7 @@
<th>
<label for="rep_platform">
- <a href="page.cgi?id=fields.html#rep_platform">Платформа</a>:
+ <a href="page.cgi?id=fields.html#rep_platform">Город</a>:
</label>
</th>
<td>
@@ -116,7 +116,7 @@
<tr>
<th>
<label for="op_sys">
- <a href="page.cgi?id=fields.html#op_sys">ОС</a>:
+ <a href="page.cgi?id=fields.html#op_sys">Тип подразделения</a>:
</label>
</th>
<td [% " colspan=\"3\"" IF !Param("usetargetmilestone") %]>
Исправляем описания полей и параметры отображения для списка задач:
--- /tmp/1/template/ru/default/list/table.html.tmpl Tue May 22 01:03:48 2007
+++ default/list/table.html.tmpl Wed Aug 8 14:57:45 2007
@@ -42,24 +42,24 @@
[% abbrev =
{
- "bug_severity" => { maxlength => 8 } ,
- "priority" => { maxlength => 3 , title => "Прт" } ,
- "rep_platform" => { maxlength => 3 , title => "Плф" } ,
- "bug_status" => { maxlength => 10 } ,
- "assigned_to" => { maxlength => 30 , ellipsis => "..." } ,
+ "bug_severity" => { maxlength => 22 , title => "Серьезн" } ,
+ "priority" => { maxlength => 16 , ellipsis => "...", title => "Приор" } ,
+ "rep_platform" => { maxlength => 25 } ,
+ "bug_status" => { maxlength => 24 } ,
+ "assigned_to" => { maxlength => 30 , ellipsis => "..." , title => "Исполнитель" } ,
"assigned_to_realname" => { maxlength => 20 , ellipsis => "..." } ,
"reporter" => { maxlength => 30 , ellipsis => "..." } ,
"reporter_realname" => { maxlength => 20 , ellipsis => "..." } ,
"qa_contact" => { maxlength => 30 , ellipsis => "..." , title => "Приемка" } ,
"qa_contact_realname" => { maxlength => 20 , ellipsis => "..." , title => "Приемка" } ,
- "resolution" => { maxlength => 8 } ,
+ "resolution" => { maxlength => 40 } ,
"short_desc" => { wrap => 1 } ,
"short_short_desc" => { maxlength => 60 , ellipsis => "..." , wrap => 1 } ,
"status_whiteboard" => { title => "Заметки" , wrap => 1 } ,
- "component" => { maxlength => 8 , title => "Компонент" } ,
- "product" => { maxlength => 8 } ,
+ "component" => { maxlength => 50 , title => "Компонент", wrap => 1 } ,
+ "product" => { maxlength => 40, wrap => 1 } ,
"version" => { maxlength => 5 , title => "Версия" } ,
- "op_sys" => { maxlength => 10 } ,
+ "op_sys" => { maxlength => 16 , title => "Подразд" } ,
"target_milestone" => { title => "Запланировано" } ,
"percentage_complete" => { format_value => "%d %%" } ,
}
На последнем патче я бы хотел опять остановиться более подробно. Этот патч не только изменяет описание столбцов, но и меняет параметры их отображения. Проблемой Bugzilla является то, что некоторые столбцы отображаются не полностью, когда они содержат «не-английский» текст. Происходит это потому что «не-английский» текст записывается в кодировке UTF-8, в которой один символ занимает два байта. Поэтому параметры отображения были значительно изменены – длина отображения (maxlength) взята с учетом удвоения, заголовок (title) в некоторых местах задается вручную, для некоторых полей задается автоматический перенос текста (wrap), для других полей задается генерация между полем и соседними полями пробелов (ellipsis).
Последний патч, который мы применяем – для изменения отображения уже созданной задачи:
--- edit.html.tmpl 2007-06-02 09:15:14.000000000 +0700
+++ /usr/home/shelton/edit.html.tmpl 2007-09-09 22:28:29.000000000 +0700
@@ -218,9 +218,11 @@
[% IF fields %]
[% FOREACH field = fields %]
<tr>
+ [% IF field.name != 'cf_addr' %]
[% PROCESS bug/field.html.tmpl value=bug.${field.name}
editable = bug.check_can_change_field(field.name, 0, 1)
value_span = 2 %]
+ [% END %]
</tr>
[% END %]
[% END %]
@@ -615,23 +617,23 @@
<table cellspacing="1" cellpadding="1">
<tr>
<td align="right">
- <label for="rep_platform" accesskey="h"><b>Платформа</b></label>:
+ <label for="rep_platform" accesskey="h"><b>Город</b></label>:
</td>
[% PROCESS select selname => "rep_platform" %]
</tr>
<tr>
<td align="right">
- <label for="op_sys" accesskey="o"><b>ОС</b></label>:
+ <label for="op_sys" accesskey="o"><b>Подразделение</b></label>:
</td>
[% PROCESS select selname => "op_sys" %]
</tr>
<tr>
- <td align="right">
- <label for="version"><b>Версия</b></label>:
- </td>
- [% PROCESS select selname => "version" %]
+ [% USE Bugzilla %]
+ [% SET field = Bugzilla.get_fields({ name => "cf_addr" }) %]
+ [% SET value = ${field.name} ?
IF ${field.name}.defined %]
+ [% PROCESS bug/field.html.tmpl editable=1 value_span=2 disabled=0 %]
</tr>
<tr>
Здесь первым исправлением мы отключаем отображение поля cf_addr там, где отображаются дополнительные поля, а вторым – меняем описания полей, а также добавляем вывод дополнительного поля cf_addr непосредственно под полем «Подразделение». Что ж, с шаблонами покончено.
Пишите письма
Правок в исходном коде Perl мы будем делать существенно меньше – только в модуле Bugzilla/BugMail.pm, который отвечает за отправку оповещений по почте о новых или изменившихся задачах. Текст письма формируется этим модулем целиком, без использования шаблонов, поэтому исправлять сообщения нам придется тоже непосредственно в модуле. Разумеется, при этом мы теряем совместимость с каким-нибудь «уругвайским» языком, но, мне кажется, это небольшая потеря. Разумеется, если вы стремитесь к чистоте кода, можно насоздавать еще языковых констант – группа поддержки Bugzilla вам только спасибо скажет.
--- /tmp/1/BugMail.pm Wed Feb 28 20:42:22 2007
+++ BugMail.pm Tue Aug 14 19:45:05 2007
@@ -229,11 +229,11 @@
$lastwho = $who;
$fullwho = $whoname ? "$whoname <$who" . Bugzilla->params->{'emailsuffix'} . ">" : "$who" . Bugzilla->params->{'emailsuffix'};
- $diffheader = "\n$fullwho changed:\n\n";
- $diffheader .= FormatTriple("What ", "Removed", "Added");
+ $diffheader = "\n$fullwho внес ?
изменения:\n\n";
+ $diffheader .= FormatTriple("Что ", "Удалено", "Добавлено");
$diffheader .= ('-' x 76) . "\n";
}
- $what =~ s/^(Attachment )?/Attachment #$attachid / if $attachid;
+ $what =~ s/^(Attachment )?/Вложение #$attachid / if $attachid;
if( $fieldname eq 'estimated_time' ||
$fieldname eq 'remaining_time' ) {
$old = format_time_decimal($old);
@@ -298,10 +298,10 @@
$lastbug = $depbug;
my $urlbase = Bugzilla->params->{"urlbase"};
$thisdiff =
- "\nBug $id depends on bug $depbug, which changed state.\n\n" .
- "Bug $depbug Summary: $summary\n" .
+ "\nЗадача $id, зависит от задачи $depbug, которая изменила статус.\n\n" .
+ "Описание задачи $depbug: $summary\n" .
"${urlbase}show_bug.cgi?id=$depbug\n\n";
- $thisdiff .= FormatTriple("What ", "Old Value", "New Value");
+ $thisdiff .= FormatTriple("Что ", "Старое значение", "Новое значение");
$thisdiff .= ('-' x 76) . "\n";
$interestingchange = 0;
}
@@ -703,7 +728,7 @@
my $result = "";
foreach my $comment (@$raw_comments) {
if ($count) {
- $result .= "\n\n--- Comment #$count from ";
+ $result .= "\n\n--- Комментарий #$count от ";
if ($comment->{'name'} eq $comment->{'email'}) {
$result .= $comment->{'email'};
} else {
Наш товарищ – острый нож
Переходим к непосредственному исправлению содержимого базы данных. Это необходимо для завершения локализации, так как некоторые вещи (например, описания системных групп) не могут быть исправлены через интерфейс настройки Bugzilla, а могут быть изменены только внешним редактором базы данных. При этом редактор должен поддерживать редактирование строк в кодировке UTF-8. Программа phpMyAdmin удовлетворяет этим требованиям.
Внимание! Перед началом каких-либо изменений, проводимых непосредственно в базе данных, сделайте ее резервную копию!
Следуйте этому правилу, как минимум до тех пор, пока не разберетесь со структурой базы данных и не сможете исправлять ошибки прямой корректировкой данных в базе.
Итак, устанавливаем phpMyAdmin, настраиваем подключение к базе данных и подключаемся. Какова же внутренняя структура Bugzilla?
База данных Bugzilla состоит из 54 основных таблиц и произвольного количества для хранения дополнительных полей, по одной таблице на каждое поле. Все таблицы, предназначенные для хранения дополнительных полей начинаются с 'cf_'. Наиболее важными для нас таблицами являются:
- bugs – основная таблица базы, описывающая зарегистрированную задачу. Запись по задаче содержит множество полей, из которых вручную чаще всего придется редактировать поля assigned_to (идентификатор пользователя, назначенного исполнителем) и reporter (идентификатор пользователя, инициировавшего задачу).
- bug_severity – таблица, описывающая параметр «Серьезность» задачи.
- fielddefs – таблица, описывающая определения полей задачи – как существовавших изначально, так и добавленных после, по одной записи на поле.
- groups – таблица, описывающая системные и пользовательские группы, по одной записи на группу.
- op_sys – таблица, изначально содержащая параметр «ОС», которую мы приспосабливаем под «Подразделение».
- priority – таблица, содержащая параметр «Приоритет» задачи.
- profiles – таблица, содержащая список пользователей. Именно индексы из этой таблицы вставляются в поля assigned_to и/или reporter таблицы bugs.
- rep_platform – таблица, содержащая изначально параметр «Платформа», которую мы приспосабливаем под «Город».
Начинаем.
В таблице bug_severity изменяем значение поля value – просто переводим его на русский язык. На порядок сортировки это не повлияет – для этого есть поле sortkey.
В таблице groups переводим на русский язык поле description у всех системных групп – ни одну системную группу нельзя отредактировать через интерфейс администратора Bugzilla.
В таблице op_sys в поле value для всех записей заменяем присутствующие там значения на необходимые, лишние записи удаляем, нужные – добавляем. При добавлении записей устанавливаем нужный порядок сортировки при помощи поля sortkey.
В таблице priority переводим на русский язык поле value.
С таблицей rep_platform поступаем точно так же, как с таблицей op_sys – удаляем лишнее, вписываем нужное.
Собственно говоря, все. Хотя в случае каких-либо ошибок не исключено, что придется возвращаться к редактированию базы вручную.
Подключаемся к Active Directory
Разумеется, ценность нашей системы была бы довольно низкой, если бы она не умела получать учетные записи пользователей из Active Directory или другого LDAP-сервера.
Перед тем, как начинать настройку подключения, следует создать некоторого «особо бесправного» пользователя, от имени которого будем выполнять подключение. Сделать это необходимо, поскольку Active Directory не допускает анонимное подключение. Бесправным же он должен быть потому, что его пароль будет записан в конфигурационном файле Bugzilla открытым текстом.
Приступаем к настройке. Необходимо зарегистрироваться в Bugzilla под учетной записью администратора (она уже создана скриптом checksetup.pl) и войти в «Настройки». Я не буду рассматривать здесь все настройки Bugzilla, после локализации они все подробно описаны в комментариях, опишу только те настройки, которые необходимо установить для подключения к LDAP.
В разделе «Аутентификация пользователей»:
- Параметр user_verify_class установить в «DB,LDAP». Этот параметр задает последовательность методов для проверки учетной записи пользователя. Использование метода LDAP имеет ту особенность, что на самом деле информация не проверяется по базе LDAP, а копируется из нее в локальную базу и в дальнейшем проверяется именно по ней. Это может иметь такие, возможно недопустимые для вас сторонние эффекты, как после смены пароля в AD, если пользователь уже хоть раз заходил в Bugzilla, в ней все еще будет храниться старый пароль, изменить который можно только вручную. Все пароли постепенно мигрируют в базу Bugzilla, что нарушает безопасность AD.
- Параметр emailregexp установить в «^[^@]+$». Этот параметр в установке по умолчанию проверяет формат регистрационного имени – оно обязано быть допустимым адресом электронной почты. В корпоративной системе в этом нет необходимости, и мы «переворачиваем» проверку наоборот – имя учетной записи не должно содержать знака @.
- В качестве значения параметра emailregexpdesc задать любое сообщение. Это сообщение будет выдаваться тогда, когда будет выполняться попытка зарегистрировать пользователя с неверной учетной записью.
- В качестве значения параметра emailsuffix задать «@ваш.домен» (например, если ваш домен – shelton.net, то установить в «@shelton.net»). Адрес электронной почты для оповещения пользователя в таком случае будет формироваться простым слиянием строк имени учетной записи и параметра emailsuffix.
В разделе «LDAP»:
- Параметру LDAPserver присвоить значение IP-адреса контроллера домена AD.
- Параметрy LDAPbinddn присвоить в качестве значения строчку формата «username@DOMAIN.NAME:password». Комментарий к параметру игнорировать – он предлагает неверный формат. DOMAIN.NAME – это переведенное в верхний регистр имя домена AD. Username и password – это имя и пароль «особо бесправного» пользователя, созданного для подключения к AD.
- Параметр LDAPBaseDN установить в строчку формата «dc=domain,dc=name», где domain.name – это имя домена AD.
- Параметр LDAPuidattribute установить в значение «sAMAccountName». Внимание! Записать именно так, как показано!
- Параметр LDAPmailattribute стереть – он должен быть пустым.
Теперь на главной странице можно вводить только логин из AD – доменное имя к нему уже приписано. Для пущей красоты можно наложить вот этот патч, который вставит пробел между полем ввода и именем домена:
--- /tmp/1/template/ru/default/account/auth/login-small.html.tmpl Thu May 17 03:48:42 2007
+++ default/account/auth/login-small.html.tmpl Wed Jun 27 15:41:18 2007
@@ -40,7 +40,7 @@
<tr>
<th align="right"><label for="Bugzilla_login">Пользователь:</label></th>
<td><input size="20" id="Bugzilla_login" name="Bugzilla_login">
- [% Param('emailsuffix') FILTER html %]</td>
+ [% Param('emailsuffix') FILTER html %]</td>
</tr>
<tr>
<th align="right"><label for="Bugzilla_password">Пароль:</label></th>
--- /tmp/1/template/ru/default/account/auth/login.html.tmpl Thu May 17 03:48:42 2007
+++ default/account/auth/login.html.tmpl Wed Jun 27 15:41:26 2007
@@ -46,7 +46,7 @@
<th align="right"><label for="Bugzilla_login">Пользователь:</label></th>
<td>
<input size="35" id="Bugzilla_login" name="Bugzilla_login">
- [% Param('emailsuffix') FILTER html %]
+ [% Param('emailsuffix') FILTER html %]
</td>
</tr>
<tr>
Как проверить, что подключение к LDAP работает? Достаточно попробовать зарегистрироваться в Bugzilla с учетной записью из домена – если регистрация прошла успешно – значит подключение есть.
Корпоративный стиль
Ну и последний штришок, который мы наложим на нашу систему – это замена логотипа Bugzilla на первой странице на корпоративную эмблему.
В каталог skins/standard/index мы помещаем файл с изображением корпоративной эмблемы (в нашем случае ask_big.png) и исправляем файл skins/standard/index.css следующим образом:
div#page-index .intro
{
width: 250px;
height: 200px;
margin-top: 2.3em;
margin-right: 2.3em;
float: right;
background: transparent no-repeat url(index/ask_big.png);
}
Нерешенные проблемы
На момент написания статьи еще не были решены следующие проблемы:
- Формирование темы письма. Как упоминалось выше, тема формируется в кодировке UTF-8. Задача состоит в том, чтобы добавить код, который перед формированием темы перекодирует ее из UTF-8, например в Windows-1251. Для того чтобы вообще не иметь проблем с заголовками, их надо кодировать в 7-битный формат.
- При формировании письма о новой задаче длинные значения полей описания задачи и прочих могут «ломаться» – произвольно переноситься на следующую строку.
- Не выделяются критические задачи. Задача, которой присваивается приоритет «критическая» или «блокирующая», должна отмечаться в списке красным и жирным красным соответственно. Делается это с помощью CSS, но при этом имя стиля соответствует тексту приоритета. Не знаю, может, для английского текста это и было изящным решением, но для «неанглийского» выглядит довольно глупо.
Заключение
Bugzilla в качестве ServiceDesk – это жизнеспособное решение для компаний, которые не предъявляют к нему чрезмерно больших требований, хотят сэкономить деньги на покупке платной версии или отказаться от Windows. В ней реализована большая часть того, что требуется от службы ServiceDesk, а того, чего в ней не хватает (учет аппаратной конфигурации, наряды на работу), зачастую на том уровне, где эксплуатируется Bugzilla, и не требуется.
Приложение
Дополнительные поля в Bugzilla
Bugzilla имеет возможность расширять структуру базы данных за счет добавления дополнительных полей и соответствующего списка значений. Эти дополнительные поля выводятся по одному друг под другом в том месте, где определено разработчиками, хотя, конечно, можно это поменять.