110 lines
2.6 KiB
Python
110 lines
2.6 KiB
Python
import subprocess
|
|
import shlex
|
|
from os import environ
|
|
|
|
class JokerSecureShell():
|
|
|
|
def __init__(self, hostName):
|
|
self.tempDir = "/tmp"
|
|
|
|
# TODO implement password authentication scheme
|
|
self.credentials = {
|
|
"user": None,
|
|
"host": None,
|
|
"port": 22,
|
|
"key": None,
|
|
}
|
|
|
|
self.options = {
|
|
"proxyCommand": None,
|
|
"StrictHostKeyChecking": "no"
|
|
}
|
|
|
|
|
|
self.haveMasterSocket = False
|
|
self.masterSocketPid = None
|
|
|
|
|
|
# FIXME use inspect.stack()[0][3] ?
|
|
@property
|
|
def host(self):
|
|
print "called host getter"
|
|
return self.credentials['host']
|
|
|
|
@host.setter
|
|
def host(self, value):
|
|
print "called host setter"
|
|
self.credentials['host'] = value
|
|
|
|
@property
|
|
def user(self):
|
|
return self.credentials['user'] if (self.credentials['user']) else environ['USER']
|
|
|
|
@user.setter
|
|
def user(self, value):
|
|
self.credentials.user = value
|
|
|
|
@property
|
|
def key(self):
|
|
assert self.credentials['key'] is not None, "Keyfile for %s@%s:%d not present" % (self.user, self.host, self.port)
|
|
return self.credentials['key']
|
|
|
|
@key.setter
|
|
def key(self, value):
|
|
self.credentials['key'] = value
|
|
|
|
@property
|
|
def port(self):
|
|
return self.credentials['port']
|
|
|
|
@port.setter
|
|
def port(self, value):
|
|
self.credentials.port = value
|
|
|
|
@property
|
|
def proxyCommand(self):
|
|
return self.credentials.proxyCommand
|
|
|
|
@proxyCommand.setter
|
|
def proxyCommand(self, value):
|
|
self.credentials.proxyCommand = value
|
|
|
|
@property
|
|
def masterSocketPath(self):
|
|
return "%s/%s:%d" % (self.tempDir, self.host, self.port)
|
|
|
|
@property
|
|
def sshOptions(self):
|
|
r = ""
|
|
|
|
# compile ssh options in one string
|
|
|
|
for i in self.options:
|
|
if self.options[i] is not None:
|
|
r = r + ( '-o %s=%s' % (i, self.options[i]) )
|
|
|
|
return r;
|
|
|
|
def createMasterSocket(self):
|
|
self.haveMasterSocket = True
|
|
|
|
# XXX we support only keys without password encryption
|
|
cmd = "ssh -i %s -p %d %s -M -S %s %s@%s" % (self.key, self.port, self.sshOptions, self.masterSocketPath, self.user, self.host)
|
|
|
|
#subprocess.Popen(shlex.split(cmd))
|
|
|
|
|
|
def call(self, destinationCmd):
|
|
if (not self.haveMasterSocket):
|
|
self.createMasterSocket()
|
|
|
|
#cmd = "ssh %s %s" % (self.host, destinationCmd)
|
|
|
|
#stdout = stderr = None
|
|
|
|
#exitCode = subprocess.call(shlex.split(destinationCmd), stdout = stdout, stderr = stderr)
|
|
|
|
|
|
|
|
|