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

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

    <bug>
          <bug_id>49404</bug_id>
          
          <creation_ts>2024-02-13 18:05:48 +0300</creation_ts>
          <short_desc>netcmdplus не работает с Samba &gt;= 4.19</short_desc>
          <delta_ts>2024-02-23 06:11:47 +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>netcmdplus</component>
          <version>unstable</version>
          <rep_platform>x86_64</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>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Evgeny Shesteperov">alimektor</reporter>
          <assigned_to name="Evgeny Sinelnikov">sin</assigned_to>
          <cc>amakeenk</cc>
    
    <cc>arzdez</cc>
    
    <cc>greh</cc>
    
    <cc>liannnix</cc>
    
    <cc>liannnix</cc>
    
    <cc>manowar</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>241601</commentid>
    <comment_count>0</comment_count>
    <who name="Evgeny Shesteperov">alimektor</who>
    <bug_when>2024-02-13 18:05:48 +0300</bug_when>
    <thetext>Версия

-   netcmdplus-0.1.2-alt2
-   samba-4.19.4-alt1

Шаги воспроизведения

Развернуть Samba домен, на сервере установить пакет netcmdplus, открыть
web интерфейс альтератора (https://&lt;IP&gt;:8080).

Открыть вкладку Пользователи, нажать Выбор источника, выбрать Samba
ActiveDirectory и выбрать имя домена

Выполнить команду на сервере:

    # samba-tool-plus domain info 127.0.0.1 -d 4

Ожидаемый результат:

В списке Samba ActiveDirectory присутствует созданный домен.

Команда возвращает информацию о домене.

Фактический результат:

В списке Samba ActiveDirectory отсутствует созданный домен (список
пуст).

Команда возвращает ошибку:

    /usr/lib/python3/site-packages/netcmdplus/samdb.py:58: SyntaxWarning: &quot;is not&quot; with &apos;str&apos; literal. Did you mean &quot;!=&quot;?
      if useusernameascn is None and displayname is not &quot;&quot;:
    /usr/lib/python3/site-packages/netcmdplus/samdb.py:66: SyntaxWarning: &quot;is not&quot; with &apos;str&apos; literal. Did you mean &quot;!=&quot;?
      if val is not None and val is not &quot;&quot;:
    /usr/lib/python3/site-packages/netcmdplus/samdb.py:86: SyntaxWarning: &quot;is not&quot; with &apos;str&apos; literal. Did you mean &quot;!=&quot;?
      if displayname is not &quot;&quot;:
    /usr/lib/python3/site-packages/netcmdplus/samdb.py:185: SyntaxWarning: &quot;is not&quot; with &apos;str&apos; literal. Did you mean &quot;!=&quot;?
      if val is not None and val is not &quot;&quot;:
    ERROR(&lt;class &apos;AttributeError&apos;&gt;): uncaught exception - &apos;cmd_sambatoolplus&apos; object has no attribute &apos;command_name&apos;
      File &quot;/usr/bin/samba-tool-plus&quot;, line 45, in &lt;module&gt;
        retval = cmd._run(&quot;samba-tool-plus&quot;, subcommand, *args)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File &quot;/usr/lib64/python3/site-packages/samba/netcmd/__init__.py&quot;, line 369, in _run
        f&quot;{self.command_name} &lt;subcommand&gt; (-h|--help)\n&quot;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241610</commentid>
    <comment_count>1</comment_count>
    <who name="Evgeny Sinelnikov">sin</who>
    <bug_when>2024-02-14 00:23:53 +0300</bug_when>
    <thetext>Странно, ошибка имеется, но у выглядит иначе:

# samba-tool-plus domain info 127.0.0.1 -d 4
ERROR(&lt;class &apos;AttributeError&apos;&gt;): uncaught exception - &apos;cmd_sambatoolplus&apos; object has no attribute &apos;command_name&apos;
  File &quot;/usr/bin/samba-tool-plus&quot;, line 45, in &lt;module&gt;
    retval = cmd._run(&quot;samba-tool-plus&quot;, subcommand, *args)
  File &quot;/usr/lib64/samba-dc/python3.9/samba/netcmd/__init__.py&quot;, line 369, in _run
    f&quot;{self.command_name} &lt;subcommand&gt; (-h|--help)\n&quot;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241743</commentid>
    <comment_count>2</comment_count>
    <who name="Alexander Makeenkov">amakeenk</who>
    <bug_when>2024-02-16 18:40:42 +0300</bug_when>
    <thetext>(Ответ для Evgeny Sinelnikov на комментарий #1)
&gt; Странно, ошибка имеется, но у выглядит иначе

В p10 и в сизифе вывод немного отличается из-за разных версий python.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241756</commentid>
    <comment_count>3</comment_count>
    <who name="Evgeny Sinelnikov">sin</who>
    <bug_when>2024-02-17 17:58:23 +0300</bug_when>
    <thetext>Нужно определиться c тем, зачем мы этот пакет вообще тащим?
Кто и для каких задач его использует?

Оно так написано, by design, что его нужно постоянно подпинывать и сопровождать. Если больше никто не готов это делать и я должен взяться за этот пакет, то возникает вопрос: &quot;А зачем мы этот пакет, вообще, создали?&quot;

Предположу, что это было актуально, как обертка для alterator-net-domain. Но это очень слабая история. Функциональность этого модуля минимальна, поэтому нужно решить:
* Для каких практических задач сейчас используется netcmdplus?
* Какие существенные, функциональные возможности предоставляет этот пакет?
* Какими инструментами мы планируем замещать этот функционал в будущем?
* Кто его готов дорабатывать и сопровождать сегодня?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241764</commentid>
    <comment_count>4</comment_count>
    <who name="Evgeny Sinelnikov">sin</who>
    <bug_when>2024-02-18 03:57:22 +0300</bug_when>
    <thetext>В новой samba появился обобщённый класс:

diff --git a/source4/scripting/bin/samba-tool b/source4/scripting/bin/samba-tool
index f8a70a6b295..b02ad4d0ef7 100755
--- a/source4/scripting/bin/samba-tool
+++ b/source4/scripting/bin/samba-tool
@@ -30,21 +30,7 @@ sys.path.insert(0, &quot;bin/python&quot;)
 import signal
 signal.signal(signal.SIGINT, signal.SIG_DFL)
 
-from samba.netcmd.main import cmd_sambatool
-cmd = cmd_sambatool()
-subcommand = None
-args = ()
+from samba.netcmd.main import samba_tool
 
-if len(sys.argv) &gt; 1:
-    subcommand = sys.argv[1]
-    if len(sys.argv) &gt; 2:
-        args = sys.argv[2:]
-
-try:
-    retval = cmd._run(&quot;samba-tool&quot;, subcommand, *args)
-except SystemExit as e:
-    retval = e.code
-except Exception as e:
-    cmd.show_command_error(e)
-    retval = 1
+retval = samba_tool(*sys.argv[1:])
 sys.exit(retval)

Логику добавления новых команд в samba-tool-plus нужно выправлять в рамках новой реализации.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241766</commentid>
    <comment_count>5</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-02-18 13:56:36 +0300</bug_when>
    <thetext>(Ответ для Evgeny Sinelnikov на комментарий #3)
&gt; Нужно определиться c тем, зачем мы этот пакет вообще тащим?
&gt; Кто и для каких задач его использует?

Кажется, cas@ попросил меня добавить подкоманду в net-tool, которой там не было, но в питоновском API нужная операция была. Причин, по которым мы не стали делать форк обычного net-tool (а сделали обёртку) я уже не помню.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241774</commentid>
    <comment_count>6</comment_count>
    <who name="Evgeny Sinelnikov">sin</who>
    <bug_when>2024-02-19 06:14:23 +0300</bug_when>
    <thetext>&quot;Причесал код&quot;. На пустом месте он перестал падать.

Оно делает, вроде, то, что ожидается:
# samba-tool-plus domain info 127.0.0.1 -d 4
lpcfg_load: refreshing parameters from /etc/samba/smb.conf
Processing section &quot;[global]&quot;
Processing section &quot;[sysvol]&quot;
Processing section &quot;[netlogon]&quot;
Processing section &quot;[people]&quot;
Processing section &quot;[photo]&quot;
Processing section &quot;[iso]&quot;
Processing section &quot;[distr]&quot;
pm_process() returned Yes
GENSEC backend &apos;gssapi_spnego&apos; registered
GENSEC backend &apos;gssapi_krb5&apos; registered
GENSEC backend &apos;gssapi_krb5_sasl&apos; registered
GENSEC backend &apos;spnego&apos; registered
GENSEC backend &apos;schannel&apos; registered
GENSEC backend &apos;ncalrpc_as_system&apos; registered
GENSEC backend &apos;sasl-EXTERNAL&apos; registered
GENSEC backend &apos;ntlmssp&apos; registered
GENSEC backend &apos;ntlmssp_resume_ccache&apos; registered
GENSEC backend &apos;http_basic&apos; registered
GENSEC backend &apos;http_ntlm&apos; registered
GENSEC backend &apos;http_negotiate&apos; registered
GENSEC backend &apos;krb5&apos; registered
GENSEC backend &apos;fake_gssapi_krb5&apos; registered
added interface lo ip=::1 bcast= netmask=ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
added interface lo ip=127.0.0.1 bcast=127.255.255.255 netmask=255.0.0.0
added interface eth0 ip=192.168.9.3 bcast=192.168.9.255 netmask=255.255.255.0
added interface lo ip=::1 bcast= netmask=ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
added interface lo ip=127.0.0.1 bcast=127.255.255.255 netmask=255.0.0.0
added interface eth0 ip=192.168.9.3 bcast=192.168.9.255 netmask=255.255.255.0
added interface lo ip=::1 bcast= netmask=ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
added interface lo ip=127.0.0.1 bcast=127.255.255.255 netmask=255.0.0.0
added interface eth0 ip=192.168.9.3 bcast=192.168.9.255 netmask=255.255.255.0
added interface lo ip=::1 bcast= netmask=ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
added interface lo ip=127.0.0.1 bcast=127.255.255.255 netmask=255.0.0.0
added interface eth0 ip=192.168.9.3 bcast=192.168.9.255 netmask=255.255.255.0
finddcs: searching for a DC by IP 127.0.0.1
finddcs: performing CLDAP query on 127.0.0.1
finddcs: Found matching DC 127.0.0.1 with server_type=0x000013fd
Forest           : darkmastersin.net
Domain           : darkmastersin.net
Netbios domain   : DARKMASTERSIN
DC name          : dc.darkmastersin.net
DC netbios name  : DC
Server site      : Default-First-Site-Name
Client site      : Default-First-Site-Name

Но modify, ради которого всё затекалось - отваливается:
# samba-tool-plus user update xtst --must-change-at-next-login
ERROR(ldb): Failed to modify user &apos;xtst&apos;:  - objectclass: modify message must have elements/attributes!
  File &quot;/usr/lib/python3/site-packages/netcmdplus/user.py&quot;, line 58, in run
    samdb.usermod(username, password=password,
  File &quot;/usr/lib/python3/site-packages/netcmdplus/samdb.py&quot;, line 160, in usermod
    self.modify(ldbmessage)

# samba-tool-plus user update xtst 
ERROR(ldb): Failed to modify user &apos;xtst&apos;:  - objectclass: modify message must have elements/attributes!
  File &quot;/usr/lib/python3/site-packages/netcmdplus/user.py&quot;, line 58, in run
    samdb.usermod(username, password=password,
  File &quot;/usr/lib/python3/site-packages/netcmdplus/samdb.py&quot;, line 160, in usermod
    self.modify(ldbmessage)

Нужно теперь с деталями разбираться ещё. Исходники выложил сюда:
https://git.altlinux.org/people/sin/packages/netcmdplus.git
https://gitlab.basealt.space/alt/netcmdplus</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241775</commentid>
    <comment_count>7</comment_count>
    <who name="Evgeny Sinelnikov">sin</who>
    <bug_when>2024-02-19 07:34:57 +0300</bug_when>
    <thetext>Ошибка &quot;objectclass: modify message must have elements/attributes!&quot; связана с логикой, когда ни один атрибут не задан, а команда на изменение даётся. Оно и понятно:

Смотрим и видим, что мне повезло выбрать именно тот параметр, который не меняет ни один атрибут:
--------
        self.transaction_start()
        try:
            self.modify(ldbmessage)
            if setpassword:
                self.setpassword(
                    &quot;(samAccountName=%s)&quot; % ldb.binary_encode(username),
                    password,
                    force_password_change_at_next_login_req)
--------
Тут можно просто не делать modify(), если не было задано ни одного атрибута.


А вот это как понимать?

[root@dc ~]# samba-tool-plus user update xtst --department=&quot;City&quot;
ERROR(ldb): Failed to modify user &apos;xtst&apos;:  - No such Base DN: CN=xtst,CN=Users,DC=darkmastersin,DC=net
  File &quot;/usr/lib/python3/site-packages/netcmdplus/user.py&quot;, line 58, in run
    samdb.usermod(username, password=password,
  File &quot;/usr/lib/python3/site-packages/netcmdplus/samdb.py&quot;, line 160, in usermod
    self.modify(ldbmessage)

[root@dc ~]# samba-tool-plus user show xtst 
ldb_wrap open of secrets.ldb
dn: CN=Tester Functional,OU=Home,DC=darkmastersin,DC=net
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Tester Functional
instanceType: 4
whenCreated: 20231105225819.0Z
uSNCreated: 12843
name: Tester Functional
objectGUID: 49b9b2c1-39bb-414b-9a5e-134b77c97460
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 0
lastLogoff: 0
primaryGroupID: 513
objectSid: S-1-5-21-3813720-278734374-249828831-1117
accountExpires: 9223372036854775807
sAMAccountType: 805306368
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=darkmastersin,DC=net
givenName: Functional
sn: Tester
sAMAccountName: xtst
userPrincipalName: xtst@darkmastersin.net
userAccountControl: 512
lastLogonTimestamp: 133436987772250650
pwdLastSet: 133442918956692000
whenChanged: 20231112194455.0Z
uSNChanged: 12856
lastLogon: 133443861188327300
logonCount: 10
distinguishedName: CN=Tester Functional,OU=Home,DC=darkmastersin,DC=net

Это уже дичь, если вот так вычислять dn пользователя:
--------
        cn = username
        if useusernameascn is None and displayname is not &quot;&quot;:
            cn = displayname
        user_dn = &quot;CN=%s,%s,%s&quot; % (cn, (userou or &quot;CN=Users&quot;), self.domain_dn())
--------
Ну, это же не FreeIPA, где свалка в одной куче всех пользователей. Тут сначала нужно выяснить dn по имени, а потом уже предлагать его атрибуты менять.


В общем, цель всего этого хозяйства понятна. Samba Team не осилила, а мы не им и всем запили, а очень ограниченную реализацию сделали. Она никогда не работала, получается с пользователями в разных ou. Если только вот так предполагалось:
--------
[root@dc ~]# samba-tool-plus user update xtst --userou=&quot;OU=Home&quot; --department=&quot;City&quot;
ERROR(ldb): Failed to modify user &apos;xtst&apos;:  - No such Base DN: CN=xtst,OU=Home,DC=darkmastersin,DC=net
  File &quot;/usr/lib/python3/site-packages/netcmdplus/user.py&quot;, line 58, in run
    samdb.usermod(username, password=password,
  File &quot;/usr/lib/python3/site-packages/netcmdplus/samdb.py&quot;, line 160, in usermod
    self.modify(ldbmessage)
-------

Но в том-то и дело, что CN объекта пользователь никак не должен, не обязан &quot;биться&quot; с его sAMAccountName или userPrincipalName:

sAMAccountName: xtst
userPrincipalName: xtst@darkmastersin.net

В общем, оно &quot;работает&quot;. Но требуется доработка. Это ещё пилить и пилить.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241776</commentid>
    <comment_count>8</comment_count>
    <who name="Evgeny Sinelnikov">sin</who>
    <bug_when>2024-02-19 07:37:53 +0300</bug_when>
    <thetext>Будем считать, что регрессий нет:

[root@dc ~]# samba-tool-plus user create ytst &quot;XXXXXXXX&quot;
descriptor_prepare_commit: changes: num_registrations=0
descriptor_prepare_commit: changes: num_registered=0
descriptor_prepare_commit: changes: num_toplevel=0
descriptor_prepare_commit: changes: num_processed=0
descriptor_prepare_commit: objects: num_processed=0
descriptor_prepare_commit: objects: num_skipped=0
User &apos;ytst&apos; added successfully

[root@dc ~]# samba-tool-plus user update ytst --department=&quot;City&quot;
descriptor_prepare_commit: changes: num_registrations=0
descriptor_prepare_commit: changes: num_registered=0
descriptor_prepare_commit: changes: num_toplevel=0
descriptor_prepare_commit: changes: num_processed=0
descriptor_prepare_commit: objects: num_processed=0
descriptor_prepare_commit: objects: num_skipped=0
User account &apos;ytst&apos; updated successfully

[root@dc ~]# samba-tool-plus user show ytst 
ldb_wrap open of secrets.ldb
dn: CN=ytst,CN=Users,DC=darkmastersin,DC=net
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: ytst
instanceType: 4
whenCreated: 20240219043608.0Z
uSNCreated: 17555
name: ytst
objectGUID: 5658c610-d2a5-4331-97d3-9ffb6e4aebba
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 0
lastLogoff: 0
lastLogon: 0
primaryGroupID: 513
objectSid: S-1-5-21-3813720-278734374-249828831-1119
accountExpires: 9223372036854775807
logonCount: 0
sAMAccountName: ytst
sAMAccountType: 805306368
userPrincipalName: ytst@darkmastersin.net
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=darkmastersin,DC=net
pwdLastSet: 133527909680720840
userAccountControl: 512
department: City
whenChanged: 20240219043621.0Z
uSNChanged: 17558
distinguishedName: CN=ytst,CN=Users,DC=darkmastersin,DC=net</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241777</commentid>
    <comment_count>9</comment_count>
    <who name="Repository Robot">repository-robot</who>
    <bug_when>2024-02-19 08:30:04 +0300</bug_when>
    <thetext>netcmdplus-0.1.3-alt1 -&gt; sisyphus:

 Mon Feb 19 2024 Evgeny Sinelnikov &lt;sin@altlinux&gt; 0.1.3-alt1
 - Add compatibility with stable releases of samba-4.18 and later (closes: 49404).
 - Replace python3 build to new pyproject_build process.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241795</commentid>
    <comment_count>10</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-02-19 13:07:09 +0300</bug_when>
    <thetext>(Ответ для Evgeny Sinelnikov на комментарий #7)

&gt; В общем, цель всего этого хозяйства понятна. Samba Team не осилила, а мы не
&gt; им и всем запили, а очень ограниченную реализацию сделали. Она никогда не
&gt; работала, получается с пользователями в разных ou.

Так какой у нас план? Может быть осилить &quot;им и всем&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241985</commentid>
    <comment_count>11</comment_count>
    <who name="Evgeny Sinelnikov">sin</who>
    <bug_when>2024-02-23 06:10:14 +0300</bug_when>
    <thetext>(Ответ для manowar@altlinux.org на комментарий #10)
&gt; (Ответ для Evgeny Sinelnikov на комментарий #7)
&gt; 
&gt; &gt; В общем, цель всего этого хозяйства понятна. Samba Team не осилила, а мы не
&gt; &gt; им и всем запили, а очень ограниченную реализацию сделали. Она никогда не
&gt; &gt; работала, получается с пользователями в разных ou.
&gt; 
&gt; Так какой у нас план? Может быть осилить &quot;им и всем&quot;?

Давайте сформулируем, что мы хотим. А то угадывать, заглядывая одним глазом в код приходится. Перетащить текущий код в базовый инструмент - samba-tool не представляет собой особой технической проблемы.

Чтобы &quot;осилить&quot; требуется заняться такой цепочкой действий:
* дать подробное описание текущей доработки;
* перетащить код в проект samba (поверх ветки master, разумеется);
* зафиксировать подготовленное подробное описание в тексте коммита (правильно оформленном commit message на английском языке, конечно);
* добавить к этому коммиту, отдельный коммит с тестами (без тестов апстрим не захочет принимать);
* убедиться, что предложенный функционал работает, освоив для этого запуск этих тестов для samba;
* отправить, в соответствии с правилами Samba Team, патчи для принятия в основной код проекта.

По мне, функционал был добавлен полезный. Но описание требуется. Изложить же его на английском, исправить changelog в коммите, добавить тесты и т.п. требует времени, которого пока не нашлось.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241986</commentid>
    <comment_count>12</comment_count>
    <who name="Evgeny Sinelnikov">sin</who>
    <bug_when>2024-02-23 06:11:47 +0300</bug_when>
    <thetext>(Ответ для manowar@altlinux.org на комментарий #10)
[...]
&gt; Так какой у нас план? Может быть осилить &quot;им и всем&quot;?

Содержательно, этот вопрос к авторам задумки. Я предлагаю её сформулировать и передать с патчами и тестами в апстрим.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>