Ejemplo n.º 1
0
def dc_domain_list(request):
    """
    DNS Domain/Record <-> Dc management.
    """
    user, dc = request.user, request.dc
    domains = Domain.objects.order_by('name')
    dc_domain_ids = list(
        request.dc.domaindc_set.values_list('domain_id', flat=True))
    context = collect_view_data(request, 'dc_domain_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(
        request, DnsAdminPermission.name)
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['deleted'] = _deleted = can_edit and request.GET.get(
        'deleted', False)
    qs = get_query_string(request, all=_all, deleted=_deleted)
    qs.pop('domain', None)
    context['qs'] = qs = qs.urlencode()

    if _deleted:
        domains = domains.exclude(access=Domain.INTERNAL)
    else:
        domains = domains.exclude(access__in=Domain.INVISIBLE)

    if can_edit:
        domains = domains.annotate(records=Count('record', distinct=True))

    if _all:
        context['domains'] = prefetch_domain_dcs(
            prefetch_domain_owner(domains))
    else:
        context['domains'] = prefetch_domain_owner(
            domains.filter(id__in=dc_domain_ids))

    if is_staff:
        if _all:  # Uses set() because of optimized membership ("in") checking
            context['can_add'] = set(
                Domain.objects.exclude(id__in=dc_domain_ids).values_list(
                    'id', flat=True))
        else:
            context['can_add'] = Domain.objects.exclude(
                id__in=dc_domain_ids).count()

        # Only SuperAdmins can create and edit domains
        context['form_dc'] = DcDomainForm(request, domains)
        context['form_admin'] = AdminDomainForm(request,
                                                None,
                                                prefix='adm',
                                                initial={
                                                    'owner': user.username,
                                                    'access': Domain.PRIVATE,
                                                    'dc_bound': not is_staff
                                                })
        context['url_form_dc'] = reverse('dc_domain_form', query_string=qs)
        context['url_form_admin'] = reverse('admin_domain_form',
                                            query_string=qs)

    return render(request, 'gui/dc/domain_list.html', context)
Ejemplo n.º 2
0
def dc_image_list(request):
    """
    Image<->Dc management + Image management.
    """
    user, dc = request.user, request.dc
    imgs = Image.objects.order_by('name')
    context = collect_view_data(request, 'dc_image_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(
        request, ImageAdminPermission.name)
    context['can_import'] = is_staff or (can_edit and user.has_permission(
        request, ImageImportAdminPermission.name))
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['deleted'] = _deleted = can_edit and request.GET.get(
        'deleted', False)
    context['qs'] = qs = get_query_string(request, all=_all,
                                          deleted=_deleted).urlencode()
    context['task_id'] = request.GET.get('task_id', '')
    context['image_vm'] = ImageVm.get_uuid()

    if _deleted:
        imgs = imgs.exclude(access=Image.INTERNAL)
    else:
        imgs = imgs.exclude(access__in=Image.INVISIBLE)

    if _all:
        context['images'] = imgs.select_related(
            'owner', 'dc_bound').prefetch_related('dc').all()
    else:
        context['images'] = imgs.select_related('owner',
                                                'dc_bound').filter(dc=dc)

    if is_staff:
        if _all:  # Uses set() because of optimized membership ("in") checking
            context['can_add'] = set(
                imgs.exclude(dc=dc).values_list('pk', flat=True))
        else:
            context['can_add'] = imgs.exclude(dc=dc).count()

        context['form_dc'] = ImageForm(request, imgs)
        context['url_form_dc'] = reverse('dc_image_form', query_string=qs)

    if can_edit:
        context['url_form_admin'] = reverse('admin_image_form',
                                            query_string=qs)
        context['form_admin'] = AdminImageForm(request,
                                               None,
                                               prefix='adm',
                                               initial={
                                                   'owner': user.username,
                                                   'access': Image.PRIVATE,
                                                   'dc_bound': not is_staff
                                               })

    return render(request, 'gui/dc/image_list.html', context)
Ejemplo n.º 3
0
def backups(request, hostname):
    """
    List of server backups stored on this node.
    """
    context = collect_view_data(request, 'node_list')
    context['node'] = node = get_node(request, hostname)
    context['nodes'] = (node, )
    context['node_online'] = node.is_online()
    context['submenu_auto'] = ''
    context['lastbkp'] = []
    context['can_edit'] = True
    context['bkp_node'] = True
    context['last_bkpid'] = request.GET.get('last_bkpid', None)

    # This could change the current DC
    _backup_list_context(request, node, context)

    context['bkpform_update'] = UpdateBackupForm(None, prefix='snap_update')
    context['bkpform_restore'] = RestoreBackupForm(
        get_vms(request, sr=(), prefetch_tags=False))
    context['update_mod_source'] = reverse('node_backup_form',
                                           node.hostname,
                                           query_string=context['qs'])

    return render(request, 'gui/node/backups.html', context)
Ejemplo n.º 4
0
def _backup_list_context(request, node, context, vm_hostname=None):
    """Helper of returning list of backups including filters"""
    context['filters'] = filter_form = BackupFilterForm(
        request, node, request.GET)
    bkps = node.backup_set.select_related('vm', 'dc')
    qs = QueryDict('', mutable=True)

    if filter_form.is_valid() and filter_form.has_changed():
        q = filter_form.get_filters()

        if q:
            qs = request.GET
            bkps = bkps.filter(q)

            if filter_form.vm:
                dc_switch(request, filter_form.vm.dc.name)

    if filter_form.all_vm:
        qs_novm = qs.copy()
        qs_novm.pop('hostname', None)
        context['node_vm_backup_url'] = reverse('node_backups',
                                                node.hostname,
                                                query_string=qs_novm)
    else:
        qs_nopage = qs.copy()
        qs_nopage.pop('page', None)
        context['qs_nopage'] = qs_nopage.urlencode()

    context['qs'] = qs
    context['vm'] = filter_form.vm
    context['no_vm'] = filter_form.no_vm
    context.update(get_node_backups(request, bkps))

    return context
Ejemplo n.º 5
0
def dc_group_list(request):
    """
    Group -> Dc group management.
    """
    user, dc = request.user, request.dc
    groups = Role.objects.order_by('name')
    context = collect_view_data(request, 'dc_group_list')
    context['is_staff'] = is_staff = user.is_staff
    context[
        'can_edit'] = can_edit = is_staff  # No permission for edit (only staff) as other might promote himself
    context['all'] = _all = can_edit and request.GET.get('all', False)
    context['qs'] = qs = get_query_string(
        request,
        all=_all,
    ).urlencode()

    if _all:
        context['colspan'] = 5
        context['groups'] = Role.objects.select_related('dc_bound').all()\
                                .prefetch_related('user_set', 'permissions', 'dc_set').order_by('name')
    else:
        context['colspan'] = 4
        context['groups'] = dc.roles.select_related('dc_bound').all()\
                              .prefetch_related('user_set', 'permissions', 'dc_set').order_by('name')

    if can_edit:
        if _all:  # Uses set() because of optimized membership ("in") checking
            context['can_add'] = set(
                groups.exclude(dc=dc).values_list('pk', flat=True))
        else:  # No need for item list
            context['can_add'] = groups.exclude(dc=dc).count()

        context['url_form_admin'] = reverse('admin_group_form',
                                            query_string=qs)
        context['form_admin'] = AdminGroupForm(request,
                                               None,
                                               prefix='adm',
                                               initial={'dc_bound': True})

        context['form_dc'] = DcGroupForm(request, groups)
        context['url_form_dc'] = reverse('dc_group_form', query_string=qs)

    return render(request, 'gui/dc/group_list.html', context)
Ejemplo n.º 6
0
def dc_network_list(request):
    """
    Network/IP<->Dc management and Network management.
    """
    user, dc = request.user, request.dc
    nets = Subnet.objects.order_by('name')
    context = collect_view_data(request, 'dc_network_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(request, NetworkAdminPermission.name)
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['deleted'] = _deleted = can_edit and request.GET.get('deleted', False)
    context['qs'] = qs = get_query_string(request, all=_all, deleted=_deleted).urlencode()

    if _deleted:
        nets = nets.exclude(access=Subnet.INTERNAL)
    else:
        nets = nets.exclude(access__in=Subnet.INVISIBLE)

    if _all:
        _nets = nets.select_related('owner', 'dc_bound').prefetch_related('dc').all()
    else:
        _nets = nets.select_related('owner', 'dc_bound').filter(dc=dc)

    context['networks'] = _nets.extra(select=ExtendedNetworkSerializer.extra_select)

    if is_staff:
        if _all:  # Uses set() because of optimized membership ("in") checking
            context['can_add'] = set(nets.exclude(dc=dc).values_list('pk', flat=True))
        else:
            context['can_add'] = nets.exclude(dc=dc).count()

        context['form_dc'] = DcNetworkForm(request, nets)
        context['url_form_dc'] = reverse('dc_network_form', query_string=qs)

    if can_edit:
        context['url_form_admin'] = reverse('admin_network_form', query_string=qs)
        context['form_admin'] = AdminNetworkForm(request, None, prefix='adm', initial={'owner': user.username,
                                                                                       'access': Subnet.PRIVATE,
                                                                                       'dc_bound': not is_staff})

    return render(request, 'gui/dc/network_list.html', context)
Ejemplo n.º 7
0
def dc_domain_record_list(request):
    """
    List/filter DNS records for a DNS domain (domain parameter in querystring).
    """
    context = collect_view_data(request, 'dc_domain_list', dc_dns_only=True)
    context['is_staff'] = is_staff = request.user.is_staff
    qs = request.GET.copy()
    name = qs.get('flt-domain', None)
    context['all'] = _all = is_staff and request.GET.get(
        'all', request.GET.get('flt-all', False))
    qs['flt-all'] = '1' if _all else ''

    if not name:
        raise PermissionDenied

    context['domain'] = domain = get_domain(request, name)
    context['filters'] = filter_form = DnsRecordFilterForm(request,
                                                           qs,
                                                           _all=_all,
                                                           prefix='flt')
    context['qs'] = qs.urlencode()
    context['order_by'], order_by = get_order_by(request,
                                                 api_view=RecordView,
                                                 db_default=('-id', ),
                                                 user_default=('-id', ))
    records = domain.record_set.order_by(*order_by)

    if filter_form.is_valid() and filter_form.has_changed():
        q = filter_form.get_filters()

        if q:
            records = records.filter(q)

    context['records'] = context['pager'] = get_pager(request,
                                                      records,
                                                      per_page=50)
    context['form_record'] = DnsRecordForm(request,
                                           domain,
                                           None,
                                           initial={
                                               'prio': Record.PRIO,
                                               'ttl': Record.TTL,
                                               'type': Record.A,
                                               'id': 0,
                                               'disabled': False,
                                               'name': '.%s' % domain.name
                                           })
    context['form_records'] = MultiDnsRecordForm(request, domain, None)
    context['url_form_record'] = reverse('domain_record_form',
                                         name,
                                         query_string=qs)

    return render(request, 'gui/dc/domain_record_list.html', context)
Ejemplo n.º 8
0
def dc_user_list(request):
    """
    User -> Dc group management.
    """
    user, dc = request.user, request.dc
    users = User.objects.order_by('username').filter(ExcludeInternalUsers)
    context = collect_view_data(request, 'dc_user_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(
        request, UserAdminPermission.name)
    context['all'] = _all = can_edit and request.GET.get('all', False)
    context['active'] = _active = not (can_edit
                                       and request.GET.get('inactive', False))
    context['qs'] = qs = get_query_string(request, all=_all,
                                          inactive=_active).urlencode()

    if _all or dc.access == dc.PUBLIC:
        if _all:
            pr = ('roles', 'roles__dc_set')
        else:
            pr = ('roles', )

        context['users'] = users.select_related('dc_bound').filter(
            is_active=_active).prefetch_related(*pr)

        if dc.access == dc.PUBLIC:
            context['dc_users'] = AllIn()
        else:
            # Uses set() because of optimized membership ("in") checking
            context['dc_users'] = set(
                users.filter(
                    (Q(id=dc.owner.id)
                     | Q(roles__in=dc.roles.all()))).values_list('pk',
                                                                 flat=True))
    else:
        context['users'] = users.select_related('dc_bound')\
                                .filter(is_active=_active)\
                                .filter(Q(id=dc.owner.id) | Q(roles__in=dc.roles.all()) | Q(dc_bound=dc))\
                                .prefetch_related('roles').distinct()

    if can_edit:
        context['url_form_admin'] = reverse('dc_user_modal_form',
                                            query_string=qs)
        context['form_admin'] = AdminUserModalForm(request,
                                                   None,
                                                   prefix='adm',
                                                   initial={
                                                       'dc_bound':
                                                       not is_staff,
                                                       'is_active': True
                                                   })

    return render(request, 'gui/dc/user_list.html', context)
Ejemplo n.º 9
0
def imagestore_list(request, repo=None):
    user = request.user
    context = collect_view_data(request, 'dc_image_list')
    context['image_vm'] = ImageVm.get_uuid()
    context['is_staff'] = is_staff = user.is_staff
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['qs'] = qs = get_query_string(request, all=_all).urlencode()
    context['url_form_admin'] = reverse('admin_image_form', query_string=qs)
    context['form_admin'] = AdminImageForm(request,
                                           None,
                                           prefix='adm',
                                           initial={
                                               'owner': user.username,
                                               'access': Image.PRIVATE,
                                               'dc_bound': True
                                           })
    qs_image_filter = request.GET.copy()
    qs_image_filter.pop('created_since', None)
    qs_image_filter.pop('last', None)
    context['qs_image_filter'] = qs_image_filter.urlencode()
    context['default_limit'] = default_limit = 30
    context['image_uuids'] = set(Image.objects.all().values_list('uuid',
                                                                 flat=True))

    try:
        created_since_days = int(request.GET.get('created_since', 0))
    except (ValueError, TypeError):
        created_since_days = None

    if created_since_days:
        limit = None
    else:
        created_since_days = None

        try:
            limit = int(request.GET.get('last', default_limit))
        except (ValueError, TypeError):
            limit = default_limit

    repositories = ImageStore.get_repositories(
        include_image_vm=request.user.is_staff)
    context['imagestores'] = imagestores = ImageStore.all(repositories)
    context['created_since'] = created_since_days
    context['limit'] = limit

    if repositories:
        if repo and repo in repositories:
            context['imagestore'] = imagestore = ImageStore(
                repo, url=repositories[repo])
        else:  # Choose the first one
            context['imagestore'] = imagestore = imagestores[0]

        if created_since_days:
            created_since = make_aware(datetime.now() -
                                       timedelta(days=created_since_days))
        else:
            created_since = None

        context['images'] = imagestore.images_filter(
            created_since=created_since, limit=limit)
    else:
        context['imagestore'] = None
        context['images'] = []

    return render(request, 'gui/dc/imagestore_list.html', context)
Ejemplo n.º 10
0
def dc_network_ip_list(request, name):
    """
    List IP addresses in network.
    DC admin can only see server IP addresses of VMs used in current DC.
    SuperAdmin user is able to see all IP addresses, including not used and reserved for other devices.
    """
    context = collect_view_data(request, 'dc_network_list')
    context['is_staff'] = is_staff = request.user.is_staff
    net_filter = {'name': name}
    dc = request.dc

    if not is_staff:
        net_filter['dc'] = dc

    try:
        context['net'] = net = Subnet.objects.select_related('owner', 'dc_bound').get(**net_filter)
    except Subnet.DoesNotExist:
        raise Http404

    context['networks'] = Subnet.objects.filter(network=net.network, netmask=net.netmask, vlan_id=net.vlan_id).count()

    context['can_edit'] = can_edit = is_staff or (net.dc_bound and
                                                  request.user.has_permission(request, NetworkAdminPermission.name))
    context['all'] = _all = can_edit and request.GET.get('all', False)
    qs = get_query_string(request, all=_all, used=can_edit)
    qs['ips'] = 1
    context['qs'] = qs.urlencode()
    ips_used = Q(usage__in=[IPAddress.VM, IPAddress.VM_REAL])
    ips_vm = (Q(vm__isnull=False) | ~Q(vms=None))
    ips_vm_dc = (Q(vm__dc=dc) | Q(vms__dc=dc))

    if can_edit:
        if is_staff:
            ips_other = Q(usage__in=[IPAddress.OTHER, IPAddress.NODE])
        else:
            ips_other = Q(usage=IPAddress.OTHER)

        ips_node = Q(usage=IPAddress.NODE)
        ip_filter = [Q(subnet=net)]
        context['used'] = used = bool(request.GET.get('used', False))

        if _all:
            if used:
                ip_filter.append((ips_used & ips_vm) | ips_other)
            elif not is_staff:
                ip_filter.append(~ips_node)
        else:
            if used:
                ip_filter.append((ips_used & ips_vm & ips_vm_dc) | ips_other)
            else:
                ip_filter.append(ips_vm_dc)

        context['netinfo'] = netinfo = net.ip_network_hostinfo
        context['form_ip'] = NetworkIPForm(request, net, None, initial={'usage': IPAddress.VM, 'count': 1,
                                                                        'ip': netinfo['min']})
        context['form_ips'] = MultiNetworkIPForm(request, net, None)
        context['form_admin'] = AdminNetworkForm(request, None, prefix='adm', initial=net.web_data_admin)
        context['url_form_admin'] = reverse('admin_network_form', query_string=qs)
        context['url_form_ip'] = reverse('network_ip_form', name, query_string=qs)
        context['colspan'] = 8
        # Complex query according to user filter
        ip_filter = reduce(and_, ip_filter)

    else:
        context['colspan'] = 6
        # No manual filtering - we have to display only DC related objects and only VMs have a DC relationship
        ip_filter = Q(subnet=net) & ips_vm_dc & ips_used & ips_vm

    context['order_by'], order_by = get_order_by(request, api_view=NetworkIPView, db_default=('ip',))
    ips = IPAddress.objects.select_related('vm', 'vm__dc', 'subnet')\
                           .prefetch_related('vms')\
                           .filter(ip_filter)\
                           .order_by(*order_by).distinct()
    context['ips'] = context['pager'] = pager = get_pager(request, ips, per_page=50)
    context['free'] = net.ipaddress_set.filter(usage=IPAddress.VM, vm__isnull=True, vms=None).count()

    if can_edit:
        context['total'] = net.ipaddress_set.count()
    else:
        context['total'] = pager.paginator.count + context['free']

    return render(request, 'gui/dc/network_ip_list.html', context)