Сборка ProFTPD 1.3 из исходников с модулем iconv для переконвертации налету из CP1251 в UTF-8 и обратно и с фиксацией проблемы буквы Я
При очередном обновлении корпоративного сервера ввиду ряда других требований поставил RHEL 4 up5, не имеющий в своем арсенале поддержки локали CP1251. Сервер представлял собой samba-файлохранилище для виндовых клиентов местной сети. Уделенные клиенты ходили на сервер через модемную стойку и получали тот же массив файлов, но по ftp. С сервером Samba проблем не возникло, так как он изначально умеет хранить файлы в одной кодировке, а отдавать клиенту в другой. Вопрос решается добавлением в smb.conf нескольких строчек:
unix charset = utf8 display = WINDOWS-1251 client codepage = 866 character set = cp1251 |
Перечитываем файл конфигурации:
Вопрос с самбой решен. Теперь необходимо научить ProFTPD конфертировать на лету имена файлов из utf8 в win1251 и обратно, а так же поправить давно уже известную проблему отображения русской буквы "я" в нижнем регистре в именах файлов. Приступим.
1. Скачиваем исходник proftpd-1.3.0a-3.fc7.src.rpm. Я воспользовался следующей ссылкой:
http://www.rpmfind.net/linux/rpm2html/search.php?query=proftpd+src
2. Скачиваем патч iconv для proftpd. Быстро найти такой патч для proftpd-1.3 не удалось, поэтому чтобы не тратить времени скачал proftpd-1.2.10-iconv.patch.gz по ссылке:
http://home.h01.itscom.net/para/software/misc/proftpd-iconv/index-e.html
3. Устанавливаем src-пакет proftpd
#rpm –ivh proftpd-1.3.0a-3.fc7.src.rpm
4. Переходим в умолчательный каталог src-пакетов вашей ОС
#cd /usr/src/redhat/SOURCES
Распаковываем из /usr/src/redhat/SOURCES/proftpd-1.3.0a.tar.bz2 каталог proftpd-1.3.0a во временную директорию, например /tmp/proftpd/proftpd-1.3.0a
Так как патч предназначен для proftpd-1.2.10, переименовываем :
#mv /tmp/proftpd/proftpd-1.3.0a /tmp/proftpd/proftpd-1.2.10
5. Кладем в эту же директорию /tmp/proftpd/ патч:
#cp proftpd-1.2.10-iconv.patch.gz /tmp/proftpd/ переходим в наш временный каталог и патчим командой
#cd /tmp/proftpd/
#gzip -cd proftpd-1.2.10-iconv.patch.gz |patch -p0
patching file proftpd-1.2.10/modules/mod_codeconv.c
patching file proftpd-1.2.10/modules/mod_df.c
patching file proftpd-1.2.10/modules/mod_ls.c
patching file proftpd-1.2.10/src/netio.c
# |
Результатом выполнения является распаковка в подкаталог proftpd-1.2.10 3-х модулей и обновление файла netio.c . Переименовываем обратно пропатченный каталог:
#mv /tmp/proftpd/proftpd-1.2.10 /tmp/proftpd/proftpd-1.3.0a
6. Для решения проблемы буквы «Я» то есть в целях правильного отображения файлов с русскими именами в кодировке 1251 надо сделать следующее:
- открываем файл /tmp/proftpd/proftpd-1.3.0a/src/netio.c - ищем там следующий кусок кода (или похожий на него): switch (mode) { case IAC: switch (cp) { case WILL: case WONT: case DO: case DONT: mode = cp; continue; case IAC: mode = 0; break; default: /* Ignore */ mode = 0; continue; } break; case WILL: case WONT: pr_netio_printf(out_nstrm, "%c%c%c", IAC, DONT, cp); mode = 0; continue; case DO: case DONT: pr_netio_printf(out_nstrm, "%c%c%c", IAC, WONT, cp); mode = 0; continue; default: if (cp == IAC) { mode = cp; continue; } break; } |
и вырезаем его целиком, начиная от команды switch и до завершающей фигурной скобки.
7. Пропатченный каталог /tmp/proftpd/proftpd-1.3.0a упаковываем командой
#tar –cjf proftpd-1.3.0a.tar.bz2 proftpd-1.3.0a
8. Заменяем изначальный исходник полученный при установке пакета proftpd-1.3.0a-3.fc7.src.rpm на пропатченный
#cp proftpd-1.3.0a.tar.bz2 /usr/src/redhat/SOURCES/proftpd-1.3.0a.tar.bz2
9. Редактируем /usr/src/asplinux/SPECS/proftpd.spec добавляя mod_codeconv и mod_df в раздел %configure \ : --with-modules=mod_codeconv:mod_df \

10. Производим сборку нового пакета:
#rpmbuild –ba –with mod_codeconv proftpd.spec
В моем случае потребовалось удовлетворить неудовлетворенные зависимости сборки c дистрибутивных дисков №3 и №4:
#rpm -ivh libacl-devel
#rpm -ivh libattr-devel
#rpm -ivh mysql-devel
#rpm -ivh postgresql-devel
После этого сборка пакета прошла успешно.
11. Устанавливаем собранный дистрибутив
#rpm –ivh /usr/src/redhat/RPMS/i386/proftpd-1.3.0a-3.i386.rpm -o
12. При установке пакета обновляется файл /etc/ftpusers с перечнем пользователей, которым запрещен доступ по ftp и в него автоматом вносятся пользователи с минимальными UID (500-505) такие как guest, websdm. Необходимо отредактировать этот файл, удалив имена соответствующих пользователей.
13. С пакетом proftpd-1.3.0a-3.i386.rpm не устанавливается скрипт /etc/init.d/proftpd . Взял этот скрипт из комплекта proftpd-1.2.10-3.i386.rpm
14. Редактируем /etc/proftpd.conf в соответствии со следующими рекомендациями и в соответсвии с нашей локалью, либо просто комментируем эти параметры если перекодировка не требуется:
CharsetLocal UTF-8
CharsetRemote CP1251
Для того чтобы узнать, какие кодировки поддерживает установленный в системе iconv, выполняем в консоли #iconv –l
15. Перезагружаем сервис proftpd:
#service proftpd restart
16. Готово! Важно: Если при старте proftpd Вы получили "Failed" проверьте в /etc/proftpd.conf параметр ServerName. Имя сервера, указанное в этой строке, должно быть описано в /etc/hosts.
|