1. 程式人生 > >CMDB項目之獲取今日未采集資產列表和API驗證

CMDB項目之獲取今日未采集資產列表和API驗證

dumps 數據添加 now() 年月日 host client form def _id

獲取今日未采集資產列表:

要點:

1、server表添加兩個字段:latest_date(可以為空);服務器狀態信息;

2、哪些情況會獲取到未采集服務器信息?

  ①latest_date為空的情況,比如初始創建尚未匯報資產;

  ②今日還未采集過,註意latest_date__date__lt<current_date,雙下劃線加date表示只取年月日部分。

  ③服務器狀態為在線狀態

3、服務器更新資產時設置current_date=datetime.datetime.now();

4、get_host_list函數:

  註意:內容放在response.text部分(response=request.get(url))

代碼區:

###############服務端###############

@csrf_exempt
def server(request):
    ‘‘‘
    requests不能發送字典類型數據,縱觀我們學的form表單提交數據,
    ajax發送數據,均是不支持字典類型數據的發送的。
    具體原因百度知曉。
    :param request: 
    :return: 
    ‘‘‘
    if request.method == ‘GET‘:
        # 獲取今日未采集主機列表[latest_date為None或者latest_date不為今日且服務器狀態為在線]
        current_date = date.today()
        host_list = models.Server.objects.filter(
            Q(Q(latest_date=None) | Q(latest_date__date__lt=current_date)) & Q(server_status_id=2)).values(‘hostname‘)
        ‘‘‘
        [‘hostname‘:‘c1.com‘]
        ‘‘‘
        host_list = list(host_list)
        print(host_list)
        return HttpResponse(json.dumps(host_list))

#############客戶端#############

class SshSaltClient(BaseClient):

    def get_host_list(self):
        response=requests.get(self.api) #<Response [200]>
        # print(response.text)    # [{"hostname": "c1.com"}]註意這種用法
        return json.loads(response.text)

API驗證

要點:過三關

第一關:時間限制(客戶端時間與服務端相隔多久的時間以外,我們隊請求做限制)

第二關:加密規則限制(主要應用MD5加密)

第三關:對於已訪問過得加密str我們設置已訪問列表,正常用戶不可能再次拿著這個訪問過得數據請求服務器,如果列表裏沒有str,證明是正常用戶訪問,記得把該條數據添加到已訪問列表。

這個內容會越來越龐大,實際會應用到memcache和redis。

最後這三關基本已可以實現防黑客攻擊的效果,但是不排除黑客網速比我們網速快的情況,不妨我們把要發送的數據做一層加密,接著黑客的網速早點提交至服務器,也未嘗不可呢?

代碼區:

##############客戶端##############

import requests
import time
import hashlib


def md5(arg):
    md5 = hashlib.md5()
    md5.update(arg.encode(‘utf-8‘))
    return md5.hexdigest()


key = ‘asdfghjklmnbvcxz‘
ctime = str(time.time())
client_str = ‘%s|%s‘ % (key, ctime)
client_md5_str = md5(client_str)
client_header_str = ‘%s|%s‘ % (client_md5_str, ctime)
print(client_header_str)

response = requests.get(url=‘http://127.0.0.1:8000/api/tests.html‘, headers={‘auth-api‘: ‘cae76146bfa06482cfee7e4f899cc414|1506956350.973326‘})
print(response.text)

##############服務端##############

def md5(arg):
    md5 = hashlib.md5()
    md5.update(arg.encode(‘utf-8‘))
    return md5.hexdigest()

key = ‘asdfghjklmnbvcxz‘
vistied_str_dict={}

def tests(request):

    client_header_str = request.META.get(‘HTTP_AUTH_API‘)
    print(client_header_str)
    client_md5_str, client_ctime = client_header_str.split(‘|‘, maxsplit=1)
    client_float_ctime = float(client_ctime)
    server_float_ctime = float(time.time())
    # 第一關
    if (client_float_ctime + 20) < server_float_ctime:
        return HttpResponse("太慢了")

    # 第二關
    server_str = ‘%s|%s‘ % (key, client_ctime)
    server_md5_str = md5(server_str)

    if client_md5_str != server_md5_str:
        return HttpResponse(‘休想‘)

    # 第三關
    if vistied_str_dict.get(client_md5_str):
        return HttpResponse(‘放棄吧‘)
    else:
        vistied_str_dict[client_md5_str] = client_ctime
        return HttpResponse(‘你得到我了‘)

最後,未用裝飾器,明天加上。

CMDB項目之獲取今日未采集資產列表和API驗證