11#!/usr/bin/env python3
2-
32# Copyright (C) 2022 Nethesis S.r.l.
43# SPDX-License-Identifier: GPL-3.0-or-later
54
65import json
76import sys
87import agent
9- import secrets
10- import base64
118import os
129from agent .ldapproxy import Ldapproxy
1310
14- # Parse JSON input
11+ # ------------------------------------------------
12+ # 0. Parse JSON input
13+ # ------------------------------------------------
1514data = json .load (sys .stdin )
1615
17- # ------------------------------------------------------------
18- # 1. Core application settings (always required)
19- # ------------------------------------------------------------
16+ # ------------------------------------------------
17+ # 1. Core application settings
18+ # ------------------------------------------------
2019SEMAPHORE_ADMIN_PASSWORD = data .get ("SEMAPHORE_ADMIN_PASSWORD" , "password" )
2120SEMAPHORE_ADMIN_NAME = data .get ("SEMAPHORE_ADMIN_NAME" , "admin" )
2221SEMAPHORE_ADMIN_EMAIL = data .get ("SEMAPHORE_ADMIN_EMAIL" , "admin@admin.com" )
2322SEMAPHORE_ADMIN = data .get ("SEMAPHORE_ADMIN" , "admin" )
2423
25- # ------------------------------------------------------------
26- # 2. Reverse-proxy / TLS settings (NEW)
27- # ------------------------------------------------------------
28- host = data .get ("host" , "" )
29- lets_encrypt = data .get ("lets_encrypt" , False )
30- http2https = data .get ("http2https" , True )
24+ # ------------------------------------------------
25+ # 2. Reverse-proxy / TLS
26+ # ------------------------------------------------
27+ host = data .get ("host" , "" )
28+ lets_encrypt = data .get ("lets_encrypt" , False )
29+ http2https = data .get ("http2https" , True )
3130
3231agent .set_env ("TRAEFIK_HOST" , host )
3332agent .set_env ("TRAEFIK_LETS_ENCRYPT" , "True" if lets_encrypt else "False" )
3433agent .set_env ("TRAEFIK_HTTP2HTTPS" , "True" if http2https else "False" )
3534
36- # ------------------------------------------------------------
37- # 3. SMTP via SmartHost (unchanged)
38- # ------------------------------------------------------------
39- rdb = agent .redis_connect (use_replica = True )
35+ # ------------------------------------------------
36+ # 3. SMTP via SmartHost
37+ # ------------------------------------------------
38+ rdb = agent .redis_connect (use_replica = True )
4039smtp = agent .get_smarthost_settings (rdb )
4140
4241MAIL_FROM_NAME = f"SEMAPHORE <{ smtp ['username' ]} >"
4342
44- # ------------------------------------------------------------
45- # 4. Optional notification channels (unchanged)
46- # ------------------------------------------------------------
43+ # ------------------------------------------------
44+ # 4. Optional notification channels
45+ # ------------------------------------------------
4746SEMAPHORE_GOTIFY_ALERT = data .get ("SEMAPHORE_GOTIFY_ALERT" , "False" )
4847SEMAPHORE_GOTIFY_URL = data .get ("SEMAPHORE_GOTIFY_URL" , "" )
4948SEMAPHORE_GOTIFY_TOKEN = data .get ("SEMAPHORE_GOTIFY_TOKEN" , "" )
@@ -52,25 +51,52 @@ SEMAPHORE_TELEGRAM_ALERT = data.get("SEMAPHORE_TELEGRAM_ALERT", "False")
5251SEMAPHORE_TELEGRAM_CHAT = data .get ("SEMAPHORE_TELEGRAM_CHAT" , "" )
5352SEMAPHORE_TELEGRAM_TOKEN = data .get ("SEMAPHORE_TELEGRAM_TOKEN" , "" )
5453
55- # ------------------------------------------------------------
56- # 5. LDAP (unchanged – still driven by ldap_domain)
57- # ------------------------------------------------------------
54+ # ------------------------------------------------
55+ # 5. LDAP
56+ # ------------------------------------------------
5857ldap_domain = data .get ("ldap_domain" , "" )
5958agent .set_env ("LDAP_DOMAIN" , ldap_domain )
6059
61- agent .bind_user_domains ([ldap_domain ] if ldap_domain else [])
62-
63- SEMAPHORE_LDAP_ENABLE = "True" if ldap_domain else "False"
64- SEMAPHORE_LDAP_BIND_DN = os .getenv ("LDAP_SEARCH_BIND_DN" , "" )
65- SEMAPHORE_LDAP_BIND_PASSWORD = os .getenv ("LDAP_SEARCH_BIND_PASSWORD" , "" )
66- SEMAPHORE_LDAP_SERVER = os .getenv ("LDAP_HOSTNAME" , "" )
67- SEMAPHORE_LDAP_SEARCH_DN = os .getenv ("LDAP_USER_BASE_DN" , "" )
68- SEMAPHORE_LDAP_SEARCH_FILTER = os .getenv ("LDAP_USER_SEARCH_FILTER" , "" )
69- SEMAPHORE_LDAP_NEEDTLS = "False"
70-
71- # ------------------------------------------------------------
72- # 6. Build the final env file for Semaphore
73- # ------------------------------------------------------------
60+ # unset stale LDAP env vars
61+ for var in [
62+ "LDAP_HOSTNAME" , "LDAP_PORT" , "LDAP_SEARCH_BIND_DN" ,
63+ "LDAP_SEARCH_BIND_PASSWORD" , "LDAP_USER_BASE_DN" ,
64+ "LDAP_MEMBER_ATTRIBUTE" , "LDAP_MEMBER_ATTRIBUTE_TYPE" ,
65+ "LDAP_GROUP_BASE_DN" , "LDAP_USERNAME_ATTRIBUTE" ,
66+ "LDAP_USER_SEARCH_FILTER" , "LDAP_GROUP_SEARCH_FILTER"
67+ ]:
68+ agent .unset_env (var )
69+
70+ if ldap_domain :
71+ agent .bind_user_domains ([ldap_domain ])
72+ odom = Ldapproxy ().get_domain (ldap_domain )
73+ base_dn = odom ["base_dn" ]
74+
75+ agent .set_env ("LDAP_HOSTNAME" , odom ["host" ])
76+ agent .set_env ("LDAP_PORT" , str (odom ["port" ]))
77+ agent .set_env ("LDAP_SEARCH_BIND_DN" , odom ["bind_dn" ])
78+ agent .set_env ("LDAP_SEARCH_BIND_PASSWORD" , odom ["bind_password" ])
79+
80+ if odom ["schema" ] == "rfc2307" :
81+ agent .set_env ("LDAP_USER_BASE_DN" , f"ou=People,{ base_dn } " )
82+ agent .set_env ("LDAP_GROUP_BASE_DN" , f"ou=Groups,{ base_dn } " )
83+ agent .set_env ("LDAP_MEMBER_ATTRIBUTE" , "memberUid" )
84+ agent .set_env ("LDAP_MEMBER_ATTRIBUTE_TYPE" , "uid" )
85+
86+ elif odom ["schema" ] == "ad" :
87+ agent .set_env ("LDAP_USER_BASE_DN" , f"cn=Users,{ base_dn } " )
88+ agent .set_env ("LDAP_GROUP_BASE_DN" , f"cn=Users,{ base_dn } " )
89+ agent .set_env ("LDAP_USERNAME_ATTRIBUTE" , "samaccountname" )
90+ agent .set_env ("LDAP_USER_SEARCH_FILTER" ,
91+ "(&(objectClass=top)(objectClass=user)(objectClass=person)(objectClass=organizationalPerson))" )
92+ agent .set_env ("LDAP_GROUP_SEARCH_FILTER" ,
93+ "(&(objectClass=top)(objectClass=group))" )
94+ else :
95+ agent .bind_user_domains ([])
96+
97+ # ------------------------------------------------
98+ # 6. Build final env file
99+ # ------------------------------------------------
74100app_env = {
75101 # Admin
76102 "SEMAPHORE_ADMIN_PASSWORD" : SEMAPHORE_ADMIN_PASSWORD ,
@@ -94,13 +120,13 @@ app_env = {
94120 "SEMAPHORE_TELEGRAM_TOKEN" : SEMAPHORE_TELEGRAM_TOKEN ,
95121
96122 # LDAP
97- "SEMAPHORE_LDAP_ENABLE" : SEMAPHORE_LDAP_ENABLE ,
98- "SEMAPHORE_LDAP_BIND_DN" : SEMAPHORE_LDAP_BIND_DN ,
99- "SEMAPHORE_LDAP_BIND_PASSWORD" : SEMAPHORE_LDAP_BIND_PASSWORD ,
100- "SEMAPHORE_LDAP_SERVER" : SEMAPHORE_LDAP_SERVER ,
101- "SEMAPHORE_LDAP_SEARCH_DN" : SEMAPHORE_LDAP_SEARCH_DN ,
102- "SEMAPHORE_LDAP_SEARCH_FILTER" : SEMAPHORE_LDAP_SEARCH_FILTER ,
103- "SEMAPHORE_LDAP_NEEDTLS" : SEMAPHORE_LDAP_NEEDTLS ,
123+ "SEMAPHORE_LDAP_ENABLE" : "True" if ldap_domain else "False" ,
124+ "SEMAPHORE_LDAP_BIND_DN" : os . getenv ( "LDAP_SEARCH_BIND_DN" , "" ) ,
125+ "SEMAPHORE_LDAP_BIND_PASSWORD" : os . getenv ( "LDAP_SEARCH_BIND_PASSWORD" , "" ) ,
126+ "SEMAPHORE_LDAP_SERVER" : os . getenv ( "LDAP_HOSTNAME" , "" ) ,
127+ "SEMAPHORE_LDAP_SEARCH_DN" : os . getenv ( "LDAP_USER_BASE_DN" , "" ) ,
128+ "SEMAPHORE_LDAP_SEARCH_FILTER" : os . getenv ( "LDAP_USER_SEARCH_FILTER" , "" ) ,
129+ "SEMAPHORE_LDAP_NEEDTLS" : "False" ,
104130 "SEMAPHORE_LDAP_MAPPING_DN" : "dn" ,
105131 "SEMAPHORE_LDAP_MAPPING_MAIL" : "mail" ,
106132 "SEMAPHORE_LDAP_MAPPING_UID" : "uid" ,
@@ -109,15 +135,15 @@ app_env = {
109135
110136agent .write_envfile ("app.env" , app_env )
111137
112- # ------------------------------------------------------------
113- # 7. Echo back the whole configuration so the UI can reload it
114- # ------------------------------------------------------------
138+ # ------------------------------------------------
139+ # 7. Echo back the configuration for the UI
140+ # ------------------------------------------------
115141json .dump ({
116142 "host" : host ,
117143 "lets_encrypt" : lets_encrypt ,
118144 "http2https" : http2https ,
119145 "ldap_domain" : ldap_domain ,
120- "domains_list" : agent .list_user_domains (), # used by combo-box
146+ "domains_list" : agent .list_user_domains (),
121147 "semaphore_admin" : SEMAPHORE_ADMIN ,
122148 "semaphore_admin_name" : SEMAPHORE_ADMIN_NAME ,
123149 "semaphore_admin_email" : SEMAPHORE_ADMIN_EMAIL ,
0 commit comments