ipatests: Properly kill gpg-agent

There is a race condition exposed in 'test_gpg_asymmetric'.
The teardown of 'tempdir' fixture and gpg-agent being called
from the teardown of 'gpgkey' fixture could simultaneously
remove the gnugpg's socket files.

This results in an error like:
```

================= ERRORS ===================
_ ERROR at teardown of test_gpg_asymmetric __
...

>  os.unlink(entry.name, dir_fd=topfd)
E  FileNotFoundError: [Errno 2] No such file or directory: 'S.gpg-agent.extra'

/usr/lib64/python3.7/shutil.py:450: FileNotFoundError

```

The problem is that the agent is not terminated properly.
Instead, gpgconf could be used to kill daemonized gpg-agent.

Related: https://pagure.io/freeipa/issue/7989
Signed-off-by: Stanislav Levin <slev@altlinux.org>
Reviewed-By: Christian Heimes <cheimes@redhat.com>
This commit is contained in:
Stanislav Levin 2019-11-13 20:35:25 +03:00 committed by Alexander Bokovoy
parent 43a97082bb
commit 19462788f1
2 changed files with 8 additions and 4 deletions

View File

@ -172,6 +172,7 @@ class BasePathNamespace:
FIREFOX = "/usr/bin/firefox" FIREFOX = "/usr/bin/firefox"
GETCERT = "/usr/bin/getcert" GETCERT = "/usr/bin/getcert"
GPG2 = "/usr/bin/gpg2" GPG2 = "/usr/bin/gpg2"
GPG_CONF = "/usr/bin/gpgconf"
GPG_CONNECT_AGENT = "/usr/bin/gpg-connect-agent" GPG_CONNECT_AGENT = "/usr/bin/gpg-connect-agent"
GPG_AGENT = "/usr/bin/gpg-agent" GPG_AGENT = "/usr/bin/gpg-agent"
IPA_GETCERT = "/usr/bin/ipa-getcert" IPA_GETCERT = "/usr/bin/ipa-getcert"

View File

@ -50,8 +50,8 @@ def gpgkey(request, tempdir):
f.write("verbose\n") f.write("verbose\n")
f.write("allow-preset-passphrase\n") f.write("allow-preset-passphrase\n")
# run agent in background # daemonize agent (detach from the console and run in the background)
agent = subprocess.Popen( subprocess.Popen(
[paths.GPG_AGENT, '--batch', '--daemon'], [paths.GPG_AGENT, '--batch', '--daemon'],
env=env, stdout=devnull, stderr=devnull env=env, stdout=devnull, stderr=devnull
) )
@ -61,8 +61,11 @@ def gpgkey(request, tempdir):
os.environ['GNUPGHOME'] = orig_gnupghome os.environ['GNUPGHOME'] = orig_gnupghome
else: else:
os.environ.pop('GNUPGHOME', None) os.environ.pop('GNUPGHOME', None)
agent.kill() subprocess.run(
agent.wait() [paths.GPG_CONF, '--kill', 'all'],
check=True,
env=env,
)
request.addfinalizer(fin) request.addfinalizer(fin)