import os, sys, re import libutil import socket class RemoteEnvironment: def __init__(self, env): # we need SimEnvironemtn self.env = env self.om = self.env.OptionsManager self.db = self.env.ConfigurationDatabase self.dd = self.env.DefineDatabase self.SimLib = self.env.SimLib def init(self, machineName): #convienience SimLib = self.SimLib self.localMachineName = machine = self.SimEnvironment.LocalMachine self.localMachineEntry = self.SimEnvironment.LocalMachineEntry if self.localMachineEntry == None: print "Error, unknown local machine %s" % self.localMachineName sys.exit(1) self.machineName = machineName if self.machineName == self.localMachineName: print "Error, remote machine %s is the same as local machine %s" % (self.machineName, self.localMachineName) sys.exit(1) self.machineEntry = self.db.GetMachine(self.machineName) if self.machineEntry == None: print "Error, unknown remote machine %s" % self.machineName sys.exit(1) if self.localMachineEntry.HasKey("sshsetup"): self.localSshSetup = self.localMachineEntry.GetKey("sshsetup") else: self.localSshSetup = ":" req_keys = ['sourcebasedir', 'user'] SimLib.VerifyKeys(self.localMachineEntry, req_keys) req_keys = ['sourcebasedir', 'user', 'hostname'] SimLib.VerifyKeys(self.localMachineEntry, req_keys) def GetRemoteExePath(self, locals, remotes): SimLib = self.SimLib exe = self.env.EXECUTABLE path = SimLib.GetDirSuffix(locals) if exe[0] == "/": exe = exe.replace(locals, remotes) else: exe = SimLib.BuildPath([remotes, path, exe]) return exe def ExecuteSameCommand(self, parrotArguments=False, stripArguments=None, sshargs=None): SimLib = self.SimLib SimEnvironment = self.env localSourceBaseDir = SimLib.GetLocalSourceBaseDir() sourceBaseDir = SimLib.GetSourceBaseDir(self.machineEntry) path = SimLib.GetDirSuffix(localSourceBaseDir) remoteExe = self.GetRemoteExePath(localSourceBaseDir, sourceBaseDir) if SimEnvironment.COMMAND != None: remoteExe = "%s %s" % (remoteExe, SimEnvironment.COMMAND) self.ExecuteCommand(remoteExe, parrotArguments, stripArguments, sshargs) def ExecuteCommand(self, command, parrotArguments=False, stripArguments=None, sshargs=None): SimLib = self.SimLib if parrotArguments == True: argStr = self.om.BuildOptionString(stripArguments) command = "%s %s" % (command, argStr) sshcmd = SimLib.GetSSHCommand(self.machineName, command, sshargs) cmd = "{ %s; } && %s" % (self.localSshSetup, sshcmd) #print "Executing Command: %s" % cmd SimLib.ExecuteCommand(cmd)