summaryrefslogtreecommitdiff
path: root/cloudinit/sources
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2013-07-10 13:08:23 -0400
committerScott Moser <smoser@ubuntu.com>2013-07-10 13:08:23 -0400
commitce949d5b4c94caf9c1df6393abe86de2872e05ae (patch)
tree9a8317fdcc9489738a1b425dca0d0e91d1f267f2 /cloudinit/sources
parentec22feeefe309187107e0fb5471136f1c8a646c9 (diff)
downloadvyos-cloud-init-ce949d5b4c94caf9c1df6393abe86de2872e05ae.tar.gz
vyos-cloud-init-ce949d5b4c94caf9c1df6393abe86de2872e05ae.zip
add waiting for files and reading of crt keys
Diffstat (limited to 'cloudinit/sources')
-rw-r--r--cloudinit/sources/DataSourceAzure.py46
1 files changed, 45 insertions, 1 deletions
diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py
index ab570344..200bede5 100644
--- a/cloudinit/sources/DataSourceAzure.py
+++ b/cloudinit/sources/DataSourceAzure.py
@@ -19,6 +19,7 @@
import base64
import os
import os.path
+import time
from xml.dom import minidom
from cloudinit import log as logging
@@ -113,9 +114,18 @@ class DataSourceAzureNet(sources.DataSource):
wait_for = [os.path.join(mycfg['datadir'], "SharedConfig.xml")]
+ fp_files = []
for pk in self.cfg.get('_pubkeys', []):
bname = pk['fingerprint'] + ".crt"
- wait_for += [os.path.join(mycfg['datadir'], bname)]
+ fp_files += [os.path.join(mycfg['datadir'], bname)]
+
+ missing = wait_for_files(wait_for + fp_files)
+ if len(missing):
+ LOG.warn("Did not find files, but going on: %s" % missing)
+
+ pubkeys = pubkeys_from_crt_files(fp_files)
+
+ self.metadata['public-keys'] = pubkeys
return True
@@ -123,6 +133,40 @@ class DataSourceAzureNet(sources.DataSource):
return self.cfg
+def crtfile_to_pubkey(fname):
+ pipeline = ('openssl x509 -noout -pubkey < "$0" |'
+ 'ssh-keygen -i -m PKCS8 -f /dev/stdin')
+ (out, _err) = util.subp(['sh', '-c', pipeline, fname], capture=True)
+ return out.rstrip()
+
+
+def pubkeys_from_crt_files(flist):
+ pubkeys = []
+ errors = []
+ for fname in flist:
+ try:
+ pubkeys.append(crtfile_to_pubkey(fname))
+ except util.ProcessExecutionError:
+ errors.extend(fname)
+
+ if errors:
+ LOG.warn("failed to convert the crt files to pubkey: %s" % errors)
+
+ return pubkeys
+
+
+def wait_for_files(flist, maxwait=60, naplen=.5):
+ need = set(flist)
+ waited = 0
+ while waited < maxwait:
+ need -= set([f for f in need if os.path.exists(f)])
+ if len(need) == 0:
+ return []
+ time.sleep(naplen)
+ waited += naplen
+ return need
+
+
def write_files(datadir, files):
if not datadir:
return