def duplicate_credential(request): if request.method == 'POST': # bail early if canceled if 'button' in request.POST and request.POST['button'] == "Cancel": messages.info(request, "No changes made.") return HttpResponseRedirect(webhelpers.url("/admin-pane/yabi/credential/?ids=%s" % (request.POST['ids']))) ids = [int(X) for X in request.POST.get('ids', '').split(',')] action = request.POST.get('action') success, fail = 0, 0 # duplicate if action == 'duplicate': for id in ids: cred = Credential.objects.get(id=id) try: cred.id = None cred.description = "%s (copy)" % cred.description cred.encrypted2protected(request.POST["password"]) cred.save() success += 1 except DecryptException: fail += 1 # cache if action == 'cache': for id in ids: cred = Credential.objects.get(id=id) try: cred.send_to_cache() success += 1 except DecryptException: # failed decrypt. not saved. fail += 1 msg = "%s credential%s successful. %s credential%s failed." % (success, "s" if success != 1 else "", fail, "s" if fail != 1 else "") # default is all successful level = messages.SUCCESS # no successes if fail and not success: level = messages.ERROR # some success if fail and success: level = messages.WARNING messages.add_message(request, level, msg) return HttpResponseRedirect(webhelpers.url("/admin-pane/yabi/credential/?ids=%s" % (request.POST['ids']))) else: return render_cred_password_form(request)
def render_form(form, error='Invalid login credentials'): return render_to_response('fe/login.html', RequestContext(request, { 'h': webhelpers, 'base_site_url': webhelpers.url("").rstrip("/"), 'form': form, 'error': error, 'show_dev_warning': show_dev_warning}))
def render_cred_password_form(request): ids = request.GET.get('ids', []) action = request.GET.get('action', None) render_data = {'h': webhelpers, 'return_url': webhelpers.url("/ws/manage_credential/"), 'ids': ids, 'request': request, 'LANGUAGE_CODE': "en", 'title': "%s Credential" % action.capitalize(), 'user': request.user, 'root_path': webhelpers.url("/"), 'action': action, 'plural': 's', } return render(request, 'yabi/crypt_password.html', render_data)
def render_cred_password_form(request): ids = request.GET.get('ids', []) action = request.GET.get('action', None) render_data = { 'h': webhelpers, 'return_url': webhelpers.url("/ws/manage_credential/"), 'ids': ids, 'request': request, 'LANGUAGE_CODE': "en", 'title': "%s Credential" % action.capitalize(), 'user': request.user, 'root_path': webhelpers.url("/"), 'action': action, 'plural': 's', } return render(request, 'yabi/crypt_password.html', render_data)
def tool(request, tool_id): tool = get_object_or_404(ToolDesc, pk=tool_id) return render(request, 'yabi/tool.html', { 'tool': tool, 'user': request.user, 'title': 'Tool Details', 'root_path': urlresolvers.reverse('admin:index'), 'edit_url': urlresolvers.reverse('admin:yabi_tooldesc_change', args=(tool.id,)), 'json_url': webhelpers.url('/ws/tooldesc/%s' % tool.id), 'tool_params': format_params(tool.toolparameter_set.order_by('id')), })
def login(request): # show a warning if using dev settings show_dev_warning = using_dev_settings() def render_form(form, error='Invalid login credentials'): return render_to_response('fe/login.html', RequestContext(request, { 'h': webhelpers, 'base_site_url': webhelpers.url("").rstrip("/"), 'form': form, 'error': error, 'show_dev_warning': show_dev_warning})) if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] # authenticate user = authenticate(username=username, password=password) if user is not None: if user.is_active: django_login(request, user) # for every credential for this user, call the login hook # currently creds will raise an exception if they can't be decrypted # this is logged but user can still log in as they may have other creds # that are still usable creds = Credential.objects.filter(user__name=username) for cred in creds: try: cred.on_login(username, password) except DecryptException: logger.error("Unable to decrypt credential `%s'" % cred.description) next_page = request.GET.get('next', webhelpers.url("/")) return HttpResponseRedirect(next_page) else: form = LoginForm() return render_form(form) else: return render_form(form) else: form = LoginForm() error = request.GET['error'] if 'error' in request.GET else '' return render_form(form, error)
def render_page(template, request, response=None, **kwargs): if not response: response = HttpResponse() # Check for the debug cookie or GET variable. debug = False if request.COOKIES.get("yabife-debug"): debug = True elif request.GET.get("yabife-debug"): debug = True response.set_cookie("yabife-debug", "1", path=webhelpers.url("/")) # Actually render the template. context = RequestContext(request, { "h": webhelpers, "settings": settings, "debug": debug, "base_site_url": webhelpers.url("").rstrip("/") }) context.update(kwargs) return render_to_response(template, context)
def status(request): def anyfn(fn, iterable): for e in iterable: if fn(e): return True return False render_data = { 'request': request, 'title': 'Admin Status', 'user': request.user, 'root_path': webhelpers.url("/"), 'settings': get_safe_settings(), } return render(request, 'yabi/admin_status.html', render_data)
def tool(request, tool_id): tool = get_object_or_404(ToolDesc, pk=tool_id) return render( request, 'yabi/tool.html', { 'tool': tool, 'user': request.user, 'title': 'Tool Details', 'root_path': urlresolvers.reverse('admin:index'), 'edit_url': urlresolvers.reverse('admin:yabi_tooldesc_change', args=(tool.id, )), 'json_url': webhelpers.url('/ws/tooldesc/%s' % tool.id), 'tool_params': format_params(tool.toolparameter_set.order_by('id')), })
def cache_credential(self, request, queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) return HttpResponseRedirect( webhelpers.url("/ws/manage_credential/?ids=%s&action=cache" % (",".join(selected))))
def logout(request): django_logout(request) return HttpResponseRedirect(webhelpers.url("/"))
def link_to_stageins_from_task(obj): return '<a href="%s?task__job__workflow__exact=%d&task__exact=%d">%s</a>' % (url('/admin-pane/yabiengine/stagein/'), obj.workflowid, obj.id, "Stageins")
def cache_credential(self, request, queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) return HttpResponseRedirect(webhelpers.url("/ws/manage_credential/?ids=%s&action=cache" % (",".join(selected))))
def link_to_syslog(self): return '<a href="%s?table_name=task&table_id=%d">%s</a>' % (url('/admin-pane/yabiengine/syslog/'), self.id, "Syslog")
def link_to_json(self): return '<a href="%s%d">%s</a>' % (url('/engine/task_json/'), self.id, "JSON")
def json(self): # formulate our status url and our error url # use the yabi embedded in this server statusurl = webhelpers.url("/engine/status/task/%d" % self.id) syslogurl = webhelpers.url("/engine/syslog/task/%d" % self.id) remoteidurl = webhelpers.url("/engine/remote_id/%d" % self.id) remoteinfourl = webhelpers.url("/engine/remote_info/%d" % self.id) # get our tools fs_backend fsscheme, fsbackend_parts = uriparse(self.job.fs_backend) logger.debug("getting fs backend for user: %s fs_backend:%s" % (self.job.workflow.user.name, self.job.fs_backend)) fs_backend = backendhelper.get_fs_backend_for_uri(self.job.workflow.user.name, self.job.fs_backend) logger.debug("fs backend is: %s" % fs_backend) # get out exec backend so we can get our submission script logger.debug("getting exec backendcredential for user: %s exec_backend:%s" % (self.job.workflow.user.name, self.job.exec_backend)) submission_backendcredential = backendhelper.get_exec_backendcredential_for_uri(self.job.workflow.user.name, self.job.exec_backend) logger.debug("exec backendcredential is: %s" % (submission_backendcredential)) submission_backend = submission_backendcredential.backend submission = submission_backendcredential.submission if str(submission_backend.submission).isspace() else submission_backend.submission # if the tools filesystem and the users stageout area are on the same schema/host/port # then use the preferred_copy_method, else default to 'copy' so_backend = backendhelper.get_fs_backend_for_uri(self.job.workflow.user.name, self.job.stageout) soscheme, sobackend_parts = uriparse(self.job.stageout) if so_backend == fs_backend and soscheme == fsscheme and sobackend_parts.hostname == fsbackend_parts.hostname and sobackend_parts.port == fsbackend_parts.port and sobackend_parts.username == fsbackend_parts.username: stageout_method = self.job.preferred_stageout_method else: stageout_method = "copy" output = { "yabiusername": self.job.workflow.user.name, "taskid": self.id, "statusurl": statusurl, "syslogurl": syslogurl, "remoteidurl": remoteidurl, "remoteinfourl": remoteinfourl, "stagein": [], "exec": { "command": self.command, "backend": url_join(self.job.exec_backend), "fsbackend": url_join(self.job.fs_backend, self.working_dir), "workingdir": os.path.join(fsbackend_parts.path, self.working_dir), "cpus": self.job.cpus, "walltime": self.job.walltime, "module": self.job.module, "queue": self.job.queue, "memory": self.job.max_memory, "jobtype": self.job.job_type, "tasknum": self.task_num, "tasktotal": self.job.task_total, "submission": submission }, "stageout": self.job.stageout + ("" if self.job.stageout.endswith("/") else "/") + ("" if not self.name else self.name + "/"), "stageout_method": stageout_method } for s in self.stagein_set.all(): src_scheme, src_rest = uriparse(s.src) dst_scheme, dst_rest = uriparse(s.dst) # method may be 'copy', 'lcopy' or 'link' output["stagein"].append({"src": s.src, "dst": s.dst, "order": s.order, "method": s.method}) return json.dumps(output)
def link_to_jobs(obj): return '<a href="%s?workflow__exact=%d">%s</a>' % (url('/admin-pane/yabiengine/job/'), obj.workflowid, "Jobs")
def link_to_tasks_from_job(obj): return '<a href="%s?job__workflow__exact=%d&job__exact=%d">%s</a>' % (url('/admin-pane/yabiengine/task/'), obj.workflowid, obj.id, "Tasks")
def duplicate_credential(request): if request.method == 'POST': # bail early if canceled if 'button' in request.POST and request.POST['button'] == "Cancel": messages.info(request, "No changes made.") return HttpResponseRedirect( webhelpers.url("/admin-pane/yabi/credential/?ids=%s" % (request.POST['ids']))) ids = [int(X) for X in request.POST.get('ids', '').split(',')] action = request.POST.get('action') success, fail = 0, 0 # duplicate if action == 'duplicate': for id in ids: cred = Credential.objects.get(id=id) try: cred.id = None cred.description = "%s (copy)" % cred.description cred.encrypted2protected(request.POST["password"]) cred.save() success += 1 except DecryptException: fail += 1 # cache if action == 'cache': for id in ids: cred = Credential.objects.get(id=id) try: cred.send_to_cache() success += 1 except DecryptException: # failed decrypt. not saved. fail += 1 msg = "%s credential%s successful. %s credential%s failed." % ( success, "s" if success != 1 else "", fail, "s" if fail != 1 else "") # default is all successful level = messages.SUCCESS # no successes if fail and not success: level = messages.ERROR # some success if fail and success: level = messages.WARNING messages.add_message(request, level, msg) return HttpResponseRedirect( webhelpers.url("/admin-pane/yabi/credential/?ids=%s" % (request.POST['ids']))) else: return render_cred_password_form(request)
def link_to_syslog_from_task(obj): return '<a href="%s?table_name=task&table_id=%d">%s</a>' % (url('/admin-pane/yabiengine/syslog/'), obj.id, "Syslog")
'kombu.transport.django', 'django_extensions', 'djamboloader', 'django.contrib.admin', 'anymail', ] # see: https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf ROOT_URLCONF = 'yabi.urls' # cookies # see: https://docs.djangoproject.com/en/dev/ref/settings/#session-cookie-age # see: https://docs.djangoproject.com/en/dev/ref/settings/#csrf-cookie-name # you SHOULD change the cookie to use HTTPONLY and SECURE when in production SESSION_COOKIE_AGE = env.get("session_cookie_age", 60 * 60) SESSION_COOKIE_PATH = url('/') SESSION_SAVE_EVERY_REQUEST = env.get("session_save_every_request", True) SESSION_COOKIE_HTTPONLY = SESSION_COOKIE_HTTPONLY = env.get("session_cookie_httponly", True) SESSION_COOKIE_SECURE = env.get("session_cookie_secure", PRODUCTION) SESSION_COOKIE_NAME = env.get("session_cookie_name", "yabi_{0}".format(url('/').replace("/", ""))) SESSION_COOKIE_DOMAIN = env.get("session_cookie_domain", "") or None CSRF_COOKIE_NAME = env.get("csrf_cookie_name", "csrf_{0}".format(SESSION_COOKIE_NAME)) CSRF_COOKIE_DOMAIN = env.get("csrf_cookie_domain", "") or SESSION_COOKIE_DOMAIN CSRF_COOKIE_PATH = env.get("csrf_cookie_path", SESSION_COOKIE_PATH) CSRF_COOKIE_SECURE = env.get("csrf_cookie_secure", PRODUCTION) CSRF_COOKIE_HTTPONLY = env.get("csrf_cookie_httponly", False) # Locale # see: https://docs.djangoproject.com/en/dev/ref/settings/#time-zone # https://docs.djangoproject.com/en/dev/ref/settings/#language-code # https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n