summaryrefslogtreecommitdiff
path: root/cloudinit/gpg.py
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2016-06-10 13:57:20 -0400
committerScott Moser <smoser@ubuntu.com>2016-06-10 13:57:20 -0400
commit8da73fb6ccb0d99c7e5183257c4cbd2dd94719f1 (patch)
treeb3df0a72a1c784dd5c5d289b7a92804d8589b6b1 /cloudinit/gpg.py
parent9cb2af16f2fe4f4c9b7a443e67e9bfd1e0f82ef9 (diff)
parent7e527b1b2f3fda558fb0f3a6958c42dde4716079 (diff)
downloadvyos-cloud-init-8da73fb6ccb0d99c7e5183257c4cbd2dd94719f1.tar.gz
vyos-cloud-init-8da73fb6ccb0d99c7e5183257c4cbd2dd94719f1.zip
Fix apt configure unittests to run in more environments
As well as some improvements that were found along testing them and due to the fact that we review some of that code again in the scope of curtin currently. Tests: - add a test for an alternate keyserver - harden mirrorfail tests to detect and skip if no network is available - improve apt_source related tests to work on CentOS7 Changes: - gpg key handling is now in python instead of a shell blob and moved to its own module. - packages/bddeb has an option to sign as someone else than smoser - make exception handling of apt_source features more specific (do not catch broad 'Exception') - rename some functions to reflect better what they actually do - capture some helper subp calls output to avoid spilling into stdout when not intended
Diffstat (limited to 'cloudinit/gpg.py')
-rw-r--r--cloudinit/gpg.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/cloudinit/gpg.py b/cloudinit/gpg.py
new file mode 100644
index 00000000..6a76d785
--- /dev/null
+++ b/cloudinit/gpg.py
@@ -0,0 +1,74 @@
+"""gpg.py - Collection of gpg key related functions"""
+# vi: ts=4 expandtab
+#
+# Copyright (C) 2016 Canonical Ltd.
+#
+# Author: Scott Moser <scott.moser@canonical.com>
+# Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 3, as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from cloudinit import log as logging
+from cloudinit import util
+
+LOG = logging.getLogger(__name__)
+
+
+def export_armour(key):
+ """Export gpg key, armoured key gets returned"""
+ try:
+ (armour, _) = util.subp(["gpg", "--export", "--armour", key],
+ capture=True)
+ except util.ProcessExecutionError as error:
+ # debug, since it happens for any key not on the system initially
+ LOG.debug('Failed to export armoured key "%s": %s', key, error)
+ armour = None
+ return armour
+
+
+def receive_key(key, keyserver):
+ """Receive gpg key from the specified keyserver"""
+ LOG.debug('Receive gpg key "%s"', key)
+ try:
+ util.subp(["gpg", "--keyserver", keyserver, "--recv-keys", key],
+ capture=True)
+ except util.ProcessExecutionError as error:
+ raise ValueError(('Failed to import key "%s" '
+ 'from server "%s" - error %s') %
+ (key, keyserver, error))
+
+
+def delete_key(key):
+ """Delete the specified key from the local gpg ring"""
+ try:
+ util.subp(["gpg", "--batch", "--yes", "--delete-keys", key],
+ capture=True)
+ except util.ProcessExecutionError as error:
+ LOG.warn('Failed delete key "%s": %s', key, error)
+
+
+def get_key_by_id(keyid, keyserver="keyserver.ubuntu.com"):
+ """get gpg keyid from keyserver"""
+ armour = export_armour(keyid)
+ if not armour:
+ try:
+ receive_key(keyid, keyserver=keyserver)
+ armour = export_armour(keyid)
+ except ValueError:
+ LOG.exception('Failed to obtain gpg key %s', keyid)
+ raise
+ finally:
+ # delete just imported key to leave environment as it was before
+ delete_key(keyid)
+
+ return armour