| 
									
										
										
										
											2017-09-13 02:41:19 +05:30
										 |  |  | import tempfile | 
					
						
							| 
									
										
										
										
											2017-09-01 02:33:31 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | import cdist | 
					
						
							| 
									
										
										
										
											2017-08-31 15:05:45 +02:00
										 |  |  | from cdist.integration import configure_hosts_simple | 
					
						
							| 
									
										
										
										
											2017-09-01 02:33:31 +05:30
										 |  |  | from celery.result import AsyncResult | 
					
						
							| 
									
										
										
										
											2017-09-15 13:09:46 +02:00
										 |  |  | from celery import current_task | 
					
						
							| 
									
										
										
										
											2017-08-28 11:40:59 +02:00
										 |  |  | from celery.utils.log import get_task_logger | 
					
						
							|  |  |  | from django.conf import settings | 
					
						
							| 
									
										
										
										
											2017-08-27 15:23:19 +05:30
										 |  |  | from django.core.mail import EmailMessage | 
					
						
							| 
									
										
										
										
											2017-08-28 11:40:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from dynamicweb.celery import app | 
					
						
							| 
									
										
										
										
											2017-08-28 12:25:39 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | logger = get_task_logger(__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-27 15:23:19 +05:30
										 |  |  | @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 12:10:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 12:25:39 +05:30
										 |  |  | @app.task(bind=True, max_retries=settings.CELERY_MAX_RETRIES) | 
					
						
							| 
									
										
										
										
											2017-08-31 18:57:05 +02:00
										 |  |  | def save_ssh_key(self, hosts, keys): | 
					
						
							| 
									
										
										
										
											2017-08-28 12:25:39 +05:30
										 |  |  |     """
 | 
					
						
							|  |  |  |     Saves ssh key into the VMs of a user using cdist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     :param hosts: A list of hosts to be configured | 
					
						
							| 
									
										
										
										
											2017-08-30 09:44:33 +02: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 12:25:39 +05:30
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2017-09-15 13:09:46 +02:00
										 |  |  |     logger.debug( | 
					
						
							|  |  |  |         "Running save_ssh_key on {}".format(current_task.request.hostname)) | 
					
						
							| 
									
										
										
										
											2017-09-14 15:27:25 +02:00
										 |  |  |     logger.debug("""Running save_ssh_key task for
 | 
					
						
							| 
									
										
										
										
											2017-08-31 15:05:45 +02:00
										 |  |  |                     Hosts: {hosts_str} | 
					
						
							| 
									
										
										
										
											2017-08-31 18:57:05 +02:00
										 |  |  |                     Keys: {keys_str}""".format(hosts_str=", ".join(hosts),
 | 
					
						
							|  |  |  |                                                keys_str=", ".join([ | 
					
						
							|  |  |  |                                                    "{value}->{state}".format( | 
					
						
							|  |  |  |                                                        value=key.get('value'), | 
					
						
							|  |  |  |                                                        state=str( | 
					
						
							|  |  |  |                                                            key.get('state'))) | 
					
						
							|  |  |  |                                                    for key in keys])) | 
					
						
							| 
									
										
										
										
											2017-08-31 15:05:45 +02:00
										 |  |  |                  ) | 
					
						
							| 
									
										
										
										
											2017-08-28 11:40:59 +02:00
										 |  |  |     return_value = True | 
					
						
							| 
									
										
										
										
											2017-08-29 18:15:23 +02:00
										 |  |  |     with tempfile.NamedTemporaryFile(delete=True) as tmp_manifest: | 
					
						
							| 
									
										
										
										
											2017-08-28 11:40:59 +02:00
										 |  |  |         # Generate manifest to be used for configuring the hosts | 
					
						
							| 
									
										
										
										
											2017-08-30 09:44:33 +02: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 18:15:23 +02:00
										 |  |  |         lines_list.insert(0, b'__ssh_authorized_keys root \\\n') | 
					
						
							|  |  |  |         tmp_manifest.writelines(lines_list) | 
					
						
							|  |  |  |         tmp_manifest.flush() | 
					
						
							| 
									
										
										
										
											2017-08-28 11:40:59 +02:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2017-08-31 15:05:45 +02:00
										 |  |  |             configure_hosts_simple(hosts, | 
					
						
							|  |  |  |                                    tmp_manifest.name, | 
					
						
							|  |  |  |                                    verbose=cdist.argparse.VERBOSE_TRACE) | 
					
						
							| 
									
										
										
										
											2017-08-28 11:40:59 +02:00
										 |  |  |         except Exception as cdist_exception: | 
					
						
							|  |  |  |             logger.error(cdist_exception) | 
					
						
							|  |  |  |             return_value = False | 
					
						
							| 
									
										
										
										
											2017-09-13 07:45:16 +05:30
										 |  |  |             email_data = { | 
					
						
							|  |  |  |                 'subject': "celery save_ssh_key error - task id {0}".format( | 
					
						
							|  |  |  |                     self.request.id.__str__()), | 
					
						
							| 
									
										
										
										
											2017-09-15 13:09:46 +02:00
										 |  |  |                 'from_email': current_task.request.hostname, | 
					
						
							|  |  |  |                 'to': settings.DCL_ERROR_EMAILS_TO_LIST, | 
					
						
							| 
									
										
										
										
											2017-09-13 07:45:16 +05:30
										 |  |  |                 'body': "Task Id: {0}\nResult: {1}\nTraceback: {2}".format( | 
					
						
							|  |  |  |                     self.request.id.__str__(), False, str(cdist_exception)), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             send_plain_email_task(email_data) | 
					
						
							| 
									
										
										
										
											2017-08-28 11:40:59 +02:00
										 |  |  |     return return_value | 
					
						
							| 
									
										
										
										
											2017-09-01 02:33:31 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @app.task | 
					
						
							|  |  |  | def save_ssh_key_error_handler(uuid): | 
					
						
							|  |  |  |     result = AsyncResult(uuid) | 
					
						
							|  |  |  |     exc = result.get(propagate=False) | 
					
						
							|  |  |  |     logger.error('Task {0} raised exception: {1!r}\n{2!r}'.format( | 
					
						
							|  |  |  |         uuid, exc, result.traceback)) | 
					
						
							|  |  |  |     email_data = { | 
					
						
							|  |  |  |         'subject': "[celery error] Save SSH key error {0}".format(uuid), | 
					
						
							| 
									
										
										
										
											2017-09-15 13:09:46 +02:00
										 |  |  |         'from_email': current_task.request.hostname, | 
					
						
							|  |  |  |         'to': settings.DCL_ERROR_EMAILS_TO_LIST, | 
					
						
							| 
									
										
										
										
											2017-09-01 02:33:31 +05:30
										 |  |  |         'body': "Task Id: {0}\nResult: {1}\nTraceback: {2}".format( | 
					
						
							|  |  |  |             uuid, exc, result.traceback), | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     send_plain_email_task(email_data) |