(slapd 2.4.47 + dfsg-3 + deb10u3 - из Debian 10)
Я искал предыдущие ответы на этот вопрос, но, несмотря на то, что следую предложениям (используйте changetype: modify
), у меня все еще есть проблемы.
Проблема заключается в том, чтобы иметь возможность записать файл LDIF, который содержит смесь новых элементов и существующих элементов, которые необходимо изменить.
Однако ни один из перечисленных ниже подходы работают.
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: foo
-
add: olcTLSCertificateFile
olcTLSCertificateFile: foo
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: foo
-
add: olcTLSCipherSuite
olcTLSCipherSuite: foo
-
add: olcTLSVerifyClient
olcTLSVerifyClient: foo
При запуске с ldapmodify -Y EXTERNAL -H ldapi: /// -f /etc/myconfigs/ldifs/certs.ldif"
дает следующую ошибку:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
ldap_modify: Inappropriate matching (18)
additional info: modify/add: olcTLSCACertificateFile: no equality matching rule
Если я затем адаптируйтесь к стилю replace
:
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: foo
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: foo
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: foo
-
replace: olcTLSCipherSuite
olcTLSCipherSuite: foo
-
replace: olcTLSVerifyClient
olcTLSVerifyClient: foo
Ошибка меняется на:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
ldap_modify: Other (e.g., implementation specific) error (80)
Каков правильный синтаксис для «добавить, если не существует, и заменить, если существует» ?
Replace на самом деле is "добавить, если не существует, и заменить, если существует".
rfc2849 заявляет
«Существует однозначная корреляция между операциями LDAP, которые изменяют каталог (добавление, удаление, изменение и изменение), и типами записей изменений, описанных ниже («добавить» , «удалить», «изменить» и «modrdn» или «moddn»). Это соответствие является преднамеренным и позволяет напрямую преобразовать записи изменений LDIF в операции протокола».
Хорошо, давайте посмотрим, как должны работать эти операции протокола. в rfc4511, раздел 4.6.
"заменить: заменить все существующие значения атрибута модификации перечисленными новыми значениями, создав атрибут, если он еще не существует.Замена без значения удалит весь атрибут, если он существует, и проигнорирует, если атрибут не существует».
Хорошо, это даже лучше, это «добавить, если нет», «заменить, если есть» и даже "удалить".
Давайте попробуем.
Предположим, у меня есть этот объект в моем каталоге.
dn: cn=timor,ou=people,dc=orga,dc=tld
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: posixAccount
objectClass: top
cn: timor
gidNumber: 10001
homeDirectory: /home/timor
sn: None
uid: timor
uidNumber: 10001
displayName: Timor
givenName: Timor
userPassword:: <stripped>
Я настроил этот LDIF, который добавляет к объекту три почтовых
значений, не используя «добавить», но «заменить».
dn: cn=timor,ou=people,dc=orga,dc=tld
changetype: modify
replace: mail
mail: first
mail: second
mail: third
Просто ldap измените это в каталоге.
timor@somehost ~ $ ldapmodify -x -H ldaps://localhost -D "cn=Manager,dc=orga,dc=tld" -w "superSecret" -f /tmp/3mail.ldif
modifying entry "cn=timor,ou=people,dc=orga,dc=tld"
Работает нормально. (Я не собираюсь вставлять еще больше LDIF, я думаю, вы доверяете мне, что значения там есть)
Так что это на самом деле показывает, что есть какая-то другая проблема. К сожалению, сообщение об ошибке OpenLDAP «ldap_modify: Другая (например, специфичная для реализации) ошибка (80)» также не очень полезно. Я видел это не раз и часто по совершенно разным причинам, т.е. г. нарушения схемы, проблемы с разрешениями и тому подобное.
Я бы посоветовал придерживаться второго фрагмента (changetype:modify
) и включить отладку с помощью -d -1
при вводе команды ldapmodify
. . Если это не поможет — а я боюсь, что не поможет — вы можете сделать то же самое с самим slapd
, той же опцией -d -1
и внимательно посмотреть на log во время выполнения команды ldapmodify
.