refactor: cleanup temp files, centralize API URL, and dynamic routing
- 불필요한 마이그레이션 스크립트, JSON 덤프, 백업 폴더 일괄 삭제 - 프론트엔드 API_BASE_URL 상수 도입 및 하드코딩된 API 엔드포인트 통합 - 백엔드(server.js) GET/POST 라우팅 구조를 Map 기반 동적 라우팅으로 리팩토링 - 미사용 dummyDataGenerator 제거
This commit is contained in:
134
pc_agent.py
Normal file
134
pc_agent.py
Normal file
@@ -0,0 +1,134 @@
|
||||
import wmi
|
||||
import requests
|
||||
import json
|
||||
import socket
|
||||
import platform
|
||||
import sys
|
||||
import time
|
||||
|
||||
def collect_specs():
|
||||
try:
|
||||
c = wmi.WMI()
|
||||
computer = c.Win32_ComputerSystem()[0]
|
||||
os_info = c.Win32_OperatingSystem()[0]
|
||||
proc = c.Win32_Processor()[0]
|
||||
board = c.Win32_BaseBoard()[0]
|
||||
|
||||
# 1. 상세 GPU 정보 수집 (모든 그래픽 카드)
|
||||
gpu_list = []
|
||||
for g in c.Win32_VideoController():
|
||||
gpu_list.append(g.Name)
|
||||
gpu_info = ", ".join(gpu_list) if gpu_list else "N/A"
|
||||
|
||||
# 2. 모든 저장장치 정보 수집 및 SSD/HDD 구분
|
||||
storage_list = []
|
||||
|
||||
# Windows 8 이상에서 작동하는 상세 저장소 정보 수집 시도
|
||||
physical_disks = {}
|
||||
try:
|
||||
storage_c = wmi.WMI(namespace="Root\\Microsoft\\Windows\\Storage")
|
||||
for d in storage_c.MSFT_PhysicalDisk():
|
||||
# MediaType: 3(HDD), 4(SSD), 0(Unspecified)
|
||||
physical_disks[d.DeviceId] = d.MediaType
|
||||
except:
|
||||
pass
|
||||
|
||||
for d in c.Win32_DiskDrive():
|
||||
size_gb = round(float(d.Size) / (1024**3)) if d.Size else 0
|
||||
|
||||
# 미디어 타입 판단
|
||||
media_type = physical_disks.get(str(d.Index), 0)
|
||||
prefix = ""
|
||||
if media_type == 4:
|
||||
prefix = "[SSD] "
|
||||
elif media_type == 3:
|
||||
prefix = "[HDD] "
|
||||
else:
|
||||
# 힌트가 없을 경우 모델명으로 추측
|
||||
cap = d.Caption.upper()
|
||||
if "SSD" in cap or "NVME" in cap or "FLASH" in cap:
|
||||
prefix = "[SSD] "
|
||||
else:
|
||||
prefix = "[HDD] "
|
||||
|
||||
storage_list.append(f"{prefix}{d.Caption} ({size_gb}GB)")
|
||||
|
||||
# DB 필드(SSD1, SSD2, SSD3)에 나눠 담기
|
||||
storage1 = storage_list[0] if len(storage_list) > 0 else "N/A"
|
||||
storage2 = storage_list[1] if len(storage_list) > 1 else ""
|
||||
storage3 = storage_list[2] if len(storage_list) > 2 else ""
|
||||
|
||||
# 실시간 데이터 추출
|
||||
specs = {
|
||||
"메인보드": f"{board.Manufacturer} {board.Product}".strip(),
|
||||
"CPU": proc.Name.strip(),
|
||||
"RAM": f"{round(float(computer.TotalPhysicalMemory) / (1024**3))}GB",
|
||||
"OS": os_info.Caption,
|
||||
"GPU": gpu_info,
|
||||
"SSD1": storage1,
|
||||
"SSD2": storage2,
|
||||
"SSD3": storage3,
|
||||
"비고": "실시간 에이전트(EXE) 자동 수집"
|
||||
}
|
||||
return specs
|
||||
except Exception as e:
|
||||
print(f"데이터 수집 중 오류 발생: {e}")
|
||||
return None
|
||||
|
||||
def send_data(specs, server_url, asset_code):
|
||||
try:
|
||||
# 전송 데이터에 자산코드 추가 (식별용)
|
||||
specs["자산코드"] = asset_code
|
||||
print(f"\n📡 서버로 전송 중... ({server_url})")
|
||||
response = requests.post(server_url, json=specs, timeout=10)
|
||||
if response.status_code == 200:
|
||||
print("✅ 전송 성공! ITAM 시스템에서 확인하세요.")
|
||||
else:
|
||||
print(f"❌ 전송 실패: 서버 응답 코드 {response.status_code}")
|
||||
except Exception as e:
|
||||
print(f"❌ 서버 연결 오류: {e}")
|
||||
print("서버가 켜져 있는지, URL이 맞는지 확인해주세요.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("========================================")
|
||||
print(" ITAM PC 실시간 사양 수집 에이전트 (v1.1)")
|
||||
print("========================================\n")
|
||||
|
||||
# 1. 정보 수집
|
||||
print("🔍 하드웨어 정보를 읽어오는 중...")
|
||||
data = collect_specs()
|
||||
|
||||
if data:
|
||||
print("\n[수집된 실제 사양]")
|
||||
display_map = {
|
||||
"메인보드": "메인보드",
|
||||
"CPU": "CPU",
|
||||
"RAM": "RAM",
|
||||
"OS": "OS",
|
||||
"GPU": "GPU",
|
||||
"SSD1": "Storage 1",
|
||||
"SSD2": "Storage 2",
|
||||
"SSD3": "Storage 3",
|
||||
"비고": "비고"
|
||||
}
|
||||
for key, value in data.items():
|
||||
if value: # 값이 있는 경우만 표시
|
||||
label = display_map.get(key, key)
|
||||
print(f" - {label}: {value}")
|
||||
|
||||
print("\n" + "="*40)
|
||||
asset_code = input("등록할 자산번호를 입력하세요 (예: PC-001): ").strip()
|
||||
if not asset_code:
|
||||
print("❌ 자산번호 없이는 전송할 수 없습니다.")
|
||||
else:
|
||||
server_ip = input("서버 IP를 입력하세요 (기본값 localhost): ").strip()
|
||||
if not server_ip: server_ip = "localhost"
|
||||
|
||||
target_url = f"http://{server_ip}:3000/api/agent/collect"
|
||||
|
||||
confirm = input("\n위 정보를 서버로 전송할까요? (y/n): ")
|
||||
if confirm.lower() == 'y':
|
||||
send_data(data, target_url, asset_code)
|
||||
|
||||
print("\n5초 후 프로그램이 종료됩니다...")
|
||||
time.sleep(5)
|
||||
Reference in New Issue
Block a user