mirror of
https://github.com/Rudd-O/ansible-qubes.git
synced 2025-03-01 14:22:33 +01:00
Python 3 compat and a bunch of other things.
This commit is contained in:
parent
75921b3eb4
commit
8598cfa2b5
@ -12,6 +12,7 @@ class ActionModule(command):
|
||||
if 'env' in self._task.args:
|
||||
cmd.append("saltenv=%s" % (self._task.args['env'],))
|
||||
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.args['_raw_params'] = module_args
|
||||
for x in 'env sls'.split():
|
||||
|
@ -180,7 +180,10 @@ class Signaler(MyThread):
|
||||
assert len(data) == 2
|
||||
signum = struct.unpack("!H", data)[0]
|
||||
logging.debug("Received relayed signal %s, sending to process %s", signum, self.process.pid)
|
||||
self.process.send_signal(signum)
|
||||
try:
|
||||
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")
|
||||
|
||||
|
||||
|
@ -55,7 +55,11 @@ except ImportError:
|
||||
display = Display()
|
||||
class x(object):
|
||||
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()
|
||||
|
||||
|
||||
@ -182,14 +186,14 @@ if __name__ == '__main__':
|
||||
import StringIO
|
||||
s = StringIO.StringIO()
|
||||
try:
|
||||
file("/doesnotexist")
|
||||
open("/doesnotexist")
|
||||
except Exception as e:
|
||||
encode_exception(e, s)
|
||||
s.seek(0)
|
||||
dec = decode_exception(s)
|
||||
|
||||
|
||||
preamble = '''
|
||||
preamble = b'''
|
||||
from __future__ import print_function
|
||||
import sys, os, subprocess
|
||||
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.stdout = sys.stdout.buffer if hasattr(sys.stdout, 'buffer') else sys.stdout
|
||||
'''
|
||||
payload = '\n\n'.join(
|
||||
inspect.getsource(x)
|
||||
payload = b'\n\n'.join(
|
||||
inspect.getsource(x).encode("utf-8")
|
||||
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()
|
||||
'''
|
||||
|
||||
@ -245,9 +249,15 @@ class Connection(ConnectionBase):
|
||||
transport_cmd = 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):
|
||||
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:
|
||||
self.transport_cmd = kwargs['transport_cmd']
|
||||
@ -277,20 +287,26 @@ class Connection(ConnectionBase):
|
||||
ution of Ansible modules against VMs, whether local or remote
|
||||
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()
|
||||
#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:
|
||||
remote_cmd = [to_bytes(x, errors='surrogate_or_strict') for x in [
|
||||
# 'strace', '-s', '2048', '-o', '/tmp/log',
|
||||
'python', '-i', '-c', preamble
|
||||
]]
|
||||
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:
|
||||
proxy = ["--proxy=%s" % proxy] if proxy else []
|
||||
proxy = [b"--proxy=%s" % proxy] if proxy else []
|
||||
addr = addr.split(".")[0]
|
||||
else:
|
||||
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)
|
||||
self._transport = subprocess.Popen(
|
||||
cmd, shell=False, stdin=subprocess.PIPE,
|
||||
@ -300,8 +316,9 @@ class Connection(ConnectionBase):
|
||||
self._transport.stdin.write(payload)
|
||||
self._transport.stdin.flush()
|
||||
ok = self._transport.stdout.readline(16)
|
||||
if not ok.startswith("OK\n"):
|
||||
raise errors.AnsibleError("the remote end of the Qubes connection was not ready")
|
||||
if not ok.startswith(b"OK\n"):
|
||||
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:
|
||||
self._abort_transport()
|
||||
raise
|
||||
@ -335,18 +352,20 @@ class Connection(ConnectionBase):
|
||||
def exec_command(self, cmd, in_data=None, sudoable=False):
|
||||
'''Run a command on the VM.'''
|
||||
super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable)
|
||||
try: basestring
|
||||
except NameError: basestring = str
|
||||
if isinstance(cmd, basestring):
|
||||
cmd = shlex.split(cmd)
|
||||
display.vvvv("EXEC %s" % cmd, host=self._play_context.remote_addr)
|
||||
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.flush()
|
||||
yesno = self._transport.stdout.readline(2)
|
||||
except Exception:
|
||||
self._abort_transport()
|
||||
raise
|
||||
if yesno == "Y\n":
|
||||
if yesno == "Y\n" or yesno == b"Y\n":
|
||||
try:
|
||||
retcode = self._transport.stdout.readline(16)
|
||||
try:
|
||||
@ -379,7 +398,7 @@ class Connection(ConnectionBase):
|
||||
except Exception:
|
||||
self._abort_transport()
|
||||
raise
|
||||
elif yesno == "N\n":
|
||||
elif yesno == "N\n" or yesno == b"N\n":
|
||||
exc = decode_exception(self._transport.stdin)
|
||||
raise exc
|
||||
else:
|
||||
@ -392,12 +411,12 @@ class Connection(ConnectionBase):
|
||||
display.vvvv("PUT %s to %s" % (in_path, out_path), host=self._play_context.remote_addr)
|
||||
out_path = _prefix_login_path(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()
|
||||
yesno = self._transport.stdout.readline(2)
|
||||
if yesno == "Y\n":
|
||||
if yesno == "Y\n" or yesno == b"Y\n":
|
||||
pass
|
||||
elif yesno == "N\n":
|
||||
elif yesno == "N\n" or yesno == b"N\n":
|
||||
exc = decode_exception(self._transport.stdin)
|
||||
raise exc
|
||||
else:
|
||||
@ -407,7 +426,7 @@ class Connection(ConnectionBase):
|
||||
while True:
|
||||
chunk = in_file.read(BUFSIZE)
|
||||
try:
|
||||
self._transport.stdin.write("%s\n" % len(chunk))
|
||||
self._transport.stdin.write(("%s\n" % len(chunk)).encode("utf-8"))
|
||||
self._transport.stdin.flush()
|
||||
if len(chunk) == 0:
|
||||
break
|
||||
@ -417,9 +436,9 @@ class Connection(ConnectionBase):
|
||||
self._abort_transport()
|
||||
raise
|
||||
yesno = self._transport.stdout.readline(2)
|
||||
if yesno == "Y\n":
|
||||
if yesno == "Y\n" or yesno == b"Y\n":
|
||||
pass
|
||||
elif yesno == "N\n":
|
||||
elif yesno == "N\n" or yesno == b"N\n":
|
||||
exc = decode_exception(self._transport.stdin)
|
||||
raise exc
|
||||
else:
|
||||
@ -434,7 +453,7 @@ class Connection(ConnectionBase):
|
||||
out_file = open(out_path, "wb")
|
||||
try:
|
||||
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()
|
||||
while True:
|
||||
chunk_len = self._transport.stdout.readline(16)
|
||||
|
@ -1,6 +1,7 @@
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
try:
|
||||
@ -42,4 +43,6 @@ class LookupModule(LookupBase):
|
||||
else:
|
||||
raise AnsibleError("qubes-pass lookup failed: %s" % e)
|
||||
|
||||
return [ret]
|
||||
if sys.version_info.major == 2:
|
||||
return [ret]
|
||||
return [ret.decode("utf-8")]
|
||||
|
Loading…
x
Reference in New Issue
Block a user