CMDB学习之六 --客户端请求测试,服务端api优化

news/2024/8/30 22:17:39

客户端使用agent 请求测试,agent使用的POST 请求,使用requests模块

本地采集,汇报服务端

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from .base import BaseHandler
from ..plugins import get_server_info
import requests
import json

class AgnetHandler(BaseHandler):

    def cmd(self,command,hostname=None):
        import subprocess
        return subprocess.getoutput(command)

    def handler(self):
        """
        Agent模式下处理资产采集:硬盘、内存、网卡
        :return:
        """
        print('agent模式')
        #调用pulugins.disk /plugins.momory /plugins.nerwork
        info = get_server_info(self)
        # print(info)
        r1 = requests.post(
            url='http://127.0.0.1:8000/api/asset',
            data=json.dumps(info)
        )
        print(r1)

salt 和ssh请求 首先要获取服务端 ,没有采集的主机列表,然后根据主机列表进行采集。

  1. get请求获取主机列表

  2、发起远程采集数据,汇报服务器

两方法都有 采集都发起远程和汇报服务器的功能,所有在基类实现方法,然后 方法继承基类   SSHhandSaltHandler

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from ..plugins import get_server_info
import json
import requests

class BaseHandler(object):

    def cmd(self,command,hostname=None):
        '''
         约束派生类
        :return:
        '''
        raise NotImplementedError('cmd() must Implemented.')

    def handler(self):
        '''
        约束派生类
        :return:
        '''
        raise NotImplementedError('handler() must Implemented.')

class SSHhandSaltHandler(BaseHandler):
    def handler(self):
        """
        Salt模式下处理资产采集
        :return:
        """
        print('salt模式或者ssh模式')
        r1 = requests.get(url='http://127.0.0.1:8000/api/asset')
        host_list = r1.json()
        print(host_list)
        from concurrent.futures import ThreadPoolExecutor
        pool = ThreadPoolExecutor(10)
        for host in host_list:
            pool.submit(self.task, host)

    def task(self, hostname):
        # 资产采集并且汇报
        info = get_server_info(self)
        # print(info)
        r1 = requests.post(
            url='http://127.0.0.1:8000/api/asset',
            data=json.dumps(info)
        )
        print(r1)
        print(r1.text)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from .base import SSHhandSaltHandler

class SaltHandler(SSHhandSaltHandler):

    def cmd(self, command, hostname=None):
        """
        调用saltstack远程连接主机并执行命令(saltstack的master)
        :param hostname:主机名
        :param command: 要执行的命令
        :return:
        """
        import salt.client #安装salt
        local = salt.client.LocalClient()
        result = local.cmd(hostname, 'cmd.run', [command])
        return result[hostname]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from .base import SSHhandSaltHandler
from config  import settings

class SSHHandler(SSHhandSaltHandler):

    def cmd(self, command, hostname=None):
        """
        调用paramiko远程连接主机并执行命令,依赖rsa
        :param hostname:主机名
        :param command: 要执行的命令
        :return:
        """
        import paramiko

        private_key = paramiko.RSAKey.from_private_key_file(settings.SSH_PRIVATE_KEY)
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=hostname, port=settings.SSH_PORT, username=settings.SSH_USER, pkey=private_key)
        stdin, stdout, stderr = ssh.exec_command(command)
        result = stdout.read()
        ssh.close()
        return result

##################下面是django服务端#######################

 

下面使用多种方式的api 

from django.shortcuts import render,HttpResponse,redirect,reverse
from django.views.decorators.csrf import csrf_exempt
import json
# Create your views here.
@csrf_exempt
def asset(request):
    if request.method == 'GET':
        host_list = ['c1.com','c2.com']
        return HttpResponse(json.dumps(host_list)) #序列化

    # print(request.body) #原始数据
    # print(request.POST) #url编码的格式  "hostname=c1.com&memory=...."
    ret =json.loads(request.body.decode('utf-8'))
    print(ret)
    return HttpResponse("接受成功")


# CBV加装饰器,忽略csrf验证
# from django.utils.decorators import method_decorator
# from django.views import View
# # @method_decorator(csrf_exempt,name='dispatch')  #这个装饰器比较特殊不能直接加到类中的方法,方法一
# class Asset(View):
#
#     # 这个装饰器比较特殊不能直接加到类中的方法,方法二
#     @method_decorator(csrf_exempt)
#     def dispatch(self,request,*args,**kwargs):
#         return super().dispatch(request,*args,**kwargs)
#
#     def get(self,request):
#         host_list = ['c1.com', 'c2.com']
#         return HttpResponse(json.dumps(host_list))  # 序列化
#
#     def post(self,request):
#         ret = json.loads(request.body.decode('utf-8'))
#         print(ret)
#         return HttpResponse("接受成功")

#使用rest_framework ,首先要安装pip去安装Djangorestframework ,这个模块
# 在Django的settings中注册app
from rest_framework.views import APIView
from rest_framework.response import Response

class Asset(APIView):

    def get(self,request):
        host_list = ['c1.com', 'c2.com']
        return Response(host_list)

    def post(self,request):
        ret = json.loads(request.body.decode('utf-8'))
        print(ret)
        return HttpResponse("接受成功")

Django提供的 rest_framework 需要安装模块导入使用,方便简洁,rest_framework是一个独立的app,所以在Django配置文件中注册

页面结果;

 

 

转载于:https://www.cnblogs.com/michael2018/p/10423178.html


http://www.niftyadmin.cn/n/529810.html

相关文章

FLEX杂谈——flex就业现状与学习标准分析

写下这个标题大家一定以为我是只FLEX老鸟,不然不敢这么高声说话,而且是在JAVAEYE里.我知道JE里高手很多.有很多人都对FLEX有秀深的见底,写此文是为了回答一些朋友对我的提问. 有很多想转行的开发者都问我这样几个问题:现在招FLEX的公司多吗?搞FLEX开发工资高吗?怎么样才算是F…

php的 提示无效字符,PHP无效字符错误

运行此代码时出现此错误:致命错误:test.php中带有消息’无效字符错误’的未捕获异常’DOMException’:29堆栈跟踪:#0 test.php(29):DOMDocument-> createElement(‘1OhmStable’,’a’)#1 { main}在第29行的test.ph…

学习笔记66—兴趣阅读之哲学(佛学)

摘要: 题记:不阅读的人只能过一种人生,参与阅读的人能过成百上千的人生。(PS:每读完一本书,一定要写读后感!!!)转载于:https://www.cnblogs.com/hechangchun/p/10495554.…

php 单行日历,PHP完整的日历类(CLASS)

class Calendar{/** www.jb51.net修正版*/var $YEAR,$MONTH,$DAY;var $WEEKarray("星期日","星期一","星期二","星期三","星期四","星期五","星期六");var $_MONTHarray("01">"一月&…

ES6小技巧笔记

1:去重数组 let a [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]let b [...new Set(a)]console.log(2222222222, b) // [1, 2, 3, 4, 5]2:合并数组let arr1 [a, b]let arr2 [c]let arr3 [d, e]let arr4 arr1.concat(arr2, arr3)let arr5 [...arr1, ...arr2, ...arr3]console.log…

php实现hmac sha1,PHP:如何生成字符串的hmac SHA1签名?

我正在尝试使用PHP连接到API并需要正确的签名.他们的文件逐字记录:The command string needs to hashed using HMAC SHA-1 hashing algorithmagainst the API secret key. The resulting byte array should be Base64encoded in UTF-8 format so that it can be pas…

房贷计算公式

//本息还款的月还款额(参数: 年利率/贷款总额/贷款总月份) //function getMonthMoney1(lilv,total,month){ // var lilv_month lilv / 12;//月利率 // return total * lilv_month * Math.pow(1 lilv_month, month) / ( Math.pow(1 lilv_month, m…

二分搜索树实现Java的Map(下)

二分搜索树Map public class BSTMap<K extends Comparable<K>,V> implements Map<K,V> {private class Node{public K key;public V value;public Node left,right;public Node(K key,V value){this.key key;this.value value;left null;right null;}}pr…