Exemplo n.º 1
0
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)
Exemplo n.º 2
0
 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}))
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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')),
    })
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
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)
Exemplo n.º 10
0
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')),
        })
Exemplo n.º 11
0
 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))))
Exemplo n.º 12
0
def logout(request):
    django_logout(request)
    return HttpResponseRedirect(webhelpers.url("/"))
Exemplo n.º 13
0
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")
Exemplo n.º 14
0
Arquivo: admin.py Projeto: muccg/yabi
 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))))
Exemplo n.º 15
0
 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")
Exemplo n.º 16
0
 def link_to_json(self):
     return '<a href="%s%d">%s</a>' % (url('/engine/task_json/'), self.id, "JSON")
Exemplo n.º 17
0
    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)
Exemplo n.º 18
0
def link_to_jobs(obj):
    return '<a href="%s?workflow__exact=%d">%s</a>' % (url('/admin-pane/yabiengine/job/'), obj.workflowid, "Jobs")
Exemplo n.º 19
0
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")
Exemplo n.º 20
0
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)
Exemplo n.º 21
0
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")
Exemplo n.º 22
0
    '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