Python 3 compat and a bunch of other things.

This commit is contained in:
Rudd-O 2019-06-11 20:27:27 +00:00
parent 75921b3eb4
commit 8598cfa2b5
4 changed files with 51 additions and 25 deletions

View File

@ -12,6 +12,7 @@ class ActionModule(command):
if 'env' in self._task.args: if 'env' in self._task.args:
cmd.append("saltenv=%s" % (self._task.args['env'],)) cmd.append("saltenv=%s" % (self._task.args['env'],))
module_args = " ".join(pipes.quote(s) for s in cmd) module_args = " ".join(pipes.quote(s) for s in cmd)
module_args = "bash -c %s" % pipes.quote("DISPLAY=:0 " + module_args)
self._task.action = "command" self._task.action = "command"
self._task.args['_raw_params'] = module_args self._task.args['_raw_params'] = module_args
for x in 'env sls'.split(): for x in 'env sls'.split():

View File

@ -180,7 +180,10 @@ class Signaler(MyThread):
assert len(data) == 2 assert len(data) == 2
signum = struct.unpack("!H", data)[0] signum = struct.unpack("!H", data)[0]
logging.debug("Received relayed signal %s, sending to process %s", signum, self.process.pid) logging.debug("Received relayed signal %s, sending to process %s", signum, self.process.pid)
try:
self.process.send_signal(signum) self.process.send_signal(signum)
except BaseException as e:
logging.error("Failed to relay signal %s to process %s: %s", signum, self.process.pid, e)
logging.debug("End of signaler") logging.debug("End of signaler")

View File

@ -55,7 +55,11 @@ except ImportError:
display = Display() display = Display()
class x(object): class x(object):
def vvvv(self, text, host=None): def vvvv(self, text, host=None):
print >> file("/tmp/log", "ab"), text, host with open(os.path.expanduser("~/ansible-qubes.log"), "a") as f:
print(text, host, file=f)
def vvv(self, text, host=None):
with open(os.path.expanduser("~/ansible-qubes.log"), "a") as f:
print(text, host, file=f)
display = x() display = x()
@ -182,14 +186,14 @@ if __name__ == '__main__':
import StringIO import StringIO
s = StringIO.StringIO() s = StringIO.StringIO()
try: try:
file("/doesnotexist") open("/doesnotexist")
except Exception as e: except Exception as e:
encode_exception(e, s) encode_exception(e, s)
s.seek(0) s.seek(0)
dec = decode_exception(s) dec = decode_exception(s)
preamble = ''' preamble = b'''
from __future__ import print_function from __future__ import print_function
import sys, os, subprocess import sys, os, subprocess
sys.ps1 = '' sys.ps1 = ''
@ -197,13 +201,13 @@ sys.ps2 = ''
sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0) if hasattr(sys.stdin, 'buffer') else sys.stdin sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0) if hasattr(sys.stdin, 'buffer') else sys.stdin
sys.stdout = sys.stdout.buffer if hasattr(sys.stdout, 'buffer') else sys.stdout sys.stdout = sys.stdout.buffer if hasattr(sys.stdout, 'buffer') else sys.stdout
''' '''
payload = '\n\n'.join( payload = b'\n\n'.join(
inspect.getsource(x) inspect.getsource(x).encode("utf-8")
for x in (encode_exception, popen, put, fetch) for x in (encode_exception, popen, put, fetch)
) + \ ) + \
r''' b'''
_ = sys.stdout.write(b'OK\n') _ = sys.stdout.write(b'OK\\n')
sys.stdout.flush() sys.stdout.flush()
''' '''
@ -245,9 +249,15 @@ class Connection(ConnectionBase):
transport_cmd = None transport_cmd = None
_transport = None _transport = None
def set_options(self, task_keys=None, var_options=None, direct=None):
super(Connection, self).set_options(task_keys=task_keys, var_options=var_options, direct=direct)
# FIXME HORRIBLE WORKAROUND FIXME
if task_keys['delegate_to'] and 'management_proxy' in self._options:
self._options['management_proxy'] = ''
def __init__(self, play_context, new_stdin, *args, **kwargs): def __init__(self, play_context, new_stdin, *args, **kwargs):
super(Connection, self).__init__(play_context, new_stdin, *args, **kwargs) super(Connection, self).__init__(play_context, new_stdin, *args, **kwargs)
display.vvvv("INSTANTIATING %s" % (os.getppid(),), host=play_context.remote_addr) display.vvv("INSTANTIATING %s %s" % (os.getppid(), id(self)), host=play_context.remote_addr)
if 'transport_cmd' in kwargs: if 'transport_cmd' in kwargs:
self.transport_cmd = kwargs['transport_cmd'] self.transport_cmd = kwargs['transport_cmd']
@ -277,20 +287,26 @@ class Connection(ConnectionBase):
ution of Ansible modules against VMs, whether local or remote ution of Ansible modules against VMs, whether local or remote
via SSH. In other words, we have pipelining now. via SSH. In other words, we have pipelining now.
''' '''
display.vvv("CONNECTING %s %s %s" % (os.getppid(), id(self), self.get_option("management_proxy")), host=self._play_context.remote_addr)
super(Connection, self)._connect() super(Connection, self)._connect()
#if self._play_context.remote_addr == 'ring2-buildserver':
# assert 0, dir(self)
# assert 0, self._play_context.serialize()
# assert 0, [x for x in dir(self._play_context) if callable(getattr(self._play_context, x))]
if not self._connected: if not self._connected:
remote_cmd = [to_bytes(x, errors='surrogate_or_strict') for x in [ remote_cmd = [to_bytes(x, errors='surrogate_or_strict') for x in [
# 'strace', '-s', '2048', '-o', '/tmp/log', # 'strace', '-s', '2048', '-o', '/tmp/log',
'python', '-i', '-c', preamble 'python', '-i', '-c', preamble
]] ]]
addr = self._play_context.remote_addr addr = self._play_context.remote_addr
proxy = self.get_option("management_proxy") proxy = to_bytes(self.get_option("management_proxy")) if self.get_option("management_proxy") else ""
if proxy: if proxy:
proxy = ["--proxy=%s" % proxy] if proxy else [] proxy = [b"--proxy=%s" % proxy] if proxy else []
addr = addr.split(".")[0] addr = addr.split(".")[0]
else: else:
proxy = [] proxy = []
cmd = self.transport_cmd + proxy + [addr] + remote_cmd addr = to_bytes(addr)
cmd = [to_bytes(x) for x in self.transport_cmd] + proxy + [addr] + remote_cmd
display.vvvv("CONNECT %s" % (cmd,), host=self._play_context.remote_addr) display.vvvv("CONNECT %s" % (cmd,), host=self._play_context.remote_addr)
self._transport = subprocess.Popen( self._transport = subprocess.Popen(
cmd, shell=False, stdin=subprocess.PIPE, cmd, shell=False, stdin=subprocess.PIPE,
@ -300,8 +316,9 @@ class Connection(ConnectionBase):
self._transport.stdin.write(payload) self._transport.stdin.write(payload)
self._transport.stdin.flush() self._transport.stdin.flush()
ok = self._transport.stdout.readline(16) ok = self._transport.stdout.readline(16)
if not ok.startswith("OK\n"): if not ok.startswith(b"OK\n"):
raise errors.AnsibleError("the remote end of the Qubes connection was not ready") cmdquoted = " ".join(pipes.quote(x.decode("utf-8")) for x in cmd)
raise errors.AnsibleError("the remote end of the Qubes connection was not ready: %s yielded %r" % (cmdquoted, ok))
except Exception: except Exception:
self._abort_transport() self._abort_transport()
raise raise
@ -335,18 +352,20 @@ class Connection(ConnectionBase):
def exec_command(self, cmd, in_data=None, sudoable=False): def exec_command(self, cmd, in_data=None, sudoable=False):
'''Run a command on the VM.''' '''Run a command on the VM.'''
super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable) super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable)
try: basestring
except NameError: basestring = str
if isinstance(cmd, basestring): if isinstance(cmd, basestring):
cmd = shlex.split(cmd) cmd = shlex.split(cmd)
display.vvvv("EXEC %s" % cmd, host=self._play_context.remote_addr) display.vvvv("EXEC %s" % cmd, host=self._play_context.remote_addr)
try: try:
payload = 'popen(%r, %r)\n' % (cmd, in_data) payload = ('popen(%r, %r)\n' % (cmd, in_data)).encode("utf-8")
self._transport.stdin.write(payload) self._transport.stdin.write(payload)
self._transport.stdin.flush() self._transport.stdin.flush()
yesno = self._transport.stdout.readline(2) yesno = self._transport.stdout.readline(2)
except Exception: except Exception:
self._abort_transport() self._abort_transport()
raise raise
if yesno == "Y\n": if yesno == "Y\n" or yesno == b"Y\n":
try: try:
retcode = self._transport.stdout.readline(16) retcode = self._transport.stdout.readline(16)
try: try:
@ -379,7 +398,7 @@ class Connection(ConnectionBase):
except Exception: except Exception:
self._abort_transport() self._abort_transport()
raise raise
elif yesno == "N\n": elif yesno == "N\n" or yesno == b"N\n":
exc = decode_exception(self._transport.stdin) exc = decode_exception(self._transport.stdin)
raise exc raise exc
else: else:
@ -392,12 +411,12 @@ class Connection(ConnectionBase):
display.vvvv("PUT %s to %s" % (in_path, out_path), host=self._play_context.remote_addr) display.vvvv("PUT %s to %s" % (in_path, out_path), host=self._play_context.remote_addr)
out_path = _prefix_login_path(out_path) out_path = _prefix_login_path(out_path)
payload = 'put(%r)\n' % (out_path,) payload = 'put(%r)\n' % (out_path,)
self._transport.stdin.write(payload) self._transport.stdin.write(payload.encode("utf-8"))
self._transport.stdin.flush() self._transport.stdin.flush()
yesno = self._transport.stdout.readline(2) yesno = self._transport.stdout.readline(2)
if yesno == "Y\n": if yesno == "Y\n" or yesno == b"Y\n":
pass pass
elif yesno == "N\n": elif yesno == "N\n" or yesno == b"N\n":
exc = decode_exception(self._transport.stdin) exc = decode_exception(self._transport.stdin)
raise exc raise exc
else: else:
@ -407,7 +426,7 @@ class Connection(ConnectionBase):
while True: while True:
chunk = in_file.read(BUFSIZE) chunk = in_file.read(BUFSIZE)
try: try:
self._transport.stdin.write("%s\n" % len(chunk)) self._transport.stdin.write(("%s\n" % len(chunk)).encode("utf-8"))
self._transport.stdin.flush() self._transport.stdin.flush()
if len(chunk) == 0: if len(chunk) == 0:
break break
@ -417,9 +436,9 @@ class Connection(ConnectionBase):
self._abort_transport() self._abort_transport()
raise raise
yesno = self._transport.stdout.readline(2) yesno = self._transport.stdout.readline(2)
if yesno == "Y\n": if yesno == "Y\n" or yesno == b"Y\n":
pass pass
elif yesno == "N\n": elif yesno == "N\n" or yesno == b"N\n":
exc = decode_exception(self._transport.stdin) exc = decode_exception(self._transport.stdin)
raise exc raise exc
else: else:
@ -434,7 +453,7 @@ class Connection(ConnectionBase):
out_file = open(out_path, "wb") out_file = open(out_path, "wb")
try: try:
payload = 'fetch(%r, %r)\n' % (in_path, BUFSIZE) payload = 'fetch(%r, %r)\n' % (in_path, BUFSIZE)
self._transport.stdin.write(payload) self._transport.stdin.write(payload.encode("utf-8"))
self._transport.stdin.flush() self._transport.stdin.flush()
while True: while True:
chunk_len = self._transport.stdout.readline(16) chunk_len = self._transport.stdout.readline(16)

View File

@ -1,6 +1,7 @@
from ansible.errors import AnsibleError from ansible.errors import AnsibleError
from ansible.plugins.lookup import LookupBase from ansible.plugins.lookup import LookupBase
import sys
import subprocess import subprocess
try: try:
@ -42,4 +43,6 @@ class LookupModule(LookupBase):
else: else:
raise AnsibleError("qubes-pass lookup failed: %s" % e) raise AnsibleError("qubes-pass lookup failed: %s" % e)
if sys.version_info.major == 2:
return [ret] return [ret]
return [ret.decode("utf-8")]