def connectApp(ns, name): """ Connects to a remote application. :param Pyro4.naming.Nameserver ns: Instance of a nameServer :param str name: Name of the application to be connected to :return: Application :rtype: Instance of an application :raises Exception: When cannot find registered server or Cannot connect to application """ try: uri = ns.lookup(name) log.debug("Found URI %s from a nameServer %s" % (uri, ns) ) app2 = Pyro4.Proxy(uri) except Exception as e: log.error("Cannot find registered server %s on %s" % (name, ns) ) raise try: sig = app2.getApplicationSignature() log.debug("Connected to " + sig + " with the name " + name) except Exception as e: log.exception("Cannot connect to application " + name + ". Is the server running?") raise return app2
def sshTunnel(remoteHost, userName, localPort, remotePort, sshClient='ssh', options='', sshHost='', Reverse=False): """ Automatic creation of ssh tunnel, using putty.exe for Windows and ssh for Linux :param str remoteHost: IP of remote host :param str userName: User name, if empty, current user name is used :param int localPort: Local port :param int remotePort: Remote port :param str sshClient: Path to executable ssh client (on Windows use double backslashes 'C:\\Program Files\\Putty\putty.exe') :param str options: Arguments to ssh clinent, e.g. the location of private ssh keys :param str sshHost: Computer used for tunelling, optional. If empty, equals to remoteHost :param bool Reverse: True if reverse tunnel to be created (default is False) :return: Instance of subprocess.Popen running the tunneling command :rtype: subprocess.Popen :raises Exception: if creation of a tunnel failed """ if sshHost =='': sshHost = remoteHost if userName =='': userName = os.getenv('USER') direction = 'L' if Reverse == True: direction = 'R' #use direct system command. Paramiko or sshtunnel do not work. #put ssh public key on a server - interaction with a keyboard for password will not work here (password goes through TTY, not stdin) if sshClient=='ssh': cmd = 'ssh -%s %d:%s:%d %s@%s -N %s' % (direction, localPort, remoteHost, remotePort, userName, sshHost, options) log.debug("Creating ssh tunnel via command: " + cmd) elif sshClient=='autossh': cmd = 'autossh -%s %d:%s:%d %s@%s -N %s' % (direction, localPort, remoteHost, remotePort, userName, sshHost, options) log.debug("Creating autossh tunnel via command: " + cmd) elif 'putty' in sshClient.lower(): #need to create a public key *.ppk using puttygen. It can be created by importing Linux private key. The path to that key is given as -i option cmd = '%s -%s %d:%s:%d %s@%s -N %s' % (sshClient, direction, localPort, remoteHost, remotePort, userName, sshHost, options) log.debug("Creating ssh tunnel via command: " + cmd) elif sshClient=='manual': #You need ssh server running, e.g. UNIX-sshd or WIN-freesshd cmd1 = 'ssh -%s %d:%s:%d %s@%s -N %s' % (direction, localPort, remoteHost, remotePort, userName, sshHost, options) cmd2 = 'putty.exe -%s %d:%s:%d %s@%s -N %s' % (direction, localPort, remoteHost, remotePort, userName, sshHost, options) log.info("If ssh tunnel does not exist, do it manually using a command e.g. " + cmd1 + " , or " + cmd2) return 'manual' else: log.error("Unknown ssh client, exiting") exit(0) try: tunnel = subprocess.Popen(cmd.split()) except Exception: log.exception("Creation of a tunnel failed. Can not execute the command: %s " % cmd) raise time.sleep(1.0) return tunnel