Projet

Général

Profil

Paste
Télécharger (2,66 ko) Statistiques
| Branche: | Révision:

root / other-scripts / fix-cas.py @ 2545992a

1
#!/usr/bin/env python3
2

    
3
# This script is intended to fix the cas_user table. Just give the database name.
4

    
5
import argparse
6
from getpass import getpass
7

    
8
def fix_cas(db, host, user, password, prefix, roles):
9
    import pymysql as mysql
10

    
11
    if not password:
12
        conn = mysql.connect(host=host, user=user, db=db, charset='utf8')
13
    else:
14
        conn = mysql.connect(host=host, user=user, passwd=password, db=db, charset='utf8')
15
        
16
    with conn:
17
        cur = conn.cursor()
18

    
19
        # We format the name of the tables according to prefix
20
        tables = {'users': '{}users', 'users_roles': '{}users_roles',\
21
                  'role': '{}role', 'cas_user': '{}cas_user'}
22
        for key, elt in tables.items():
23
            tables[key] = elt.format(prefix)
24

    
25
        # We take into account the roles to modify
26
        # If 'authenticated user' is among them, then we modify all users
27
        if 'authenticated user' not in roles:
28
            for role in roles:
29
                i = roles.index(role)
30
                roles[i] = "'" + role + "'"
31
            format_dict = {'roles_to_modify': ', '.join(roles)}
32

    
33
            # We are ready to format queries
34
            format_dict.update(tables)
35

    
36
            select = """SELECT {users}.name, {users}.uid FROM {users}
37
            JOIN {users_roles} ON {users_roles}.uid = {users}.uid
38
            JOIN {role} ON {role}.rid = {users_roles}.rid
39
            WHERE {role}.name IN ({roles_to_modify}) AND {users}.uid NOT IN
40
            (SELECT uid FROM {cas_user})
41
            """.format(**format_dict)
42
        else:
43
            select = """SELECT {users}.name, {users}.uid FROM {users}
44
            WHERE {users}.uid NOT IN (SELECT uid FROM {cas_user})""".format(**tables)
45

    
46
        insert = """INSERT INTO {cas_user} (uid, cas_name)
47
        VALUES (%s, %s)
48
        """.format(**tables)
49

    
50
        cur.execute(select)
51
        rows = cur.fetchall()
52

    
53
        for name, uid in rows:
54
            cur.execute(insert, (uid, name))
55

    
56
        conn.commit()
57

    
58

    
59

    
60
###### Main
61

    
62
parser = argparse.ArgumentParser(description='Fill the cas_user table from the users table for a specific role or all roles. Requires pymysql to query the database.')
63
parser.add_argument('database', metavar='database', help='name of the database to fix')
64
parser.add_argument('--host', dest='host', default='localhost')
65
parser.add_argument('--user', '-u', dest='user', default='root')
66
parser.add_argument('--password', '--passwd', '-p', dest='password')
67
parser.add_argument('--prefix', dest='prefix', default='')
68
parser.add_argument('--roles', '-r', dest='roles', nargs='+', default=['authenticated user'])
69

    
70
args = parser.parse_args()
71
fix_cas(args.database, args.host, args.user, args.password, args.prefix, args.roles)