38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
|
|
# --- routers/config.py ---
|
||
|
|
from fastapi import APIRouter, HTTPException
|
||
|
|
from pydantic import BaseModel
|
||
|
|
from netmiko import ConnectHandler
|
||
|
|
from shared import CMTS_DEVICE, cmts_config_lock
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
class ConfigRequest(BaseModel):
|
||
|
|
script: str
|
||
|
|
host: str
|
||
|
|
username: str
|
||
|
|
password: str
|
||
|
|
|
||
|
|
@router.post("/cmts-config")
|
||
|
|
async def execute_cmts_config(req: ConfigRequest):
|
||
|
|
# 使用非同步鎖,確保同一時間只有一個寫入任務執行
|
||
|
|
async with cmts_config_lock:
|
||
|
|
try:
|
||
|
|
device = CMTS_DEVICE.copy()
|
||
|
|
device.update({'host': req.host, 'username': req.username, 'password': req.password})
|
||
|
|
|
||
|
|
# 過濾掉空行與註解 (! 開頭的行)
|
||
|
|
commands = [cmd.strip() for cmd in req.script.splitlines() if cmd.strip() and not cmd.strip().startswith('!')]
|
||
|
|
|
||
|
|
net_connect = ConnectHandler(**device)
|
||
|
|
net_connect.send_command_timing("config")
|
||
|
|
|
||
|
|
# 批次送出設定指令
|
||
|
|
output = net_connect.send_config_set(commands, cmd_verify=False)
|
||
|
|
|
||
|
|
net_connect.send_command_timing("exit")
|
||
|
|
net_connect.disconnect()
|
||
|
|
|
||
|
|
return {"status": "success", "data": output}
|
||
|
|
except Exception as e:
|
||
|
|
raise HTTPException(status_code=500, detail=f"CMTS Config Error: {str(e)}")
|