Restful接口对操作系统进行操作

在产品开发过程中,有时候需要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

时间: 2024-10-13 00:38:46

Restful接口对操作系统进行操作的相关文章

RESTful 接口调试分享利器 restc

这个工具来自于https://elemefe.github.io/restc/  这里对Abp进行了一次封装 1.在项目中添加nuget包 Abp.Web.Api.Restc 2.在项目Abp模块的DependsOn添加AbpWebApiRestcModule Run It,启动项目,访问/api开头的restful接口 ,原先正常返回的干巴巴JSON数据变成了一个可以操作分享的UI界面了 项目源码https://github.com/yuzukwok/Abp.Web.Api.Restc大家可以

前端调用后端的方法(基于restful接口的mvc架构)

1.前端调用后台: 建议用你熟悉的一门服务端程序,例如ASP,PHP,JSP,C#这些都可以,然后把需要的数据从数据库中获得,回传给客户端浏览器(其实一般就是写到HTML中,或者生成XML文件)然后在用JS获得. 2.js只是前端的语言,它还没有访问数据库的能力.不过它可以向某个URL发送请求,并获得返回的数据.这个会用到Ajax技术. 用AJAX,页面不刷新,只提交字符串到后台导入数据库       通过纯AngularJS+REST API构建Web是否可行? 在构建Web系统的时候,可不可

[转]简单识别 RESTful 接口

     本文描述了识别一个接口是否真的是 RESTful 接口的基本方法.符合 REST 架构风格的接口,称为 RESTful 接口.本文不打算从架构风格的推导方面描述,而是从 HTTP 标准的方面描述.识别的方法同时也是指导实践的原则.       一.是否使用了正确(合适)的方法 目前对于 HTTP 标准滥用较多的,就是方法.谈起 RESTful 接口的方法,很多资料告诉大家,说 GET.POST.PUT.DELETE,分别对应数据库操作的 SELECT.INSERT.UPDATE.DEL

RESTful接口签名认证实现机制

RESTful接口 互联网发展至今,催生出了很多丰富多彩的应用,极大地调动了人们对这些应用的使用热情.但同时也为互联网应用带来了严峻的考验.具体体现在以下几个方面: 1.     部署方式的改变:当用户量不多的情况下,可能只需部署一台服务器就可以解决问题,但是当很多用户的情况下,为抗住高并发访问,需要组成应用集群对外提供服务: 2.     应用构建的改变:很多应用采用了多种技术解决方案,不同编程语言(如C,Java,Python),所以很难采用传统应用构建模式将不同模块整合进来: 3.    

简单识别 RESTful 接口

本文描述了识别一个接口是否真的是 RESTful 接口的基本方法.符合 REST 架构风格的接口,称为 RESTful 接口.本文不打算从架构风格的推导方面描述,而是从 HTTP 标准的方面描述.识别的方法同时也是指导实践的原则. 一.是否使用了正确(合适)的方法 目前对于 HTTP 标准滥用较多的,就是方法.谈起 RESTful 接口的方法,很多资料告诉大家,说 GET.POST.PUT.DELETE,分别对应数据库操作的 SELECT.INSERT.UPDATE.DELETE.其实这种理解是

PHP restful 接口

首先我们来认识下RESTful Restful是一种设计风格而不是标准,比如一个接口原本是这样的: http://www.test.com/user/view/id/1 表示获取id为1的用户信息,如果使用Restful风格,可以变成这样: http://www.test.com/user/1 可以很明显的看出这样做的好处: 1.更简洁的URL,对程序员友好 2.不暴露内部代码结构,更安全 那么,如何实现这个接口呢?首先,我们需要接收到/user/1部分. $path = $_SERVER['P

简淡 RESTful 接口

今天眼睛有点痛,早点下班回来,不想做饭,顿觉无聊,掐指一算,还是写点想法吧.写东西也是一个休息吧.就聊一下互联网的应用程序接口吧. 互联网最流行的应用程序接口,莫过于 RPC 与 RESTful.两者的一个重要区别是如何对待客户端,RPC 把客户端视为整个系统的一部分,服务器与客户端之间紧密耦合.而 RESTful 刚好相反,客户端与服务器之间,仅需要一个入口 URL. 国内绝大多数 Api,包括新浪微博之类的 HTTP/JSON Api,都是 RPC,RPC 的一个常见的问题就是接口的管理问题

RESTful 接口实现简明指南

REST 简介 REST 是一个术语的缩写,REpresentational State Transfer,中文直译「表征状态转移」,这是个很拗口的词.我的建议是先不要强行理解,直接看怎么做,等对实施细节有一些了解后,再来看名字会有更深刻的理解.REST 是一套风格约定,RESTful 是它的形容词形式:比如一套实现了 REST 风格的接口,可以称之为 RESTful 接口. REST 对请求的约定 REST 用来规范应用如何在 HTTP 层与 API 提供方进行数据交互:在现阶段,你应该已经很

Swagger文档化restful接口

1.注解 @Api:用在类上,说明该类的作用. @ApiOperation:注解来给API增加方法说明. @ApiImplicitParams : 用在方法上包含一组参数说明. @ApiImplicitParam:用来注解来给方法入参增加说明. @ApiResponses:用于表示一组响应 @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息 l   code:数字,例如400 l   message:信息,例如"请求参数没填好" l   resp