2017-08-28 06:55:39 +00:00
|
|
|
import tempfile
|
2017-08-31 07:25:19 +00:00
|
|
|
|
|
|
|
import cdist
|
|
|
|
import cdist.integration as cdist_integration
|
2017-08-28 09:40:59 +00:00
|
|
|
from celery.utils.log import get_task_logger
|
|
|
|
from django.conf import settings
|
2017-08-27 09:53:19 +00:00
|
|
|
from django.core.mail import EmailMessage
|
2017-08-28 09:40:59 +00:00
|
|
|
|
|
|
|
from dynamicweb.celery import app
|
2017-08-28 06:55:39 +00:00
|
|
|
|
|
|
|
logger = get_task_logger(__name__)
|
|
|
|
|
|
|
|
|
2017-08-27 09:53:19 +00:00
|
|
|
@app.task(bind=True, max_retries=settings.CELERY_MAX_RETRIES)
|
|
|
|
def send_plain_email_task(self, email_data):
|
|
|
|
"""
|
|
|
|
This is a generic celery task to be used for sending emails.
|
|
|
|
A celery wrapper task for EmailMessage
|
|
|
|
|
|
|
|
:param self:
|
|
|
|
:param email_data: A dict of all needed email headers
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
email = EmailMessage(**email_data)
|
|
|
|
email.send()
|
2017-08-30 10:10:44 +00:00
|
|
|
|
|
|
|
|
2017-08-28 06:55:39 +00:00
|
|
|
@app.task(bind=True, max_retries=settings.CELERY_MAX_RETRIES)
|
2017-08-28 09:40:59 +00:00
|
|
|
def save_ssh_key(self, hosts, keys):
|
2017-08-28 06:55:39 +00:00
|
|
|
"""
|
|
|
|
Saves ssh key into the VMs of a user using cdist
|
|
|
|
|
|
|
|
:param hosts: A list of hosts to be configured
|
2017-08-30 07:44:33 +00:00
|
|
|
:param keys: A list of keys to be added. A key should be dict of the
|
|
|
|
form {
|
|
|
|
'value': 'sha-.....', # public key as string
|
|
|
|
'state': True # whether key is to be added or
|
|
|
|
} # removed
|
|
|
|
|
2017-08-28 06:55:39 +00:00
|
|
|
"""
|
2017-08-28 09:40:59 +00:00
|
|
|
return_value = True
|
2017-08-29 16:15:23 +00:00
|
|
|
with tempfile.NamedTemporaryFile(delete=True) as tmp_manifest:
|
2017-08-28 09:40:59 +00:00
|
|
|
# Generate manifest to be used for configuring the hosts
|
2017-08-30 07:44:33 +00:00
|
|
|
lines_list = [
|
|
|
|
' --key "{key}" --state {state} \\\n'.format(
|
|
|
|
key=key['value'],
|
|
|
|
state='present' if key['state'] else 'absent'
|
|
|
|
).encode('utf-8')
|
|
|
|
for key in keys]
|
2017-08-29 16:15:23 +00:00
|
|
|
lines_list.insert(0, b'__ssh_authorized_keys root \\\n')
|
|
|
|
tmp_manifest.writelines(lines_list)
|
|
|
|
tmp_manifest.flush()
|
2017-08-28 09:40:59 +00:00
|
|
|
try:
|
2017-08-31 07:25:19 +00:00
|
|
|
cdist_instance_index = cdist_integration.instance_index
|
|
|
|
cdist_index = next(cdist_instance_index)
|
|
|
|
cdist_integration.configure_hosts_simple(hosts,
|
|
|
|
tmp_manifest.name,
|
|
|
|
index=cdist_index,
|
|
|
|
verbose=cdist.argparse.VERBOSE_TRACE)
|
|
|
|
cdist_instance_index.free(cdist_index)
|
2017-08-28 09:40:59 +00:00
|
|
|
except Exception as cdist_exception:
|
|
|
|
logger.error(cdist_exception)
|
|
|
|
return_value = False
|
|
|
|
return return_value
|