基于Python的TestAgent实现
问题:
1、本人工作主要做自动化,经常要去Linux后台进行一些脚本操作,有时要去后台执行命令,如果逐个登陆比较费事,效率会大打折扣
2、虽然有可以直接去后台执行命令的AW,但是该AW存在很多问题,而且遇到交互式操作时不能很好的解决
基于以上问题,通过Python写了一个简单的CLI Agent,就叫做TestAgent吧,主要思路:
1、采用POST消息发送到TestAgent,TestAgent进行解析
2、TestAgent接受到消息后,把消息体存为一个文件
3、将文件更改为可执行的,然后启动一个进程去执行脚本
4、如果执行成功将结果返回给客户端,如果失败,同样将错误输出也返回给客户端
5、在POST消息的头域中可以设置超时时间,如果超时,返回“time out”,并将启动的进程给杀掉
代码如下:
#! /usr/bin/env python
import commands
import socket
import time
import os
import multiprocessing
import uuid
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer #HTTPServer的监听端口
PORT=12345 class HttpHandler(BaseHTTPRequestHandler):
tmpfile=''
#处理POST消息
def do_POST(self):
print self.path
content_len = int(self.headers.getheader('content-length',0))
#获取timeout
timeout = int(self.headers.getheader('timeout',0))
if timeout==0:
timeout=5
#解析消息并存储为文件
script=self.rfile.read(content_len)
x=uuid.uuid4()
self.tmpfile="."+str(x.int)
fd=open(self.tmpfile,'w')
fd.write(script)
fd.close()
os.system("chmod +x "+self.tmpfile)
script="./"+self.tmpfile
#执行脚本
self.ExecuteScript(script,timeout) def ExecuteScript(self,script,timeout=5):
#启动另一个进程执行脚本
p=multiprocessing.Process(target=self.ScriptWorker,args=(script,))
p.start()
i=0
while i<timeout:
if(not p.is_alive()):
return "successful"
else:
time.sleep(1)
i=i+1
#超时的话终止进程并杀掉执行任务的进程
p.terminate()
os.system("kill -9 "+str(p.pid))
self.send_error(400,"time out")
self.request.shutdown(socket.SHUT_RDWR)
self.request.close()
#删除临时文件
if self.tmpfile != '':
os.system("rm "+self.tmpfile)
self.tmpfile='' def ScriptWorker(self,script):
#执行脚本,返回状态码和输出
(status,result)=commands.getstatusoutput(script)
print script
print result
#如果成功返回200,如果失败返回400
if status == 0:
self.send_response(200)
else:
self.send_response(400)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write(result)
#删除临时文件
if self.tmpfile != '':
os.system("rm "+self.tmpfile)
self.tmpfile='' if __name__=='__main__':
os.system('rm .*')
server_address=('0.0.0.0',PORT)
http_server=HTTPServer(server_address,HttpHandler)
http_server.serve_forever()
测试:
采用curl或者restful client进行测试
1、执行简单命令

2、执行的命令不存在

3、执行一个Python脚本


4、执行一个超时的脚本

5、执行一个带有timeout头域的脚本



至此,基本所有功能都验证过了
PS:该程序理论上可以执行任何脚本,只要脚本的解释器写正确
使用时一般会再写个monitor脚本,放在crontab中,这样就完全可以不登陆服务器了,可以自动拉起TestAgent
希望该程序可以帮助大家,^v^ !!
地址:https://github.com/litlefirefly/TestAgent
基于Python的TestAgent实现的更多相关文章
- 【Machine Learning】决策树案例:基于python的商品购买能力预测系统
决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本 ...
- 基于Python+Django的Kubernetes集群管理平台
➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...
- 关于《selenium2自动测试实战--基于Python语言》
关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...
- psutil一个基于python的跨平台系统信息跟踪模块
受益于这个模块的帮助,在这里我推荐一手. https://pythonhosted.org/psutil/#processes psutil是一个基于python的跨平台系统信息监视模块.在pytho ...
- 一次完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试
Web登录测试是很常见的测试!手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文作者就用python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动 ...
- 搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台
搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台 By 子敬叔叔 最近在学习麦好的<机器学习实践指南案例应用解析第二版>,在安装学习环境的时候 ...
- 《Selenium2自动化测试实战--基于Python语言》 --即将面市
发展历程: <selenium_webdriver(python)第一版> 将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...
- 从Theano到Lasagne:基于Python的深度学习的框架和库
从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...
- 基于python的互联网软件测试开发(自动化测试)-全集合
基于python的互联网软件测试开发(自动化测试)-全集合 1 关键字 为了便于搜索引擎收录本文,特别将本文的关键字给强调一下: python,互联网,自动化测试,测试开发,接口测试,服务测试,a ...
随机推荐
- JAVA中static关键字
用法:是一个修饰符,用于修饰成员(成员变量,成员函数),不能用于修饰局部变量!被static修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用,写法格式是:类名.静态成员.优点:被 ...
- 登录服务器windows2008出现:远程桌面服务当前正忙,因此无法完成您尝试执行的任务。(或者出现黑屏界面)
问题:有段时间登录服务器总是提示:远程桌面服务当前正忙,因此无法完成您尝试执行的任务. 在微软找到的原因是:Csrss.exe 进程和某些应用程序 (例如,Microsoft Excel 或 Micr ...
- 3.通过现有的PDB创建一个新的PDB
实验说明:创建PDB除了可以通过种子PDB创建外,现在测试通过一个现有的用户PDB克隆创建新的PDB数据库 实验步骤: 1.创建测试数据 SQL> alter session set conta ...
- html基本知识点
<hr />定义下划线 <br/>定义换行<p>段落</p> <h1>标题</h1>h后的数字逐渐增大,字体逐渐减小;<h ...
- BACKLOG
团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...
- Pig语言基础-【持续更新中】
***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.*** Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的, ...
- 【原】iOS学习之Socket
Socket在百度百科的定义 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 相关的描述 Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进 ...
- jQuery学习笔记--JqGrid相关操作 方法列表(上)
1.获得当前列表行数:$("#gridid").getGridParam("reccount"); 2.获取选中行数据(json):$("#gridi ...
- MySQL-多条件拼接语句
BEGIN "; SET @_where=""; THEN SET @_where= CONCAT(@_where," AND sourcedomain=\&q ...
- linux 添加 service 服务并自动添加 chkconfig 启动级别
下面以添加一个叫做watchcat的服务为例进行说明: 1.写一个提供给service命令使用的脚本 service 命令的使用方法一般如下 启动: $ service watchcat start ...