#!/usr/bin/env python # -*- coding: utf-8 -*- import pymongo import sys import inspect import kpov_random_helpers import settings import guestfs import os import glob import subprocess import fcntl import pyssh import paramiko class SSHGuestFs(): def __init__(hostname, path, username, password): return_results = {} client = paramiko.SSHClient() client.load_system_host_keys() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname, username=username, password=password) self.conn = client self.mountdir = path def chmod(self, mode, path): self.conn.exec_command('chmod {} "{}"'.format(mode, os.path.join(self.mountdir, path))) def chown(self, owner, group, path) self.conn.exec_command('chown {}.{} "{}"'.format(owner, group, os.path.join(self.mountdir, path)) def command(self, arguments): self.conn.exec_command(arguments) def cp(self, src, dest): src = os.path.join(self.mountdir, src) dst = os.path.join(self.mountdir, dst) self.conn.exec_command('cp "{}" "{}"'.format(src, dest)) def cp_a(self, src, dest): src = os.path.join(self.mountdir, src) dst = os.path.join(self.mountdir, dst) self.conn.exec_command('cp -a "{}" "{}"'.format(src, dest)) def cp_r(self, src, dest): src = os.path.join(self.mountdir, src) dst = os.path.join(self.mountdir, dst) self.conn.exec_command('cp -r "{}" "{}"'.format(src, dest)) def dd(self, src, dest): src = os.path.join(self.mountdir, src) dst = os.path.join(self.mountdir, dst) self.conn.exec_command('dd if="{}" of="{}"'.format(src, dest)) def df(self): stdin, stdout, stderr = self.conn.exec_command('df') return stdin.read() def download(self, remotefilename, filename): path = os.path.join(self.mountdir, remotefilename) stdin, stdout, stderr = self.conn.exec_command('dd if="{}"'.format(path)) with open(filename, 'w') as f: while data = stdin.read(4096): f.write(data) def download_offset (self, remotefilename, filename, offset, size): path = os.path.join(self.mountdir, remotefilename) stdin, stdout, stderr = self.conn.exec_command('dd bs=1 skip={} count={} if="{}"'.format( offset, size ,path)) with open(filename, 'w') as f: while data = stdin.read(4096): f.write(data) def du(self, path) path = os.path.join(self.mountdir, path) stdin, stdout, stderr = self.conn.exec_command('du "{}"'.format(path)) return stdin.read() def equal(self, file1, file2) src = os.path.join(self.mountdir, src) dst = os.path.join(self.mountdir, dst) pass def file(self, path) path = os.path.join(self.mountdir, path) stdin, stdout, stderr = self.conn.exec_command('file "{}"'.format(path)) return stdin.read() def getxattrs(self, path) pass #path = os.path.join(self.mountdir, path) #stdin, stdout, stderr = self.conn.exec_command('du "{}"'.format(path)) #return stdin.read() def mv (self, src, dest): src = os.path.join(self.mountdir, src) dst = os.path.join(self.mountdir, dst) self.conn.exec_command('mv "{}" "{}"'.format(src, dest)) def mkdir (self, path): path = os.path.join(self.mountdir, path) sftp_client = self.conn.open_sftp() sftp_client.mkdir(path) def read_file (self, path): path = os.path.join(self.mountdir, path) sftp_client = self.conn.open_sftp() f = sftp_client.file(path, mode='r', bufsize=-1) s = f.read() f.close() return s def readdir (self, dir): path = os.path.join(self.mountdir, path) sftp_client = self.conn.open_sftp() return sftp_client.listdir(path) def readlink (self, path): path = os.path.join(self.mountdir, path) stdin, stdout, stderr = self.conn.exec_command('readlink "{}"'.format(path)) return stdin.read() def rename (self, oldpath, newpath): return self.mv(oldpath, newpath) def rm (self, path): path = os.path.join(self.mountdir, path) stdin, stdout, stderr = self.conn.exec_command('rm "{}"'.format(path)) def rm_rf (self, path): path = os.path.join(self.mountdir, path) stdin, stdout, stderr = self.conn.exec_command('rm -rf "{}"'.format(path)) def rmdir (self, path): path = os.path.join(self.mountdir, path) stdin, stdout, stderr = self.conn.exec_command('rmdir "{}"'.format(path)) def setxattr (self, xattr, val, vallen, path): pass def write (self, path, content): """This call creates a file called "path". The content of the file is the string "content" (which can contain any 8 bit data). See also "g.write_append". """ path = os.path.join(self.mountdir, path) sftp_client = self.conn.open_sftp() f = sftp_client.file(path, mode='w', bufsize=-1) f.write(content) f.close() return r def write_append (self, path, content): """This call appends "content" to the end of file "path". If "path" does not exist, then a new file is created. See also "g.write". """ path = os.path.join(self.mountdir, path) sftp_client = self.conn.open_sftp() f = sftp_client.file(path, mode='a', bufsize=-1) f.write(content) f.close() if __name__ == '__main__': if len(sys.argv) != 2: print "Usage: {0} task_file" print "Run prepare_disks on running computers over ssh"