<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>18616</bug_id>
          
          <creation_ts>2009-01-23 13:14:06 +0300</creation_ts>
          <short_desc>В chroot-окружение не копируются все нужные библиотеки</short_desc>
          <delta_ts>2015-08-02 16:42:52 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>openldap</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>ASSIGNED</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>blocker</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="serpiph">serpiph</reporter>
          <assigned_to name="Anton V. Boyarshinov">boyarsh</assigned_to>
          <cc>boyarsh</cc>
    
    <cc>dottedmag</cc>
    
    <cc>erthad</cc>
    
    <cc>imz</cc>
    
    <cc>klark</cc>
    
    <cc>ldv</cc>
    
    <cc>shaba</cc>
    
    <cc>shadrinov</cc>
    
    <cc>slev</cc>
    
    <cc>vitty</cc>
    
    <cc>viy</cc>
    
    <cc>vvk</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>84802</commentid>
    <comment_count>0</comment_count>
    <who name="serpiph">serpiph</who>
    <bug_when>2009-01-23 13:14:06 +0300</bug_when>
    <thetext>При запуске slapd в окружение программы (посредством файла /etc/chroot.d/ldap.lib) не копируется библиотека libmysqlclient.so.15, которая требуется для работы библиотеки libsql.so из пакета sasl2. Ошибка скрытая, так как если в окружении уже лежит хоть какая-то версия библиотеки libmysqlclient.so.15, то slapd запускается без особых проблем, зато хорошо проявляется после установки системы с нуля или при обновлении с достаточно старой версии openldap и sasl2, что может сделать невозможным вход в систему, работу служб, демонов, если они пользуются услугами slapd.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84811</commentid>
    <comment_count>1</comment_count>
    <who name="Eugene Ostapets">eostapets</who>
    <bug_when>2009-01-23 14:29:35 +0300</bug_when>
    <thetext>Поправлю... Хотя с системой чрутизации не все так так хорошо, должна быть внешняя ручка для sasl2, где в зависимости от пользовательских настроек будет формироваться список рабочих методов, а на основании этого уже будет выполнять копирование библиотек в чрут.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84817</commentid>
    <comment_count>2</comment_count>
    <who name="Dmitry Lebkov">dlebkov</who>
    <bug_when>2009-01-23 14:57:57 +0300</bug_when>
    <thetext>Интересно, а где-нить существуют реализаций генерации chroot&apos;а &quot;на лету&quot;?
Или генераторы скрипта для генерации chroot&apos;а, в зависимости от имеющегося окружения... :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84818</commentid>
    <comment_count>3</comment_count>
    <who name="Eugene Ostapets">eostapets</who>
    <bug_when>2009-01-23 15:24:45 +0300</bug_when>
    <thetext>Для простого чрута можно и самому написать и в скрипты FreeBSD посмотреть, а вот с sasl и другими подобными неявными зависимостями - проблема, ибо список требуемого для каждой конкретной инсталяции будет заметно отличаться, а если тянуть в чрут всё - лучше вообще от чрута отказаться, как поступили мантейнеры postgreSQL</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84819</commentid>
    <comment_count>4</comment_count>
    <who name="Mikhail Gusarov">dottedmag</who>
    <bug_when>2009-01-23 15:34:57 +0300</bug_when>
    <thetext>(В ответ на комментарий №2)
&gt; Интересно, а где-нить существуют реализаций генерации chroot&apos;а &quot;на лету&quot;?

hasher :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84821</commentid>
    <comment_count>5</comment_count>
    <who name="Eugene Ostapets">eostapets</who>
    <bug_when>2009-01-23 15:37:06 +0300</bug_when>
    <thetext>(В ответ на комментарий №4)
&gt; (В ответ на комментарий №2)
&gt; &gt; Интересно, а где-нить существуют реализаций генерации chroot&apos;а &quot;на лету&quot;?
&gt; 
&gt; hasher :)

Но в случае этой баги - он не помощник :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84830</commentid>
    <comment_count>6</comment_count>
    <who name="Dmitry Lebkov">dlebkov</who>
    <bug_when>2009-01-23 16:56:33 +0300</bug_when>
    <thetext>(В ответ на комментарий №3)
&gt; а если тянуть в чрут всё - лучше вообще от чрута отказаться, как поступили
&gt; мантейнеры postgreSQL

Похоже, к этому всё и идёт. Да и на грабли вида &quot;две разные версии libdb в chroot&apos;е&quot; я уже один раз наступал :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>85104</commentid>
    <comment_count>7</comment_count>
    <who name="serpiph">serpiph</who>
    <bug_when>2009-01-27 17:02:03 +0300</bug_when>
    <thetext>Хм, есть предложение, правда, довольно громоздкое:
1) в каждый пакет с библиотеками выкладывать исполняемый файл /etc/chroot.d/libs/&lt;имя библиотеки&gt;, который проверяет, вызывается ли он повторно или нет. Если в первый раз, то копирует свои библиотеки в нужный каталог chroot и вызывает скрипты из /etc/chroot.d/libs для своих прямых зависимостей, после выполнения выставляет глобальный флаг, что выполнялся (чтобы избежать зацикливания).
2) для формирования chroot-окружения достаточно вызвать команды для копирования библиотек по прямым зависимостям, те скрипты вызовут выполнение дальше. Получится что-то вроде #include в gcc. Прямо хоть пиши такие скрипты в виде header&apos;ов, превращай их скрипты через gcc -E и выполняй (ну или что-то в этом роде). Тогда все зависимости соберутся.

Пример: в создании chroot-серевера slapd (/etc/chroot.d/ldap.lib) вызвать:

Copy_Libs ldap &lt;chroot-каталог&gt;

По этой команде запустится скрипт /etc/chroot.d/libs/ldap, в котором скопируются собственно библиотеки ldap в нужное место chroot-каталога и будет команда
Copy_libs sasl2 &lt;chroot-каталог&gt;

Эта команда вызовет /etc/chroot.d/libs/sasl2, которая скопирует файлы sasl2 и выполнит команду

Copy_Libs mysqlclient &lt;chroot-каталог&gt;

Тогда если изменятся требования sasl2 или то-то ещё далее, то не потребуется пересборка и поиск зависимостей для slapd, так как sasl2 сам знает, что ему нужно. А если изменится структура, то пересборка slapd всё равно потребуется.
Большой минус в том, что мантейнеры библиотек, используемых в формировании chroot, должны будут отслеживать файлы /etc/chroot.d/libs/&lt;имя библиотеки&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>85744</commentid>
    <comment_count>8</comment_count>
    <who name="serpiph">serpiph</who>
    <bug_when>2009-02-11 14:48:09 +0300</bug_when>
    <thetext>Теперь обнаружил, что ещё и libpq.so.5 не оказывается в окружении slapd. Опять же по причине libsql.so из libsasl2. С теми же симптомами.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>90061</commentid>
    <comment_count>9</comment_count>
    <who name="Dmitry Lebkov">dlebkov</who>
    <bug_when>2009-04-24 18:27:03 +0400</bug_when>
    <thetext>На основе патчей от Raorn&apos;а (см. #19716) родились вот такие &quot;костыли&quot; для копирования библиотек внутрь openldap-chroot&apos;а:

-------
# copy libs, required by SLAPD
slapd_lib_list=`ldd /usr/sbin/slapd | grep -vE &apos;ld-linux|^/&apos; | awk &apos;{print $3}&apos; | sort -u `
for libfile in $slapd_lib_list ; do
    libdir=&quot;${libfile%/*}&quot;
    CopyLibs $force -l$libfile -d &quot;.$libdir&quot;

    dep2_libs=`ldd $libfile | grep -vE &apos;ld-linux|^/&apos; | awk &apos;{print $3}&apos;`
    dep2_total=&quot;$dep2_total $dep2_libs&quot;
done

dep2_list=`echo $dep2_total | sed &apos;s| |\n|g&apos; | sort -u`
#second level of dependencies
for f in $dep2_list ; do
    CopyLibs $force -l$libfile -d &quot;.$libdir&quot;
done
-------

То же самое проделывается для всех модулей OpenLDAP (backend и overlays) и библиотек и модулей SALS2. В первом приближении, всё работает так, как задумывалось: chroot формируется на основе существующего окружения в хост-системе, а не на основе статического списка библиотек (см. существующий
/etc/chroot.d/openldap.lib).

Использование CopyLibs без ключа -l не устраивает, т.к. копирется не всё и не в нужные каталоги. Возможно кто-то, лучше владеющий shell-програмированием, сможет реализовать идею в виде дополнения к CopyLibs из /etc/chroot.d/functions или в виде отдельной функции.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103211</commentid>
    <comment_count>10</comment_count>
    <who name="barabashka">barabashka</who>
    <bug_when>2009-11-16 18:12:19 +0300</bug_when>
    <thetext>(In reply to comment #9)
&gt; На основе патчей от Raorn&apos;а (см. #19716) родились вот такие &quot;костыли&quot; для
&gt; копирования библиотек внутрь openldap-chroot&apos;а:
&gt; 
&gt; -------
&gt; # copy libs, required by SLAPD
&gt; slapd_lib_list=`ldd /usr/sbin/slapd | grep -vE &apos;ld-linux|^/&apos; | awk &apos;{print $3}&apos;
&gt; | sort -u `
&gt; for libfile in $slapd_lib_list ; do
&gt;     libdir=&quot;${libfile%/*}&quot;
&gt;     CopyLibs $force -l$libfile -d &quot;.$libdir&quot;
&gt; 
&gt;     dep2_libs=`ldd $libfile | grep -vE &apos;ld-linux|^/&apos; | awk &apos;{print $3}&apos;`
&gt;     dep2_total=&quot;$dep2_total $dep2_libs&quot;
&gt; done
&gt; 
&gt; dep2_list=`echo $dep2_total | sed &apos;s| |\n|g&apos; | sort -u`
&gt; #second level of dependencies
&gt; for f in $dep2_list ; do
&gt;     CopyLibs $force -l$libfile -d &quot;.$libdir&quot;
&gt; done
&gt; -------
&gt; 
&gt; То же самое проделывается для всех модулей OpenLDAP (backend и overlays) и
&gt; библиотек и модулей SALS2. В первом приближении, всё работает так, как
&gt; задумывалось: chroot формируется на основе существующего окружения в
&gt; хост-системе, а не на основе статического списка библиотек (см. существующий
&gt; /etc/chroot.d/openldap.lib).
&gt; 
&gt; Использование CopyLibs без ключа -l не устраивает, т.к. копирется не всё и не в
&gt; нужные каталоги. Возможно кто-то, лучше владеющий shell-програмированием,
&gt; сможет реализовать идею в виде дополнения к CopyLibs из /etc/chroot.d/functions
&gt; или в виде отдельной функции.

#!/bin/bash -efu

_list=

slapd=&apos;/usr/sbin/slapd&apos;
slapd_conf=&apos;/etc/openldap/slapd.conf&apos;


create_list()
{
        ldd &quot;$@&quot; 2&gt;/dev/null |sed -r -ne &apos;s/^.+=&gt;[[:blank:]]([^[:blank:]]+)[[:blank:]].+/\1/gp&apos;|tr &apos; &apos; &apos;\n&apos;|sort -u
}

create_modules_list()
{
modulepath=`sed -r -ne &apos;s|^modulepath[[:blank:]]+(.+)$|\1|p&apos; $slapd_conf`
moduleload=`sed -r -ne &quot;s|^moduleload[[:blank:]]+(.+).la$|$modulepath/\1.so|pg&quot; $slapd_conf`

echo &quot;$moduleload&quot;

}

_list=$(create_list $slapd)

while :
do
flag=0
        for i in $(create_list &quot;$_list&quot;) $(create_modules_list)
        do

                echo  &quot;$_list&quot; | tr &apos; &apos; &apos;\n&apos; | grep -q &quot;^$i$&quot; ||
                { flag=1 ; _list=&quot;$_list $i&quot; ; }
        done

[ $flag -eq 0 ] &amp;&amp; { echo &quot;$_list&quot; | tr &apos; &apos; &apos;\n&apos; ; exit 0 ; }

done

Возвращает список всех библиотек, необходимы slapd и подключенным модулям. Это шаблон, улучшать есть чего. )</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103240</commentid>
    <comment_count>11</comment_count>
    <who name="barabashka">barabashka</who>
    <bug_when>2009-11-17 11:28:06 +0300</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; На основе патчей от Raorn&apos;а (см. #19716) родились вот такие &quot;костыли&quot; для
&gt; &gt; копирования библиотек внутрь openldap-chroot&apos;а:
&gt; &gt; 


_list=
slapd=&apos;/usr/sbin/slapd&apos;
slapd_conf=&apos;/etc/openldap/slapd.conf&apos;

_tr()
{
        tr &apos; &apos; &apos;\n&apos;
}

create_list()
{
        ldd $@ 2&gt;/dev/null |sed -r -ne &apos;s/^.+=&gt;[[:blank:]]([^[:blank:]]+)[[:blank:]].+/\1/gp&apos;|_tr|sort -u
}

create_modules_list()
{
modulepath=`sed -r -ne &apos;s|^modulepath[[:blank:]]+(.+)$|\1|p&apos; $slapd_conf`
moduleload=`sed -r -ne &quot;s|^moduleload[[:blank:]]+(.+).la$|$modulepath/\1.so|pg&quot; $slapd_conf`

echo $moduleload | _tr

}

_list=$(create_list $slapd)

while :
do
flag=0
        for i in $(create_list &quot;$_list&quot; ; create_modules_list)
        do

                echo  &quot;$_list&quot; | _tr | grep -q &quot;^$i$&quot; ||
                { flag=1 ; _list=&quot;$_list $i&quot; ; }
        done

[ $flag -eq 0 ] &amp;&amp; { echo &quot;$_list&quot; | _tr  ; exit 0 ; }

done</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>152305</commentid>
    <comment_count>12</comment_count>
      <attachid>6330</attachid>
    <who name="Dmitriy Shadrinov">shadrinov</who>
    <bug_when>2015-08-02 16:42:19 +0300</bug_when>
    <thetext>Created attachment 6330
Предлагаю внести следующие изменения в скрипт формирующий chroot</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>152306</commentid>
    <comment_count>13</comment_count>
    <who name="Dmitriy Shadrinov">shadrinov</who>
    <bug_when>2015-08-02 16:42:52 +0300</bug_when>
    <thetext>Довольно старая тема, но...
На данный момент chroot-скрипты пытаются копировать библиотеки из каталога sasl2, в то время как на данный момент необходимые библиотеки лежат в sasl2-3,
А так же переменная chrooted_slib определяется в function...
Предлагаю внести изменения (патч прилагаю)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>6330</attachid>
            <date>2015-08-02 16:42:19 +0300</date>
            <delta_ts>2015-08-02 16:42:19 +0300</delta_ts>
            <desc>Предлагаю внести следующие изменения в скрипт формирующий chroot</desc>
            <filename>ldap.lib.diff</filename>
            <type>text/plain</type>
            <size>783</size>
            <attacher name="Dmitriy Shadrinov">shadrinov</attacher>
            
              <data encoding="base64">LS0tIGxkYXAubGliLm9yaWcJMjAxNS0wNi0wMSAxMzo0MDoyMy4wMDAwMDAwMDAgKzAzMDAKKysr
IGxkYXAubGliCTIwMTUtMDgtMDIgMTY6NDM6MjYuMzk3NjgzOTQ0ICswMzAwCkBAIC0xLDcgKzEs
NSBAQAogIyEvYmluL3NoIC1lCiAKLWNocm9vdGVkX3NsaWI9bGliCi0KICMgU291cmNlIGZ1bmN0
aW9ucyBsaWJyYXJ5CiAuIC9ldGMvY2hyb290LmQvZnVuY3Rpb25zCiAKQEAgLTIwLDE1ICsxOCwx
NSBAQAogCiAjIGNvcHkgU0FTTDIgcGx1Z2lucwogQ29weUxpYnMgJHZlcmJvc2UgJGZvcmNlIFwK
LQktbC91c3IvJHtjaHJvb3RlZF9zbGlifS9zYXNsMi9saWIqLnNvIFwKLQktZCB1c3IvbGliL3Nh
c2wyCisJLWwvdXNyLyR7Y2hyb290ZWRfc2xpYn0vc2FzbDItMy9saWIqLnNvIFwKKwktZCB1c3Iv
bGliL3Nhc2wyLTMKIAogIyBjb3B5IE9wZW5MREFQIHBsdWdpbnMKIENvcHlMaWJzICR2ZXJib3Nl
ICRmb3JjZSBcCiAJLWwvdXNyL2xpYi9vcGVubGRhcC8qIFwKIAktZCB1c3IvbGliL29wZW5sZGFw
CiAKLWxkZCAvdXNyLyR7Y2hyb290ZWRfc2xpYn0vc2FzbDIvbGliKi5zbyAvdXNyL2xpYi9vcGVu
bGRhcC8qIDI+L2Rldi9udWxsIHwKK2xkZCAvdXNyLyR7Y2hyb290ZWRfc2xpYn0vc2FzbDItMy9s
aWIqLnNvIC91c3IvbGliL29wZW5sZGFwLyogMj4vZGV2L251bGwgfAogc2VkIC1uZSAncy9eW1s6
c3BhY2U6XV1cK1woW15bOnNwYWNlOl1dXCsgPT4gXClcP1woW15bOnNwYWNlOl1dXCtcKSAoMHhc
KFswLTlhLWZdXCtcKSkkL1wyL3AnIHwKIHNvcnQgLXUgPi5saWJzCiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>