xiaorouji / openwrt-passwall

7.02k stars 2.62k forks source link

[Feature Request]: 能不能加个通知推送 #3138

Closed monyuan closed 5 months ago

monyuan commented 5 months ago

描述你想要的新功能

切换节点或断开时能够发送通知

描述你想要的解决方案

我们搞外贸的公司,有时候端开了还不知道,被各种骂。希望能加个通知,调用anpush的接口。这样运营和运维的Whtsapp都能收到通知

描述你考虑过的替代方案

No response

其他信息

No response

Nicepaul commented 5 months ago

这个想法好

nftbty commented 5 months ago

这个需求应该比较小众,而且由passwall来做不合适,各有各的需求。 这些信息日志里面都有,有需求的可以利用高级日志功能,把日志重定向到系统日志,然后把系统日志发送到另一个服务器;或者重定向日志文件路径,利用远程目录挂载,让另一个服务器可以读取日志文件。然后在另一个服务器上跑一个服务监测日志变化,可以随你们自己需求监测任何事件。当监测到特定事件发生时,也可以随你们自己做任何操作,发送邮件,或者其他通知服务。

monyuan commented 5 months ago

@nftbty 也就是加个webhook事件,其实这个并不小众,对普通个人来说可有可无,但是对于公司来说,不用派人盯着

这个需求应该比较小众,而且由passwall来做不合适,各有各的需求。 这些信息日志里面都有,有需求的可以利用高级日志功能,把日志重定向到系统日志,然后把系统日志发送到另一个服务器;或者重定向日志文件路径,利用远程目录挂载,让另一个服务器可以读取日志文件。然后在另一个服务器上跑一个服务监测日志变化,可以随你们自己需求监测任何事件。当监测到特定事件发生时,也可以随你们自己做任何操作,发送邮件,或者其他通知服务。

nftbty commented 5 months ago

小不小众的问题且不说,这个没有数据,我们自己说的也不算。也不是好不好改的事。 而是我说了,即使有类似需求,那也是各有各的不同。你们这家是需要切换时走AnPush通知,其他家可能需要其他信息,操作也不一定是AnPush通知。

所以,这个功能要做也只能根据你这个需求抽象化,一般化。初步想了一下,可以在高级日志功能下面新增2个option。一个是从日志中筛选出特定日志的关键字(或者正则),另一个就是对满足筛选条件的日志进行额外处理的shell命令,用%s表示日志内容,或者填入脚本/程序路径,日志内容则作为参数。 这样,对passwall影响最小,该功能的适用性最广。这样,可以用 curl 或其他网络工具,向AnPush服务,或者其他推送服务,或者同时推送给多个服务,或者运行其他本地程序,修改配置,重启服务之类的任何操作。

nftbty commented 5 months ago

不过这个是针对Passwall自身的日志。其他组件运行的日志不太方便处理,要麻烦些,不过一般也不需要对具体组件运行的日志做监测然后触发特定操作吧。

monyuan commented 5 months ago

@nftbty 感谢回复,其实就是增加一个特定事件,触发时能有特定回调,如果按照你的实现思路,那是不是还得加个定时服务去筛选日志

nftbty commented 5 months ago

感谢回复,其实就是增加一个特定事件,触发时能有特定回调,如果按照你的实现思路,那是不是还得加个定时服务去筛选日志

不用,我计划这样改,一个就是希望一次改动可以满足尽量多的需求,再一个就是这样改最简单。 passwall自身的日志输出,是调用的 app.sh里的echolog()函数,也就是说只需要稍微修改echolog(),在完成原本的日志输出后,进行关键字匹配或者正则表达式匹配,有匹配到的就执行一次设定好的命令。这样其他人之后再有监测其他某些事件的需求,即使没有现成的日志输出,也只需要在相应位置加个echolog就行了。 目前的echolog()非常简单 https://github.com/xiaorouji/openwrt-passwall/blob/40751a447bd352644b88cc1ba5dd01b618f51d60/luci-app-passwall/root/usr/share/passwall/app.sh#L42-L45 只需要在最后加个判断,匹配成功就执行用户设定的脚本代码。等于只提供了一个接口,告诉你现在发生了什么,知道发生了什么,具体要怎么做,就由用户自己随意发挥了。比如设备有声音硬件及驱动,或者有远程可发声设备的话,可以控制设备播放音频报警或者文字转语音播报之类的。而且,后续修改、调试脚本代码更方便及时。比如你需要的AnPush推送服务,如果之后修改了API,或者推出了新版API,你们可以更快适配,甚至之后又出现一个比AnPush更优秀的服务,自己随时想替换就替换。

monyuan commented 5 months ago

@nftbty 能否搞个demo出来,其实他这个接口很简单https://anpush.com/doc,至于替换什么的,目前不管server酱还是wxpusher都只支持国内的,国外的whatsapp、tg、facebook都不行,而且免费额度低的可怕,用passwall的很多外贸用户。

另外一个就是,其实你说的是我们这种程序员,遇到了可以手动二开一下,实际上公司买的路由器都自带了passwall,运维们根本不懂,他们也想捐赠或付费搞个事件通知,可惜找不到人处理

CharlesLocke commented 5 months ago

这个功能不应该passwall来做,你可以用其他软件实现。如果你这个外贸公司非要用这个功能,那是不是付费定制一个版本更合适呢。还有你们所谓买的路由器都自带了passwall,那这个看起来就不合适,那是否应该请商家去解决这个通知推送问题。

lwb1978 commented 5 months ago

既然是外贸公司商用,自己搭建稳定的VPS和购买流量转发服务才是正确的做法,这样才能保证你的连接不会断,而不是购买第三方机场通过翻墙软件的通知来维护。同时,自建机场再购买一个高倍率机场作为后备,基本就能保证万无一失了。

monyuan commented 5 months ago

是买的vps,但是经常开大会或其他原因导致被GFW,所以需要一个触发通知的刚性需求

nftbty commented 5 months ago

@monyuan passwall是主分支还是smartdns分支的?我先改个样你试下。

monyuan commented 5 months ago

@nftbty 我看了下,是主分支的。我去找运维要一台路由器过来测试

nftbty commented 5 months ago

socks_auto_switch.sh.txt /usr/share/socks_auto_switch.sh global.lua.txt /usr/lib/lua/luci/model/cbi/passwall/client/global.lua anpush.sh.txt 这个是我自己写的一个AnPush的推送脚本,只处理了标题可能存在的空格,然后推送内容做了URL编码,具体根据你自己需求改吧。

image

脚本上传到路由器某个目录,别忘了 chmod +x,然后如图中所示,日志筛选填正则表达式,执行命令就脚本所在路径,后面%s表示匹配成功的日志内容,作为脚本参数,当然你也可以不用脚本文件,直接一条curl命令也可以,只要把content位置换成%s就行了。

需要注意的就是筛选日志的正则表达式,你可以看下socks_auto_switch.sh这个脚本里面切换时有哪些echolog

monyuan commented 5 months ago

感谢感谢🙏,正在测试

nftbty commented 5 months ago

我自己测试是没问题,推送成功,你们那个需求的话,用什么关键词或正则来匹配,得好好确定下,要不无关紧要的日志也会推送的。这一项不填的话,就是不筛选,全部推送。不过我只修改了socks自动切换脚本的日志 echolog,app.sh的没改,因为app.sh的日志基本都是手动操作之后马上产生的,运行完脚本就退出了,没有后台持续运行,没有监测推送的必要。 另外还有个monitor.sh,好像是守护进程,监控xray这些具体程序后台的,程序掉后台、重启会产生日志,这个感觉也可以适配修改下?

nftbty commented 5 months ago

感谢感谢🙏,正在测试

测试的时候,正则可以先不填,这样就会推送全部自动切换产生的日志,先测试推送成功了,再确定关键字用什么。 不过它这个推送数一天只有30条,你们是付费了吗?

XedGo commented 5 months ago

@nftbty 这个需求好啊,但是纯小白使用者怎么操作,我也想搞个通知,还是说直接把你给的脚本传上去然后配置一下anpush的密钥就能用了?

monyuan commented 5 months ago

我自己测试是没问题,推送成功,你们那个需求的话,用什么关键词或正则来匹配,得好好确定下,要不无关紧要的日志也会推送的。这一项不填的话,就是不筛选,全部推送。不过我只修改了socks自动切换脚本的日志 echolog,app.sh的没改,因为app.sh的日志基本都是手动操作之后马上产生的,运行完脚本就退出了,没有后台持续运行,没有监测推送的必要。 另外还有个monitor.sh,好像是守护进程,监控xray这些具体程序后台的,程序掉后台、重启会产生日志,这个感觉也可以适配修改下?

感谢,只要有个demo就行了,我测试跑通了,再改下monitor.sh应该能满足需求了

monyuan commented 5 months ago

@nftbty 这个需求好啊,但是纯小白使用者怎么操作,我也想搞个通知,还是说直接把你给的脚本传上去然后配置一下anpush的密钥就能用了?

这个额,没有做成主分支的功能,自己手动搞搞吧,我弄完了之后,后面有空写个教程

nftbty commented 5 months ago

@nftbty 这个需求好啊,但是纯小白使用者怎么操作,我也想搞个通知,还是说直接把你给的脚本传上去然后配置一下anpush的密钥就能用了?

关于这一块,我想了一下,可以利用好GitHub的Discussion,开个教程贴,会写脚本的可以开个子帖,上传脚本模板,简要说明下怎么使用。比如我可以把我刚写的那个anpush.sh传上去,然后其他某个人觉得一天30条额度太少,可以注册多个账号,然后修改脚本轮换使用多个token来推送,来突破一天30条的限制,完成之后,效果可以,他也可以把这个多账号推送脚本上传。

nftbty commented 5 months ago

这个额,没有做成主分支的功能,自己手动搞搞吧,我弄完了之后,后面有空写个教程

你测试成功了,我就规范化修改下(主要是变量名和参数说明),然后就提交了。这个对passwall几乎没什么影响,可以添加。 我还打算弄完了,试试远程让树莓派播放音频文件或者文字转语音发出通知呢。试成功了也发到讨论。

主要是都最好集中发到一个讨论帖。

nftbty commented 5 months ago

这个Feature 要添加到passwall的话,新增的这两个选项到底用什么名字好呢,log_regexlog_shell我临时取的,表达不出这2个option的作用。还有Luci界面的显示名和说明,应该用个什么词,才能一眼看出选项的作用。

monyuan commented 5 months ago

这个额,没有做成主分支的功能,自己手动搞搞吧,我弄完了之后,后面有空写个教程

你测试成功了,我就规范化修改下(主要是变量名和参数说明),然后就提交了。这个对passwall几乎没什么影响,可以添加。 我还打算弄完了,试试远程让树莓派播放音频文件或者文字转语音发出通知呢。试成功了也发到讨论。

主要是都最好集中发到一个讨论帖。

我这边测试成功了,只是在研究monitor.sh 。“新增的这两个选项到底用什么名字好呢” 我个人建议叫做 “事件通知”,很多插件只要带推送的几乎都叫这个名字,减少小白的理解和学习成本

monyuan commented 5 months ago

这个额,没有做成主分支的功能,自己手动搞搞吧,我弄完了之后,后面有空写个教程

你测试成功了,我就规范化修改下(主要是变量名和参数说明),然后就提交了。这个对passwall几乎没什么影响,可以添加。 我还打算弄完了,试试远程让树莓派播放音频文件或者文字转语音发出通知呢。试成功了也发到讨论。 主要是都最好集中发到一个讨论帖。

我这边测试成功了,只是在研究monitor.sh 。“新增的这两个选项到底用什么名字好呢” 我个人建议叫做 “事件通知”,很多插件只要带推送的几乎都叫这个名字,减少小白的理解和学习成本

当然,我这只是个抽象表达的总称,对应到具体功能,log_regex,事件提取 ,log_shell 提取内容推送 ?

nftbty commented 5 months ago

修改已提交,我等会开个讨论贴,你可以把自动切换筛选用的关键字或正则发一下。 我也把anpush脚本单开个主题贴上去。

WROIATE commented 5 months ago

然后在另一个服务器上跑一个服务监测日志变化,可以随你们自己需求监测任何事件。当监测到特定事件发生时,也可以随你们自己做任何操作,发送邮件,或者其他通知服务。

附议,个人认为这样才是正常做法。passwall应该保证的只有日志格式的规范化,剩余的交给用户自行解析做消息监听,转换成消息事件才对。

看代码当前使用grep实现的过滤,一是如果想匹配多事件,仍是需要用户自主实现脚本的,实际用户问题并没有完整解决,未来遇到新场景可能还需要开发者迭代维护;二是使用grep在公司的生产环境,日志小时间短还好,时间久了日志一长这马上就是cpu消耗大头,这种定制逻辑最好还是由公司自己实现比较好,不然到时该挨骂还是照样挨骂。

nftbty commented 5 months ago

看代码当前使用grep实现的过滤,一是如果想匹配多事件,仍是需要用户自主实现脚本的,实际用户问题并没有完整解决,未来遇到新场景可能还需要开发者迭代维护;二是使用grep在公司的生产环境,日志小时间短还好,时间久了日志一长这马上就是cpu消耗大头,这种定制逻辑最好还是由公司自己实现比较好,不然到时该挨骂还是照样挨骂。

不过passwall自身的日志并不多,目前也只是监测了socks自动切换,没有监测具体程序的运行日志。而且也并不是从日志文件里面查找匹配,是每产生一条日志,对该日志判断是否满足筛选条件,所以对于这个issue所提的类似的需求,现在这样足够了。 不过多个事件匹配,代码上确实没做支持。但passwall后台服务总共也就一个 monitor.sh,然后一些用户开了socks自动切换的会有个健康检查和切换的后台服务。 所以即使有匹配多个不同事件的需求,使用正则表达式的或应该可以满足

WROIATE commented 5 months ago

是每产生一条日志,对该日志判断是否满足筛选条件

那这个确实没什么问题,我只看了pr的diff,没细看函数入参逻辑。

不过多个事件匹配,代码上确实没做支持。但passwall后台服务总共也就一个 monitor.sh,然后一些用户开了socks自动切换的会有个健康检查和切换的后台服务。 所以即使有匹配多个不同事件的需求,使用正则表达式的或应该可以满足

就怕进酒吧的下一个顾客要点的不是蛋炒饭而是扬州炒饭了🤣

laaArmy commented 5 months ago

你们的外网流量一定很恐怖