def get_user(self, user_id): try: # Fetch user. user = User.objects.get(pk=user_id) except User.DoesNotExist: user = None else: # Does the user have a current session? if user.vac_cookie is None or user.last_validation is None: user = None # Is a revalidation needed? elif user.last_validation < ( timezone.now() - datetime.timedelta(seconds=REVALIDATION_FREQUENCY)): # Check session against the VAC. try: vac = VAC(user.vac_cookie) if vac.validate_session(): # Update VAC cookie info. user.last_validation = timezone.now() user.save() else: # Session is no longer valid. user.vac_cookie = None user.save() user = None # Problems revalidating. VAC unavailable? Log out user. except VAC.Exception as e: user = None logging.getLogger('vac-templater').exception(e) # Done! return user
def authenticate(self, username=None, password=None): # Authenticate against the VAC. vac = VAC() if vac.login(username, password): # Recover or build user instance. try: user = User.objects.get(username=username) except User.DoesNotExist: user = User(username=username) # Update VAC cookie info. user.vac_cookie = vac.cookie user.last_validation = timezone.now() user.save() # Done! return user return None
def irun(self, username, group_id, vcl_commit_id, vcl_content, changes): deployment = None error = None try: try: user = User.objects.get(pk=username) except User.DoesNotExist: error = _('Error retrieving the current user. Reconnect and ' 'try again.') else: if user.vac_cookie: try: vac = VAC(user.vac_cookie) group = vac.group(group_id) if group: vcl = vac.vcl(group.active_vcl) if vcl: vcl_commit = vac.vcl_head(vcl.id) if vcl_commit: if vcl_commit.id == vcl_commit_id: # Push VCL. result = vac.vcl_push( vcl.id, vcl_content, group.id, vcl_commit_id) if result['success']: # Keep track of this deployment. deployment = Deployment( user=user, group_name=group.name, group_oid=group.id, branch_name=vcl.name, branch_oid=vcl.id, old_head_oid=vcl_commit.id, new_head_oid=result['vcl'].id, vcl=result['vcl'].content, message=result['message'], changes=changes) deployment.save() # Notify by e-mail. send_templated_mail( template_name= 'emails/vcl/deploy.email', from_email=settings. DEFAULT_FROM_EMAIL, to=[ admin[1] for admin in settings.ADMINS ], bcc=settings. DEFAULT_BCC_EMAILS, context={ 'base_url': settings.BASE_URL, 'deployment': deployment, }, ) else: error = result['message'] else: error = _( 'The VCL has been modified while ' 'you were updating it! Please, ' 'redo all required changes and ' 'try again.') else: error = _( 'The VCL has been undeployed from ' 'this group while you were updating ' 'it! No changes have been made.') else: error = _( 'The VCL has been undeployed from this ' 'group while you were updating it! No ' 'changes have been made.') else: error = _('The selected group no longer exists.') except VAC.AuthenticationException: error = _('Your session in the VAC has been ' 'automatically expired. Reconnect and try' 'again.') except VAC.Exception as e: logging.getLogger('vac-templater').exception(e) error = _('Failed to connect to the VAC. Is it ' 'running? Do you have r/w access to it?') else: error = _('You must be authenticated to the VAC. ' 'Reconnect and try again.') except Exception as e: error = 'Exception: %s' % e return { 'deployment_id': deployment.id if deployment else None, 'error': error, }
def irun(self, username, group_id, vcl_commit_id, vcl_content, changes): deployment = None error = None try: try: user = User.objects.get(pk=username) except User.DoesNotExist: error = _("Error retrieving the current user. Reconnect and " "try again.") else: if user.vac_cookie: try: vac = VAC(user.vac_cookie) group = vac.group(group_id) if group: vcl = vac.vcl(group.active_vcl) if vcl: vcl_commit = vac.vcl_head(vcl.id) if vcl_commit: if vcl_commit.id == vcl_commit_id: # Push VCL. result = vac.vcl_push(vcl.id, vcl_content, group.id, vcl_commit_id) if result["success"]: # Keep track of this deployment. deployment = Deployment( user=user, group_name=group.name, group_oid=group.id, branch_name=vcl.name, branch_oid=vcl.id, old_head_oid=vcl_commit.id, new_head_oid=result["vcl"].id, vcl=result["vcl"].content, message=result["message"], changes=changes, ) deployment.save() # Notify by e-mail. send_templated_mail( template_name="emails/vcl/deploy.email", from_email=settings.DEFAULT_FROM_EMAIL, to=[admin[1] for admin in settings.ADMINS], bcc=settings.DEFAULT_BCC_EMAILS, context={"base_url": settings.BASE_URL, "deployment": deployment}, ) else: error = result["message"] else: error = _( "The VCL has been modified while " "you were updating it! Please, " "redo all required changes and " "try again." ) else: error = _( "The VCL has been undeployed from " "this group while you were updating " "it! No changes have been made." ) else: error = _( "The VCL has been undeployed from this " "group while you were updating it! No " "changes have been made." ) else: error = _("The selected group no longer exists.") except VAC.AuthenticationException: error = _( "Your session in the VAC has been " "automatically expired. Reconnect and try" "again." ) except VAC.Exception as e: logging.getLogger("vac-templater").exception(e) error = _("Failed to connect to the VAC. Is it " "running? Do you have r/w access to it?") else: error = _("You must be authenticated to the VAC. " "Reconnect and try again.") except Exception as e: error = "Exception: %s" % e return {"deployment_id": deployment.id if deployment else None, "error": error}
def _process(self, request): cache_group_form = None deploy_form = None try: vac = VAC(request.user.vac_cookie) # Cache group selected? cache_group_form = CacheGroupForm( vac, prefix='cache-group', data=request.POST or None) if cache_group_form.is_bound and cache_group_form.is_valid(): # Deploying? deploying = (request.POST.get('op') == 'deploy') deploy_form = DeployForm( vac, cache_group_form.cleaned_data['group'], request.user, prefix='settings', data=request.POST if deploying else None) if deploy_form.is_bound: if deploy_form.is_valid(): if deploy_form.changes: deploy_form.execute() token = tasks.enqueue( request, PushVCLTask, request.user.username, deploy_form.group.id, deploy_form.vcl_commit.id, deploy_form.new_vcl, deploy_form.changes, callback={ 'fn': ( 'vac_templater.views.vcl.Deploy', 'callback', ), 'context': {}, }) return HttpResponseAjax([ commands.show_progress(token), ], request) else: messages.warning( request, _('No changes have been done to the settings. ' 'There is no new VCL to be deployed.')) else: if deploy_form.non_field_errors(): for error in deploy_form.non_field_errors(): messages.error(request, error) else: messages.error( request, _('There are some errors in the values you ' 'supplied. Please, fix them and try again.')) # Unauthenticated VAC request. except VAC.AuthenticationException: messages.error(request, _( 'Your session has automatically expired. Please, log in ' 'again.')) # Clear VAC cookie info. request.user.vac_cookie = None request.user.save() # Logout locally. auth.logout(request) return HttpResponseRedirect(reverse('home')) # Failed VAC request. except VAC.Exception as e: logging.getLogger('vac-templater').exception(e) messages.error(request, _( 'Failed to connect to the VAC. Is it running? Do you have r/w ' 'access to it?')) return { 'template': 'vac-templater/vcl/deploy.html', 'context': { 'cache_group_form': cache_group_form, 'deploy_form': deploy_form, }, }