DELL IDRAC API接口开发文档翻译及client模块

今天和DELL官网要了一份关于服务器IDRAC 版本7/8 的API开发文档,花了一天的时间,进行了翻译,不一定全部准确,但对于英语不好的人会有所帮助。也不用重复造轮子了。
下载链接:

IDRAC API开发文档翻译版本

DELL IDRAC7/8  硬件监控client模块

  1 #!/opt/python3/bin/python3
  2 #Author: zhaoyong
  3 '''
  4 本模块用于DELL 服务器IDARC API接口,只用于检测硬件状态,检测硬件包括如下:
  5     < CPU, 内存, 磁盘, 电源, 风扇, raid卡>
  6 注意:只支持IDRAC版本7和版本8
  7 注意:只提取URL:/redfish/v1/Systems/System.Embedded.1 下的信息
  8 '''
  9 import requests, json
 10 
 11 
 12 class idrac_api(object):
 13     '''
 14     DELL powerEdge服务器IDRAC 7/8 API 硬件监控客户端接口
 15     '''
 16 
 17     def __init__(self, ip, username, passwd):
 18         self.__ip = ip
 19         self.__username = username
 20         self.__passwd = passwd
 21         # 服务器连接tokin对象
 22         self.__s_tokin = ''
 23         # 第一次访问提取的元数据,字典格式
 24         self.__meta_data_dict = ''
 25 
 26     def conn(self):
 27         '''
 28         连接服务器
 29         :return:
 30         '''
 31         # SSL验证会提示警告,这里进行关闭警告信息的提示
 32         requests.packages.urllib3.disable_warnings()
 33         # 初始化一个session连接
 34         c = requests.Session()
 35         c.timeout = 60
 36         # 设置验证信息
 37         c.auth = (self.__username, self.__passwd)
 38         # 关闭SSL验证
 39         c.verify = False
 40         # 连接IDRAC并进行身份验证和原始数据的提取
 41         auth_url = 'https://%s/redfish/v1/Systems/System.Embedded.1' % (self.__ip)
 42         try:
 43             conn_status = c.get(auth_url)
 44             # 如果连接成功,将session对象赋予self.__s_tokin,获取的元数据赋予self.__meta_data_dict,否则报错
 45             if conn_status.ok:
 46                 self.__s_tokin = c
 47                 self.__meta_data_dict = conn_status.json()
 48             else:
 49                 err_info = conn_status.raise_for_status()
 50                 # print('----->',err_info)
 51                 return '服务器: %s IDRAC连接失败,错误信息:%s' % (self.__ip, err_info)
 52         except Exception as e:
 53             return '服务器: %s IDRAC连接失败,错误信息:%s' % (self.__ip, e)
 54 
 55     def memory_status(self):
 56         '''
 57         检测内存
 58         输出格式:MemorySummary {'Status': {'Health': 'OK', 'HealthRollUp': 'OK', 'State': 'Enabled'}, 'TotalSystemMemoryGiB': 64.0}
 59         :return: 返回内存状态
 60         '''
 61         mem_status = self.__meta_data_dict['MemorySummary']['Status']['Health']
 62         return mem_status
 63 
 64     def cpu_status(self):
 65         '''
 66         检测CPU
 67         输出格式:ProcessorSummary {'Count': 2, 'Model': 'Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz', 'Status': {'Health': 'OK', 'HealthRollUp': 'OK', 'State': 'Enabled'}}
 68         :return:返回CPU状态
 69         '''
 70         cpu_status = self.__meta_data_dict['ProcessorSummary']['Status']['Health']
 71         return cpu_status
 72 
 73     def sn(self):
 74         '''
 75         提取服务的SN,暂时不需要
 76         :return: 返回SN码
 77         '''
 78         sn_str = self.__meta_data_dict['SKU']
 79         return sn_str
 80 
 81     def disk_status(self):
 82         '''
 83         硬盘检测输出:
 84         SimpleStorage {'@odata.id': '/redfish/v1/Systems/System.Embedded.1/Storage/Controllers'}
 85         Status {'Health': 'OK', 'HealthRollUp': 'OK', 'State': 'Enabled'}
 86         如果总体检测结果为OK,直接返回默认字典
 87         否则将详细检查每一个磁盘和raid卡,将有故障的设备名称写入返回的字典
 88         :return: 返回硬盘和raid卡状态
 89         '''
 90         disk_result= {'raid_card':'OK','pre_disk':'OK'}
 91         disk_check = self.__meta_data_dict['Status']['Health']
 92         if disk_check != 'OK':
 93             d_url_str = 'https://%s%s' % (self.__ip, self.__meta_data_dict['SimpleStorage']['@odata.id'])
 94             member_out = self.__s_tokin.get(d_url_str).json()
 95             member_url_str = 'https://%s%s' % (self.__ip, member_out['Members'][0]['@odata.id'])
 96             pre_disk_out = self.__s_tokin.get(member_url_str).json()
 97             if pre_disk_out['Status']['Health'] != 'OK':
 98                 disk_result['raid_card'] = pre_disk_out['Name']
 99             for pd in pre_disk_out['Devices']:
100                 if pd['Status']['Health'] != 'OK':
101                     disk_result['pre_disk'] = pd['Name']
102 
103         return disk_result
104 
105     def power_status(self):
106         '''
107         电源检测
108         :return: 返回电源状态
109         '''
110         pow_status = {}
111         power_url_list = self.__meta_data_dict['Links']['PoweredBy']
112         for p in power_url_list:
113             p_url = 'https://%s%s' % (self.__ip, p['@odata.id'])
114             p_dict = self.__s_tokin.get(p_url).json()
115             pow_status[p_dict['Name']] = p_dict['Status']['Health']
116         return pow_status
117 
118     def fan_status(self):
119         '''
120         风扇检测
121         :return:统一返回风扇整体状态
122         '''
123         fan_status={'fan':'OK'}
124         fan_all_list = self.__meta_data_dict['Links']['CooledBy']
125         for f in fan_all_list:
126             f_url_str = 'https://%s%s' % (self.__ip, f['@odata.id'])
127             fan_out = self.__s_tokin.get(f_url_str).json()
128             if fan_out['Status']['Health'] != 'OK':
129                 fan_status['fan'] = fan_out['FanName']
130                 return fan_status
131         return fan_status
132 
133     def hardware_status(self):
134         '''
135         收集所有硬件信息
136         :return: 返回json格式数据
137         '''
138         out = []
139         ck_result = {}
140         ck_result['cpu'] = self.cpu_status()
141         ck_result['memory'] = self.memory_status()
142         ck_result['disk'] = self.disk_status()['pre_disk']
143         ck_result['raid_card'] = self.disk_status()['raid_card']
144         ck_result['power1'] = self.power_status()['PS1 Status']
145         ck_result['power2'] = self.power_status()['PS2 Status']
146         ck_result['fan'] = self.fan_status()['fan']
147         # 提取故障设备
148         for s in ck_result:
149             if ck_result[s] != 'OK':
150                 out.append(ck_result[s])
151         if len(out) == 0:
152             out.append('OK')
153         # 以字符串返回故障设备,否则返回OK,表示无故障
154         return ','.join(out)
155 
156 if __name__ == '__main__':
157     '''
158     运行主程序,测试使用
159     '''
160     out = idrac_api('IDRAC IP', '账号', '密码')
161     # 连接服务器
162     mess = out.conn()
163     # 有错误就打印报错信息并exit
164     if mess:
165         exit(mess)
166     # 以字符串打印检测结果
167     result = out.hardware_status()
168     print(result)

 

posted @ 2018-04-28 23:27  十年如一..bj  阅读(2158)  评论(1编辑  收藏  举报