Skip to content

Commit bc46fb3

Browse files
committed
groups
1 parent 97ed511 commit bc46fb3

10 files changed

Lines changed: 389 additions & 4 deletions

File tree

‎src/bin/groups.py‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/python3
2+
import sys
3+
sys.path.append('../lib')
4+
import backend_ldap_utils as ldap
5+
import backend_utils as u
6+
7+
def is_group_concerned(js):
8+
if u.config('groupFamily', '') == '':
9+
return True
10+
families = [f.strip() for f in u.config('groupFamily').split(',')]
11+
return js['payload']['group'].get('family', '') in families
12+
13+
def main():
14+
js = u.readjsoninput()
15+
config=u.read_config('../etc/config.conf')
16+
if not is_group_concerned(js):
17+
print(u.returncode(0, "not concerned"))
18+
exit(0)
19+
ldap.set_config(config)
20+
conn=ldap.connect_ldap(u.config('host'),u.config('dn'),u.config('password'))
21+
if (ldap.do_group(conn,js)):
22+
print(u.returncode(0, "done"))
23+
exit(0)
24+
else:
25+
print(u.returncode(1, "not ok"))
26+
exit(1)
27+
28+
if __name__ == '__main__':
29+
main()

‎src/bin/groups_del.py‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/python3
2+
import sys
3+
sys.path.append('../lib')
4+
import backend_ldap_utils as ldap
5+
import backend_utils as u
6+
7+
def is_group_concerned(js):
8+
if u.config('groupFamily', '') == '':
9+
return True
10+
families = [f.strip() for f in u.config('groupFamily').split(',')]
11+
return js['payload']['group'].get('family', '') in families
12+
13+
def main():
14+
js = u.readjsoninput()
15+
config=u.read_config('../etc/config.conf')
16+
if not is_group_concerned(js):
17+
print(u.returncode(0, "not concerned"))
18+
exit(0)
19+
ldap.set_config(config)
20+
conn=ldap.connect_ldap(u.config('host'),u.config('dn'),u.config('password'))
21+
if (ldap.del_group(conn,js)):
22+
print(u.returncode(0, "done"))
23+
exit(0)
24+
else:
25+
print(u.returncode(1, "not ok"))
26+
exit(1)
27+
28+
if __name__ == '__main__':
29+
main()

‎src/config.yml‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,12 @@ actions:
2929
IDENTITY_LIFECYCLE_CHANGED:
3030
script: 'lifecycle.py'
3131
onError: 'stop'
32+
GROUP_CREATE:
33+
script: 'groups.py'
34+
onError: 'continue'
35+
GROUP_UPDATE:
36+
script: 'groups.py'
37+
onError: 'continue'
38+
GROUP_DELETE:
39+
script: 'groups_del.py'
40+
onError: 'continue'

‎src/etc/config.conf.exemple‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@ disabledAttribute=sogxdisableflag
1414
disableValue=1
1515
enableValue=0
1616
additionnalObjectClass=sogxUser
17+
branchForGroup=ou=groups
18+
groupFamily=GENERAL,ENSEIGNEMENTS

‎src/lib/backend_ldap_utils.py‎

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def search_entity(l,entity):
112112
number=employeeNumber[0]
113113
else:
114114
number=employeeNumber
115-
filter='(&(employeeNumber=' + number + ')(employeeType=' + employeeType + '))'
115+
filter='(&(employeeNumber=' + str(number) + ')(employeeType=' + employeeType + '))'
116116
try:
117117
r=l.search_s(base,ldap.SCOPE_SUBTREE,filter)
118118
return r
@@ -331,4 +331,70 @@ def lifecycle(entity):
331331
import lifecycle
332332
lifecycle.do(entity)
333333

334-
return(r)
334+
return(r)
335+
336+
def add_group(l,entity):
337+
members=entity['payload']['members']
338+
base = u.config('base')
339+
list_members=[]
340+
for member in members:
341+
r=l.search_s(base,ldap.SCOPE_SUBTREE,'(uid=' + member['uid'] + ')')
342+
if len(r) > 0:
343+
list_members.append(r[0][0])
344+
else:
345+
print(u.returncode(1, member['uid'] + "not found"))
346+
exit(1)
347+
# creation du groupe
348+
object={}
349+
if u.config('branchForGroup',''):
350+
dn='cn='+ entity['payload']['group']['cn'] + ',' +u.config('branchForGroup')+","+base
351+
else:
352+
dn='cn='+ entity['payload']['group']['cn']+","+base
353+
object['cn'] = entity['payload']['group']['cn']
354+
object['member']=list_members
355+
object['objectClass']=['top','groupofnames']
356+
if entity['payload']['group']['mail'] != '':
357+
object['objectClass'].append('extendedObject')
358+
object['mail']=entity['payload']['group']['mail']
359+
ldif=modlist.addModlist(convert_to_utf8(object))
360+
try:
361+
l.add_s(dn,ldif)
362+
return True
363+
except ldap.LDAPError as e:
364+
print(u.returncode(1, format_ldap_error(e)))
365+
exit(1)
366+
367+
def del_group(l,group_entry):
368+
base = u.config('base')
369+
name = entity['payload']['group']['cn']
370+
r = l.search_s(base, ldap.SCOPE_SUBTREE, '(cn=' + name + ')')
371+
if len(r) > 0:
372+
try:
373+
l.delete_s(group_entry[0][0])
374+
print(u.returncode(0, 'deleted'))
375+
except ldap.LDAPError as e:
376+
print(u.returncode(1, format_ldap_error(e)))
377+
exit(1)
378+
379+
def mod_group(l,entity,group_entry):
380+
try:
381+
l.delete_s(group_entry[0][0])
382+
except ldap.LDAPError as e:
383+
print(u.returncode(1, format_ldap_error(e)))
384+
exit(1)
385+
add_group(l,entity)
386+
return True
387+
388+
def do_group(l,entity):
389+
#group exist ?
390+
base = u.config('base')
391+
name=entity['payload']['group']['cn']
392+
r = l.search_s(base, ldap.SCOPE_SUBTREE, '(cn='+name+')')
393+
if len(r) > 0:
394+
mod_group(l,entity,r)
395+
return True
396+
else:
397+
add_group(l,entity)
398+
return True
399+
400+

‎unittest/files_ad_utils/group.json‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"concernedTo": "6aca0812c636ce89dc4e2009",
3+
"payload": {
4+
"group": {
5+
"_id": "6aca0812c636ce89dc4e2009",
6+
"cn": "groupe statiQUE",
7+
"description": "",
8+
"mail": "",
9+
"family": "GENERAL",
10+
"owner": []
11+
},
12+
"members": [
13+
{
14+
"_id": "67dd1e9de52d6011720ffe58",
15+
"cn": "DUPONT Jean",
16+
"uid": "jdupont",
17+
"mail": "jdupont@test.fr",
18+
"employeeType": "TAIGA",
19+
"employeeNumber": "179892"
20+
},
21+
{
22+
"_id": "68e6134cba3112ef00fbb158",
23+
"cn": "MATON Olivier",
24+
"uid": "omaton",
25+
"mail": "omaton@test.fr",
26+
"employeeType": "LOCAL",
27+
"employeeNumber": "119"
28+
}
29+
]
30+
},
31+
"options": {
32+
"async": false,
33+
"updateStatus": true,
34+
"concernedToRef": "groups",
35+
"concernedToName": "groupe statiQUE",
36+
"task": "6aca9e81f0f70d6f00fe9cbb"
37+
}
38+
}
Lines changed: 130 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,130 @@
1-
{"concernedTo":"673df967f8edfbb98437994f","payload":{"identity":{"action":"IDENTITY_UPDATE","identity":{"_id":"673df967f8edfbb98437994f","inetOrgPerson":{"cn":"Maton Olivier","displayName":"Olivier Maton","facsimileTelephoneNumber":"","givenName":"Olivier","labeledURI":"","mail":"olivier.maton@exemple.fr","mobile":"06 05 04 03 02","postalAddress":"15 rue des pingouins, 54000, Nancy","preferredLanguage":"","sn":"Maton","telephoneNumber":"","title":"","uid":"omaton","employeeNumber":"179892","employeeType":"TAIGA","departmentNumber":["adm"],"jpegPhoto":"","userCertificate":""},"additionalFields":{"objectClasses":["supannPerson","eduPerson","sogxuser","ealPerson"],"attributes":{"eduPerson":{"edupersonaffiliation":["staff","member"],"edupersonprimaryaffiliation":"staff","edupersonprincipalname":"omaton@exemple.com"},"sogxuser":{"proxyaddress":["administrator@exemple.conf"],"sogxquota":0,"sogxdisableflag":0},"supannPerson":{"supannAutreMail":"olivier.maton@gmoil.com","supannEmpId":"175","supannEtablissement":"{UAI}0690184A","supannOIDCDatedeNaissance":"01/01/1970","supannOIDCGenre":"M.","supannPrenomsEtatCivil":"Olivier","supannRefId":["179892","175"],"supannTypeEntiteAffectation":["adm"],"supanncivilite":"M.","supannEntiteAffectationPrincipale":"adm","supannNomdeNaissance":"","supannCodeINSEEPaysDeNaissance":"","supannCodeINSEEVilleDeNaissance":"","supannListeRouge":"","mailForwardingAddress":"","supannMailPerso":"","supannRoleGenerique":"","supannEtuId":"","supannParrainDN":"","supannActivite":"","supannEmpDateFin":"","supannEtuDiplome":"","supannEtuAnneeInscription":""},"ealPerson":{"ealnumcarte":"043d6232346f80","ealmail2":"","ealmobile2":"","ealformation":"","ealsituation":"","ealcycle":"","ealan":"","ealdepartement":"","ealwifi":"","ealnumetd":"","ealenseignement":[],"ealue":[]}}},"customFields":{"photo":"adm-175.jpg"},"dataStatus":1,"deletedFlag":false,"initInfo":{"sentDate":"","initDate":"2025-01-29T10:47:15.870Z"},"initState":1,"lastBackendSync":"","lastSync":"2025-01-29T08:27:38.932Z","lifecycle":-1,"metadata":{"createdAt":"2024-11-20T14:59:51.924Z","createdBy":"Taiga","lastUpdatedAt":"2025-01-30T16:59:24.708Z","lastUpdatedBy":"admin"},"primaryEmployeeNumber":"","srcFusionId":"","state":2,"fingerprint":"b46334b0f30216223ac51cb2e87bea7e5d843bba2a529142d6b72ff731e52623"}}},"options":{"async":false,"updateStatus":true,"task":"679bafef3b8386f9c7f360a3"}}
1+
{
2+
"concernedTo": "673df967f8edfbb98437994f",
3+
"payload": {
4+
"identity": {
5+
"action": "IDENTITY_UPDATE",
6+
"identity": {
7+
"_id": "673df967f8edfbb98437994f",
8+
"inetOrgPerson": {
9+
"cn": "Maton Olivier",
10+
"displayName": "Olivier Maton",
11+
"facsimileTelephoneNumber": "",
12+
"givenName": "Olivier",
13+
"labeledURI": "",
14+
"mail": "olivier.maton@exemple.fr",
15+
"mobile": "06 05 04 03 02",
16+
"postalAddress": "15 rue des pingouins, 54000, Nancy",
17+
"preferredLanguage": "",
18+
"sn": "Maton",
19+
"telephoneNumber": "",
20+
"title": "",
21+
"uid": "omaton",
22+
"employeeNumber": "179892",
23+
"employeeType": "TAIGA",
24+
"departmentNumber": [
25+
"adm"
26+
],
27+
"jpegPhoto": "",
28+
"userCertificate": ""
29+
},
30+
"additionalFields": {
31+
"objectClasses": [
32+
"supannPerson",
33+
"eduPerson",
34+
"sogxuser",
35+
"ealPerson"
36+
],
37+
"attributes": {
38+
"eduPerson": {
39+
"edupersonaffiliation": [
40+
"staff",
41+
"member"
42+
],
43+
"edupersonprimaryaffiliation": "staff",
44+
"edupersonprincipalname": "omaton@exemple.com"
45+
},
46+
"sogxuser": {
47+
"proxyaddress": [
48+
"administrator@exemple.conf"
49+
],
50+
"sogxquota": 0,
51+
"sogxdisableflag": 0
52+
},
53+
"supannPerson": {
54+
"supannAutreMail": "olivier.maton@gmoil.com",
55+
"supannEmpId": "175",
56+
"supannEtablissement": "{UAI}0690184A",
57+
"supannOIDCDatedeNaissance": "01/01/1970",
58+
"supannOIDCGenre": "M.",
59+
"supannPrenomsEtatCivil": "Olivier",
60+
"supannRefId": [
61+
"179892",
62+
"175"
63+
],
64+
"supannTypeEntiteAffectation": [
65+
"adm"
66+
],
67+
"supanncivilite": "M.",
68+
"supannEntiteAffectationPrincipale": "adm",
69+
"supannNomdeNaissance": "",
70+
"supannCodeINSEEPaysDeNaissance": "",
71+
"supannCodeINSEEVilleDeNaissance": "",
72+
"supannListeRouge": "",
73+
"mailForwardingAddress": "",
74+
"supannMailPerso": "",
75+
"supannRoleGenerique": "",
76+
"supannEtuId": "",
77+
"supannParrainDN": "",
78+
"supannActivite": "",
79+
"supannEmpDateFin": "",
80+
"supannEtuDiplome": "",
81+
"supannEtuAnneeInscription": ""
82+
},
83+
"ealPerson": {
84+
"ealnumcarte": "043d6232346f80",
85+
"ealmail2": "",
86+
"ealmobile2": "",
87+
"ealformation": "",
88+
"ealsituation": "",
89+
"ealcycle": "",
90+
"ealan": "",
91+
"ealdepartement": "",
92+
"ealwifi": "",
93+
"ealnumetd": "",
94+
"ealenseignement": [],
95+
"ealue": []
96+
}
97+
}
98+
},
99+
"customFields": {
100+
"photo": "adm-175.jpg"
101+
},
102+
"dataStatus": 1,
103+
"deletedFlag": false,
104+
"initInfo": {
105+
"sentDate": "",
106+
"initDate": "2025-01-29T10:47:15.870Z"
107+
},
108+
"initState": 1,
109+
"lastBackendSync": "",
110+
"lastSync": "2025-01-29T08:27:38.932Z",
111+
"lifecycle": -1,
112+
"metadata": {
113+
"createdAt": "2024-11-20T14:59:51.924Z",
114+
"createdBy": "Taiga",
115+
"lastUpdatedAt": "2025-01-30T16:59:24.708Z",
116+
"lastUpdatedBy": "admin"
117+
},
118+
"primaryEmployeeNumber": "",
119+
"srcFusionId": "",
120+
"state": 2,
121+
"fingerprint": "b46334b0f30216223ac51cb2e87bea7e5d843bba2a529142d6b72ff731e52623"
122+
}
123+
}
124+
},
125+
"options": {
126+
"async": false,
127+
"updateStatus": true,
128+
"task": "679bafef3b8386f9c7f360a3"
129+
}
130+
}

0 commit comments

Comments
 (0)