def docker_build(): userdir = os.path.expanduser('~') if not os.path.exists(userdir + "/.ssh/id_dsa")\ or not os.path.exists(userdir + "/.ssh/id_dsa.pub"): _derror("Please generate ssh key file use 'ssh-keygen -t dsa'") exit(1) _exec_system("cat ~/.ssh/id_dsa > %s/id_dsa" % (path)) _exec_system("cat ~/.ssh/id_dsa.pub > %s/id_dsa.pub" % (path)) _exec_system("cat ~/.ssh/id_dsa.pub > %s/authorized_keys" % (path)) #_exec_system("cp %s/../rpms/libisal-2.14.0-1.el7.centos.x86_64.rpm %s/libisal-2.14.0-1.el7.centos.x86_64.rpm" % (path, path)) #_exec_system("cp %s/../rpms/libisal-devel-2.14.0-1.el7.centos.x86_64.rpm %s/libisal-devel-2.14.0-1.el7.centos.x86_64.rpm" % (path, path)) file_object = open("%s/rsyncd.conf" % (path), 'w') file_object.write("[sdfs]\n path=/tmp\n readonly=no\n list=yes") file_object.close() errno = _exec_system("docker build --rm -t %s %s" % (tpl, path)) if errno: _derror("Please install docker last version") exit(errno) _exec_system("rm %s/id_dsa" % (path)) _exec_system("rm %s/id_dsa.pub" % (path)) _exec_system("rm %s/authorized_keys" % (path)) _exec_system("rm %s/rsyncd.conf" % (path))
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 sync(self): newpath = os.path.abspath(path + '/../') cmd = 'rsync -varz --progress --no-o --no-g --exclude-from=%s/.gitignore %s root@%s::sdfs' % ( newpath, newpath, self.addr) errno = _exec_system(cmd) if errno: _derror("cmd %s fail:%d" % (cmd, errno)) exit(errno)
def __docker_start(): _exec_system("echo '' > /tmp/hosts") (distro, release, codename) = lsb.lsb_release() for i in dock_list: if distro == 'CentOS': errno = _exec_system( "docker exec %s sed -i 's/^UsePAM yes$/UsePAM no/g' /etc/ssh/sshd_config" % (i)) if errno: _derror("Please install docker last version") exit(errno) errno = _exec_system( "docker exec %s sed -i 's/^#PermitRootLogin yes$/PermitRootLogin yes/g' /etc/ssh/sshd_config" % (i)) if errno: _derror("Please install docker last version") exit(errno) errno = _exec_system( "docker exec %s bash -c \"echo 'mdsmds' | passwd root --stdin\"" % (i)) if errno: _derror("Please install docker last version") exit(errno) _exec_system( r"docker exec %s sed -i 's/\\h \\W/\\H \\W/g' /etc/bashrc" % (i)) """ errno = _exec_system('docker exec %s /etc/init.d/sshd start' % (i)) if errno: _derror("Please install docker last version") exit(errno) """ errno = _exec_system( 'docker exec %s /usr/bin/rsync --daemon --config=/etc/rsyncd.conf' % (i)) if errno: _derror("Please install docker last version") exit(errno) _exec_system("echo %s %s >> /tmp/hosts" % (get_addr(i), i)) for i in dock_list: try: _put_remote(get_addr(i), "/tmp/hosts", "/etc/hosts", user='******', password='******', timeout=10) except Exception, e: _derror( "put file /tmp/hosts to %s failed, please check sshd is running normal" % i) #_exec_system('docker exec %s bash -c \ # "sed -i \'s/session required pam_loginuid.so/#session required pam_loginuid.so/\' /etc/pam.d/sshd"' % i) exit(1)
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 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 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 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 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 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 _lun_list(self): lun = [] lun_info = [] pool = [] tgt = [] dir = '/' res = _exec_pipe([self.lichfs, '--list', dir], 0, False) for r in res.splitlines(): r = dir + r.split(' ')[-1] if r == '/system': continue res = _exec_pipe([self.lichfs, '--list', r], 0, False) for p in res.splitlines(): p = p.split(' ')[-1] pool.append(r + dir + p) for p in pool: res = _exec_pipe([self.lichfs, '--list', p], 0, False) for l in res.splitlines(): l = l.split(' ')[-1] path = p + dir + l if self.is_dir(path): tgt.append(path) else: lun.append(path) for t in tgt: res = _exec_pipe([self.lichfs, '--list', t], 0, False) res = [x.split(' ')[-1] for x in res.splitlines()] for l in res: path = t + dir + l if (self.is_dir(path)): _dmsg('%s is dir' % path) _derror('list lun fail') #exit(e.errno) else: lun.append(path) for l in lun: size = self.getsize(l) size = _human_readable(int(size)) allocated = self.getallocated(l) allocated = _human_readable(int(allocated) * self.chunksize) lun_info.append((l, size, allocated)) return lun_info
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 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)
def check(self, snapath, path, keep, backuppath): snapsize = 0 devsize = 0 name = snapath.split('/iscsi/')[1] snap = [] snap = self.list_snap(self.verbose) for i in snap: if (i[1] == name): snapsize = int(i[2]) st = os.statvfs(path) devsize = st.f_bavail * st.f_frsize if (snapsize >= devsize): self.end(keep, backuppath) _derror('snap lun is larger than disk') exit(errno.EINVAL)
def list_lun(self, v): localun = [] lun = "" tgt = "" size = "" time.sleep(1) try: res = _exec_pipe([self.lichfs, '--list', self.defaultpath], 0, False) for line in res.splitlines(): pool = line.split(' ')[-1] lunres = _exec_pipe([self.lichfs, '--list', self.defaultpath + pool], 0, False) for l in lunres.splitlines(): lun = l.split(' ')[-1] lunsize = self.getsize(pool+'/'+lun, v) if pool is not None and lun is not None: size = lunsize localun.append((pool + '/' + lun, size)) except Exp, e: _derror('list local lun fail') exit(e.errno)
def gettier(self, path): #replica : 1908 #allocated : 0 #tier0 : 0 #tier1 : 0 tier_info = [] cmd = [self.config.inspect, "--tier", path] try: (out, err) = _exec_pipe1(cmd, 0, False) for line in out.splitlines(): m1 = re.match("\s*tier0 :\s+(\d*).*", line) if m1 is not None: ssd = m1.group(1) m2 = re.match("\s*tier1 :\s+(\d*).*", line) if m2 is not None: hdd = m2.group(1) tier_info.append((ssd, hdd)) except Exp, e: if e.err: _derror(str(e.err)) exit(e.errno)
def __get_used_percent(self, lst=None): #lst = ['node4/0', 'node4/1', 'node4/2', 'node4/3', 'node5/0'] used_percent = [] res = _exec_pipe([self.lich_admin, '--listnode'], 3, False)[:-1] if lst: list = [x.strip() for x in res.splitlines() if x.strip() in lst] else: list = [x.strip() for x in res.splitlines()] if len(list) == 0: _derror("node is not exists") exit(errno.EINVAL) for node in list: res = _exec_pipe([self.lich_admin, '--stat', node], 3, False)[:-1] if (len(res) != 0): d = _str2dict(res) used = d['used'] capacity = d['capacity'] percent = float(used) / float(capacity) * 100 used_percent.append((node, percent, used, capacity)) return sorted(used_percent, key=lambda d: d[1], reverse=False)
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 restore(self, path, lun, filename, v): if (path.startswith('/dev/')): self.dev = path self.mount_dev(path) filepath = self.dir + '/' + filename else: filepath = path + '/' + filename if not os.path.exists(filepath): self.end() _derror( '%s filename is not exist' % (filepath)) exit(errno.EINVAL) if (self.is_target(lun, v) == 1): if (self.is_lun(lun, v) == 1): self.end() _derror( '%s is exist, please rename a new lun' % (lun)) exit(errno.EINVAL) else: tgt = os.path.dirname(lun) cmd = "lichbd mkpool %s -p iscsi" % (tgt) if (self.verbose): print cmd os.system(cmd) cmd = [self.lichfs, "--copy", ":" + filepath, self.defaultpath + lun] if (self.verbose): print cmd try: (out, err) = _exec_pipe1(cmd, 0, False) print out except Exp, e: ret = _exec_system("echo $?", False, False) if ret and e.err: self.end() _derror(str(e.err)) exit(e.errno)
def docker_pull(): errno = _exec_system("docker pull centos:7") if errno: _derror("Please install docker last version") exit(errno)
verbose = 1 newargs.remove(o) elif o in ('-j', '--json'): is_json = 1 newargs.remove(o) elif o in ('-f', '--force'): force = True newargs.remove(o) for o, a in newopts: if o in ('--help'): usage() exit(0) elif o == '--disk': if a not in ['list', 'add', 'del']: _derror('disk only support list add del operate') exit(errno.EINVAL) if a in ['add', 'del'] and len(newargs) == 0: _derror('add/del need dev') exit(errno.EINVAL) op = o type = a ext = newargs elif o == '--tier': op = o type = a ext = newargs elif o == '--lun': op = o type = a ext = newargs
argv.append(_argv[i]) try: opts, args = getopt.getopt( argv, 'hv', ['help', 'verbose', 'force', 'keep', 'backup=', 'restore=', 'list'] ) except getopt.GetoptError, err: print str(err) usage() exit(errno.EINVAL) try: snapshot = Snapshot(verbose) except Exp, e: _derror(e.err) exit(e.errno) for o, a in opts: if o in ('-h', '--help'): usage() exit(0) elif o in '--backup': flag = False backup_argv = sys.argv for i in range(len(backup_argv)): if (backup_argv[i] == '--name'): flag = True break if flag and (len(sys.argv) <= i + 1):