Libelektra: تفرخ الاختبارات وكلاء gpg غير محدود

تم إنشاؤها على ١٩ أبريل ٢٠١٨  ·  36تعليقات  ·  مصدر: ElektraInitiative/libelektra

خطوات إعادة إظهار المشكلة

  • بناء elektra على سبيل المثال في حاوية عامل ميناء ، أو تحقق من خادم v2
  • إجراء الاختبارات make run_nokdbtests
  • ps -ef
  • إجراء الاختبارات make run_nokdbtests
  • ps -ef
  • ؟؟؟؟
  • أتساءل أين ذهب كل ما تبذلونه من pid

نتيجة متوقعة

يجب أن تتوقف الاختبارات عن عوامل gpg بعد انتهائها

نتيجة فعلية

كل اختبار تشغيل يولد المزيد من وكلاء gpg

معلومات النظام

  • نسخة إليكترا: سيد

مزيد من ملفات الدخول والإخراج

+ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 05:57 pts/0    00:00:00 bash
root     11296     1  0 07:01 pts/0    00:00:00 sh -c /usr/bin/python2 /root/cppcms-1.2.0/tests/http_timeouts_test.py 
root     11297 11296  0 07:01 pts/0    00:00:00 /usr/bin/python2 /root/cppcms-1.2.0/tests/http_timeouts_test.py write 
root     28509     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.NmmZ2I/.gnupg --use-standard-soc
root     28519     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.6mb1t2/.gnupg --use-standard-soc
root     28539     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.5XdxDR/.gnupg --use-standard-soc
root     30656     1  0 08:00 pts/0    00:00:00 ps -ef
+ make run_nokdbtests
+ ps -ef
+ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 05:57 pts/0    00:00:00 bash
root     11296     1  0 07:01 pts/0    00:00:00 sh -c /usr/bin/python2 /root/cppcms-1.2.0/tests/http_timeouts_test.py 
root     11297 11296  0 07:01 pts/0    00:00:00 /usr/bin/python2 /root/cppcms-1.2.0/tests/http_timeouts_test.py write 
root     28509     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.NmmZ2I/.gnupg --use-standard-soc
root     28519     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.6mb1t2/.gnupg --use-standard-soc
root     28539     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.5XdxDR/.gnupg --use-standard-soc
root     30778     1  0 08:02 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.GZbzqb/.gnupg --use-standard-soc
root     30788     1  0 08:02 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.PEjcKs/.gnupg --use-standard-soc
root     30808     1  0 08:02 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.d6yL2g/.gnupg --use-standard-soc
root     30923     1  0 08:02 pts/0    00:00:00 ps -ef
bug work in progress

التعليق الأكثر فائدة

ضع في اعتبارك أنه إذا قمت بمشاركة الدليل الرئيسي الخاص بك ، فقد لا تتمكن من إجراء الاختبارات بشكل متوازي.
وستظل بحاجة إلى حذف GNUPGHOME بعد ذلك (أنت لا تريد وكيل pgp المتبقي للرد على مكالمات المستخدم الذي قام بتسجيل الدخول ، أليس كذلك؟).

وماذا سيحدث إذا تم ترحيل النظام المستهدف إلى GNUPGHOME ، لذلك ستحتاج إلى حفظ البيئة الموجودة واستعادتها يدويًا بعد الاختبارات.

سأكون ممتنًا لو تمكنا من التراجع والنظر في كيفية تأثير هذه الاختبارات على أجهزة المستخدم ، وليس فقط بيئة خادم الاختبار.

ال 36 كومينتر

شكرا لك على الإبلاغ عن المشكلة!

@ petermax2 هل من الممكن أن أوامر gpg أثناء الاختبارات تفرخ وكلاء gpg؟

عفوًا ، اعتقدت أن gpg سيتصل دائمًا بنفس الوكيل. وسوف التحقيق.

@ markus2330 هذا أيضًا هو السبب وراء وجود العديد من وكلاء gpg على الإصدار 2 الذي تم الإبلاغ عنه باستخدام معرف المستخدم الخاص بك ، حيث تعمل حاوية عامل الإرساء بـ 1000: 1000.

لكن المشكلة لا تقتصر على عامل الإرساء: يحتوي debian-stretch-simple على أكثر من 250 منها أيضًا

لا تتأثر بعض العقد لأنها تم إعدادها لتفرخ عامل gpg لجنكينز الذي تستخدمه الاختبارات (ربما ، يجب التأكيد)

شكرا لكما على النظر في هذا!

لا تتأثر بعض العقد لأنها تم إعدادها لتفرخ عامل gpg لجنكينز الذي تستخدمه الاختبارات (ربما ، يجب التأكيد)

إذا لم نتمكن من إيجاد طريقة لقتل الوكلاء الذين بدأناهم ، فيمكننا ببساطة أن نطلب أن البيئة لديها بالفعل وكيل gpg (# 1888).

ربما لا يلزم أن يبدأ وكيل gpg على الإطلاق ويمكننا منعه أثناء الاختبارات. لكن لا بد لي من إلقاء نظرة عليه في المساء.

عادة ما يتم تعيين mh GPG_AGENT_INFO عند بدء تشغيل واحد ، في الماضي قمنا بتنظيف متغيرات البيئة بحيث قد يكون هذا قد أوضح البدايات المتعددة في الماضي. لا توجد فكرة لماذا لا يزال يحدث الآن على الرغم من ...

@ petermax2 الاختبارات التي تتطلب وكيل gpg (تم العثور عليها بإعادة تسمية وكيل gpg إلى gpg-agent.bak؛)):

  • testmod_fcrypt
  • testmod_crypto_openssl
  • testmod_crypto_gcrypt

يجب أن يعمل testmod_crypto_botan تمامًا مثل testmod_crypto_gcrypt و testmod_crypto_openssl . هل اختبار Botan يعمل على الخادم؟

@ petermax2 ربما نعم. في البيئة التي اختبرت فيها لم يكن هناك نباتات مثبتة. ومع ذلك فهي تعمل هنا وربما أيضًا عوامل تفرخ.

انها ليست بهذه البساطة. حاولت استدعاء gpg باستخدام الوسيطة --no-autostart أثناء اختبارات الوحدة ، ومع ذلك لا يزال gpg يبدأ تشغيل الوكيل. --no-use-agent مضحك. تقول صفحة الرجل:

--no-use-agent 
              This is dummy option. gpg2 always requires the agent.

إذا لم نتمكن من إيجاد طريقة لقتل الوكلاء الذين بدأناهم ، فيمكننا ببساطة أن نطلب أن البيئة لديها بالفعل وكيل gpg (# 1888).

هل يمكننا إعطاء هذه فرصة؟

أو لديك وظيفة كرون مثل

pgrep gpg-agent | xargs -d "\n" kill

أو شيء مشابه على بناء الخوادم / الحاويات؟

سأقوم بفحص الاختبار إذا كان الوكيل متاحًا ، إذا لم يبدأ تشغيله والاحتفاظ به pid. في تنظيف الاختبار ، أوقف العامل. كل شيء آخر هو اختراق.

أنت محق ، السؤال الوحيد هو أين يجب أن تحدث البداية والتوقف. يبدو أن القيام بذلك داخل وكلائنا / عمال الرصيف أسهل مما هو عليه في اختبارات الوحدة المكتوبة في C.

إليكم ما تعلمته حتى الآن:

من الممكن منع البدء التلقائي لـ gpg-agent مع الخيار --no-autostart ، إذا تم استخدامه باستمرار مع جميع مكالمات gpg . ومع ذلك ، بدون gpg-agent gpg2 لا يمكن تنفيذ أي عمليات تتطلب المفتاح الخاص (مثل فك التشفير والتوقيعات).

من الممكن أيضًا أن تتفرع gpg-agent --server ولكن بعد ذلك gpg2 لا يمكن الاتصال بالوكيل. تم إهمال متغير البيئة GPG_AGENT_INFO ولم يعد يعتبر من قبل gpg2 .

سأحاول مفترق و execv gpg-agent --daemon . أنا فقط بحاجة إلى طريقة لمعرفة معرف المنتج (PID) لـ gpg-agent حتى أستطيع SIGTERM عند الانتهاء من الاختبارات.

يبدو أن القيام بذلك داخل وكلائنا / عمال الرصيف أسهل مما هو عليه في اختبارات الوحدة المكتوبة في C.

أسهل بكثير ، أعتقد :-)

أعتقد أن قرارك كان صائبًا بمجرد استخدام الطريقة الافتراضية لـ gpg للاتصال بالوكلاء.

كبديل لبدء / إيقاف وكيل gpg ، يمكننا أيضًا تعطيل "عامل الاستخدام" في .gnupg / gpg.conf

ليس لدي مشكلة في بدء تشغيل وكيل واحد تلقائيًا (وحتى تشغيله). لدي مشكلة مع الاختبارات اللاحقة في بدء اختبار جديد

أعتقد أن قرارك كان صائبًا بمجرد استخدام الطريقة الافتراضية لـ gpg للاتصال بالوكلاء.

في بيئة الإنتاج هو الخيار الأفضل. على جهازي ، اتصل دائمًا بالوكيل نفسه crypto و fcrypt ويعمل التكامل مع Yubikey الخاص بي جيدًا.

في بيئات الاختبار الخاصة بنا ، يجب أن نحتفظ بنسخة واحدة من الوكيل وتشغيله قبل بدء الاختبارات. أعتقد أن المشكلة تكمن في أننا نطهر البيئة ، كما ذكر

أعتقد أن المشكلة هي أننا نطهر البيئة

لا ينبغي لنا بعد الآن. لكن المشكلة استمرت

إذا حاول وكيل gpg الاتصال عبر البيئة فمن الواضح أنه لا يمكن أن يعمل ، فلن يؤدي تشغيل الاختبار التالي إلى تعيين البيئة من خلال تشغيل اختباري من قبل.

أحب اتباع خيارين أفضل:

  1. نبدأ / نوقف وكيل gpg بشكل صحيح داخل الحاويات والمستند في TESTING.md الذي يجب تشغيل وكيل gpg (انظر # 1888).
  2. قمنا بتعطيل بدء تشغيل وكلاء gpg (تعطيل "عامل الاستخدام" في .gnupg / gpg.conf يجب أن يعمل ، ولم نختبره على الرغم من ذلك) وقمنا بتوثيق ذلك في TESTING.md (انظر # 1888).

يبدو أن الإعداد ، حيث تبدأ الشياطين عند الطلب دون طريقة عالمية لمعرفة ما إذا كان البرنامج الخفي قد بدأ بالفعل (وفارز env ليست عالمية ولكنها خاصة بالعملية) ، معطلة. يجب ألا نحاول إصلاح هذا في الاختبارات.

https://stackoverflow.com/questions/27459869/how-to-stop-gpg-2-1-spawning-many-agents-for-unit-testing

السبب الذي يجعلك تفرخ الكثير من الوكلاء هو الدليل الرئيسي المختلف باستخدام الخيار --homedir ، وإلا فسيتم استخدام دليل واحد. من GnuPG 2.1 ، يتم إجراء كل الاتصالات مع الوكيل من خلال مقبس في دليل GnuPG الرئيسي.

نحن لا نستخدم خيار homedir. ويصف https://dev.gnupg.org/T3218 الحل البديل لـ stackoverflow بأنه "حل (محرج للغاية)".

ربما يكون مجرد بدء وكيل gpg هو البديل الأكثر إثباتًا للمستقبل (بطريقة مسيطر عليها داخل بيئتنا). يبدو أن بدء تشغيل وكيل gpg لم يعد اختياريًا في الإصدارات الأخيرة. (مما يجعل خياري 2. أعلاه غير منطقي)

نحن لا نستخدم خيار homedir.

نعم ، لم أجد من أين أتت لكنها تطابق المشكلة (انظر المرجع السابق) حيث أن جميع الوكلاء ولّدوا بواحد مختلف.

لقد كان تلميحًا جيدًا ، علمت أن بدء تشغيل وكيل gpg لم يعد اختياريًا.

مما يجعل الأمر واضحًا جدًا أننا بحاجة إلى البدء وإيقافه. ولا تحاول تجنب البداية.

نحن لا نستخدم خيار homedir.

نعم ، لم أجد من أين أتت لكنها تطابق المشكلة (انظر المرجع)

نحن لا نستخدم الخيار --home-dir بشكل صريح ، لكن ps -ef يظهر أن gpg يعينه بطريقة ما على أي حال.

https://wiki.archlinux.org/index.php/GnuPG

يستخدم GnuPG $ GNUPGHOME للإشارة إلى الدليل حيث يتم تخزين ملفات التكوين الخاصة به. افتراضيًا ، لم يتم تعيين $ GNUPGHOME ويتم استخدام $ HOME بدلاً منه ؛ وبالتالي ، ستجد دليل ~ / .gnupg بعد التثبيت مباشرة.
لتغيير الموقع الافتراضي ، قم بتشغيل gpg بهذه الطريقة $ gpg --homedir path / to / file أو اضبط متغير بيئة GNUPGHOME.
""
@ petermax2 هل يمكنك التحقق مما إذا كان HOME متاحًا في موقع الاختبارات الخاص بك؟

مثيرة للاهتمام أيضًا https://www.gnupg.org/documentation/manuals/gnupg/Ephemeral-home-directories.html :

أنشئ دليلًا مؤقتًا ، وأنشئ (أو انسخ) تكوينًا يلبي احتياجاتك ، واجعل gpg يستخدم هذا الدليل إما باستخدام متغير البيئة GNUPGHOME ، أو الخيار --homedir. تدعم GPGME هذا أيضًا على أساس كل سياق ، من خلال تعديل معلومات محرك السياقات. قم الآن بتنفيذ أي عملية تريدها ، واستيراد وتصدير المواد الرئيسية حسب الضرورة. بمجرد الانتهاء ، يمكنك حذف الدليل. ستكتشف جميع خدمات الواجهة الخلفية لـ GnuPG التي تم بدؤها هذا الأمر وستغلق

اختبرت هذا في الحاوية الخاصة بي ونظف العملية تلقائيًا كما وعدت.

@ petermax2 هل يمكنك التحقق مما إذا كان HOME متاحًا في موقع الاختبارات الخاص بك؟

نعم ، يتوفر HOME :

HOME = /tmp/elektra-test.3vLR4L

حسنًا ، هناك شيء ما في مجموعة الاختبار يتخطى HOME في دليل tmp (وهو أمر جيد). إذا كان هذا لا يزال متاحًا أثناء التنظيف ، فيجب إزالته فقط لإيقاف العامل. سيكون ذلك حلا مثاليا.

إذا قمنا ببساطة بتعيين GNUPGHOME يتم إنتاج مثيل واحد فقط من gpg-agent . لا يتم الكتابة فوق GNUPGHOME قبل بدء الاختبار.

مع تعيين GNUPGHOME ، يتم تشغيل واحد فقط gpg-agent بعد إجراء اختبارات متعددة.

أعتقد أن هذا هو أبسط حل.

ضع في اعتبارك أنه إذا قمت بمشاركة الدليل الرئيسي الخاص بك ، فقد لا تتمكن من إجراء الاختبارات بشكل متوازي.
وستظل بحاجة إلى حذف GNUPGHOME بعد ذلك (أنت لا تريد وكيل pgp المتبقي للرد على مكالمات المستخدم الذي قام بتسجيل الدخول ، أليس كذلك؟).

وماذا سيحدث إذا تم ترحيل النظام المستهدف إلى GNUPGHOME ، لذلك ستحتاج إلى حفظ البيئة الموجودة واستعادتها يدويًا بعد الاختبارات.

سأكون ممتنًا لو تمكنا من التراجع والنظر في كيفية تأثير هذه الاختبارات على أجهزة المستخدم ، وليس فقط بيئة خادم الاختبار.

قد لا تتمكن من إجراء الاختبارات بشكل متوازي.

قمت بتشغيل البرنامج النصي:

#!/bin/bash
mkdir /tmp/x
export GNUPGHOME=/tmp/x
for run in {1..1000000}
do
    ctest -R crypto_openssl &
done

بدون أي مشاكل. يجب أن يتعامل GPG مع القفل ، إلخ.

لا تريد وكيل pgp الذي طال انتظاره يجيب على مكالمات المستخدم الذي قام بتسجيل الدخول ، أليس كذلك؟

هذه هي الطريقة التي تم بها تصميم gpg-agent : فهو يعمل إلى الأبد حتى تنتهي جلسة المستخدم. لا يكتب PID الخاص به في مكان ما ، ولا توجد أوامر لإنهاءه. يتفاعل فقط مع SIGTERM .

حاولت الحصول على fork gpg-agent من داخل اختبار الوحدة باستخدام الخيار --server ، لذلك سيكون لدينا PID إلى kill بعد ذلك. ولكن بعد ذلك ، لا يفتح gpg-agent المنافذ المطلوبة عند $GNUPGHOME وتعيد اختبارات الوحدة فتح مثيل آخر من الوكيل (الذي يعمل في الوضع --daemon ). أيضًا لا توجد طريقة لجعل gpg-agent يفتح أي مآخذ عندما تكون في وضع --server (لقد تحققت من هذا باستخدام الكود المصدري gpg-agent ).

gpg-agent الصعب التحكم في gpg-agent . حالة الاستخدام لدينا غير مغطاة. الخيار الوحيد هو SIGTERM .

تماثل

كنت أفكر أكثر في رغبتك في فصل وكلاء gpg الذين لا يجب أن يؤثروا على بعضهم البعض. أي أنك تريد فقط أن يكون لدى الوكيل أ مفتاح الاختبار أ ، وأن يكون لدى الوكيل ب مفتاح الاختبار ب. إذا لم تكن هناك حاجة لذلك ، فلا بأس من وجود منزل tmp مشفر.

قتل عامل gpg

عند التحقيق في المشكلة لأول مرة ، صادفت موقع ويب (مرتبط أعلاه) ذكر أن الطريقة المتوقعة لإغلاق وكيل مؤقت gpg هو حذف دليل gpg الرئيسي.

لذلك إذا قمت بتعيين GNUPGHOME على /tmp/elektra_tests/gpg وأثناء تنظيف الاختبار ، احذف دليل tmp هذا ، فسيكون ذلك جيدًا.

لذلك إذا قمت بتعيين GNUPGHOME على / tmp / elektra_tests / gpg وأثناء تنظيف الاختبار ، احذف دليل tmp هذا ، فسيكون ذلك جيدًا.

إنها تعمل! سأقوم بدمج هذا الإصلاح في حالات الاختبار crypto و fcrypt . شكرا على البقشيش!

لدي نموذج أولي عملي. العلاقات العامة قادمة غدا.

يجب أن تكون ثابتة بالرقم 2056 #. يرجى إعادة الفتح إذا استمرت المشكلة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

markus2330 picture markus2330  ·  4تعليقات

sanssecours picture sanssecours  ·  3تعليقات

mpranj picture mpranj  ·  4تعليقات

dominicjaeger picture dominicjaeger  ·  3تعليقات

markus2330 picture markus2330  ·  3تعليقات