| Summary: | netcmdplus не работает с Samba >= 4.19 | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Evgeny Shesteperov <alimektor> |
| Component: | netcmdplus | Assignee: | Evgeny Sinelnikov <sin> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P5 | CC: | amakeenk, arzdez, greh, liannnix, liannnix, manowar |
| Version: | unstable | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
Странно, ошибка имеется, но у выглядит иначе:
# samba-tool-plus domain info 127.0.0.1 -d 4
ERROR(<class 'AttributeError'>): uncaught exception - 'cmd_sambatoolplus' object has no attribute 'command_name'
File "/usr/bin/samba-tool-plus", line 45, in <module>
retval = cmd._run("samba-tool-plus", subcommand, *args)
File "/usr/lib64/samba-dc/python3.9/samba/netcmd/__init__.py", line 369, in _run
f"{self.command_name} <subcommand> (-h|--help)\n")
(Ответ для Evgeny Sinelnikov на комментарий #1) > Странно, ошибка имеется, но у выглядит иначе В p10 и в сизифе вывод немного отличается из-за разных версий python. Нужно определиться c тем, зачем мы этот пакет вообще тащим? Кто и для каких задач его использует? Оно так написано, by design, что его нужно постоянно подпинывать и сопровождать. Если больше никто не готов это делать и я должен взяться за этот пакет, то возникает вопрос: "А зачем мы этот пакет, вообще, создали?" Предположу, что это было актуально, как обертка для alterator-net-domain. Но это очень слабая история. Функциональность этого модуля минимальна, поэтому нужно решить: * Для каких практических задач сейчас используется netcmdplus? * Какие существенные, функциональные возможности предоставляет этот пакет? * Какими инструментами мы планируем замещать этот функционал в будущем? * Кто его готов дорабатывать и сопровождать сегодня? В новой 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, "bin/python")
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) > 1:
- subcommand = sys.argv[1]
- if len(sys.argv) > 2:
- args = sys.argv[2:]
-
-try:
- retval = cmd._run("samba-tool", 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 нужно выправлять в рамках новой реализации.
(Ответ для Evgeny Sinelnikov на комментарий #3) > Нужно определиться c тем, зачем мы этот пакет вообще тащим? > Кто и для каких задач его использует? Кажется, cas@ попросил меня добавить подкоманду в net-tool, которой там не было, но в питоновском API нужная операция была. Причин, по которым мы не стали делать форк обычного net-tool (а сделали обёртку) я уже не помню. "Причесал код". На пустом месте он перестал падать.
Оно делает, вроде, то, что ожидается:
# samba-tool-plus domain info 127.0.0.1 -d 4
lpcfg_load: refreshing parameters from /etc/samba/smb.conf
Processing section "[global]"
Processing section "[sysvol]"
Processing section "[netlogon]"
Processing section "[people]"
Processing section "[photo]"
Processing section "[iso]"
Processing section "[distr]"
pm_process() returned Yes
GENSEC backend 'gssapi_spnego' registered
GENSEC backend 'gssapi_krb5' registered
GENSEC backend 'gssapi_krb5_sasl' registered
GENSEC backend 'spnego' registered
GENSEC backend 'schannel' registered
GENSEC backend 'ncalrpc_as_system' registered
GENSEC backend 'sasl-EXTERNAL' registered
GENSEC backend 'ntlmssp' registered
GENSEC backend 'ntlmssp_resume_ccache' registered
GENSEC backend 'http_basic' registered
GENSEC backend 'http_ntlm' registered
GENSEC backend 'http_negotiate' registered
GENSEC backend 'krb5' registered
GENSEC backend 'fake_gssapi_krb5' 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 'xtst': - objectclass: modify message must have elements/attributes!
File "/usr/lib/python3/site-packages/netcmdplus/user.py", line 58, in run
samdb.usermod(username, password=password,
File "/usr/lib/python3/site-packages/netcmdplus/samdb.py", line 160, in usermod
self.modify(ldbmessage)
# samba-tool-plus user update xtst
ERROR(ldb): Failed to modify user 'xtst': - objectclass: modify message must have elements/attributes!
File "/usr/lib/python3/site-packages/netcmdplus/user.py", line 58, in run
samdb.usermod(username, password=password,
File "/usr/lib/python3/site-packages/netcmdplus/samdb.py", line 160, in usermod
self.modify(ldbmessage)
Нужно теперь с деталями разбираться ещё. Исходники выложил сюда:
https://git.altlinux.org/people/sin/packages/netcmdplus.git
https://gitlab.basealt.space/alt/netcmdplus
Ошибка "objectclass: modify message must have elements/attributes!" связана с логикой, когда ни один атрибут не задан, а команда на изменение даётся. Оно и понятно:
Смотрим и видим, что мне повезло выбрать именно тот параметр, который не меняет ни один атрибут:
--------
self.transaction_start()
try:
self.modify(ldbmessage)
if setpassword:
self.setpassword(
"(samAccountName=%s)" % ldb.binary_encode(username),
password,
force_password_change_at_next_login_req)
--------
Тут можно просто не делать modify(), если не было задано ни одного атрибута.
А вот это как понимать?
[root@dc ~]# samba-tool-plus user update xtst --department="City"
ERROR(ldb): Failed to modify user 'xtst': - No such Base DN: CN=xtst,CN=Users,DC=darkmastersin,DC=net
File "/usr/lib/python3/site-packages/netcmdplus/user.py", line 58, in run
samdb.usermod(username, password=password,
File "/usr/lib/python3/site-packages/netcmdplus/samdb.py", 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 "":
cn = displayname
user_dn = "CN=%s,%s,%s" % (cn, (userou or "CN=Users"), self.domain_dn())
--------
Ну, это же не FreeIPA, где свалка в одной куче всех пользователей. Тут сначала нужно выяснить dn по имени, а потом уже предлагать его атрибуты менять.
В общем, цель всего этого хозяйства понятна. Samba Team не осилила, а мы не им и всем запили, а очень ограниченную реализацию сделали. Она никогда не работала, получается с пользователями в разных ou. Если только вот так предполагалось:
--------
[root@dc ~]# samba-tool-plus user update xtst --userou="OU=Home" --department="City"
ERROR(ldb): Failed to modify user 'xtst': - No such Base DN: CN=xtst,OU=Home,DC=darkmastersin,DC=net
File "/usr/lib/python3/site-packages/netcmdplus/user.py", line 58, in run
samdb.usermod(username, password=password,
File "/usr/lib/python3/site-packages/netcmdplus/samdb.py", line 160, in usermod
self.modify(ldbmessage)
-------
Но в том-то и дело, что CN объекта пользователь никак не должен, не обязан "биться" с его sAMAccountName или userPrincipalName:
sAMAccountName: xtst
userPrincipalName: xtst@darkmastersin.net
В общем, оно "работает". Но требуется доработка. Это ещё пилить и пилить.
Будем считать, что регрессий нет: [root@dc ~]# samba-tool-plus user create ytst "XXXXXXXX" 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 'ytst' added successfully [root@dc ~]# samba-tool-plus user update ytst --department="City" 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 'ytst' 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 netcmdplus-0.1.3-alt1 -> sisyphus: Mon Feb 19 2024 Evgeny Sinelnikov <sin@altlinux> 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. (Ответ для Evgeny Sinelnikov на комментарий #7) > В общем, цель всего этого хозяйства понятна. Samba Team не осилила, а мы не > им и всем запили, а очень ограниченную реализацию сделали. Она никогда не > работала, получается с пользователями в разных ou. Так какой у нас план? Может быть осилить "им и всем"? (Ответ для manowar@altlinux.org на комментарий #10) > (Ответ для Evgeny Sinelnikov на комментарий #7) > > > В общем, цель всего этого хозяйства понятна. Samba Team не осилила, а мы не > > им и всем запили, а очень ограниченную реализацию сделали. Она никогда не > > работала, получается с пользователями в разных ou. > > Так какой у нас план? Может быть осилить "им и всем"? Давайте сформулируем, что мы хотим. А то угадывать, заглядывая одним глазом в код приходится. Перетащить текущий код в базовый инструмент - samba-tool не представляет собой особой технической проблемы. Чтобы "осилить" требуется заняться такой цепочкой действий: * дать подробное описание текущей доработки; * перетащить код в проект samba (поверх ветки master, разумеется); * зафиксировать подготовленное подробное описание в тексте коммита (правильно оформленном commit message на английском языке, конечно); * добавить к этому коммиту, отдельный коммит с тестами (без тестов апстрим не захочет принимать); * убедиться, что предложенный функционал работает, освоив для этого запуск этих тестов для samba; * отправить, в соответствии с правилами Samba Team, патчи для принятия в основной код проекта. По мне, функционал был добавлен полезный. Но описание требуется. Изложить же его на английском, исправить changelog в коммите, добавить тесты и т.п. требует времени, которого пока не нашлось. (Ответ для manowar@altlinux.org на комментарий #10) [...] > Так какой у нас план? Может быть осилить "им и всем"? Содержательно, этот вопрос к авторам задумки. Я предлагаю её сформулировать и передать с патчами и тестами в апстрим. |
Версия - netcmdplus-0.1.2-alt2 - samba-4.19.4-alt1 Шаги воспроизведения Развернуть Samba домен, на сервере установить пакет netcmdplus, открыть web интерфейс альтератора (https://<IP>: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: "is not" with 'str' literal. Did you mean "!="? if useusernameascn is None and displayname is not "": /usr/lib/python3/site-packages/netcmdplus/samdb.py:66: SyntaxWarning: "is not" with 'str' literal. Did you mean "!="? if val is not None and val is not "": /usr/lib/python3/site-packages/netcmdplus/samdb.py:86: SyntaxWarning: "is not" with 'str' literal. Did you mean "!="? if displayname is not "": /usr/lib/python3/site-packages/netcmdplus/samdb.py:185: SyntaxWarning: "is not" with 'str' literal. Did you mean "!="? if val is not None and val is not "": ERROR(<class 'AttributeError'>): uncaught exception - 'cmd_sambatoolplus' object has no attribute 'command_name' File "/usr/bin/samba-tool-plus", line 45, in <module> retval = cmd._run("samba-tool-plus", subcommand, *args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3/site-packages/samba/netcmd/__init__.py", line 369, in _run f"{self.command_name} <subcommand> (-h|--help)\n")