Patch and recompile source rpm
от JustNick
Както обикновено когато е последен работен ден изникват странни проблеми. Днес попаднах на интересен client/server side bug, който се наложи да оправям. Оказа се, че в PureFTPd има проблем засягащ timestamp на файлове. При upload на файл timestamp-а локално и този на сървъра се различават с по няколко часа, в зависимост от часовата зона, като за нашата часовете са 2. Това е когато се използва preserve timestamp опцията от страна на клиента, и е доста неудобно при синхронизация на файлове. За щастие проблема се оказа елементарен за решаване – описано е как да стане тук. Аз обаче нямах време да чакам bugfix от upstream-a и взех нещата в свои ръце. Реших да прекомпилирам source rpm и по-надолу ще опиша как точно може да се направи това.
- Като за начало имаме нужда от rpm-build, така че ако го няма, се налага да го инсталираме :
yum -y install rpm-build
- Намираме и инсталираме src rpm-а. В моя случай той е ето тук.
rpm -ivh pure-ftpd-1.0.21-15.el5.src.rpm
- Отиваме в specs директорията:
cd /usr/src/redhat/SPECS/
- Където подготвяме source за компилиране, като го разархивираме и apply-ваме вече дефинираните patch-ове
rpmbuild -bp pure-ftpd.spec
#Възможно е да има проблеми със зависимости, като естествено трябва да инсталираме посочените пакети, ако има такава необходимост
- Отиваме в /usr/src/redhat/BUILD където би трябвало да има директория от рода pure-ftpd-1.0.21. Правиме й backup, който ще ползваме при генериране на patch-a в последствие.
cd /usr/src/redhat/BUILD cp -r pure-ftpd-1.0.21 pure-ftpd-1.0.21.orig
Промяната, която трябва да направим е да заменим "mktime()" с "timegm()" във файла ftpd.c. И така с любимия файлов редактор vim, правим нужната промяна във файла /usr/src/redhat/BUILD/pure-ftpd-1.0.21/src/ftpd.c
- Генерираме patch-a
diff -Naur pure-ftpd-1.0.21.orig/src/ftpd.c pure-ftpd-1.0.21/src/ftpd.c > ../SOURCES/pure-ftpd-1.0.21-utime.patch
като той трябва да съдържа нещо от рода:
1 2 3 4 5 6 7 8 9 10 11 | --- pure-ftpd-1.0.21.orig/src/ftpd.c 2009-04-30 13:39:37.000000000 +0300 +++ pure-ftpd-1.0.21/src/ftpd.c 2009-04-30 13:40:55.000000000 +0300 @@ -2541,7 +2541,7 @@ tm.tm_mon--; tm.tm_year -= 1900; if (tm.tm_mon < 0 || tm.tm_year <= 0 || - (ts = mktime(&tm)) == (time_t) -1) { + (ts = timegm(&tm)) == (time_t) -1) { addreply_noformat(501, MSG_TIMESTAMP_FAILURE); return; } |
- Редактираме spec файла /usr/src/redhat/SPECS/pure-ftpd.spec като правим следните промени
Release: 15%{?dist}
на
Release: 15%{?dist}.1
- Добавяме ред, в който описваме направения patch
Patch3: pure-ftpd-1.0.21-utime.patch
- в %prep секцията, добавяме следния ред, след другите patch-ове
%patch3 -p1 -b .utime
- в %changelog секцията описваме направената промяна
1 2 | * Thu Apr 30 2009 package maintainer <mail> - 1.0.21-15.1 - patch pure-ftpd "SITE UTIME" bugmail> |
- остава да прекомпилираме пакета
rpmbuild -ba pure-ftpd.spec
- Ако всичко мине гладко, готовият RPM трябва да се намира в /usr/src/redhat/RPMS/$arch/ и можем да пристъпим към update/инсталация на готовия пакет.
Още информация:
http://docs.fedoraproject.org/drafts/rpm-guide-en/ch-rpmbuild.html
http://linux.die.net/man/8/rpmbuild
Допълнение:
Настройка на winscp за Daylight saving time (DST) - http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time