81 lines
3.2 KiB
Python
81 lines
3.2 KiB
Python
"""수정된 파일 재배포"""
|
|
import paramiko, sys, time
|
|
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
c = paramiko.SSHClient(); c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
c.connect('101.79.17.164', username='root', password='1q2w3e!Q', timeout=15)
|
|
sftp = c.open_sftp()
|
|
|
|
def run(label, cmd, timeout=30):
|
|
print(f'\n[{label}]')
|
|
_, o, _ = c.exec_command(cmd, timeout=timeout)
|
|
print(o.read().decode('utf-8','replace').strip()[:400])
|
|
|
|
BASE = 'C:/GUARDiA/workspace/guardia-itsm'
|
|
FIXED = ['dependency_map', 'config_inventory', 'drift_detection', 'auto_remediation']
|
|
for fn in FIXED:
|
|
sftp.put(f'{BASE}/routers/{fn}.py', f'/opt/guardia/app/routers/{fn}.py')
|
|
print(f' ✅ {fn}.py')
|
|
|
|
sftp.put(f'{BASE}/models.py', '/opt/guardia/app/models.py')
|
|
sftp.put(f'{BASE}/main.py', '/opt/guardia/app/main.py')
|
|
print(' ✅ models.py, main.py')
|
|
|
|
# ProcurementRecord 테이블 추가
|
|
db_script = """
|
|
import asyncio, sys
|
|
sys.path.insert(0, '/opt/guardia/app')
|
|
from database import engine, Base
|
|
from models import ProcurementRecord
|
|
async def create():
|
|
async with engine.begin() as conn:
|
|
await conn.run_sync(Base.metadata.create_all)
|
|
print('ProcurementRecord 테이블 생성 완료')
|
|
asyncio.run(create())
|
|
"""
|
|
with sftp.open('/tmp/create_proc.py', 'w') as f: f.write(db_script)
|
|
run('DB 테이블', 'cd /opt/guardia/app && /opt/guardia/venv/bin/python3 /tmp/create_proc.py 2>&1; rm /tmp/create_proc.py')
|
|
|
|
# 임포트 재검증
|
|
test = """
|
|
import sys; sys.path.insert(0, '/opt/guardia/app')
|
|
import importlib, traceback
|
|
fails = []
|
|
for r in ['dependency_map','config_inventory','drift_detection','auto_remediation','narasajang','e_procurement']:
|
|
try:
|
|
importlib.import_module(f'routers.{r}')
|
|
print(f'{r}: OK')
|
|
except Exception as e:
|
|
fails.append(r)
|
|
print(f'{r}: FAIL - {str(e)[:100]}')
|
|
try:
|
|
import main; print('main: OK')
|
|
except Exception as e:
|
|
print(f'main: FAIL - {str(e)[:100]}')
|
|
"""
|
|
with sftp.open('/tmp/retest.py', 'w') as f: f.write(test)
|
|
run('임포트 재검증', 'cd /opt/guardia/app && /opt/guardia/venv/bin/python3 /tmp/retest.py 2>&1; rm /tmp/retest.py')
|
|
|
|
run('서비스 재시작',
|
|
'fuser -k 9001/tcp 2>/dev/null || true; sleep 2; systemctl restart guardia && sleep 8 && systemctl is-active guardia')
|
|
time.sleep(5)
|
|
|
|
verify = """
|
|
import urllib.request, json
|
|
try:
|
|
d = json.loads(urllib.request.urlopen("http://localhost:9001/openapi.json", timeout=10).read())
|
|
paths = sorted(d["paths"].keys())
|
|
adv_kw = ["/api/autodiscovery","/api/snmp","/api/depmap","/api/inventory","/api/nlquery",
|
|
"/api/assistant","/api/queryhistory","/api/drift","/api/goldenconfig","/api/remediation",
|
|
"/api/multicloud","/api/aws","/api/costopt","/api/migration",
|
|
"/api/narasajang","/api/pubapi","/api/isp","/api/netzone","/api/kcloud","/api/eprocure"]
|
|
adv = [p for p in paths if any(k in p for k in adv_kw)]
|
|
print(f"전체: {len(paths)}개 / 고급확장: {len(adv)}개")
|
|
except Exception as e:
|
|
print(f"API 확인 실패: {e}")
|
|
"""
|
|
with sftp.open('/tmp/v2.py', 'w') as f: f.write(verify)
|
|
run('최종 검증', 'python3 /tmp/v2.py 2>&1; rm /tmp/v2.py', timeout=20)
|
|
|
|
sftp.close(); c.close()
|
|
print('\n=== 완료 ===')
|