在产品开发过程中,有时候需要web端对服务器进行操作,如修改ip、重启设备、关机等。前后端交互有很多方法,常见的有web端直接调用系统命令、通过数据库交互和Restful接口交互。直接调用系统命令最简单,但是最不安全,基本上没人会使用;数据库交互鼻尖安全,但是比较消耗硬件资源。所以Restful交互是一种很好的方式。
下面代码是对Restful形式交互的实现:
#-*- coding:utf-8 -*-
#!/usr/bin/env python
‘‘‘
Created on 2017.5.9
@desc: 对系统操作的模块,负责关机、重启、ping地址和修改网络
@useMethord shutdown: http://127.0.0.1:7777/ins/json?Command=shutdown
@useMethord restart: http://127.0.0.1:7777/ins/json?Command=restart
@useMethord ping: http://127.0.0.1:7777/ins/json?ip=120.25.160.121
@useMethord changeNetwork: http://127.0.0.1:7777/ins/json?ip_addr="$ip"&gateway="$gateway"&netmask="$mask"&dns="$dns"&device="eth0"
‘‘‘
import os
import traceback
import ipaddr
import commands
import socket,sys,urllib
from BaseHTTPServer import *
class Restful(BaseHTTPRequestHandler):
def __init__(self,request,client_address,server):
BaseHTTPRequestHandler.__init__(self, request, client_address, server)
self.dp = None
self.router = None
def basepath(self):
pass
def getresetlet(self):
pass
def send(self,src):
"""
@desc: 返回结果的函数
"""
try:
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write(src)
self.wfile.close()
except:
traceback.print_exc()
def done(self):
self.dp = self.basepath()
self.router = self.getresetlet()
class doService(Restful):
def do_GET(self):
try:
self.done()
query = None
query = urllib.splitquery(self.path)
print self.path
print query
#关机
if "Command=shutdown" in self.path:
self.shutdown()
#重启
elif "Command=restart" in self.path:
self.restart()
#ping地址
elif "ip=" in self.path:
query_string = query[1]
print query_string
if query_string:
ip = query_string.split(‘=‘)[1]
self.ping(ip)
else:
self.send(‘False‘)
#修改网络参数
else:
paramsInput=[‘ip_addr‘,‘netmask‘,‘gateway‘,‘dns‘,‘device‘]
for pInput in paramsInput:
if self.path.find(pInput) < 0:
self.send(‘False‘)
return
param=query[1].split(‘&‘)
pdict={}
for p in param:
tmp=p.split(‘=‘)
pdict[tmp[0]]=tmp[1]
print ‘change network success...‘
res = self.changeNetwork(pdict[‘ip_addr‘], pdict[‘gateway‘],
pdict[‘netmask‘],pdict[‘dns‘], pdict[‘device‘])
if res:
self.send("True")
else:
self.send("False")
except:
traceback.print_exc()
self.send("False")
def basepath(self):
return "/ins"
def shutdown(self):
try:
os.system("sudo init 0")
print "power off success..."
self.send("True")
except:
traceback.print_exc()
self.send("False")
def restart(self):
try:
os.system("sudo init 6")
print "restart success..."
self.send("True")
except:
traceback.print_exc()
self.send("False")
def ping(self,ip):
try:
if ip:
ipaddr.IPAddress(ip)
output = commands.getoutput("ping %s -c 4"%ip)
if "100% packet loss" in output:
self.send("False")
else:
self.send("True")
except:
traceback.print_exc()
self.send("False")
def changeNetwork(self,ip,gateway,mask,dns,device):
try:
if ip and gateway and mask and dns and device:
ipaddr.IPAddress(ip)
if ip == "1.1.1.1":
self.send("please change another ip...")
return False
else:
try:
files = open("/etc/network/interfaces", ‘r‘)
interface_content=files.read()
files.close()
net_split_contents = interface_content.split("########") #8个
for data in net_split_contents:
if device in data:
content = """\nauto %s\niface %s inet static\n address %s\n netmask %s\n gateway %s\n dns-nameservers %s\n\n""" %(device,device,ip,mask,gateway,dns)
interface_content=interface_content.replace(data,content)
break
files = open("/etc/network/interfaces", ‘w+‘)
files.write(interface_content)
files.close()
result = commands.getoutput("sudo ifdown %s && sudo ifup %s" %(device,device))
if "Failed" in result:
return False
else:
return True
except:
traceback.print_exc()
return False
except:
traceback.print_exc()
return False
def main():
try:
server=HTTPServer((‘127.0.0.1‘,7777),doService)
server.serve_forever()
except KeyboardInterrupt:
sys.exit(0)
if __name__ == "__main__":
main()运行上面的代码,会监控本机的7777端口,只要监控到相应的命令就会执行相应的动作。web端只需要吧相应的操作发送到777端口即可。
参考:http://www.cnblogs.com/wuchaofan/p/3432596.html
本文出自 “黑色时间” 博客,请务必保留此出处http://blacktime.blog.51cto.com/11722918/1924166
原文地址:http://blacktime.blog.51cto.com/11722918/1924166