<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## **一、windows中收集硬件信息** 為了收集運行Windows操作系統的服務器的硬件信息,我們需要編寫一個專門的腳本。 在Pycharm的Client目錄下的plugins包中,新建一個`collect_windows_info.py`文件,寫入下面的代碼: <details> <summary>collect_windows_info.py</summary> ``` # -*- coding:utf-8 -*- import platform import win32com import wmi """ 本模塊基于windows操作系統,依賴wmi和win32com庫,需要提前使用pip進行安裝, pip install wmi pip install pypiwin32 或者下載安裝包手動安裝。 """ class Win32Info(object): def __init__(self): # 固定用法,更多內容請參考模塊說明 self.wmi_obj = wmi.WMI() self.wmi_service_obj = win32com.client.Dispatch("WbemScripting.SWbemLocator") self.wmi_service_connector = self.wmi_service_obj.ConnectServer(".", "root\cimv2") def collect(self): data = { 'os_type': platform.system(), 'os_release': "%s %s %s " % (platform.release(), platform.architecture()[0], platform.version()), 'os_distribution': 'Microsoft', 'asset_type': 'server' } # 分別獲取各種硬件信息 data.update(self.get_cpu_info()) data.update(self.get_ram_info()) data.update(self.get_motherboard_info()) data.update(self.get_disk_info()) data.update(self.get_nic_info()) # 最后返回一個數據字典 return data def get_cpu_info(self): """ 獲取CPU的相關數據,這里只采集了三個數據,實際有更多,請自行選擇需要的數據 :return: """ data = {} cpu_lists = self.wmi_obj.Win32_Processor() cpu_core_count = 0 for cpu in cpu_lists: cpu_core_count += cpu.NumberOfCores cpu_model = cpu_lists[0].Name # CPU型號(所有的CPU型號都是一樣的) data["cpu_count"] = len(cpu_lists) # CPU個數 data["cpu_model"] = cpu_model data["cpu_core_count"] = cpu_core_count # CPU總的核數 return data def get_ram_info(self): """ 收集內存信息 :return: """ data = [] # 這個模塊用SQL語言獲取數據 ram_collections = self.wmi_service_connector.ExecQuery("Select * from Win32_PhysicalMemory") for ram in ram_collections: # 主機中存在很多根內存,要循環所有的內存數據 ram_size = int(int(ram.Capacity) / (1024**3)) # 轉換內存單位為GB item_data = { "slot": ram.DeviceLocator.strip(), "capacity": ram_size, "model": ram.Caption, "manufacturer": ram.Manufacturer, "sn": ram. SerialNumber, } data.append(item_data) # 將每條內存的信息,添加到一個列表里 return {"ram": data} # 再對data列表封裝一層,返回一個字典,方便上級方法的調用 def get_motherboard_info(self): """ 獲取主板信息 :return: """ computer_info = self.wmi_obj.Win32_ComputerSystem()[0] system_info = self.wmi_obj.Win32_OperatingSystem()[0] data = {} data['manufacturer'] = computer_info.Manufacturer data['model'] = computer_info.Model data['wake_up_type'] = computer_info.WakeUpType data['sn'] = system_info.SerialNumber return data def get_disk_info(self): """ 硬盤信息 :return: """ data = [] for disk in self.wmi_obj.Win32_DiskDrive(): # 每塊硬盤都要獲取相應信息 disk_data = {} interface_choices = ["SAS", "SCSI", "SATA", "SSD"] for interface in interface_choices: if interface in disk.Model: disk_data['interface_type'] = interface break else: disk_data['interface_type'] = 'unknown' disk_data['slot'] = disk.Index disk_data['sn'] = disk.SerialNumber disk_data['model'] = disk.Model disk_data['manufacturer'] = disk.Manufacturer disk_data['capacity'] = int(int(disk.Size) / (1024**3)) data.append(disk_data) return {'physical_disk_driver': data} def get_nic_info(self): """ 網卡信息 :return: """ data = [] for nic in self.wmi_obj.Win32_NetworkAdapterConfiguration(): if nic.MACAddress is not None: nic_data = {} nic_data['mac'] = nic.MACAddress nic_data['model'] = nic.Caption nic_data['name'] = nic.Index if nic.IPAddress is not None: nic_data['ip_address'] = nic.IPAddress[0] nic_data['net_mask'] = nic.IPSubnet else: nic_data['ip_address'] = '' nic_data['net_mask'] = '' data.append(nic_data) return {'nic': data} if __name__ == "__main__": # 測試代碼 data = Win32Info().collect() for key in data: print(key, ":", data[key]) ``` </details> <br /> windows中沒有方便的命令可以獲取硬件信息,但是有額外的模塊可以幫助我們實現目的,這個模塊叫做wmi。可以使用`pip install wmi`的方式安裝,當前版本是1.4.9。但是wmi安裝后,`import wmi`依然會出錯,因為它依賴一個叫做win32com的模塊。 <br /> 我們依然可以通過`pip install pypiwin32`來安裝win32com模塊,但是不幸的是,據反映,有些機器無法通過pip成功安裝。所以,這里我在github中提供了一個手動安裝包`pywin32-220.win-amd64-py3.5(配合wmi模塊,獲取主機信息的模塊).exe`,方便大家。(如果版本不兼容,也可以自行在網上搜索。) <br /> 依賴包的問題解決后,我們來看一下`sys_info.py`腳本的代碼。 * 類Win32Info封裝了具體數據收集邏輯 * 其中對Win32模塊的調用方式是固定的,有興趣的可以自行學習這個模塊的官方文檔 * 核心在于collect方法,它匯總了其它方法收集的信息! * collect方法首先通過platform模塊獲取平臺的信息,然后保存到一個data字典中。 * 分別調用其它方法,獲取CPU、RAM、主板、硬盤和網卡的信息。 * 每一類數據收集完成后都會作為一個新的字典,update到開始的data字典中,最終形成完整的信息字典。 * 最后在腳本末尾有一個測試入口。 整個腳本的代碼其實很簡單,我們只要將Win32的方法調用當作透明的空氣,剩下的不過就是將獲得的數據,按照我們指定的格式打包成一個數據字典。 <br /> **強調:數據字典的格式和鍵值是非常重要的,是預設的,不可以隨意改變!** <br /> ## **二、信息收集測試** 下面,單獨運行一下該腳本(注意不是運行CMDB項目),查看一下生成的數據。為了顯示更直觀,可以通過在線json校驗工具格式化一下。 ``` { os_type': 'Windows', 'os_release': '764bit6.1.7601', 'os_distribution': 'Microsoft', 'asset_type': 'server', 'cpu_count': 1, 'cpu_model': 'Intel(R)Core(TM)i5-2300CPU@2.80GHz', 'cpu_core_count': 4, 'ram': [ { 'slot': 'A0', 'capacity': 4, 'model': 'PhysicalMemory', 'manufacturer': '', 'sn': '' }, { 'slot': 'A1', 'capacity': 4, 'model': 'PhysicalMemory', 'manufacturer': '', 'sn': '' } ], 'manufacturer': 'GigabyteTechnologyCo., Ltd.', 'model': 'P67X-UD3R-B3', 'wake_up_type': 6, 'sn': '00426-OEM-8992662-12006', 'physical_disk_driver': [ { 'iface_type': 'unknown', 'slot': 0, 'sn': '3830414130423230233235362020202020202020', 'model': 'KINGSTONSV100S264GATADevice', 'manufacturer': '(標準磁盤驅動器)', 'capacity': 59 }, { 'iface_type': 'unknown', 'slot': 1, 'sn': '2020202020202020201020205935334445414235', 'model': 'ST2000DL003-9VT166ATADevice', 'manufacturer': '(標準磁盤驅動器)', 'capacity': 1863 } ], 'nic': [ { 'mac': '24: CF: 92: FF: 48: 34', 'model': '[ 00000011 ]RealtekRTL8192CUWirelessLAN802.11nUSB2.0NetworkAdapter', 'name': 11, 'ip_address': '192.168.1.100', 'net_mask': ('255.255.255.0', '64') }, { 'mac': '0A: 00: 27: 00: 00: 00', 'model': '[ 00000013 ]VirtualBoxHost-OnlyEthernetAdapter', 'name': 13, 'ip_address': '192.168.56.1', 'net_mask': ('255.255.255.0', '64') }, { 'mac': '24: CF: 92: FF: 48: 34', 'model': '[ 00000017 ]MicrosoftVirtualWiFiMiniportAdapter', 'name': 17, 'ip_address': '', 'net_mask': '' }, { 'mac': '10: 19: 86: 00: 12: 98', 'model': '[ 00000018 ]Bluetooth設備(個人區域網)', 'name': 18, 'ip_address': '', 'net_mask': '' } ] } ``` <br /> 上面的信息包含操作系統、主板、CPU、內存、硬盤、網卡等各種信息。可以看到我有兩條內存,兩塊硬盤,以及4塊網卡。內存沒有獲取到sn,但slot是不一樣的。硬盤有sn,但接口未知。四塊網卡有出現mac地址相同的情況,因為那是虛擬機的。 <br /> 你的數據和我的肯定不一樣,但是數據格式和鍵值必須一樣,我們后面自動分析數據、填充數據,都依靠這個固定格式的數據字典。 <br /> 通過測試我們發現數據可以收集到了,那么再測試一下數據能否正常發送到服務器。 <br /> ## **三、數據發送測試** 由于后面我們還會采用Linux虛擬機作為測試用例,所以Django服務器就不能再運行在127.0.0.1:8000上面了。 查看一下當前機器的IP,發現是192.168.0.100,修改項目的settings.py文件,將ALLOWED_HOSTS修改如下: ``` ALLOWED_HOSTS = ["*"] ``` 這表示接收所有同一局域網內的網絡訪問。 然后以0.0.0.0:8000的參數啟動CMDB項目服務器,表示對局域網內所有ip開放服務。 回到客戶端,進入Client/bin目錄,運行`python main.py report_data`,可以看到如下結果: ~~~ (venv) D:\work\2019\for_test\CMDB\Client\bin>python main.py report_data 正在將數據發送至: [http://192.168.0.100:8000/assets/report/] ...... ?[31;1m發送失敗,錯誤原因: HTTP Error 404: Not Found?[0m 日志記錄成功! ~~~ 這是一個404錯誤,表示服務器地址沒找到,這是因為我們還沒有為Django編寫接收數據的視圖和路由。 這時,打開log目錄下的日志文件,內容如下: ~~~ 發送時間:2019-04-12 10:13:52 服務器地址:http://192.168.0.100:8000/assets/report/ 返回結果:發送失敗 錯誤原因: HTTP Error 404: Not Found ~~~ <br /> ## **四、接收數據** 進入`cmdb/urls.py`文件中,編寫一個二級路由,將所有assets相關的數據都轉發到`assets.urls`中,如下所示: ~~~ from django.contrib import admin from django.urls import path from django.urls import include urlpatterns = [ path('admin/', admin.site.urls), path('assets/', include('assets.urls')), ] ~~~ 然后,我們在assets中新建一個urls.py文件,寫入下面的代碼: ~~~ from django.urls import path from assets import views app_name = 'assets' urlpatterns = [ path('report/', views.report, name='report'), ] ~~~ 這樣,我們的路由就寫好了。 轉過頭,我們進入assets/views.py文件,寫一個簡單的視圖。 ~~~ from django.shortcuts import render from django.shortcuts import HttpResponse # Create your views here. def report(request): if request.method == "POST": asset_data = request.POST.get('asset_data') print(asset_data) return HttpResponse("成功收到數據!") ~~~ 代碼很簡單,接收POST過來的數據,打印出來,然后返回成功的消息。 重新啟動服務器,然后去Client客戶端運行`python main.py report_data`,可以看到: ~~~ (venv) D:\work\2019\for_test\CMDB\Client\bin>python main.py report_data 正在將數據發送至: [http://192.168.0.100:8000/assets/report/] ...... ?[31;1m發送失敗,錯誤原因: HTTP Error 403: Forbidden?[0m 日志記錄成功! ~~~ 403就是拒絕服務的錯誤了。 原因在于我們模擬瀏覽器發送了一個POST請求給Django,但是請求中沒有攜帶Django需要的csrf安全令牌,所以拒絕了請求。 為了解決這個問題,我們需要在這個report視圖上忽略csrf驗證,可以通過Django的`@csrf_exempt`裝飾器。修改代碼如下: ~~~ from django.shortcuts import render from django.shortcuts import HttpResponse from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt def report(request): if request.method == "POST": asset_data = request.POST.get('asset_data') print(asset_data) return HttpResponse("成功收到數據!") ~~~ 重啟CMDB服務器,再次從客戶端報告數據,可以看到返回結果如下: ~~~ (venv) D:\work\2019\for_test\CMDB\Client\bin>python main.py report_data 正在將數據發送至: [http://192.168.0.100:8000/assets/report/] ...... ?[31;1m發送完畢!?[0m 返回結果:成功收到數據! 日志記錄成功! ~~~ <br /> 這表明數據發送成功了。 再看Pycharm中,也打印出了接收到的數據,一切OK! CSRF驗證的問題解決了,但是又帶來新的安全問題。我們可以通過增加用戶名、密碼,或者md5驗證或者自定義安全令牌的方式解決,這部分內容需要大家自己添加。 Windows下的客戶端已經驗證完畢了,然后我們就可以通過各種方式讓腳本定時運行、收集和報告數據,一切都自動化。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看