fix: create SD ticket on Trueconf instruct access
This commit is contained in:
+80
-15
@@ -21,6 +21,16 @@ from utils.stats_logger import log_menu_stats
|
||||
# 🔌 Импортируем рабочую функцию создания заявки из SD модуля
|
||||
from service_desk.handlers import create_ticket_in_sd
|
||||
|
||||
# Импортируем конфиг для DEFAULT_REQUESTER и SD_URL
|
||||
import importlib.util
|
||||
config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config", "config.py")
|
||||
spec = importlib.util.spec_from_file_location("custom_config", config_path)
|
||||
custom_config = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(custom_config)
|
||||
DEFAULT_REQUESTER = custom_config.DEFAULT_REQUESTER
|
||||
SD_URL = custom_config.SD_URL
|
||||
SD_TOKEN = custom_config.SD_TOKEN
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
router = Router()
|
||||
@@ -45,7 +55,7 @@ def get_user_cn(user_id: str) -> str | None:
|
||||
|
||||
logger.info(f"AD lookup: user_id={user_id}, search_id={search_id}, short={short_username}")
|
||||
|
||||
entries = search_by_user_id(search_id, ["cn", "sAMAccountName", "mail", "userPrincipalName"])
|
||||
entries = search_by_user_id(search_id, ["cn", "sAMAccountName", "mail", "userPrincipalName", "l", "userAccountControl"])
|
||||
|
||||
if entries:
|
||||
entry = entries[0]
|
||||
@@ -59,7 +69,64 @@ def get_user_cn(user_id: str) -> str | None:
|
||||
logger.warning(f"AD not found for user_id={user_id}, search_id={search_id}, short={short_username}")
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка получения CN из AD для {user_id}: {e}", exc_info=True)
|
||||
return user_id # fallback — используем user_id как CN
|
||||
return None
|
||||
|
||||
|
||||
def get_ad_user_info(user_id: str) -> dict | None:
|
||||
"""
|
||||
Получить полную информацию о пользователе из AD.
|
||||
Возвращает {cn, mail, city} или None.
|
||||
"""
|
||||
from utils.ad_search import search_by_user_id
|
||||
|
||||
try:
|
||||
search_id = user_id.replace("@tcs.sibcem.ru", "@sibcem.ru")
|
||||
entries = search_by_user_id(search_id, ["cn", "mail", "l", "userAccountControl"])
|
||||
|
||||
if entries:
|
||||
entry = entries[0]
|
||||
cn = str(entry.cn)
|
||||
mail = str(entry.mail) if 'mail' in entry else None
|
||||
city = str(entry.l) if 'l' in entry else "Кемерово"
|
||||
return {"cn": cn, "mail": mail, "city": city}
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка получения AD info для {user_id}: {e}", exc_info=True)
|
||||
return None
|
||||
|
||||
|
||||
async def create_sd_ticket_for_trueconf(user_id: str, cn: str) -> str | None:
|
||||
"""
|
||||
Создать заявку в Service Desk для запроса доступа к Trueconf.
|
||||
|
||||
Если пользователь не найден в AD — создаёт заявку от ai@sibcem.ru.
|
||||
Если пользователь найден, но не в группе 2FA — создаёт заявку от его email (или ai@sibcem.ru если mail нет).
|
||||
"""
|
||||
subject = "Запрос доступа к Trueconf"
|
||||
|
||||
# Пытаемся получить информацию из AD
|
||||
ad_info = get_ad_user_info(user_id)
|
||||
|
||||
if ad_info:
|
||||
# Пользователь найден в AD
|
||||
requester_email = ad_info["mail"] or DEFAULT_REQUESTER
|
||||
city = ad_info["city"]
|
||||
description = f"Пользователь {cn} ({user_id}) запросил инструкцию по Trueconf, но не имеет группы 2FA. Требуется выдача доступа."
|
||||
else:
|
||||
# Пользователь не найден в AD — создаём от ai@sibcem.ru
|
||||
requester_email = DEFAULT_REQUESTER
|
||||
city = "Кемерово"
|
||||
description = f"Пользователь {cn} ({user_id}) не найден в Active Directory. Требуется ручная проверка и выдача доступа к Trueconf."
|
||||
|
||||
try:
|
||||
ticket_id = await create_ticket_in_sd(requester_email, subject, description, city)
|
||||
if ticket_id:
|
||||
logger.info(f"SD ticket created for {cn}: #{ticket_id} (requester={requester_email})")
|
||||
else:
|
||||
logger.error(f"Failed to create SD ticket for {cn}")
|
||||
return ticket_id
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка создания SD заявки для {cn}: {e}", exc_info=True)
|
||||
return None
|
||||
|
||||
|
||||
@router.message()
|
||||
@@ -101,22 +168,20 @@ async def instruct_router_handler(msg: Message):
|
||||
elif cmd == "1":
|
||||
log_menu_stats(user_id, "Инструкции", "Trueconf")
|
||||
set_state(user_id, "INSTRUCT_TRUECONF_VIEW")
|
||||
|
||||
# Получаем CN пользователя
|
||||
cn = get_user_cn(user_id)
|
||||
login = user_id.split("@")[0] if "@" in user_id else user_id
|
||||
ticket_id = None
|
||||
try:
|
||||
from utils.ad_checker import check_group_membership
|
||||
result = check_group_membership(cn, "2FA")
|
||||
if not result.get("in_group", True):
|
||||
subject = f"Запрос доступа к Trueconf"
|
||||
description = f"Пользователь {cn} ({user_id}) запросил инструкцию по Trueconf, но не имеет группы 2FA. Требуется выдача доступа."
|
||||
ticket_id = await create_ticket_in_sd(DEFAULT_REQUESTER, subject, description, "Кемерово")
|
||||
logger.info(f"SD ticket created for {cn}: #{ticket_id}")
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка создания SD заявки: {e}", exc_info=True)
|
||||
ticket_id = None
|
||||
if cn is None:
|
||||
cn = user_id # fallback
|
||||
|
||||
# Создаём заявку в SD
|
||||
ticket_id = await create_sd_ticket_for_trueconf(user_id, cn)
|
||||
|
||||
# Показываем текст с результатом
|
||||
text = INSTRUCT_TRUECONF_WITH_AD(EMOJI_DIGITS, cn, ticket_id)
|
||||
await msg.answer(text, parse_mode="html")
|
||||
|
||||
# Отправляем документ-инструкцию
|
||||
if os.path.isfile(TRUECONF_INSTRUCT_PATH):
|
||||
await msg.answer_document(FSInputFile(TRUECONF_INSTRUCT_PATH))
|
||||
elif cmd == "2":
|
||||
|
||||
Reference in New Issue
Block a user