def create_new_snapshot(home, lun, snapname): cmd = os.path.join(home, "libexec/lich.snapshot") snapshot = "%s@%s" % (lun, snapname) try: _exec_pipe1([cmd, '--create', snapshot], 1, False) except Exp, e: raise Exp(e.errno, e.err)
def __check_raid_env(self): host_type = platform.architecture()[0] raid_type = [] ls_pci = None try: ls_pci = _exec_pipe(["lspci"], 0, False) except: return None for line in ls_pci.splitlines(): if 'RAID bus controller: LSI Logic / Symbios Logic MegaRAID' in line: cmd = "/opt/MegaRAID/MegaCli/MegaCli" if host_type == '64bit': cmd += '64' try: (out_msg, err_msg) = _exec_pipe1([cmd, "-v", "-Nolog"], 0, False, 10) except Exception, e: raise Exp(errno.EPERM, cmd + " command execute failed") try: (out_msg, err_msg) = _exec_pipe1(["disk2lid"], 0, False) except Exception, e: _derror("disk2lid command execute failed") return None if 'MegaRAID' not in raid_type: raid_type.append('MegaRAID')
def dev_reset_sgdisk(self, dev): try: disk_info = self.dev_check_sgdisk(dev) if disk_info.splitlines()[0].strip( ) != 'Creating new GPT entries.': try: _exec_pipe1(["sgdisk", "-z", dev], 0, False, 5) except Exception, e: pass except Exception, e: try: _exec_pipe1(["sgdisk", "-z", dev], 0, False, 5) except Exception, e: pass
def set_dev_cache(self, dev, cache, force=False): if not dev.startswith("/dev/"): dev = "/dev/" + dev if not self.is_dev(dev): raise Exp(errno.EINVAL, os.strerror(errno.EINVAL)) switch = '1' if cache == 'enable' else '0' try: _exec_pipe1(["hdparm", "-W", switch, dev], 0, False) except Exception, e: if not force: raise Exp(errno.EPERM, "set disk %s cache faile:%s" % (dev, e.message)) else: _dwarn("set disk %s cache faile, %s" % (dev, e.message))
def etcd_set(cls, meta_list, state, proxy=False): cluster = "" config = Config() if not cls.etcd_role_is_changed(proxy) and not cls.etcd_meta_list_is_changed(meta_list): _dwarn("etcd cluster not change, no need set!") return for i in meta_list: cluster = cluster + "%s=http://%s:2380," % (i, i) cls.etcd_set_config(cluster[:-1], state, proxy) if not os.path.isdir(config.etcd_data_path): os.system("mkdir -p %s" % (config.etcd_data_path)) os.system("chown etcd.etcd %s" % (config.etcd_data_path)) else: os.system("systemctl stop etcd") os.system("rm -rf %s/*" % (config.etcd_data_path)) #if cls.etcd_get_role() == ETCD_RUN_AS_PROXY and not proxy: # cmd = "systemctl stop etcd && rm -rf %s/proxy" % (config.etcd_data_path) # _exec_shell1(cmd, p=False) s = _exec_pipe1(["systemctl", 'restart', 'etcd'], 1, False)
def mount_dev(self, dev, force = 0): self.dev = dev try: self.dir = "/mnt/snap" _exec_system("mkdir -p %s" % self.dir) except: pass if not stat.S_ISBLK(os.lstat(os.path.realpath(self.dev)).st_mode): raise Exp('not a block device', dev) try: (out, err) = _exec_pipe1(["mount", self.dev, self.dir], 0, self.verbose, 0) except Exp, e: out = e.out err = e.err for line in err.splitlines(): m1 = re.search('you must specify the filesystem type', line) m2 = re.search('wrong fs type, bad option', line) if m1 is not None or m2 is not None: if force: self.disk.dev_format(self.dev, self.verbose) self.disk.dev_mount(self.dev, self.dir, self.verbose) else: _derror('wrong fs type, you must specify the filesystem type or use --force') exit(e.errno)
def check_tool(self): return 'syscall' try: (out_msg, err_msg) = _exec_pipe1(["sgdisk"], 0, False) except Exp, e: if e.err.startswith('Usage:'): return 'sgdisk'
def set_dev_label(self, dev, label, verbose=False): if not dev.startswith("/dev/"): dev = "/dev/" + dev if not self.is_block(dev): raise Exp(errno.EINVAL, os.strerror(errno.EINVAL)) (out_msg, err_msg) = _exec_pipe1(["e2label", dev, label], 0, verbose) if (verbose): print(err_msg.strip())
def get_dev_label(self, dev): if not dev.startswith("/dev/"): dev = "/dev/" + dev try: (out_msg, err_msg) = _exec_pipe1(["e2label", dev], 0, False) return out_msg.strip() except Exception: return None
def get_dev_rotation(self, dev, arg=None): try: cmd = ["smartctl", "-i"] if arg is not None: cmd += ["-d", arg] cmd += [dev] (out_msg, err_msg) = _exec_pipe1(cmd, 0, False) except Exp, e: return None
def __get_health_warn(self, dev, arg=None): warn = '' try: cmd = ["smartctl", "-H"] if arg is not None: cmd += ["-d", arg] cmd += [dev] (out_msg, err_msg) = _exec_pipe1(cmd, 0, False) except Exp, e: out_msg = e.out
def dev_check_parted(self, dev, ignore_err=True): if dev in self.dev_check: return self.dev_check[dev] try: (out_msg, err_msg) = _exec_pipe1(["parted", dev, "print", "-s"], 0, False, 5) except Exp, e: out_msg = e.out err_msg = e.err
def dev_check_sgdisk(self, dev, ignore_err=True): if dev in self.dev_check: return self.dev_check[dev] try: (out_msg, err_msg) = _exec_pipe1(["sgdisk", "-p", dev], 0, False, 5) except Exp, e: out_msg = e.out err_msg = e.err
def create_snap(self, lun): stime = time.strftime('%m%d%H%M') snap = self.defaultpath + lun + "@" + stime cmd = [self.lich_snapshot, "--create", snap] try: (out, err) = _exec_pipe1(cmd, 0, self.verbose) except Exp, e: if e.err: _derror(str(e.err)) exit(e.errno)
def list_snapshot(home, lun): res = [] cmd = os.path.join(home, "libexec/lich.snapshot") try: (out_msg, err_msg) = _exec_pipe1([cmd, '--list', lun], 1, False) res = out_msg.split('\n') return res[0:len(res) - 1] except Exp, e: raise Exp(e.errno, e.err)
def get_sys_pvs(self): pvs = {} res, err = _exec_pipe1(["pvs"], 0, False, 5) for line in res.splitlines()[1:]: fields = line.split() if fields[1] not in pvs: pvs[fields[1]] = [] if fields[0] not in pvs[fields[1]]: pvs[fields[1]].append(fields[0]) return pvs
def is_dir(self, path): cmd = [self.lichfs, "--stat", path] try: (out, err) = _exec_pipe1(cmd, 0, False) for line in out.splitlines(): m = re.match(".*Id:\s+(pool).*", line) if m is not None: return True except Exp, e: if e.err: _derror(str(e.err)) exit(e.errno)
def getallocated(self, path): cmd = [self.config.inspect, "--stat", path] try: (out, err) = _exec_pipe1(cmd, 0, False) for line in out.splitlines(): m = re.match("\s*allocated :\s+(\d*).*", line) if m is not None: return m.group(1) except Exp, e: if e.err: _derror(str(e.err)) exit(e.errno)
def getsize(self, path, v): cmd = [self.lichfs, "--stat", self.defaultpath + path] try: (out, err) = _exec_pipe1(cmd, 0, v) for line in out.splitlines(): m = re.match("\s+Size:\s+(\d*).*", line) if m is not None: return m.group(1) except Exp, e: if e.err: _derror(str(e.err)) exit(e.errno)
def __get_health_errlog(self, dev, arg=None): errlog = '' islog = 0 try: cmd = ["smartctl", "-l", "xerror"] if arg is not None: cmd += ["-d", arg] cmd += [dev] (out_msg, err_msg) = _exec_pipe1(cmd, 0, False) except Exp, e: out_msg = e.out
def get_dev_health(self, dev, arg=None): dev_health = 'Unknow' ret = 0 try: cmd = ["smartctl", "-i"] if arg is not None: cmd += ["-d", arg] cmd += [dev] (out_msg, err_msg) = _exec_pipe1(cmd, 0, False) except Exp, e: out_msg = e.out err_msg = e.err
def get_dev_info(self, dev, arg=None): out_msg = '' try: cmd = ["smartctl", "-i"] if arg is not None: cmd += ["-d", arg] cmd += [dev] (out_msg, err_msg) = _exec_pipe1(cmd, 0, False) except Exp, e: if e.errno == errno.ENOENT: raise else: return None
def backup(self, lun, path, filename, keep, force, v): filepath = "" snap = "" if (filename == ""): name = "snapfile" else: name = filename if path.startswith('/dev/'): self.dev = path self.mount_dev(path, force) filepath = self.dir elif os.path.isdir(path): filepath = path elif path.startswith('/'): filepath = os.path.dirname(path) if not os.path.exists(filepath): try: self.dir = filepath _exec_system("mkdir -p %s" % self.dir) except: pass #name = os.path.basename(path) if path.split('/')[-1] != "": name = path.split('/')[-1] else: self.end(keep, snap) _derror('path %s was wrong' % path) exit(errno.EINVAL) if (self.is_snap(lun, v)): snapath = self.defaultpath + lun elif (self.is_lun(lun, v)): snap = self.create_snap(lun) snapath = snap else: self.end(keep, snap) _derror('lun %s was wrong' % lun) exit(errno.EINVAL) self.check(snapath, filepath, keep, snap) cmd = [self.lich_snapshot, '--copy', snapath, ':' + filepath + '/' + name] try: (out, err) = _exec_pipe1(cmd, 0, self.verbose) except Exp, e: if e.err: self.end(keep, snap) _derror(str(e.err).strip()) exit(e.errno)
def get_dev_free_parted(self, dev): if not dev.startswith("/dev/"): dev = "/dev/" + dev if not self.is_dev(dev): raise Exp(errno.EINVAL, os.strerror(errno.EINVAL)) if dev in self.dev_check: return self.dev_check[dev] try: (out_msg, err_msg) = _exec_pipe1(["parted", dev, "print", "-s"], 0, False, 5) except Exp, e: raise
def list_snap(self, v): localsnap = [] lun = self.list_lun(v) for i in lun: tgt = self.defaultpath + i[0] cmd = [self.lich_snapshot, "--list", tgt] try: (out, err) = _exec_pipe1(cmd, 0, v) for line in out.splitlines(): snap = i[0] + "@" + line snapsize = self.getsize(i[0]+'/'+line, v) localsnap.append((i[0], snap, snapsize)) except Exp, e: if e.err: _derror(str(e.err)) exit(e.errno)
def set_lun(self, path, ext): if ext == 'ssd': num = 0 elif ext == 'hdd': num = 1 cmd = [self.config.inspect, "--tier", path, str(num)] try: (out, err) = _exec_pipe1(cmd, 0, False) ret = _exec_system("echo $?", False, False) if ret == 0: _dmsg('set %s %s successful' % (path, ext)) except Exp, e: if e.err: _derror(str(e.err)) exit(e.errno)
def getstat(self, path): cmd = [self.lichfs, "--stat", path] try: (out, err) = _exec_pipe1(cmd, 0, False) ret = _exec_system("echo $?", False, False) if ret == 0: self.success += 1 #_dmsg('check %s successful' % (path)) else: self.fail += 1 self.fail_lun.append(path) except Exp, e: self.fail += 1 self.fail_lun.append(path) if e.err: _derror(str(e.err)) exit(e.errno)
def __get_health_testlog(self, dev, arg=None): testlog = '' islog = 0 cmd = ["smartctl", "-l", "xselftest"] if arg is not None: cmd += ["-d", arg] cmd += [dev] (out_msg, err_msg) = _exec_pipe1(cmd, 0, False) for line in out_msg.splitlines(): m = re.search('SMART Extended Self-test Log Version', line) if m is not None: islog = 1 continue if islog == 1: testlog += line return testlog
def get_sys_lvs(self): lvs = {} res, err = _exec_pipe1(["lvdisplay"], 0, False, 5) for line in res.splitlines(): m = re.search('\s*LV Name\s*(.*)', line) if m is not None: lv = m.group(1) m = re.search('\s*VG Name\s*(.*)', line) if m is not None: vg = m.group(1) m = re.search('\s*Block device\s*(.*)', line) if m is not None: block = m.group(1) if vg not in lvs: lvs[vg] = {} lvs[vg][lv] = (block.split(':')[0], block.split(':')[1]) return lvs
def end(self, keep = 0, snap = ""): try: if self.dev != "": self.disk.dev_umount(self.dev, self.verbose) except: pass if self.dir != "" and self.dev != "": _exec_system("rm -rf %s" % self.dir) if keep == 0 and snap != "": cmd = [self.lich_snapshot, "--remove", snap] try: (out, err) = _exec_pipe1(cmd, 0, False) except Exp, e: if e.err: _derror(str(e.err)) exit(e.errno)