From bb25ec3904bfc5063555a418b3c6d36d162d764b Mon Sep 17 00:00:00 2001 From: "gasperfele@fri1.uni-lj.si" Date: Thu, 29 Jan 2015 15:43:14 +0000 Subject: Added most of the required functions for faking guestfs over ssh git-svn-id: https://svn.lusy.fri.uni-lj.si/kpov-public-svn/kpov-public@250 5cf9fbd1-b2bc-434c-b4b7-e852f4f63414 --- kpov_judge/create_disk_images.py | 140 ++++++++++++++++++++++++++------------- 1 file changed, 95 insertions(+), 45 deletions(-) (limited to 'kpov_judge/create_disk_images.py') diff --git a/kpov_judge/create_disk_images.py b/kpov_judge/create_disk_images.py index d36ff90..1f5f643 100755 --- a/kpov_judge/create_disk_images.py +++ b/kpov_judge/create_disk_images.py @@ -15,56 +15,103 @@ import pyssh import paramiko class SSHGuestFs(): - def __init__(hostname, username, password): -s = pxssh.pxssh() - hostname = raw_input('hostname: ') - username = raw_input('username: ') - password = getpass.getpass('password: ') - s.login (hostname, username, password) - s.sendline ('uptime') - self.conn = pxssh.open(hostname, username, password) - def chmod(self, mode, path) - self.conn. + 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) - pass - def command(self, arguments) - pass - def cp(self, src, dest) - pass - def cp_a(self, src, dest) - pass - def cp_r(self, src, dest) - pass - def dd(self, src, dest) - pass - def df(self) - pass - def download(self) - pass + 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) - pass + 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) - pass + 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): - pass + 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): - pass + 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): - pass + path = os.path.join(self.mountdir, path) + sftp_client = self.conn.open_sftp() + return sftp_client.listdir(path) def readlink (self, path): - pass + 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): - pass + return self.mv(oldpath, newpath) def rm (self, path): - pass + path = os.path.join(self.mountdir, path) + stdin, stdout, stderr = self.conn.exec_command('rm "{}"'.format(path)) def rm_rf (self, path): - pass + path = os.path.join(self.mountdir, path) + stdin, stdout, stderr = self.conn.exec_command('rm -rf "{}"'.format(path)) def rmdir (self, path): - pass + 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): @@ -74,8 +121,11 @@ s = pxssh.pxssh() See also "g.write_append". """ - self._check_not_closed () - r = libguestfsmod.write (self._o, path, content) + 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): @@ -84,13 +134,11 @@ s = pxssh.pxssh() See also "g.write". """ - self._check_not_closed () - r = libguestfsmod.write_append (self._o, path, content) - return r - - def write_file (self, path, content, size): - -# The external cmp(1) program is used for the comparison. + 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() def get_prepare_disks(db, task_id): prepare_disks_source = db.prepare_disks.find_one({'task_id':task_id})['source'] @@ -134,7 +182,9 @@ def publish_snapshot(d): else: url = settings.STUDENT_DISK_URL + d return url - + + + if __name__ == '__main__': if len(sys.argv) != 1: print "Usage: {0}" -- cgit v1.2.1