Поиск по сайту

Температура за бортом

Войти в Гараж



Сборка 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


Перечитываем файл конфигурации:

 
#service smb reload


Вопрос  с самбой решен.

Теперь необходимо научить 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 \

alt


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.



    Обновлено 06.02.2017 20:18
     
    Rambler's Top100
     
    www.garage.zabkray.net , Powered by HardWorm Chita 2010 - 2024