我知道这是一个真正的开放式问题,但我是python的新手,正在构建一个简单的一次性web应用程序,为非技术团队提供一些自助服务功能。这个团队有一堆重复的任务,他们把这些任务交给了另一个团队,他们只是乞求自动化,比如在远程主机上重新启动一些进程、grep日志、清理旧文件、部署/重新启动应用程序的新版本、获取当前运行的版本等。用户将点击按钮并观看GUI中的输出,他们不会手动输入运行命令(我知道这很危险)。任何新任务都将由技术支持团队编写脚本并添加到应用程序中。
现在,我唯一不确定的是如何将命令的(接近)实时输出返回到GUI。我过去用PHP构建了一个非常类似的应用程序,我所做的是将远程命令的输出刷新到数据库,然后用ajax轮询数据库并附加新的输出。它非常简单,即使输出会以块的形式返回,也能很好地工作(我将输出逐行写入GUI,所以看起来像是实时的)。有更好的方法吗?我正在考虑使用web套接字将命令的输出推回到GUI。好主意坏主意?python库有什么更好的吗?如果有什么不同的话,我也可以使用nodejs,但我对这两种语言都是新手(我已经有一个简单的python-flask应用程序启动并运行,它可以作为API将一些业务应用程序粘合在一起,在节点中重写不是什么大事)。
这是一个宽泛的问题,但我只给你一些线索。
LogIo就是一个很好的例子。一旦您愿意运行一些命令并将输出推送到GUI,使用Node.js就成为了一种自然的方法。这个应用程序可能包含几个元素:
- 第一部分运行命令并获取输出并将其推送到
- 第二部分,用于接收输出并将其保存到DB/文件中。保存后,此部分将向
- 第三部分,应该是一个websocket服务器,它将处理在线用户并将事件分发到
- 第四部分,,它将是预先编写好脚本的GUI,能够通过websocket连接到第三部分,登录用户,接收事件并将其广播到其他GUI元素
一旦我假设你觉得PHP比python更强,对你来说,最简单的方法是创建第二部分作为一个PHP服务来处理输入(将收获的输出保存到数据库),然后,比方说使用UDP包来处理第三部分的UDP侦听套接字。
第一部分将使用python脚本来获取命令输出,并将其正确绕过第二部分。它应该像往常一样容易处理grep情况:
tail -f /var/log/apache2/access.log | /usr/share/bin/myharvester
在开发它的某个阶段,您将需要在myharvester之后传递用户或unical任务id作为参数。
将Node.js脚本创建为第三部分是一个技巧,但比您想象的要容易。作为一个单实例脚本,它应该能够接收输入并将其作为事件绕过给用户。我以前承诺过这样的东西:
var config = {};
var app = require('http').createServer().listen(config.server.port);
var io = require('socket.io').listen(app);
var listenerDgram = require('dgram').createSocket('udp4');
listenerDgram.bind(config.listeners.udp.port);
var sprintf = require('sprintf').sprintf;
var users = [];
app.on('error', function(er) {
console.log(sprintf('[%s] [ERROR] HTTP Server at port %s has thrown %s', Date(), config.server.port, er.toString()));
process.exit();
});
listenerDgram.on('error', function(er) {
console.log(sprintf('[%s] [ERROR] UDP Listener at port %s has thrown %s', Date(), config.listeners.udp.port, er.toString()));
process.exit();
});
listenerDgram.on('message', function(msg, rinfo) {
// handling, let's say, JSONized msg from part two script,
// buildinf a var frame and finally
if(user) {
// emit to single user based on what happened
// inside this method
users[user].emit('notification', frame);
} else {
// emit to all users
io.emit('notification', frame);
}
});
io.sockets.on('connection', function(socket) {
// handling user connection here and pushing users' sockets to
// users aray.
});
这个废料是一个基本的例子,说明没有填充您需要的逻辑。脚本应该能够在给定的端口上打开UDP侦听器,并侦听在websocket中运行该侦听器的用户。老实说,一旦你在Node.js中变得很好,你可能想用它来修复第二部分+第三部分,将UDP部分从你身上删除的东西将直接将输出推送到脚本中,脚本在其中维护websocket。但它有一个缺点,那就是从CRM的其他后端复制一些逻辑。
最后(第四个)部分是实现内部带有JavaScript的web接口,该接口将当前登录的用户连接到套接字服务器。
我以前也使用过类似的方法,而且它是实时工作的,所以我们可以在电话真正开始响起之前向呼叫中心的员工显示来电信息。最后,解决方案(不计算CRM的接口)在两个脚本中关闭-专用的CRM API部分(所有逻辑发生的地方)来处理来自Asterisk和Node.js事件转发器的事件。