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
image

发布后点击这个图标实现Exsi虚机的开关机状态切换
image

以此方法,也可以通过接口调用检测主机启动情况,方便和HASS集成相关状态。

posted on 2022-07-31 11:57  BionExit  阅读(347)  评论(1编辑  收藏  举报

导航