Система Orphus

понедельник, 17 августа 2009 г.

GLPI: Переносим на винду (из Linux)

Вот стряслось... Пришлось свой хелпдеск перекинуть на виндовый 2003 сервак :(
Все оказалось не так гладко, как я думал...

А проблема была в том, что в никсах, как правило, используется кодировка utf-8 (у меня именно так), а в винде cp1251. Вроде бы, какое это имеет значение? Да вот дело в том, что база тоже в кодировке uft-8. Ну и что? А то, что файлы, которые прикрепляют к заявкам, хранятся не в базе на на диске, а "ссылки" на эти файлы в базе. А так как кодировки разные, то GLPI не может найти файлы на диске, если в имени файла содержатся символы с кодом больше 128 или, проще говоря, символы кириллицы.

Решений в голове назрело 2:
1. Перекодировать БД в cp1251
2. Подправить PHP-код, чтобы перед отдачей файла исправлялась кодировка, т.е. перекодировывать из утф в сипи

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

Для второго способа у меня вышло аж 2 решения, начну с более простого, которое мне подсказал Hubbitus.
1. Чтобы GLPI отдавал файлы с русскими именами нужно отредактировать файл %GLPI_DIR%\front\document.send.php. А именно, надо найти строки
if ($send&&file_exists(GLPI_DOC_DIR."/".$_GET["file"]))
sendFile(GLPI_DOC_DIR."/".$_GET["file"],$splitter[1]);
которые в самом низу файла и заменить их на
if ($send&&file_exists(GLPI_DOC_DIR."/".iconv('UTF-8', 'CP1251', $_GET["file"])))
sendFile(GLPI_DOC_DIR."/".iconv('UTF-8', 'CP1251', $_GET["file"]),$splitter[1]);
Тут функция iconv тупо перекодировывает все, что ей скармливают из utf-8 в cp1251.

2. Второй способ более универсален, т.к. сам определяет кодировку строки и перекодировывает ее в cp1251. И так, нам нужно отправиться в гости к Юрию Попову и забрать у него php-библиотечку a.charset.php (на этой же страничке вы и узнаете все про нее и скачаете) и положить ее в папку %GLPI_DIR%\inc\. Теперь в файле %GLPI_DIR%\front\document.send.php в самом начале, после первого инклюда (у меня это строка 40) нужно добавить:
include (GLPI_ROOT . "/inc/a.charset.php");
А в конце этого файла нужно сделать тоже самое, что в первом варианте, только те строки заменить на:
if ($send&&file_exists(GLPI_DOC_DIR."/".charset_x_win($_GET["file"])))
sendFile(GLPI_DOC_DIR."/".charset_x_win($_GET["file"]),$splitter[1]);
Все :) Теперь GLPI без проблем отдает файлы с русскими именами.



Осталось только одно НО... :(
К сожалению, я пока не нашел, как добиться, чтобы GLPI принимал файлы с русскими именами.
Как только найду, обязательно сразу напишу след. пост.




ЗЫЖ Сменил версию GLPI на 0.72.1, поэтому заново пришлось править скрипты, чтобы добавить свои статусы для заявок, о чем я писал в посте "GLPI: Добавляем свои статусы для заявок". Поэтому прикрепил к этому посту архив, в который положил исправленные скрипты, а так же файлы document.send.php и a.charset.php.





Информация с сайта http://angel2s2.blogspot.com/. Если Вы читаете информацию на другом сайте, пожалуйста свяжитесь с автором сайта http://angel2s2.blogspot.com/.

Похожие статьи

4 коммент.:

Анонимный комментирует... четверг, 20 августа 2009 г., 12:27:00 GMT+3

1 вопрос, а нафига перекидывать-то на win2003? если все под линухом работает?
-=AmoN=-

Angel 2S2 комментирует... четверг, 20 августа 2009 г., 12:31:00 GMT+3

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

SGG комментирует... среда, 21 октября 2009 г., 13:14:00 GMT+3

спасибо! пригодится. особенно, учитывая, что на винде сидим

Angel 2S2 комментирует... среда, 21 октября 2009 г., 13:19:00 GMT+3

Всегда пожалуйста :)

Отправить комментарий