#!/usr/bin/env python #-*-coding:UTF-8-*- """ @Item : V1.0 @Author : ShengWangQiang @Group : System ITEM @Date : 2015-01-28 @E-mail : [email protected] @Funtion: "RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0") echo "Raid Level :Raid 1";; "RAID Level : Primary-0, Secondary-0, RAID Level Qualifier-0") echo "Raid Level :Raid 0";; "RAID Level : Primary-5, Secondary-0, RAID Level Qualifier-3") echo "Raid Level :Raid 5";; "RAID Level : Primary-1, Secondary-3, RAID Level Qualifier-0") echo "Raid Level :Raid 10";; """ import os,sys,time,socket,commands,traceback,re,fcntl,json import struct class DellRaid(object): def __init__(self): version = 1.0 # Log file and save log info def log(self,info): if not os.path.exists(‘/var/log/autostack/‘): os.makedirs(‘/var/log/autostack/‘) files = open(‘/var/log/autostack/autostack.log‘,‘a‘) try: files.write(‘[%s]: %s \n‘ %(time.ctime(),info)) except IOError: files.close() files.close() # Call system commands def execute(self,*cmd): """ execute the cmd, and return the outpurt of cmd simple way to get cmd output. """ cmd = list(cmd) cmd = map(str, cmd) cmd_line = ‘ ‘.join(cmd) code, output = commands.getstatusoutput(cmd_line) if code == 0: self.log(output) self.log(cmd_line) return output else: self.log(traceback.format_exc()) self.log(cmd_line) # Megacli create Raid 0 def raid_0(self,raid_type,enclosure,slot): try: raid_type = raid_type.split(‘_‘)[-1] sinfo = ‘,‘.join([‘%s:‘ %enclosure + str(i) for i in slot]) self.execute( """/usr/bin/megacli -CfgLdAdd -r%s [%s] WB Direct -a0""" %(raid_type,sinfo)) self.log("Raid Group %s create is oK" %raid_type) except: self.log(‘raid_0 Error %s ‘ %traceback.format_exc()) # Megacli create Raid 1 def raid_1(self,raid_type,enclosure,slot): try: raid_type = raid_type.split(‘_‘)[-1] sinfo = ‘,‘.join([‘%s:‘ %enclosure + str(i) for i in slot]) self.execute( """/usr/bin/megacli -CfgLdAdd -r%s [%s] WB Direct -a0""" %(raid_type,sinfo)) self.log("Raid Group %s create is oK" %raid_type) except: self.log(‘raid_1 Error %s ‘ %traceback.format_exc()) # Megacli create Raid 5 def raid_5(self,raid_type,enclosure,slot): try: raid_type = raid_type.split(‘_‘)[-1] sinfo = ‘,‘.join([‘%s:‘ %enclosure + str(i) for i in slot]) self.execute( """/usr/bin/megacli -CfgLdAdd -r%s [%s] WB Direct -a0""" %(raid_type,sinfo)) self.log("Raid Group %s create is oK" %raid_type) except: self.log(‘raid_5 Error %s ‘ %traceback.format_exc()) # Megacli create Raid 10 def raid_10(self,raid_type,enclosure,slot): try: raid_type = raid_type.split(‘_‘)[-1] arry_slot = self._arry_slot(enclosure,slot) self.execute("""/usr/bin/megacli -CfgSpanAdd -r%s %s WB Direct -a0 """ %(raid_type,arry_slot)) print ‘yes‘ self.log("Raid Group %s create is oK" %raid_type) except: print traceback.format_exc() self.log(‘raid_10 Error %s ‘ %traceback.format_exc()) # Array split Raid def _arry_slot(self,enclosure,slot): bnext = iter(slot) count = 0 ret = [] try: for i in bnext: i = int(i.encode() ) ret.append(‘-Array%i[%s:%s,%s:%s]‘%(count, enclosure,i,enclosure, bnext.next())) count += 1 self.log(‘Array str %s ‘%‘ ‘.join(ret)) return ‘ ‘.join(ret) except: self.log(traceback.format_exc()) return ‘‘ # Split enclosure str def _enclosure(self,disks): enclosure = dict() try: for d in disks: rest =d[‘enclosure‘] if not rest: rest = self._esc() enclosure[‘enclosure‘] = rest except: self.log(traceback.format_exc()) return enclosure def _esc(self): try: ecs = self.execute(""" /usr/bin/megacli -cfgdsply -aALL |grep ‘Enclosure Device ID‘ """) ecs =int(ecs.split(":")[-1].strip()) return ecs except: self.log(traceback.format_exc()) # Split slot str info def _slot(self,disks): slot = list() try: for d in disks: slot.append(d[‘slot‘]) except: self.log(traceback.format_exc()) return slot # Delete Raid Group ,defautl values is ID def delete_raid_group(self): try: ids = self.execute("""/usr/bin/megacli -cfgdsply -aALL | grep "Number of DISK GROUPS" """) for i in range(int(ids.split(‘:‘)[-1])): self.execute(""" /usr/bin/megacli -CfgLdDel -L%s -a0""" %i) self.log("Raid Group %s delete is oK" %i) except: self.log(traceback.format_exc()) def set_ipmit_boot(self): try: self.execute(""" /usr/bin/ipmitool chassis bootdev pxe """) self.log("Set Service boot pxe is ok") except: self.log(traceback.format_exc()) def work(self,data): # Get Raid Group info for Create raid live raid_info = dict() for info in range(len(data)): raid_info[data[info][‘raid_group‘]] = dict() raid_info[data[info][‘raid_group‘]][‘raid_group‘] = data[info][‘raid_group‘] raid_info[data[info][‘raid_group‘]][‘raid_type‘] = data[info][‘raid_type‘] raid_info[data[info][‘raid_group‘]][‘os_flag‘] = data[info][‘os_flag‘] raid_info[data[info][‘raid_group‘]][‘enclosure‘] = self._enclosure(data[info][‘disks‘])[‘enclosure‘] raid_info[data[info][‘raid_group‘]][‘slot‘] = self._slot(data[info][‘disks‘]) # Delete old raid group self.delete_raid_group() # Set Service boot is PXE self.set_ipmit_boot() # Create Raid Group ... for m in raid_info: # The os Raid is create if raid_info[m][‘os_flag‘]: if raid_info[m][‘raid_type‘] == ‘raid_0‘: self.raid_0(raid_info[m][‘raid_type‘], raid_info[m][‘enclosure‘], raid_info[m][‘slot‘]) elif raid_info[m][‘raid_type‘] == ‘raid_1‘: self.raid_1(raid_info[m][‘raid_type‘], raid_info[m][‘enclosure‘], raid_info[m][‘slot‘]) elif raid_info[m][‘raid_type‘] == ‘raid_5‘: self.raid_5(raid_info[m][‘raid_type‘], raid_info[m][‘enclosure‘], raid_info[m][‘slot‘]) elif raid_info[m][‘raid_type‘] == ‘raid_10‘: self.raid_10(raid_info[m][‘raid_type‘], raid_info[m][‘enclosure‘], raid_info[m][‘slot‘]) for m in raid_info: # The not is os Raid if not raid_info[m][‘os_flag‘]: if raid_info[m][‘raid_type‘] == ‘raid_0‘: self.raid_0(raid_info[m][‘raid_type‘], raid_info[m][‘enclosure‘], raid_info[m][‘slot‘]) elif raid_info[m][‘raid_type‘] == ‘raid_1‘: self.raid_1(raid_info[m][‘raid_type‘], raid_info[m][‘enclosure‘], raid_info[m][‘slot‘]) elif raid_info[m][‘raid_type‘] == ‘raid_5‘: self.raid_5(raid_info[m][‘raid_type‘], raid_info[m][‘enclosure‘], raid_info[m][‘slot‘]) elif raid_info[m][‘raid_type‘] == ‘raid_10‘: self.raid_10(raid_info[m][‘raid_type‘], raid_info[m][‘enclosure‘], raid_info[m][‘slot‘])
时间: 2024-11-05 15:56:53