#this class is used for any ssh command and
#also for any remote or a local command independently
#on which box this must be done.
-#new TestSsh object take like an argument an instance
-#of the class where it was created
import os.path
import utils
class TestSsh:
-
+
# inserts a backslash before each occurence of the following chars
# \ " ' < > & | ; ( ) $ * ~
@staticmethod
# check main IP address against the provided hostname
@staticmethod
- def is_local (hostname):
+ def is_local_hostname (hostname):
if hostname == "localhost":
return True
import socket
remote_ip = socket.gethostbyname(hostname)
return local_ip==remote_ip
except:
- header("WARNING : something wrong in is_local with hostname=%s"%hostname)
+ utils.header("WARNING : something wrong in is_local_hostname with hostname=%s"%hostname)
return False
- def __init__(self,caller):
- self.caller=caller
+ def __init__(self,hostname,buildname=None,key=None):
+ self.hostname=hostname
+ self.buildname=buildname
+ self.key=key
- def hostname(self):
- return self.caller.hostname()
def is_local(self):
- return self.caller.is_local()
- def buildname(self):
- return self.caller.buildname()
-
+ return TestSsh.is_local_hostname(self.hostname)
+
+ std_options="-o StrictHostKeyChecking=no -o BatchMode=yes "
+
+ def key_part (self):
+ if not self.key:
+ return ""
+ return "-i %s.rsa "%self.key
+
# command gets run on the right box
- def to_host(self,command):
- if self.caller.is_local():
+ def actual_command (self, command):
+ if self.is_local():
return command
- else:
- return "ssh %s %s"%(self.hostname(),TestSsh.backslash_shell_specials(command))
+ ssh_command = "ssh "
+ ssh_command += TestSsh.std_options
+ ssh_command += self.key_part()
+ ssh_command += "%s %s" %(self.hostname,TestSsh.backslash_shell_specials(command))
+ return ssh_command
- def full_command(self,command):
- return self.to_host(self.caller.host_to_guest(command))
+ def run(self, command):
+ return utils.system(self.actual_command(command))
- def run_in_guest (self,command):
- return utils.system(self.full_command(command))
-
- def run_in_host (self,command):
- return utils.system(self.to_host(command))
+ def clean_dir (self,dirname):
+ if self.is_local():
+ return 0
+ return self.run("rm -rf %s"%dirname)
+
+ def mkdir (self,dirname=None):
+ if self.is_local():
+ if dirname:
+ return os.path.mkdir(dirname)
+ return 0
+ if dirname:
+ dirname="%s/%s"%(self.buildname,dirname)
+ else:
+ dirname=self.buildname
+ return self.run("mkdir %s"%dirname)
+
+ def create_buildname_once (self):
+ if self.is_local():
+ return
+ # create remote buildname on demand
+ try:
+ self.buildname_created
+ except:
+ self.mkdir()
+ self.buildname_created=True
- # xxx quick n dirty
- def run_in_guest_piped (self,local,remote):
- return utils.system(local+" | "+self.full_command(remote))
-
def run_in_buildname (self,command):
if self.is_local():
return utils.system(command)
- ssh_comand="ssh "
- if self.caller.key:
- ssh_comand += "-i %s.rsa "%(self.caller.key)
- ssh_command += "%s/%s"%(self.buildname,TestSsh.backslash_shell_specials(command))
- return utils.system(ssh_command)
+ self.create_buildname_once()
+ return self.run("cd %s ; %s"%(self.buildname,command))
def copy (self,local_file,recursive=False):
if self.is_local():
return 0
- command="scp "
- if recursive: command += "-r "
- if self.caller.key:
- command += "-i %s.rsa "
- command +="%s %s:%s/%s"%(local_file,self.hostname(),self.buildname,
- os.path.basename(local_file) or ".")
- return utils.system(command)
+ self.create_buildname_once()
+ scp_command="scp "
+ if recursive: scp_command += "-r "
+ scp_command += self.key_part()
+ scp_command += "%s %s:%s/%s"%(local_file,self.hostname,self.buildname,
+ os.path.basename(local_file) or ".")
+ return utils.system(scp_command)