Example #1
0
def additional_context(request):
    context = {}

    if 'datasource_profile_id' in request.session:
        rest_datasource = RestDatasourceProfile(username=request.user.username)
        profile = rest_datasource.get(request.session['datasource_profile_id'])
        if 'identification' in profile:
            title = _(profile['pluginName'] + " - %(account)s") % {'account': profile['identification']}
        else:
            title = profile['title']
        profile['good_title'] = title
        context['datasource_profile'] = profile

    if 'datasink_profile_id' in request.session:
        rest_datasink = RestDatasinkProfile(username=request.user.username)
        profile = rest_datasink.get(request.session['datasink_profile_id'])
        if 'identification' in profile:
            title = _(profile['pluginName'] + " - %(account)s") % {'account': profile['identification']}
        else:
            title = profile['title']
        profile['good_title'] = title
        context['datasink_profile'] = profile

    context['search_form'] = SearchForm(request.POST or None)

    return context
Example #2
0
    def __init__(self, *args, **kwargs):
        self.extra_data = kwargs.pop('extra_data')
        super(JobCreateForm, self).__init__(*args, **kwargs)
        
        rest_datasource_profile = RestDatasourceProfile(username=self.extra_data['username'])
        result = rest_datasource_profile.options(profile_id=self.extra_data['datasource_profile_id'], 
            data={'keyRing': self.extra_data['key_ring']})
        
        if result and 'sourceOptions' in result:
            for i, item in enumerate(result['sourceOptions']):
                self.fields['datasource_options_value_%s' % i] = forms.BooleanField(label=item, required=False)
                self.fields['datasource_options_key_%s' % i] = forms.CharField(widget=forms.HiddenInput, initial=item)
        
        rest_actions = RestAction()
        actions = rest_actions.get_all()
        
        for i, action in enumerate(actions):
            if action.get('visibility', "") == "job":
                action['options'] = rest_actions.options(action_id=action['actionId'])
            
                self.fields['actions_value_%d' % i] = forms.BooleanField(label=_(action['title']), required=False, help_text=_(action['description']))
                self.fields['actions_key_%d' % i] = forms.CharField(widget=forms.HiddenInput, initial=action['actionId'])
            
                for j, option in enumerate(action['options']):
                    self.fields['actions_value_%d_option_%d' % (i, j)] = forms.CharField(label=_(option), required=False, widget=forms.PasswordInput)
		    self.fields['actions_value_%d_option_%d' % (i, j)].initial = ""
                    self.fields['actions_key_%d_option_%d' % (i, j)] = forms.CharField(widget=forms.HiddenInput, initial=option)
Example #3
0
def index(request):
    context = additional_context(request)
    if request.user.is_authenticated():

        ### delete job form start
        job_delete_form = JobDeleteForm(request.POST or None)
        if job_delete_form.is_valid():
            result = job_delete_form.rest_save(username=request.user.username)
            if result:
                messages.add_message(request, messages.SUCCESS, _(u'Backup was successfully deleted.'))
            else:
                messages.add_message(request, messages.ERROR, _(u'Backup couldn\'t be deleted.'))
        context['job_delete_form'] = job_delete_form

        rest_jobs = RestJobs(username=request.user.username)
        jobs = rest_jobs.get_all()
        #### delete job form end

        if jobs and 'errorType' in jobs:
            if jobs['errorType'] == 'org.backmeup.model.exceptions.UnknownUserException':
                logout(request)
                redirect('index')
            else:
                messages.error(request, _(jobs['errorMessage']))
                context['needs_email_validation'] = True
        else:
            rest_datasource_profile = RestDatasourceProfile(username=request.user.username)
            datasource_profiles = rest_datasource_profile.get_all()

            rest_datasink_profile = RestDatasinkProfile(username=request.user.username)
            datasink_profiles = rest_datasink_profile.get_all()

            for job in jobs:
                # need to cut of first 3 numbers to get valid unix timestamp
                if 'createDate' in job:
                    job['createDate'] = datetime.datetime.fromtimestamp(job['createDate']/1000)
                if 'startDate' in job:
                    job['startDate'] = datetime.datetime.fromtimestamp(job['startDate']/1000)
                if 'lastBackup' in job:
                    job['lastBackup'] = datetime.datetime.fromtimestamp(job['lastBackup']/1000)
                if 'nextBackup' in job:
                    job['nextBackup'] = datetime.datetime.fromtimestamp(job['nextBackup']/1000)
                if 'lastSuccessful' in job:
                    job['lastSuccessful'] = datetime.datetime.fromtimestamp(job['lastSuccessful']/1000)
                
                job['datasink']['title'] = get_sink_title(datasink_profiles, job['datasink']['datasinkId'])
                #job['datasources'] = []
                for datasource in job['datasources']:
                    datasource['title'] = get_source_title(datasource_profiles, datasource['datasourceId'])
            context['jobs'] = jobs

    return render_to_response(
        "www/index.html",
        context,
        context_instance=RequestContext(request))
Example #4
0
def datasource_auth(request):
    
    if request.session['auth_data']['type'] == 'Input':
        # make sure 'requiredInputs' (= list of dicts) is sorted by 'order' dict value(s)
        request.session['auth_data']['requiredInputs'] = sorted(request.session['auth_data']['requiredInputs'], key=lambda k: k['order'])
    
    extra_data = {
        'auth_data': request.session['auth_data'],
    }
    
    form = DatasourceAuthForm(request.POST or None, extra_data=extra_data)
    
    # redirect to next step if there is no authentication needed...
    # ... basically means auth type is 'Input' but there are noe input fields definded
    if not form.fields and request.session['auth_data']['type'] == 'Input':
        request.session['datasource_profile_id'] = request.session['auth_data']['profileId']
        return redirect('datasink-select')
    
    # the form won't be valid if auth type is OAuth
    # so form.is_valid() works for auth type Input only.
    if form.is_valid() or request.session['auth_data']['type'] == 'OAuth':
        data = {
            "keyRing": request.session['key_ring'],
        }
        
        if request.session['auth_data']['type'] == 'Input':
            for key in form.cleaned_data:
                if key.startswith('input_key_'):
                    value = form.cleaned_data[key.replace('input_key_', 'input_value_')]
                    data[form.cleaned_data[key]] = value
        elif request.session['auth_data']['type'] == 'OAuth':
            data.update(request.session['auth_data']['oauth_data'])
        
        # add authentication data to newly created datasource profile
        rest_datasource_profile = RestDatasourceProfile(username=request.user.username)
        result = rest_datasource_profile.auth_post(profile_id=request.session['auth_data']['profileId'], data=data)
        
        if hasError(result):
            del request.session['auth_data']
            messages.add_message(request, messages.ERROR, getErrorMsg(result))
            return redirect('datasource-select')
        else:
            request.session['datasource_profile_id'] = request.session['auth_data']['profileId']
            del request.session['auth_data']
            return redirect('datasink-select')
    
    context = additional_context(request)
    context['form'] = form

    return render_to_response(
        "www/datasource_auth.html",
        context,
        context_instance=RequestContext(request))
Example #5
0
def job_log(request, job_id):
    rest_jobs = RestJobs(username=request.user.username)
    job_status = rest_jobs.get_job_status(job_id=job_id)

    rest_jobs = RestJobs(username=request.user.username)
    jobs = rest_jobs.get_all()

    job = get_job(jobs, job_id=job_id)

    rest_datasource_profile = RestDatasourceProfile(username=request.user.username)
    datasource_profiles = rest_datasource_profile.get_all()

    rest_datasink_profile = RestDatasinkProfile(username=request.user.username)
    datasink_profiles = rest_datasink_profile.get_all()

    job['datasink']['title'] = get_sink_title(datasink_profiles, job['datasink']['datasinkId'])
    #job['datasources'] = []
    for datasource in job['datasources']:
        datasource['title'] = get_source_title(datasource_profiles, datasource['datasourceId'])
    log=job_status['backupStatus']
    for l in log:
	l['message']=l['message'].encode("utf-8")
	if 'timeStamp' in l:
		l['timeStamp'] = datetime.datetime.fromtimestamp(int(l['timeStamp'])/1000)
    context = {
        'job': job,
        'log': log,
    }
    try:
        context['current_status'] = job_status['backupStatus'][0]['type']
    except:
        pass

    return render_to_response(
        "www/job_log.html",
        context,
        context_instance=RequestContext(request))
Example #6
0
def job_edit(request, job_id):
    rest_jobs = RestJobs(username=request.user.username)
    job = rest_jobs.get(job_id=job_id)
    
    datasource_profile_id = job['sourceProfiles'][0]['id']
    datasink_profile_id = job['sinkProfileId']
    
    rest_datasource_profile = RestDatasourceProfile(username=request.user.username)
    datasource_profile_options = rest_datasource_profile.options(profile_id=datasource_profile_id, 
        data={'keyRing': request.session['key_ring']})['sourceOptions']
    
    rest_actions = RestAction()
    actions = rest_actions.get_all()
    
    for action in actions:
        action['options'] = rest_actions.options(action_id=action['actionId'])
        action['checked'] = False
        
        for job_action in job['actions']:
            if job_action['id'] == action['actionId']:
                action['checked'] = True
    
    extra_data = {
        'job': job,
        'datasource_profile_options': datasource_profile_options,
        'actions': actions,
    }
    
    form = JobEditForm(request.POST or None, extra_data=extra_data)
    
    if form.is_valid():
        new_source_options = []
        new_actions = []

        for key in form.cleaned_data:

            if key.startswith('datasource_options_value_') and form.cleaned_data[key]:
                new_source_options.append(form.cleaned_data[key.replace('_value_', '_key_')])

            if key.startswith('actions_value_') and form.cleaned_data[key]:
                value = form.cleaned_data[key.replace('_value_', '_key_')]
                new_actions.append(value)

        rest_jobs = RestJobs(username=request.user.username)
        data = {
            "keyRing": request.session['key_ring'],
            'timeExpression': form.cleaned_data['time_expression'],
            'sourceProfiles': datasource_profile_id,
            'sinkProfileId': datasink_profile_id,
            'jobTitle': form.cleaned_data['title'],
            'actions': new_actions,
        }
        for item in new_source_options:
            params_key = str(data['sourceProfiles']) + "." + item
            data[params_key] = "true"
        job_result = rest_jobs.put(job_id=job_id ,data=data)
        if hasError(job_result):
            messages.add_message(request, messages.ERROR, getErrorMsg(job_result))
        else:
            return redirect('index')
    
    return render_to_response("www/job_edit.html", {
        'form': form,
    }, context_instance=RequestContext(request))
Example #7
0
def datasource_select(request):
    try:
        del request.session['datasource_profile_id']
        del request.session['datasink_profile_id']
    except Exception:
        pass
    
    rest_datasource = RestDatasource()
    datasources = rest_datasource.get_all()
    datasource_choices = []
    for item in datasources:
        datasource_choices.append((item['datasourceId'], _(item['title'])))
    
    rest_datasource_profile = RestDatasourceProfile(username=request.user.username)
    datasource_profiles = rest_datasource_profile.get_all()
    datasource_profile_choices = []
    if len(datasource_profiles):
        for item in datasource_profiles:
            # no need to show profiles without 'identification'
            # * it's not a completely authenticated profile
            # * it's a profile whitch doesn't require authentication
            if 'identification' in item:
                title = _(item['pluginName'] + " - %(account)s") % {'account': item['identification']}
                datasource_profile_choices.append( (item['datasourceProfileId'], title) )
    if len(datasource_profile_choices):
        datasource_profile_choices = [("", "---")] + datasource_profile_choices
    
    extra_data = {
        'datasource_choices': datasource_choices,
        'datasource_profile_choices': datasource_profile_choices,
    }
    
    form = DatasourceSelectForm(request.POST or None, extra_data=extra_data)
    
    if form.is_valid():
        if form.cleaned_data['datasource']:
            rest_datasource_profile = RestDatasourceProfile(username=request.user.username)
            profile_name = _("%(plugin)s - profile") % {'plugin': form.cleaned_data['datasource']}
            data = {
                "profileName": profile_name,
                "keyRing": request.session['key_ring'],
            }
            result = rest_datasource_profile.auth(datasource_id=form.cleaned_data['datasource'], data=data)
            
            if hasError(result):
                messages.add_message(request, messages.ERROR, _(getErrorMsg(result)))
            else:
                request.session['auth_data'] = result
                if result['type'] == 'OAuth':
                    request.session['next_step'] = 'datasource-auth'
                    return redirect(result['redirectURL'])
                return redirect('datasource-auth')

        elif form.cleaned_data['datasource_profile']:
            request.session['datasource_profile_id'] = form.cleaned_data['datasource_profile']
            try:
                del request.session['auth_data']
            except Exception:
                pass
            return redirect('datasink-select')
        
    context = additional_context(request)
    context['form'] = form

    return render_to_response(
        "www/datasource_select.html",
        context,
        context_instance=RequestContext(request))