基於Python的TestAgent實現

問題:html

一、本人工做主要作自動化,常常要去Linux後臺進行一些腳本操做,有時要去後臺執行命令,若是逐個登錄比較費事,效率會大打折扣python

二、雖然有能夠直接去後臺執行命令的AW,可是該AW存在不少問題,並且遇到交互式操做時不能很好的解決git

 

基於以上問題,經過Python寫了一個簡單的CLI Agent,就叫作TestAgent吧,主要思路:github

一、採用POST消息發送到TestAgent,TestAgent進行解析服務器

二、TestAgent接受到消息後,把消息體存爲一個文件restful

三、將文件更改成可執行的,而後啓動一個進程去執行腳本curl

四、若是執行成功將結果返回給客戶端,若是失敗,一樣將錯誤輸出也返回給客戶端socket

五、在POST消息的頭域中能夠設置超時時間,若是超時,返回「time out」,並將啓動的進程給殺掉測試

 

代碼以下:ui

 1 #! /usr/bin/env python
 2 import commands
 3 import socket
 4 import time
 5 import os
 6 import multiprocessing
 7 import uuid
 8 from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
 9 
10 #HTTPServer的監聽端口
11 PORT=12345
12 
13 class HttpHandler(BaseHTTPRequestHandler):
14     tmpfile=''
15     #處理POST消息
16     def do_POST(self):
17         print self.path
18         content_len = int(self.headers.getheader('content-length',0))
19         #獲取timeout
20         timeout = int(self.headers.getheader('timeout',0))
21         if timeout==0:
22             timeout=5
23         #解析消息並存儲爲文件
24         script=self.rfile.read(content_len)
25         x=uuid.uuid4()
26         self.tmpfile="."+str(x.int)
27         fd=open(self.tmpfile,'w')
28         fd.write(script)
29         fd.close()
30         os.system("chmod +x "+self.tmpfile)
31         script="./"+self.tmpfile
32         #執行腳本
33         self.ExecuteScript(script,timeout)
34         
35     def ExecuteScript(self,script,timeout=5):
36         #啓動另外一個進程執行腳本
37         p=multiprocessing.Process(target=self.ScriptWorker,args=(script,))
38         p.start()
39         i=0
40         while i<timeout:
41             if(not p.is_alive()):
42                 return "successful"
43             else:
44                 time.sleep(1)
45             i=i+1
46         #超時的話終止進程並殺掉執行任務的進程
47         p.terminate()
48         os.system("kill -9 "+str(p.pid))
49         self.send_error(400,"time out")
50         self.request.shutdown(socket.SHUT_RDWR)
51         self.request.close()
52         #刪除臨時文件
53         if self.tmpfile != '':
54             os.system("rm "+self.tmpfile)
55         self.tmpfile=''
56         
57     def ScriptWorker(self,script):
58         #執行腳本,返回狀態碼和輸出
59         (status,result)=commands.getstatusoutput(script)
60         print script
61         print result
62         #若是成功返回200,若是失敗返回400
63         if status == 0:
64             self.send_response(200)
65         else:
66             self.send_response(400)
67         self.send_header('Content-type','text/html')
68         self.end_headers()
69         self.wfile.write(result)
70         #刪除臨時文件
71         if self.tmpfile != '':
72             os.system("rm "+self.tmpfile)
73         self.tmpfile=''
74         
75 if __name__=='__main__':
76     os.system('rm .*')
77     server_address=('0.0.0.0',PORT)
78     http_server=HTTPServer(server_address,HttpHandler)
79     http_server.serve_forever()
80         

測試:

採用curl或者restful client進行測試

一、執行簡單命令

 

二、執行的命令不存在

三、執行一個Python腳本

四、執行一個超時的腳本

五、執行一個帶有timeout頭域的腳本

 

至此,基本全部功能都驗證過了

 

PS:該程序理論上能夠執行任何腳本,只要腳本的解釋器寫正確

      使用時通常會再寫個monitor腳本,放在crontab中,這樣就徹底能夠不登錄服務器了,能夠自動拉起TestAgent

 

但願該程序能夠幫助你們,^v^ !!

 地址:https://github.com/litlefirefly/TestAgent

相關文章
相關標籤/搜索