FAST-API 调取expect控制黑群晖开关机
背景与需求
Exsi上安装了一台黑群晖,由于黑群晖的硬盘管理不会睡眠,怕没跑半年硬盘挂了,故平时都是关机状态。开关机需要进入exsi主机进行操作,比较麻烦
实施:
计划
通过fast-api调取开关exsi特定主机的脚本,并将接口通过Heimdall发布,实现点击自动开关机
expect脚本
vm id为对应主机的id,具体查找办法见百度
DSM_Switch.sh
#!/usr/bin/expect -f
spawn ssh root@[exsi IP]
expect {
"*(yes/no)" {send "yes\r"'exp_continue}
"*Password:" {send -- "[password]\r"}
}
expect "*~]"
send "vim-cmd vmsvc/power.getstate [vm id]\r"
expect {
"*Powered off" {
send "vim-cmd vmsvc/power.on [vm id]\r"
set retun_value "DSM is powering ON"
}
"*Powered on" {
send "vim-cmd vmsvc/power.off [vm id]\r"
set retun_value "DSM is powering off"
}
}
expect EOF
send "exit\r"
puts "$retun_value"
exit
FAST-API
目录结构
-script
DSM_Switch.sh
main.py
run-dev.bat
run-prd.bat
requirments
Package Version
------------------ -------
anyio 3.6.1
asgiref 3.4.1
click 8.0.4
contextlib2 21.6.0
contextvars 2.4
dataclasses 0.8
fastapi 0.79.0
gunicorn 20.1.0
h11 0.13.0
idna 3.3
immutables 0.18
importlib-metadata 4.8.3
pip 21.3.1
pydantic 1.9.1
setuptools 39.2.0
sniffio 1.2.0
starlette 0.19.1
typing_extensions 4.1.1
uvicorn 0.16.0
zipp 3.6.0
main.py
from typing import Union
from fastapi import FastAPI
import os
base_dir = basedir = os.path.abspath(os.path.dirname(__file__))
app = FastAPI()
@app.get("/DSM")
def dsm_switch():
exectuionScript = os.path.join(base_dir,'script','DSM_Switch.sh')
result = os.popen(exectuionScript).read()
import re
output = re.search(r"DSM.+",result)
return {"result": output.group()}
run-dev.bat
uvicorn main:app --reload --host '0.0.0.0' --port 8006
run-prd.bat
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app -b '0.0.0.0:8006' -D
结果
Heimdall
发布后点击这个图标实现Exsi虚机的开关机状态切换
以此方法,也可以通过接口调用检测主机启动情况,方便和HASS集成相关状态。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具