Projet

Général

Profil

0001-agent-authentic2-add-an-hobo_provision-command-19853.patch

Benjamin Dauvergne, 18 avril 2018 18:01

Télécharger (3,32 ko)

Voir les différences:

Subject: [PATCH] agent/authentic2: add an hobo_provision command (#19853)

To provision all users or roles, the role provisionning is full, i.e. it
removes old roles. The user provisionning is not currently.
 .../management/commands/hobo_provision.py          | 61 ++++++++++++++++++++++
 1 file changed, 61 insertions(+)
 create mode 100644 hobo/agent/authentic2/management/commands/hobo_provision.py
hobo/agent/authentic2/management/commands/hobo_provision.py
1
from django.core.management.base import BaseCommand
2

  
3
from django_rbac.utils import get_role_model, get_ou_model
4
from django.contrib.auth import get_user_model
5

  
6
from hobo.agent.authentic2.provisionning import Provisionning
7

  
8

  
9
class Command(BaseCommand):
10
    help = 'Provision all roles or users'
11

  
12
    def add_arguments(self, parser):
13
        parser.add_argument('--roles', action='store_true', default=False)
14
        parser.add_argument('--users', action='store_true', default=False)
15
        parser.add_argument('--batch-size', type=int, default=512)
16

  
17
    def handle(self, *args, **options):
18
        self.verbosity = options['verbosity']
19
        engine = Provisionning()
20
        ous = {ou.id: ou for ou in get_ou_model().objects.all()}
21

  
22
        if options['roles']:
23
            self.provision_roles(engine, ous)
24

  
25
        if options['users']:
26
            self.provision_users(engine, ous, batch_size=options['batch_size'])
27
        if self.verbosity > 0:
28
            self.stdout.write('Done.')
29

  
30
    def provision_roles(self, engine, ous):
31
        roles = get_role_model().objects.all()
32
        if self.verbosity > 0:
33
            self.stdout.write('Provisionning {} roles.'.format(roles.count()))
34
        engine.notify_roles(ous, roles, full=True)
35

  
36
    def provision_users(self, engine, ous, batch_size=512):
37
        qs = get_user_model().objects.all()
38
        # allow easy pagination by pk
39
        qs = qs.order_by('pk')
40
        # prevent too much select
41
        qs = qs.prefetch_related('attribute_values__attribute')
42

  
43
        def do_provision(qs):
44
            users = list(qs[:batch_size])
45
            while users:
46
                engine.notify_users(ous, users)
47
                users = list(qs.filter(id__gt=users[-1].pk)[:batch_size])
48

  
49
        roles_with_attributes = get_role_model().objects.filter(attributes__name='is_superuser').children()
50
        # first those without and admin attribute
51
        normal_users = qs.exclude(roles__in=roles_with_attributes)
52

  
53
        if self.verbosity > 0:
54
            self.stdout.write('Provisionning {} normal users.'.format(normal_users.count()))
55
        do_provision(normal_users)
56
        # then those with an admin attribute, use distinct to prevent
57
        # duplicates caused by join on a m2m relation
58
        admin_users = qs.filter(roles__in=roles_with_attributes).distinct()
59
        if self.verbosity > 0:
60
            self.stdout.write('Provisionning {} admin users.'.format(admin_users.count()))
61
        do_provision(admin_users)
0
-