ceph-ansible/library/ceph_authtool.py

138 lines
3.3 KiB
Python

from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible.module_utils.basic import AnsibleModule
try:
from ansible.module_utils.ca_common import container_exec, \
is_containerized, \
fatal
except ImportError:
from module_utils.ca_common import container_exec, \
is_containerized, \
fatal
import datetime
import json
import os
import struct
import time
import base64
import socket
class KeyringExists(Exception):
pass
def build_cmd(create_keyring=False,
gen_key=False,
add_key=False,
import_keyring=None,
caps={},
name=None,
path=None,
container_image=None,
**a):
auth_tool_binary: str = 'ceph-authtool'
if container_image:
c = container_exec(auth_tool_binary,
container_image)
else:
c = [auth_tool_binary]
if name:
c.extend(['-n', name])
if create_keyring:
if os.path.exists(path):
raise KeyringExists
c.append('-C')
if gen_key:
c.append('-g')
if caps:
for k, v in caps.items():
c.extend(['--cap'] + [k] + [v])
c.append(path)
if import_keyring:
c.extend(['--import-keyring', import_keyring])
return c
def run_module():
module_args = dict(
name=dict(type='str', required=False),
create_keyring=dict(type='bool', required=False, default=False),
gen_key=dict(type='bool', required=False, default=False),
add_key=dict(type='str', required=False, default=None),
import_keyring=dict(type='str', required=False, default=None),
caps=dict(type='dict', required=False, default=None),
path=dict(type='str', required=True)
)
module = AnsibleModule(
argument_spec=module_args,
supports_check_mode=True,
add_file_common_args=True,
)
cmd = []
changed = False
result = dict(
changed=changed,
stdout='',
stderr='',
rc=0,
start='',
end='',
delta='',
)
if module.check_mode:
module.exit_json(**result)
startd = datetime.datetime.now()
# will return either the image name or None
container_image = is_containerized()
try:
cmd = build_cmd(**module.params, container_image=container_image)
except KeyringExists:
rc = 0
out = f"{module.params['path']} already exists. Skipping"
err = ""
else:
rc, out, err = module.run_command(cmd)
if rc == 0:
changed = True
endd = datetime.datetime.now()
delta = endd - startd
result = dict(
cmd=cmd,
start=str(startd),
end=str(endd),
delta=str(delta),
rc=rc,
stdout=out.rstrip("\r\n"),
stderr=err.rstrip("\r\n"),
changed=changed,
)
if rc != 0:
module.fail_json(msg='non-zero return code', **result)
#file_args = module.load_file_common_arguments(module.params)
#module.set_fs_attributes_if_different(file_args, False)
module.exit_json(**result)
def main():
run_module()
if __name__ == '__main__':
main()