#!/usr/bin/env python3 """ Проверочный скрипт: user_id -> CARD_ID -> телефон. Интерактивный режим: после каждого запроса спрашивает, хочешь ли продолжить. config.py сам подтягивает все секреты из Passwork при импорте. """ import sys import re import logging # ============================================================ # config.py при импорте заполняет globals(): # AD_USER, AD_PASSWORD, AD_SERVER, AD_BASES # DB_USER, DB_PASSWORD, SQL_SERVER, SQL_DB_NAME # ============================================================ sys.path.insert(0, "/opt/trueconf_bot") from config import config logging.basicConfig(level=logging.INFO, format="%(message)s") log = logging.getLogger(__name__) # ============================================================ # AD: user_id -> CARD_ID # ============================================================ def get_card_id_from_ad(user_id: str) -> str: """Ищем пользователя в AD по всем OU из AD_BASES, возвращаем extensionAttribute2 (CARD_ID).""" from utils.ad_search import search_by_user_id entries = search_by_user_id(user_id, ["extensionAttribute2"]) if not entries: raise Exception("Пользователь не найден в AD") entry = entries[0] if "extensionAttribute2" in entry and entry.extensionAttribute2.value: card_id = str(entry.extensionAttribute2.value).strip() log.info("CARD_ID: {}".format(card_id)) return card_id raise Exception("extensionAttribute2 пуст для этого пользователя в AD") # ============================================================ # SQL: CARD_ID -> телефон в PR_CARD # ============================================================ def get_phone_from_db(card_id: str) -> str: """Ищем сотрудника в UOV_SELFSERVICE_PR_CARD по CARD_ID.""" import pymssql conn = pymssql.connect( server=config.SQL_SERVER, user=config.DB_USER, password=config.DB_PASSWORD, database=config.SQL_DB_NAME, charset="cp1251", ) cursor = conn.cursor() query = """ SELECT c.ID, c.PHONE, c.F_NAME, c.L_NAME, c.M_NAME FROM UOV_SELFSERVICE_PR_CARD c WHERE c.ID = %s """ cursor.execute(query, (card_id,)) row = cursor.fetchone() conn.close() if not row: raise Exception("CARD_ID {} не найден в PR_CARD".format(card_id)) card_id_db = row[0] phone = str(row[1]) if row[1] else "Не указан" f_name = str(row[2]) if row[2] else "" l_name = str(row[3]) if row[3] else "" m_name = str(row[4]) if row[4] else "" log.info("PR_CARD.ID: {}".format(card_id_db)) log.info("ФИО: {} {} {}".format(l_name, f_name, m_name)) log.info("PHONE: {}".format(phone)) return phone # ============================================================ # MAIN # ============================================================ def run_one(): """Выполнить один запрос: ввод user_id -> CARD_ID -> телефон.""" user_id = input("\nВведите user_id (email или sAMAccountName): ").strip() if not user_id: print("user_id пустой, выход.") sys.exit(1) print() print("[1] Поиск CARD_ID в Active Directory") print(" Сервер: {}".format(config.AD_SERVER)) print(" Базы поиска: {}".format(config.AD_BASES)) print(" user_id: {}".format(user_id)) print() try: card_id = get_card_id_from_ad(user_id) except Exception as e: print("Ошибка AD: {}".format(e)) return None print() print("[2] Поиск телефона в базе BossCopy") print(" Сервер: {}".format(config.SQL_SERVER)) print(" CARD_ID: {}".format(card_id)) print() try: phone = get_phone_from_db(card_id) except Exception as e: print("Ошибка SQL: {}".format(e)) return card_id print() print("=" * 70) print(" ИТОГ") print("=" * 70) print(" user_id: {}".format(user_id)) print(" CARD_ID: {}".format(card_id)) print(" Телефон: {}".format(phone)) print("=" * 70) print() return card_id def main(): print() print("=" * 70) print(" Проверка: user_id -> CARD_ID -> телефон") print("=" * 70) print() while True: run_one() again = input("Продолжить? (y/n): ").strip().lower() if again not in ("y", "yes", "д", "да"): print("Готово.") break if __name__ == "__main__": main()