[devel] pam0-config-1.4.3-alt1

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Сен 23 02:58:35 MSD 2007


On Sun, Sep 23, 2007 at 02:35:41AM +0400, Alexey Tourbin wrote:
> >  pam0-config-1.4.3-alt1	Provides	pam0(other)
> > -pam0-config-1.4.3-alt1	Provides	pam0(system-auth)
> >  pam0-config-1.4.3-alt1	Provides	pam0(system-auth-ldap)
> >  pam0-config-1.4.3-alt1	Provides	pam0(system-auth-local)
> > -pam0-config-1.4.3-alt1	Provides	pam0(system-auth-use_first_pass)
> >  pam0-config-1.4.3-alt1	Provides	pam0(system-auth-use_first_pass-ldap)
> 
> Изменение зависимостей у меня не воспроизводится. :(

Я всё понял!  Да, у этого пакета слишком специфическим образом
формируются зависимости.

Requires: %([ -x "%SOURCE1" ] && RPM_LIB=%_lib RPM_LIBDIR=%_libdir PAM_SO_SUFFIX= PAM_NAME_SUFFIX=0 RPM_BUILD_ROOT=%buildroot %SOURCE1 %SOURC
Provides: %([ -x "%SOURCE1" ] && PAM_SO_SUFFIX= PAM_NAME_SUFFIX=0 RPM_BUILD_ROOT=%buildroot %SOURCE1 %SOURCE0 prov || echo unknown)

Скрипт %SOURCE1 который pam-config-deps.sh вызывает
/usr/lib/rpm/pam.{req,prov} с ОТНОСТИТЕЛЬНЫМИ путями:
    19  for f in */*; do
    20          /usr/lib/rpm/pam."$t" "$f"

Во всех стандартных /usr/lib/rpm/* скриптах, если они используют
стандарнтую процедуру обработки аргументов ArgvFileAtion, происходит
более или менее принудительная каноникализация ОТНОСИТЕЛЬНЫХ путей.

/usr/lib/rpm/pam.req:
    20  . /usr/lib/rpm/functions
    21  [ $# -eq 1 ] && [ -n "$1" -a -z "${1##/*}" ] ||
    22          { ArgvFileAction "$0" "$@"; exit; }

Это просто некоторый "хак", который я добавил в pam.req, чтобы
сразу же не переписывать pam.req целиком (со временем он перепишется).
Суть здесь в другом.  Принудительная каноникализация относительных путей
на самом деле происходит в ArgvFileAction из /usr/lib/rpm/functions.

Так вот, раньше эта каноникализация была слишком навязчивой.
Каноникализировался в том числе и последний компонент пути.

Теперь остается только заметить, что убравшиеся зависимости являются
симлинками

zsh$ ls -l pam-config/*(@)
lrwxrwxrwx 1 at at 17 Sep 23 02:00 pam-config/system-auth -> system-auth-local
lrwxrwxrwx 1 at at 32 Sep 23 02:00 pam-config/system-auth-use_first_pass -> system-auth-use_first_pass-local
zsh$

Полная каноникализация абсолютного пути приводила к тому, что вместо
system-auth на самом деле повторно обрабатывался system-auth-local и т.д.

Потом в ArgvFileAction я сделал каноникализацию относительных путей
МЕНЕЕ НАВЯЗЧИВОЙ, то есть по сути в ряде случаев более предпочтительной.
Для этого была реализована довольно простая и даже в некотором смысле
сомнительная функция CanonPath.  Но, как оказалось, она удачно решает
целый ряд довольно тонких проблем сразу в нескольких местах.


commit 5a5bd821337d620c8dae75617d5351bdc2061853
Author: Alexey Tourbin <at на altlinux>
Date:   Mon Aug 27 20:41:02 2007 +0400

    scripts/functions: CanonPath: new function (canonicalize each path component except for the last)
    
    This is actually a DWIM-style hack.  It does what we want but I cannot
    think of a better name.  The idea is that sometimes we want to clean
    up path name, possibly following symbolic links, except for the last
    component, which we want to keep as is.
    
    $ sh -c '. scripts/functions; CanonPath /etc/init.d/functions'
    /etc/rc.d/init.d/functions
    $ sh -c '. scripts/functions; CanonPath /usr/bin/../bin/perl'
    /usr/bin/perl
    $
    
    So actually it does a few different things: 1) prepend $PWD if needed;
    2) cleanup dirname; 3) canonicalize dirname with respect to symbolic links.
    
    Now the question is how to process symbolic links which
    targets are directories, e.g. /etc/init.d ?  My answer is that
    both "/etc/init.d" and "/etc/init.d/", as well as "/etc/init.d/."
    should yield the same result, which is "/etc/rc.d/init.d".

diff --git a/scripts/functions b/scripts/functions
index ef43b7b..e55e30a 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -99,6 +99,23 @@ RunMethods()
 	done
 }
 
+CanonPath()
+{
+	local f="$1" f2; shift
+	if [ -d "$f" ]; then
+		f2=$(readlink -vm -- "$f")
+	elif [ -L "$f" ]; then
+		local d
+		d=$(dirname -- "$f")
+		d=$(readlink -vm -- "$d")
+		f2="$d/${f##*/}"
+	else
+		f2=$(readlink -vm -- "$f")
+	fi
+	[ "$f" = "$f2" ] || Verbose "CanonPath: $f -> $f2"
+	echo "$f2"
+}
+
 ArgvFileAction()
 {
 	local av_action="$1"; shift
@@ -126,14 +143,14 @@ ArgvFileAction()
 	local av_f
 	if [ $# -gt 0 ]; then
 		for av_f; do
-			[ -n "$av_f" -a -z "${av_f##/*}" ] || av_f=$(readlink -vm -- "$av_f")
+			[ -n "$av_f" -a -z "${av_f##/*}" ] || av_f=$(CanonPath "$av_f")
 			Debug "processing $av_f"
 			"$av_action" "$av_f"
 		done
 	else
 		[ -t 0 ] && Info "reading file list from standard input"
 		while IFS= read -r av_f; do
-			[ -n "$av_f" -a -z "${av_f##/*}" ] || av_f=$(readlink -vm -- "$av_f")
+			[ -n "$av_f" -a -z "${av_f##/*}" ] || av_f=$(CanonPath "$av_f")
 			Debug "processing $av_f"
 			"$av_action" "$av_f"
 		done

----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20070923/de1b0654/attachment-0002.bin>


Подробная информация о списке рассылки Devel