Libelektra: testshell_markdown_tutorial_crypto: сбой

Созданный на 26 нояб. 2019  ·  17Комментарии  ·  Источник: ElektraInitiative/libelektra

Шаги по воспроизведению проблемы

Создавайте libelektra, имея файлы разработки gpgme. ( gpgme-devel на Fedora)
я использовал

cmake -DBUILD_DOCUMENTATION=ON -DBINDINGS="ALL" -DBUILD_SHARED=ON -DBUILD_STATIC=ON -DBUILD_FULL=ON -DENABLE_COVERAGE=OFF -DENABLE_OPTIMIZATIONS=ON -DENABLE_DEBUG=ON -DENABLE_LOGGER=OFF -DBUILD_STATIC=ON -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DKDB_DB_SYSTEM="$SYSTEM_DIR" DCMAKE_INSTALL_PREFIX=./releaseInstallDir -DPLUGINS="ALL" -DTOOLS="ALL" ..

но не все имеет отношение к проблеме.

make run_all

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

Test #215: testshell_markdown_tutorial_crypto ........... Passed    2.58 sec

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

Кажется, есть проблема с / tmp на tmpfs или подобном? У меня проблема с Fedora, а также с debian buster (в докере).

249/262 Test #215: testshell_markdown_tutorial_crypto ...........***Failed    2.58 sec
Input: /home/mpranj/workspace/libelektra/doc/tutorials/crypto.md
kdb mount test.ini user/tests ini
kdb set user/tests/password 1234
kdb file user/tests/password | xargs cat
kdb rm user/tests/password
kdb umount user/tests
kdb mount test.ini user/tests fcrypt "encrypt/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey),encrypt/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests crypto_gcrypt "crypto/key=$(kdb gen-gpg-testkey)" base64 ini
kdb meta-set user/tests/password crypto/encrypt 1
kdb set user/tests/password 1234
kdb set user/tests/unencrypted "I am not encrypted"
kdb file user/tests/password | xargs cat
kdb meta-set user/tests/password crypto/encrypt 0
kdb file user/tests/password | xargs cat
kdb rm user/tests/unencrypted
kdb rm user/tests/password
kdb umount user/tests
shell_recorder /tmp/tmp.FLYIzi6Q4K RESULTS: 31 test(s) done 9 error(s).

—— Protocol ————————————————————————————————————————————————————
CMD: kdb mount test.ini user/tests ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 0
STDOUT: Create a new key user/tests/password with string "1234"

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: password=1234

CMD: kdb rm user/tests/password
RET: 0

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "encrypt/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2110573:1574783987.412609.tmpZJttxQ to /home/mpranj/.config/test.ini.2110573:1574783987.412609.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2110783:1574783987.564306.tmpRJuvgG to /home/mpranj/.config/test.ini.2110783:1574783987.564306.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey),encrypt/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2111010:1574783987.747497.tmpti3bSR to /home/mpranj/.config/test.ini.2111010:1574783987.747497.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests crypto_gcrypt "crypto/key=$(kdb gen-gpg-testkey)" base64 ini
RET: 0

CMD: kdb meta-set user/tests/password crypto/encrypt 1
RET: 0

CMD: kdb set user/tests/password 1234
RET: 0
STDOUT: Set string to "1234"

CMD: kdb set user/tests/unencrypted "I am not encrypted"
RET: 0
STDOUT: Create a new key user/tests/unencrypted with string "I am not encrypted"

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: unencrypted=I am not encrypted
#<strong i="19">@META</strong> crypto/encrypt = 1
password=@BASE64IyFjcnlwdG8wMBEAAACCBjEzmVhqufXSsgK4VPRDUC9GyQxBhocVbgZwimonK+xHaRCSX/blNDSVdIoSRg0n

CMD: kdb meta-set user/tests/password crypto/encrypt 0
RET: 0

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: unencrypted=I am not encrypted
#<strong i="20">@META</strong> crypto/encrypt = 0
password=1234

CMD: kdb rm user/tests/unencrypted
RET: 0

CMD: kdb rm user/tests/password
RET: 0

CMD: kdb umount user/tests
RET: 0
————————————————————————————————————————————————————————————————

Системная информация

  • Электра Версия: мастер
  • Операционная система: Fedora
  • Версии другого актуального ПО?

Дополнительные файлы журнала и вывод

bug work in progress

Самый полезный комментарий

Думаю, эта проблема может возникать чаще. Мы даже рекомендуем в документации fcrypt перемонтировать /tmp на RAM-диск. Поэтому мы действительно рекомендуем сразу вызвать эту ошибку.

Я постараюсь исправить это.

Я просто настрою другой TMPDIR явно для сборок. Если проблема повторится в целевых системах, мы можем открыть ее повторно и найти лучшее решение.

Это также хорошо как обходной путь для серверов сборки.

Все 17 Комментарий

@ markus2330 это успешно на сервере сборки. Это шоустоппер для вас? Это будет отражено в журналах выпуска ( kdb run_all -v > ~elektra/$VERSION/run_all 2>&1 ).

РЕДАКТИРОВАТЬ: я могу попытаться выполнить эту часть на a7 / v2, поскольку это может быть неудачным только в моем сценарии с Fedora в качестве хоста (и debian только в докере).

Нет, это определенно не шоу. Скорее всего, это просто потому, что какой-то временный файл все еще существует после предыдущего запуска или # 2957 не полностью исправлен.

Надеюсь, @ petermax2 успеет исправить это до версии 0.9.2: wink:

@mpranj вам нужна помощь с примечаниями к выпуску или что-то еще?

Я не могу воспроизвести проблему при сборке 2bc994ae8b3f3a04396303ece106ea563764e490 с нуля, используя вашу команду cmake сверху.

    Start 188: testshell_markdown_tutorial_crypto 
222/235 Test #188: testshell_markdown_tutorial_crypto ...........   Passed    3.16 sec

Возможно, ваш каталог сборки как-то не работает. Не могли бы вы попробовать скомпилировать и протестировать с новым (пустым) каталогом сборки?

@ petermax2 спасибо, что проверили это так быстро. Я пробовал несколько раз в своей хост-системе (Fedora), а также в докер-контейнере debian buster. Я также много раз чистил каталог сборки.

Всегда возможно, что это просто проблема с моей стороны. Еще раз проверю позже!

Хм, странно! Кажется, вчера я использовал контейнер Debian: stable для сборки и тестирования. Я могу попробовать еще раз с Fedora вечером. На данный момент у меня не так много времени на устранение неполадок, но я бегло посмотрю.

Проблема воспроизводится в Fedora.

The following tests FAILED:
 41 - testshell_markdown_base64 (Failed)
 56 - testshell_markdown_csvstorage (Failed)
 76 - testshell_markdown_iconv (Failed)
 78 - testshell_markdown_ini (Failed)
 93 - testshell_markdown_mini (Failed)
116 - testmod_resolver (Failed)
181 - testshell_markdown_tutorial_crypto (Failed)

Возможно, это не проблема, связанная с крипто-учебником. Я должен исследовать.

kdb gen-gpg-testkey не может быть найден. Эта проблема связана с № 3246 (KDB_EXEC_PATH).

РЕДАКТИРОВАТЬ: анализ действителен только для testshell_markdown_tutorial_crypto . Остальные тесты пока не проверял.

Спасибо, что заглянули в этот выпуск!

Я не видел, чтобы другие тесты терпели неудачу. Вы уверены, что это та же проблема? Я даже не работал с установленным kdb, я просто запускал ctest с make run_all.

В конечном итоге мы добавим также образы докеров Fedora (# 3227), чтобы уловить что-то подобное раньше.

Вы уверены, что это та же проблема?

Нет, наверное, несколько разных проблем.

В конечном итоге мы добавим и образы докеров Fedora.

Очень хорошая идея!

Я отредактировал свой пост раньше, чтобы прояснить, что я имел в виду в своем анализе.

Проблема не только в моей машине. Тест не проходит, потому что следующий вызов rename () не работает:
https://github.com/ElektraInitiative/libelektra/blob/263cbe69686a9f087204a7f3660b007d1de22da2/src/plugins/fcrypt/fcrypt.c#L231

Причина в том, что / tmp по умолчанию является отдельной точкой монтирования в Fedora, чего не было в Debian. Таким образом, файл нельзя переименовать в разных точках монтирования.

Я подтвердил, что это проблема, применив (очень грязный) патч. Я предлагаю сохранить его согласованность с реализацией преобразователя и поместить временный файл в тот же каталог, что и исходный файл.

@ petermax2 что ты думаешь и

Каталог tmp, используемый fcrypt, может быть установлен через конфигурацию плагина.

fcrypt использует параметр конфигурации fcrypt / tmpdir для генерации путей для временных файлов во время шифрования и дешифрования. Если такой вариант конфигурации не указан, fcrypt попытается использовать переменную среды TMPDIR. Если TMPDIR не установлен в среде, / tmp используется как каталог по умолчанию.

(_Source_: Документация по плагину)

Самый простой способ уменьшить количество заданий сборки, подобных Fedora, - это использовать другой каталог. На сервере сборки можно использовать локальный каталог сборки. Что вы думаете?

@ petermax2 что ты думаешь и

Я могу выделить немного свободного времени на выходные, но что вы думаете о правильном решении?

Я могу выделить немного свободного времени на выходные, но что вы думаете о правильном решении?

Не нужно ничего перерабатывать. Как я предлагал, я бы поместил временный файл в тот же каталог, что и целевой файл. Так resolver делает это при фиксации изменений, так что это будет несколько согласованно.

Я также могу просто настроить другой TMPDIR для сборок. Я могу реализовать это изменение сам.

Мы пойдем со всем, что вы предложите здесь.

Из переименовать документ :

[EXDEV]
[CX] [Option Start] The links named by new and old are on different file systems and the implementation does not support links between file systems. [Option End]

Изменить: сбой с sudo с той же ошибкой:

213: CMD: kdb set user/tests/password 1234
213: RET: 5
213: === FAILED return value does not match expected pattern 0
213: STDERR: Sorry, module fcrypt issued the error C01100:
213: Resource: Renaming file /tmp/test.ini.571145:1586371945.946855.tmpHdGEMt to /root/.config/test.ini.571145:1586371945.946855.tmp failed. Reason: Invalid cross-device link
213: ERROR: C01100

Упрощенным решением было бы заменить операцию rename копией + удалением.

Я просто настрою другой TMPDIR явно для сборок. Если проблема повторится в целевых системах, мы можем открыть ее повторно и найти лучшее решение.

Думаю, эта проблема может возникать чаще. Мы даже рекомендуем в документации fcrypt перемонтировать /tmp на RAM-диск. Поэтому мы действительно рекомендуем сразу вызвать эту ошибку.

Я постараюсь исправить это.

Я просто настрою другой TMPDIR явно для сборок. Если проблема повторится в целевых системах, мы можем открыть ее повторно и найти лучшее решение.

Это также хорошо как обходной путь для серверов сборки.

Большое вам спасибо за то, что изучили это!

Упрощенным решением было бы заменить операцию переименования копией + удалением.

Не для замены кода, а для этого, если переименование не удалось. (И также для уничтожения исходного файла в этом случае.) Тогда люди без RAM-диска в / tmp будут иметь скорость, а люди с RAM-диском в / tmp будут иметь большую безопасность.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги