家庭的路由器是刷的是openwrt,电视盒子刷的armbian,有时候想知道断网了没,内网的网络状态怎么样。这时候需要内网穿透,frp和zerotier都是使用目标,写个小东西做frpc的更新,上报一下在线状态。因为同时管理父母家里、老丈人家里、家乡等多个网络。因为之前做过一个命令推送的小项目,复用一下,用Golang先实现客户端,服务器端用Java的Netty框架,用protobuf协议。
功能描述
- 启动时获取静态配置
- 上报存活状态
- 接收命令执行
- 动态升级
概要设计
配置获取
时间:每分钟更新一次
配置格式:json
数据站点:https://gitee.com/Tony36051/nat-controll/raw/master/conf.json
动态reload到内存
上报存活状态
时间:一分钟上报一次
上报内容:
- 主机名,hostname
- 内网ip,intranetIp
- 公网ip,publicIp
- 自定义名称,nickname
- 上报时间,reportTime
- 执行用户,runUser。判断命令可执行范围
- 二进制版本,version
服务器端回复: - 机器id:nickname_hostname
命令推送
时机:服务端推送
客户端收到后,返回ack。
下发内容:
- 命令id,Long型
- 命令内容
- 机器id
命令执行
时机:客户端收到命令后,立刻执行
客户端将命令原样进行系统调用,同步获取输出流和错误流,上报给服务器。
超时:无超时机制,如果一直在执行,则无返回。
阻塞:不阻塞,来一个命令开一个routine执行。必要时候接受reboot命令
命令回执
时机:命令执行完成后
上报内容:
- 命令id
- 机器id
- 输出流
- 错误流
OTA
时机:命令推送或静态配置文件发现版本可更新
升级:启动升级程序,下载新版程序,停止&删掉老程序,覆盖老程序,启动
上报:升级结果、自检结果
接口设计
上报接口
POST /mc/online
{
“hostname”: “armbian”,
“intranetIp”: “192.168.1.254”,
“publicIp”: “100.100.123.123”,
“nickname”: “hometown”,
“reportTime”: “2021-01-30 16:35:02”,
“runUser”: “root”,
“version”: “v20210130.1”
}
{
“machineId”: “hometown_armbian”
}
命令下发
POST /mc/cmd
{
“cmd”: “date”,
“machineId”: “hometown_armbian”
}
{
“recvTime”: “2021-01-30 16:35:02”,
“machineId”: “hometown_armbian”,
“cmdId”: 123456789
}
命令结果收集
PUT /mc/cmd
{
“cmdId”: 123456789,
“output”: “xxxxxxxxxxxxxxxxxx”,
“error”: “yyyyyyyyyyyyyyyyy”,
“durationInSec”: “10”
}