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

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

    <bug>
          <bug_id>49683</bug_id>
          
          <creation_ts>2024-03-13 14:14:29 +0300</creation_ts>
          <short_desc>Значение PATH в hasher-окружении ведёт к неожиданностям на merged-usr</short_desc>
          <delta_ts>2024-04-23 03:42:34 +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>cross-component</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>major</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>46738</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Arseny Maslennikov">arseny</reporter>
          <assigned_to name="Dmitry V. Levin">ldv</assigned_to>
          <cc>aen</cc>
    
    <cc>glebfm</cc>
    
    <cc>obirvalger</cc>
    
    <cc>rider</cc>
    
    <cc>sin</cc>
    
    <cc>vt</cc>
          
          <qa_contact name="Dmitry V. Levin">ldv</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>242951</commentid>
    <comment_count>0</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-03-13 14:14:29 +0300</bug_when>
    <thetext>При сборке некоторых пакетов в merged-usr-окружении можно наблюдать следующий эффект:

  [builder@localhost ~]$ echo $PATH
  /usr/src/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/games

Это ломает, например, вычисление полных путей к установленным интерпретаторам и другим программам:
  [builder@localhost ~]$ strace --trace=execve env python3
  execve(&quot;/bin/env&quot;, [&quot;env&quot;, &quot;python3&quot;], 0x7fffd7ec4730 /* 21 vars */) = 0
  execve(&quot;/usr/src/bin/python3&quot;, [&quot;python3&quot;], 0x7ffd74c17480 /* 21 vars */) = -1 ENOENT (No such file or directory)
  execve(&quot;/bin/python3&quot;, [&quot;python3&quot;], 0x7ffd74c17480 /* 21 vars */) = 0
  Python 3.12.2 (main, Feb 29 2024, 18:26:55) [GCC 13.2.1 20240128 (ALT Sisyphus 13.2.1-alt3)] on linux
  Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
  &gt;&gt;&gt; exit()
  +++ exited with 0 +++

Первым нашёлся /bin/python3, а не /usr/bin/python3.

При пересборке пакета samba (вчера я случайно догадался попробовать его собрать в merged-usr окружении. не зря!) это ведёт вот к чему:

  Checking for &apos;gcc&apos; (C compiler)          : /bin/gcc 
  Checking for program &apos;git&apos;               : /bin/git 
  Checking for program &apos;pkg-config&apos;        : /bin/pkg-config 
  Checking for program &apos;perl&apos;              : /bin/perl 
  Checking for program &apos;perl&apos;              : /bin/perl 
  Checking for program &apos;xsltproc&apos;          : /bin/xsltproc 
  Checking for program &apos;python3&apos;           : /bin/python3 
  Checking for program &apos;python&apos;            : /bin/python3 
  Checking for program &apos;python3&apos;           : /bin/python3 
  python-config                            : /bin/python3-config 
  Checking for program &apos;xsltproc&apos;          : /bin/xsltproc 
  Checking for program &apos;flex&apos;              : /bin/flex 
  Checking for program &apos;bison&apos;             : /bin/bison 
  Checking for program &apos;krb5-config&apos;       : /bin/krb5-config 
  Checking for program &apos;gpgme-config&apos;      : /bin/gpgme-config 
  Checking for program &apos;yapp&apos;              : /bin/yapp 
  Checking for program &apos;awk&apos;               : /bin/awk 
  Checking for program &apos;cups-config&apos;       : /bin/cups-config 
  Checking for program &apos;ncurses6-config&apos;   : /bin/ncurses6-config 
  Checking for program &apos;asn1Parser&apos;        : /bin/asn1Parser

Сборочный код переписывает hashbang у скриптов с #!/usr/bin/env python3 на #!/bin/python3 (!), и подпакеты с ними в итоге не проходят unmet check:

    x86_64: NEW unmet dependencies detected:
   samba-dc-client#4.19.5-alt1:sisyphus+342175.6300.10.1@1710231076  /bin/python3
   samba-gpupdate#4.19.5-alt1:sisyphus+342175.6300.10.1@1710231076   /bin/python3
    i586: NEW unmet dependencies detected:
   samba-dc-client#4.19.5-alt1:sisyphus+342175.6300.10.1@1710231216  /bin/python3
   samba-gpupdate#4.19.5-alt1:sisyphus+342175.6300.10.1@1710231216   /bin/python3
    aarch64: NEW unmet dependencies detected:
   samba-dc-client#4.19.5-alt1:sisyphus+342175.6300.10.1@1710232968  /bin/python3
   samba-gpupdate#4.19.5-alt1:sisyphus+342175.6300.10.1@1710232968   /bin/python3
    ppc64le: NEW unmet dependencies detected:
   samba-dc-client#4.19.5-alt1:sisyphus+342175.6300.10.1@1710232984  /bin/python3
   samba-gpupdate#4.19.5-alt1:sisyphus+342175.6300.10.1@1710232984   /bin/python3

Нас это ждёт, когда в сизифе окажется filesystem &gt;= 3.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242952</commentid>
    <comment_count>1</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-03-13 14:21:45 +0300</bug_when>
    <thetext>Отсюда вижу два возможных пути:
— принять удар и исправлять все результировавшие FTBFS после;
— попробовать конкретно в hasher выбросить из PATH каталог /bin (и — для rooter — /sbin), что можно сделать кодом в .host/entry или аддоном для /etc/profile.d в специальном пакете для сборочной среды.

Второй путь приведёт к тому, что execvp(&quot;awk&quot;, *) будет открывать /usr/bin/awk. На сегодняшний день непонятно, помешает ли это чему-нибудь (вдруг всплывёт тот же симптом, но наоборот: будут unmet Requires: /usr/bin/awk?).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242953</commentid>
    <comment_count>2</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-03-13 14:30:53 +0300</bug_when>
    <thetext>(In reply to Arseny Maslennikov from comment #1)
&gt; — попробовать конкретно в hasher выбросить из PATH каталог /bin (и — для
&gt; rooter — /sbin), что можно сделать кодом в .host/entry или аддоном для
&gt; /etc/profile.d в специальном пакете для сборочной среды.

Если это делать в hasher, то что-то вроде:
  if [ ! -L /bin ]; then
      # Sync this with the default /etc/profile shipped with ALT.
      PATH=&apos;/usr/bin:/usr/local/bin&apos;
  fi

/etc/profile к такому готов.
Или, может, не каталог проверять, а &quot;если стоит пакет filesystem и его версия &gt;= 3&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242954</commentid>
    <comment_count>3</comment_count>
    <who name="Anton Farygin">rider</who>
    <bug_when>2024-03-13 14:32:09 +0300</bug_when>
    <thetext>а почему бы сразу не поправить и /etc/profile ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242955</commentid>
    <comment_count>4</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2024-03-13 14:36:25 +0300</bug_when>
    <thetext>(In reply to Arseny Maslennikov from comment #2)
&gt; Если это делать в hasher, то что-то вроде:
&gt;   if [ ! -L /bin ]; then
&gt;       # Sync this with the default /etc/profile shipped with ALT.
&gt;       PATH=&apos;/usr/bin:/usr/local/bin&apos;
&gt;   fi

Если нужно поменять PATH, то почему это изменение должно быть ограничено средой hasher?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242957</commentid>
    <comment_count>5</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2024-03-13 14:38:03 +0300</bug_when>
    <thetext>Можно ли поменять /etc/profile синхронно с filesystem?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242958</commentid>
    <comment_count>6</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-03-13 14:40:04 +0300</bug_when>
    <thetext>(In reply to Dmitry V. Levin from comment #5)
&gt; Можно ли поменять /etc/profile синхронно с filesystem?

Можно, конечно. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242960</commentid>
    <comment_count>7</comment_count>
    <who name="Gleb F-Malinovskiy">glebfm</who>
    <bug_when>2024-03-13 14:40:47 +0300</bug_when>
    <thetext>(In reply to Dmitry V. Levin from comment #5)
&gt; Можно ли поменять /etc/profile синхронно с filesystem?

Мне кажется, что если мы проверяем на симлинки, то можно поменять до filesystem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242961</commentid>
    <comment_count>8</comment_count>
    <who name="Anton Farygin">rider</who>
    <bug_when>2024-03-13 14:43:03 +0300</bug_when>
    <thetext>Тоже хотел предложить поменять /etc/profile прямо сейчас.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242962</commentid>
    <comment_count>9</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-03-13 14:44:15 +0300</bug_when>
    <thetext>(In reply to Anton Farygin from comment #3)
&gt; а почему бы сразу не поправить и /etc/profile?

Я допускаю, что кому-то или чему-то такой ход может помешать. Но примеров привести не могу и сам надеюсь, что их нет.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242963</commentid>
    <comment_count>10</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-03-13 14:48:03 +0300</bug_when>
    <thetext>(In reply to Arseny Maslennikov from comment #9)
&gt; (In reply to Anton Farygin from comment #3)
&gt; &gt; а почему бы сразу не поправить и /etc/profile?
&gt; 
&gt; Я допускаю, что кому-то или чему-то такой ход может помешать. Но примеров
&gt; привести не могу и сам надеюсь, что их нет.

Более всего в этом контексте меня беспокоит генератор зависимостей. Обычно PATH используется так, что _неважно_, в каком порядке там два алиасящих друг друга пути, потому что там всего лишь проходит поиск программы, и в этих каталогах, очевидно, они будут одни и те же.

Но вот ситуация в comment 0 показывает, что чему-то не всё равно, и у нас вылезают unmets.

Подозреваю, что самый надёжный способ исключить этот класс проблем — это вообще не с PATH возиться, а все зависимости на исполнимые программы привести к виду executable(/bin/awk) вместо как /bin/awk, так и /usr/bin/awk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242964</commentid>
    <comment_count>11</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-03-13 14:51:23 +0300</bug_when>
    <thetext>(In reply to Arseny Maslennikov from comment #10)
&gt; Подозреваю, что самый надёжный способ исключить этот класс проблем — это
&gt; вообще не с PATH возиться, а все зависимости на исполнимые программы
&gt; привести к виду executable(/bin/awk) вместо как /bin/awk, так и /usr/bin/awk.

Или реально пройтись по всем пакетам, которые Provides: /bin/что-то, и повесить провайд на /usr/bin/что-то. Зависимости не исчезают, а появляются, поэтому можно в разных транзакциях.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244138</commentid>
    <comment_count>12</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-04-04 18:59:34 +0300</bug_when>
    <thetext>(In reply to Arseny Maslennikov from comment #9)
&gt; (In reply to Anton Farygin from comment #3)
&gt; &gt; а почему бы сразу не поправить и /etc/profile?
&gt; 
&gt; Я допускаю, что кому-то или чему-то такой ход может помешать. Но примеров
&gt; привести не могу и сам надеюсь, что их нет.

По итогам тестовых пересборок получается, что, если в hasher-окружении просто поменять записи в PATH в /etc/profile местами, это сломает гораздо меньше пакетов, чем если этого не делать. Сходу я увидел только, что зависимости на /lib/lsb/init-functions заменяются на /usr/lib/lsb/init-functions, но это начнёт мешать только при попытке пересобрать или обновить пакет =&gt; можно решать проблемы по мере их возникновения.

Впрочем, мониторить зависимостей при помощи тестовых пересборок очень трудно, потому что в конце лога успешной пересборки выводится дифф с пакетом в репозитории, а не с чем-то ещё. Полезнее было бы сравнивать с результатом пересборки в сизифе. Когда есть два диффа A-&gt;B и A-&gt;C, то при наличии объекта A можно получить дифф B-&gt;C (интересующий), но этого A нет или я не знаю, где он. Наверное, надо в будущем как-то упростить эту задачу.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244139</commentid>
    <comment_count>13</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-04-04 18:59:56 +0300</bug_when>
    <thetext>
Нижеследующий факт гораздо интереснее.
Значение PATH из /etc/profile не имеет эффекта в hasher-окружении, потому что в /etc/profile написано вот так:

  [ -n &quot;$PATH&quot; ] || PATH=&quot;/usr/bin:/bin:/usr/local/bin&quot;

Если PATH уже назначена во что-то, это значение будет сохранено.
До этого этапа hasher-priv ставит значение PATH, разное для rooter и builder:
https://git.altlinux.org/gears/h/hasher-priv.git?p=hasher-priv.git;a=blob;f=hasher-priv/chrootuid.c;h=45053d743d9f798bfdf5f337bd895b6c9ea9d029;hb=9f3e5ecebc2a218953cff58c71f3bc07534c58bd#l270-285

Выглядит это так:
  % hsh-run -- /bin/sh -c &apos;echo $PATH&apos;
  /bin:/usr/bin:/usr/X11R6/bin
  % hsh-shell &lt;&lt;&lt;&apos;echo $PATH&apos;
  echo $PATH
  [builder@localhost .in]$ echo $PATH
  /usr/src/bin:/usr/bin:/bin:/usr/games
  [builder@localhost .in]$ 
  logout
В первом случае остаётся значение от hasher-priv (/etc/profile даже не задействуется), во втором случае используется /etc/profile, в начале которого явно задано &quot;PATH=/usr/bin:/bin&quot;. Более того, скорее всего, для процессов от rooter используется значение из пакета rootfiles, файл вообще не profile, а bashrc:
https://git.altlinux.org/gears/r/rootfiles.git?p=rootfiles.git;a=blob;f=rootfiles/.bashrc;h=385d4978963bc1830c63123e80c1ebe8f5d11c42;hb=3e1b5ad151b6c53e1ad563659eb7df6a1428ba7d
и перебивает всю аккуратную логику, описанную выше.

Если задуматься, то это глубоко неправильно хотя бы потому, что один и тот же hasher-priv используется для сборки в окружении разных наших репозиториев.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244140</commentid>
    <comment_count>14</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-04-04 19:04:08 +0300</bug_when>
    <thetext>(In reply to Arseny Maslennikov from comment #13)
&gt; Более того, скорее всего, для
&gt; процессов от rooter используется значение из пакета rootfiles, файл вообще
&gt; не profile, а bashrc:
&gt; https://git.altlinux.org/gears/r/rootfiles.git?p=rootfiles.git;a=blob;
&gt; f=rootfiles/.bashrc;h=385d4978963bc1830c63123e80c1ebe8f5d11c42;
&gt; hb=3e1b5ad151b6c53e1ad563659eb7df6a1428ba7d
&gt; и перебивает всю аккуратную логику, описанную выше.

Это если hsh-shell --rooter запустить. В окружении под hsh-run /etc/profile всегда игнорируется, PATH всегда получается от hasher-priv.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244142</commentid>
    <comment_count>15</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-04-04 19:26:56 +0300</bug_when>
    <thetext>(In reply to Arseny Maslennikov from comment #13)
&gt; Нижеследующий факт гораздо интереснее.
&gt; Значение PATH из /etc/profile не имеет эффекта в hasher-окружении, потому
&gt; что в /etc/profile написано вот так:
&gt; 
&gt;   [ -n &quot;$PATH&quot; ] || PATH=&quot;/usr/bin:/bin:/usr/local/bin&quot;

Видимо, эту проверку на [ -n ] надо будет убрать, если она больше ни для чего не нужна.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>245178</commentid>
    <comment_count>16</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2024-04-23 03:42:34 +0300</bug_when>
    <thetext>https://packages.altlinux.org/tasks/344893/
https://packages.altlinux.org/tasks/345302/</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>