3 from pathlib
import Path
6 async def execute_process(*cmd
, log
=None, loop
=None):
8 Wrapper around asyncio.create_subprocess_exec.
11 p
= await asyncio
.create_subprocess_exec(
13 stdin
=asyncio
.subprocess
.PIPE
,
14 stdout
=asyncio
.subprocess
.PIPE
,
15 stderr
=asyncio
.subprocess
.PIPE
,
17 stdout
, stderr
= await p
.communicate()
19 log
.debug("Exec %s -> %d", cmd
, p
.returncode
)
21 log
.debug(stdout
.decode('utf-8'))
23 log
.debug(stderr
.decode('utf-8'))
24 return p
.returncode
== 0
29 Inner function for read_ssh_key, suitable for passing to our
33 default_data_dir
= Path(Path
.home(), ".local", "share", "juju")
34 juju_data
= os
.environ
.get("JUJU_DATA", default_data_dir
)
35 ssh_key_path
= Path(juju_data
, 'ssh', 'juju_id_rsa.pub')
36 with ssh_key_path
.open('r') as ssh_key_file
:
37 ssh_key
= ssh_key_file
.readlines()[0].strip()
41 async def read_ssh_key(loop
):
43 Attempt to read the local juju admin's public ssh key, so that it
44 can be passed on to a model.
47 return await loop
.run_in_executor(None, _read_ssh_key
)