告别手动告警监控:基于手机闹钟的自动化服务器告警提醒(另类电话提醒)
基于手机闹钟的自动化服务器告警提醒
简介与优势
传统的电话提醒方式在企业应用中常需进行备案等繁琐操作,而使用智能手机电话提醒作为替代方案,虽然可行,但需额外手机和SIM卡。
解决这一痛点本文介绍了一种利用HTTP请求和智能手机闹钟实现自动化告警通知的方法,避免了以上问题。
现状与挑战
当前的运维工作面临着诸多挑战:运维人员经常需要在晚上加班到深夜12点,而且每天早上7点半还需花费大量时间来检查各种告警系统(如Zabbix、Prometheus和自定义告警),确保系统稳定运行。这种高强度的工作节奏不仅增加了运维人员的工作负担,也容易导致工作效率下降和人为误操作的风险。
前置条件手机需要root权限才能设闹钟
手机基于nc启动的web服务器
为实现即时响应,我们使用nc(netcat)在手机上启动一个简单的HTTP服务器,实现设置下一分钟的闹钟:
while true; do
# 使用nc监听端口,接收请求
{ echo -e "HTTP/1.1 200 OK\r\n\r\nok"; } | nc -l -p 8081 -q 1
# 执行设置闹钟的命令
am start -a android.intent.action.SET_ALARM --ei android.intent.extra.alarm.HOUR $(( (10#$(date +%H) + (10#$(date +%M) + 1) / 60) % 24 )) --ei android.intent.extra.alarm.MINUTES $(( (10#$(date +%M) + 1) % 60 )) --ez android.intent.extra.alarm.SKIP_UI true
done
服务启动后,我们可以通过手机浏览器访问,http://127.0.0.1:8081,发现已经能够实现自动设置下一分钟闹钟了。
Nethunter上的nginx配置示例(可不做)
由于nc监听的服务不像正常的HTTP服务器,不方便自定义一些东西,只要访问到端口就会被激活,我们需要更灵活的处理请求。因此,我在手机上使用Nethunter搭建了nginx,将/setclock/
路径的请求转发到8081端口上。
server {
listen 8080;
server_name localhost;
location /setclock/ {
proxy_pass http://127.0.0.1:8081;
}
}
通过以上配置,我们可以更安全、更灵活地处理来自外部的请求,确保只有特定请求才会触发设置闹钟操作,避免误操作带来的不便。
提示
经过一星期的测试发现,手机内部可能有程序会扫描并请求手机端口,导致误设闹钟。后面我通过在Nethunter跑python flask监听某端口某路径,通过adb调用本机设置闹钟,这样效果最实用,同时frp跑在这里面也比较稳定。
frp的作用与配置
frp是一种用于内网穿透的工具,它能够将内网服务暴露到公网,从而实现外部访问内网服务的功能。在本文中,我们将使用frp来实现将手机上的8080端口(通过nginx代理的设置闹钟接口)映射到服务器的8080端口,以便外部系统可以访问设置闹钟的功能。
https://github.com/fatedier/frp
frp服务器端配置示例
[common]
bind_port = 12345
token = password
#log_level = debug
通过./frps -c frps.ini运行服务端
frp安卓客户端配置示例
安卓手机均为arm64架构,只需下载arm64版运行即可。
通过以下配置就能将手机的8080端口转发到服务器的8080,从而进行下一步操作。
[common]
server_addr = wofuwuqi.com
server_port = 12345
token=password
[naozhong]
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 8080
由于手机在你移动的过程中,切换了网络就会导致frp断开连接,所以我们这边使用while true无限循环运行,保证断掉后能重新连上。
while true
do
./frpc -c frpc.ini
sleep 5
done
服务器nginx配置
接下来基本配置为了使外部能访问我们的系统,我们在服务器上配置nginx来反向代理,为了安全再加上密码认证
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080;
auth_basic "req";
auth_basic_user_file /etc/nginx/password; #认证文件
}
}
至此访问 http://wofuwuqi.com/ 将会访问到前面手机搭的,因没有设置默认页面的默认nginx页面,访问 http://wofuwuqi.com/setclock/ 则会设置闹钟。
告警程序与手机通知对接
最后,我们通过Python代码实现告警程序与手机通知的对接:
if '异常' in result_msg:
if duty_user == '运维用户名': #设置只有某人才会收到闹钟提醒
print('检测请求到手机是否通畅')
if send_request('http://user:user@wofuwuqi.com/'):
print('检测并设置闹钟,返回接口是否正常')
if send_request('http://user:user@wofuwuqi.com/setclock/') == 'ok\n':
send_ding('AI:已联系运维手动处理!') # 发送到钉钉群
else:
send_ding(f'{duty_user}:无紧急告警无需运维处理!')
当调用接口后 自动设置闹钟 实现及时告警
原创内容未经允许禁止转载!!!!!
原创内容未经允许禁止转载!!!!!
原创内容未经允许禁止转载!!!!!