fix: get API_KEY directly from passwork, remove unused config import
This commit is contained in:
+16
-26
@@ -13,47 +13,46 @@ import os
|
|||||||
# Отключаем ворнинги для чистой работы консоли
|
# Отключаем ворнинги для чистой работы консоли
|
||||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||||
|
|
||||||
# --- ИМПОРТ КОНФИГУРАЦИИ ---
|
# --- ПОЛУЧЕНИЕ API_KEY ИЗ PASSWORK ---
|
||||||
SERVER_URL = "https://servicedesk.sibcem.ru:8080"
|
SERVER_URL = "https://servicedesk.sibcem.ru:8080"
|
||||||
API_KEY = ""
|
API_KEY = ""
|
||||||
|
|
||||||
# Пытаемся получить API_KEY из passwork
|
# 1. Пробуем passwork напрямую
|
||||||
try:
|
try:
|
||||||
# Пытаемся импортировать passwork напрямую
|
|
||||||
sys.path.insert(0, "/opt/passwork")
|
sys.path.insert(0, "/opt/passwork")
|
||||||
from passwork import get_passwork_secrets
|
from passwork import get_passwork_secrets
|
||||||
passwork_pool = get_passwork_secrets(required_cards=["sdesktoken"])
|
passwork_pool = get_passwork_secrets(required_cards=["sdesktoken"])
|
||||||
card = passwork_pool.get("sdesktoken")
|
card = passwork_pool.get("sdesktoken")
|
||||||
if card:
|
if card:
|
||||||
API_KEY = card.get("password", "").strip()
|
API_KEY = card.get("password", "").strip()
|
||||||
print(f"LOG: 🔑 API_KEY получен из passwork (sdesktoken)")
|
print("LOG: API_KEY получен из passwork (sdesktoken)")
|
||||||
else:
|
else:
|
||||||
print("LOG: ⚠️ Карточка sdesktoken не найдена в passwork", file=sys.stderr)
|
print("LOG: Карточка sdesktoken не найдена в passwork", file=sys.stderr)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"LOG: ⚠️ Passwork ошибка: {e}", file=sys.stderr)
|
print(f"LOG: Passwork ошибка: {e}", file=sys.stderr)
|
||||||
|
|
||||||
# Fallback: пробуем config.py
|
# 2. Пробуем config.py
|
||||||
if not API_KEY:
|
if not API_KEY:
|
||||||
try:
|
try:
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
import config as cfg
|
import config as cfg
|
||||||
API_KEY = getattr(cfg, 'API_KEY', "")
|
API_KEY = getattr(cfg, 'API_KEY', "")
|
||||||
if API_KEY:
|
if API_KEY:
|
||||||
print("LOG: 🔑 API_KEY получен из config.py")
|
print("LOG: API_KEY получен из config.py")
|
||||||
except Exception as e:
|
except Exception:
|
||||||
print(f"LOG: ⚠️ Config ошибка: {e}", file=sys.stderr)
|
pass
|
||||||
|
|
||||||
# Fallback: env var
|
# 3. Пробуем env var
|
||||||
if not API_KEY:
|
if not API_KEY:
|
||||||
API_KEY = os.environ.get("SD_API_KEY", "")
|
API_KEY = os.environ.get("SD_API_KEY", "")
|
||||||
if API_KEY:
|
if API_KEY:
|
||||||
print("LOG: 🔑 API_KEY получен из SD_API_KEY")
|
print("LOG: API_KEY получен из SD_API_KEY")
|
||||||
|
|
||||||
if not API_KEY:
|
if not API_KEY:
|
||||||
print("LOG: ❌ ОШИБКА: API_KEY не найден нигде! Нужен passwork или SD_API_KEY", file=sys.stderr)
|
print("LOG: ОШИБКА: API_KEY не найден нигде! Нужен passwork или SD_API_KEY", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
print(f"LOG: 🔑 Подключение к {SERVER_URL}")
|
print(f"LOG: Подключение к {SERVER_URL}")
|
||||||
|
|
||||||
def get_ts(req):
|
def get_ts(req):
|
||||||
ct = req.get("created_time", {})
|
ct = req.get("created_time", {})
|
||||||
@@ -70,7 +69,6 @@ def clean_html(text):
|
|||||||
return text.strip()
|
return text.strip()
|
||||||
|
|
||||||
def get_name(obj):
|
def get_name(obj):
|
||||||
"""Извлечь имя из объекта группы/техника/категории."""
|
|
||||||
if not obj:
|
if not obj:
|
||||||
return ""
|
return ""
|
||||||
if isinstance(obj, dict):
|
if isinstance(obj, dict):
|
||||||
@@ -78,7 +76,6 @@ def get_name(obj):
|
|||||||
return str(obj)
|
return str(obj)
|
||||||
|
|
||||||
def get_ticket_detail(ticket_id):
|
def get_ticket_detail(ticket_id):
|
||||||
"""Получить детальную информацию по заявке."""
|
|
||||||
try:
|
try:
|
||||||
url = f"{SERVER_URL}/api/v3/requests/{ticket_id}"
|
url = f"{SERVER_URL}/api/v3/requests/{ticket_id}"
|
||||||
headers = {"authtoken": API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"}
|
headers = {"authtoken": API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"}
|
||||||
@@ -93,20 +90,18 @@ def list_tickets(from_date="2026-07-20"):
|
|||||||
url = f"{SERVER_URL}/api/v3/requests"
|
url = f"{SERVER_URL}/api/v3/requests"
|
||||||
headers = {"authtoken": API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"}
|
headers = {"authtoken": API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"}
|
||||||
|
|
||||||
# Вычисляем timestamp с указанной даты
|
|
||||||
date_obj = datetime.strptime(from_date, "%Y-%m-%d")
|
date_obj = datetime.strptime(from_date, "%Y-%m-%d")
|
||||||
from_date_ms = int(date_obj.replace(tzinfo=__import__('datetime').timezone.utc).timestamp() * 1000)
|
from_date_ms = int(date_obj.replace(tzinfo=__import__('datetime').timezone.utc).timestamp() * 1000)
|
||||||
|
|
||||||
print(f"LOG: 📥 Загрузка заявок с {from_date}...")
|
print(f"LOG: Загрузка заявок с {from_date}...")
|
||||||
resp = requests.get(url, headers=headers, verify=False, timeout=30.0)
|
resp = requests.get(url, headers=headers, verify=False, timeout=30.0)
|
||||||
resp.raise_for_status()
|
resp.raise_for_status()
|
||||||
data = resp.json()
|
data = resp.json()
|
||||||
all_reqs = data.get("requests", [])
|
all_reqs = data.get("requests", [])
|
||||||
|
|
||||||
from_date_reqs = [r for r in all_reqs if get_ts(r) >= from_date_ms]
|
from_date_reqs = [r for r in all_reqs if get_ts(r) >= from_date_ms]
|
||||||
print(f"LOG: 📋 Найдено заявок с {from_date}: {len(from_date_reqs)}")
|
print(f"LOG: Найдено заявок с {from_date}: {len(from_date_reqs)}")
|
||||||
|
|
||||||
# Получаем детали для каждой заявки
|
|
||||||
rows = []
|
rows = []
|
||||||
for i, req in enumerate(from_date_reqs):
|
for i, req in enumerate(from_date_reqs):
|
||||||
if (i + 1) % 10 == 0:
|
if (i + 1) % 10 == 0:
|
||||||
@@ -115,19 +110,15 @@ def list_tickets(from_date="2026-07-20"):
|
|||||||
req_id = req.get("request_id", req.get("id", "?"))
|
req_id = req.get("request_id", req.get("id", "?"))
|
||||||
detail = get_ticket_detail(req_id)
|
detail = get_ticket_detail(req_id)
|
||||||
|
|
||||||
# Группа — из списка
|
|
||||||
group = req.get("group", {})
|
group = req.get("group", {})
|
||||||
group_name = get_name(group)
|
group_name = get_name(group)
|
||||||
|
|
||||||
# Описание — из детального запроса
|
|
||||||
desc = detail.get("description", "")
|
desc = detail.get("description", "")
|
||||||
desc_clean = clean_html(desc)
|
desc_clean = clean_html(desc)
|
||||||
|
|
||||||
# Назначено (специалист) — из детального запроса
|
|
||||||
tech = detail.get("technician", {})
|
tech = detail.get("technician", {})
|
||||||
assignee = get_name(tech)
|
assignee = get_name(tech)
|
||||||
|
|
||||||
# Категория — из детального запроса
|
|
||||||
cat = detail.get("category", {})
|
cat = detail.get("category", {})
|
||||||
category = get_name(cat)
|
category = get_name(cat)
|
||||||
|
|
||||||
@@ -138,11 +129,10 @@ def list_tickets(from_date="2026-07-20"):
|
|||||||
"category": category
|
"category": category
|
||||||
})
|
})
|
||||||
|
|
||||||
# Выводим JSONL
|
|
||||||
for row in rows:
|
for row in rows:
|
||||||
print(json.dumps(row, ensure_ascii=False))
|
print(json.dumps(row, ensure_ascii=False))
|
||||||
|
|
||||||
print(f"LOG: ✅ Выведено {len(rows)} заявок", file=sys.stderr)
|
print(f"LOG: Выведено {len(rows)} заявок", file=sys.stderr)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
from_date = sys.argv[1] if len(sys.argv) > 1 else "2026-07-20"
|
from_date = sys.argv[1] if len(sys.argv) > 1 else "2026-07-20"
|
||||||
|
|||||||
Reference in New Issue
Block a user