diff kcl/ssh.py @ 0:0f44ee073173 default tip

fake salt, initial commit
author Jeff Hammel <k0scist@gmail.com>
date Mon, 06 Feb 2017 01:10:22 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kcl/ssh.py	Mon Feb 06 01:10:22 2017 +0000
@@ -0,0 +1,62 @@
+"""
+crappy python ssh wrapper
+"""
+
+# imports
+import subprocess
+
+string = (str, unicode)
+
+
+def call(command, check=True, echo=True, **kwargs):
+
+    cmd_str = command if isinstance(command, string) else subprocess.list2cmdline(command)
+    kwargs['shell'] = isinstance(command, string)
+    kwargs['stdout'] = subprocess.PIPE
+    kwargs['stderr'] = subprocess.PIPE
+    if echo:
+        print (cmd_str)
+    process = subprocess.Popen(command, **kwargs)
+    stdout, stderr = process.communicate()
+    if check and process.returncode:
+        raise subprocess.CalledProcessError(process.returncode, command, stdout)
+    return process.returncode, stdout, stderr
+
+
+class Ssh(object):
+    """primative form of ssh session using subprocess"""
+
+    def __init__(self, host, ssh='ssh', scp='scp', verbose=False):
+        self.host = host
+        self._ssh = ssh
+        self._scp = scp
+        self.verbose=verbose
+
+    def command(self, command):
+
+        # See:
+        # http://unix.stackexchange.com/questions/122616/why-do-i-need-a-tty-to-run-sudo-if-i-can-sudo-without-a-password
+        # http://unix.stackexchange.com/a/122618
+        return [self._ssh, '-t', self.host, command]
+
+    def sudo_command(self, command):
+        return self.command('sudo ' + command)
+
+    def call(self, command):
+        returncode, output, _ = call(self.command(command),
+                                     echo=self.verbose)
+        return (returncode, output)
+
+    def sudo(self, command):
+        returncode, output, _ = call(self.sudo_command(command),
+                                     echo=self.verbose)
+        return (returncode, output)
+
+    def scp(self, src, dest):
+        """scp a file to the given host"""
+
+        command = [self._scp,
+                   src,
+                   '{host}:{dest}'.format(host=self.host, dest=dest)]
+        returncode, output, _ = call(command)
+        return (returncode, output)