Skip to content

Instantly share code, notes, and snippets.

@x-yuri

x-yuri/service Secret

Created February 23, 2017 14:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save x-yuri/221cd494ea0bb7d496d5569061b8b5db to your computer and use it in GitHub Desktop.
Save x-yuri/221cd494ea0bb7d496d5569061b8b5db to your computer and use it in GitHub Desktop.
#!/usr/bin/python
# -*- coding: utf-8 -*-
ZIPLOADER_WRAPPER = True # For test-module script to tell this is a ZIPLOADER_WRAPPER
# This code is part of Ansible, but is an independent component.
# The code in this particular templatable string, and this templatable string
# only, is BSD licensed. Modules which end up using this snippet, which is
# dynamically combined together by Ansible still belong to the author of the
# module, and they may assign their own license to the complete work.
#
# Copyright (c), James Cammarata, 2016
# Copyright (c), Toshio Kuratomi, 2016
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import os
import sys
import base64
import shutil
import zipfile
import tempfile
import subprocess
if sys.version_info < (3,):
bytes = str
PY3 = False
else:
unicode = str
PY3 = True
try:
# Python-2.6+
from io import BytesIO as IOStream
except ImportError:
# Python < 2.6
from StringIO import StringIO as IOStream
ZIPDATA = """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"""
def invoke_module(module, modlib_path, json_params):
pythonpath = os.environ.get('PYTHONPATH')
if pythonpath:
os.environ['PYTHONPATH'] = ':'.join((modlib_path, pythonpath))
else:
os.environ['PYTHONPATH'] = modlib_path
p = subprocess.Popen(['/usr/bin/python', module], env=os.environ, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
(stdout, stderr) = p.communicate(json_params)
if not isinstance(stderr, (bytes, unicode)):
stderr = stderr.read()
if not isinstance(stdout, (bytes, unicode)):
stdout = stdout.read()
if PY3:
sys.stderr.buffer.write(stderr)
sys.stdout.buffer.write(stdout)
else:
sys.stderr.write(stderr)
sys.stdout.write(stdout)
return p.returncode
def debug(command, zipped_mod, json_params):
# The code here normally doesn't run. It's only used for debugging on the
# remote machine.
#
# The subcommands in this function make it easier to debug ziploader
# modules. Here's the basic steps:
#
# Run ansible with the environment variable: ANSIBLE_KEEP_REMOTE_FILES=1 and -vvv
# to save the module file remotely::
# $ ANSIBLE_KEEP_REMOTE_FILES=1 ansible host1 -m ping -a 'data=october' -vvv
#
# Part of the verbose output will tell you where on the remote machine the
# module was written to::
# [...]
# <host1> SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o
# PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o
# ControlPath=/home/badger/.ansible/cp/ansible-ssh-%h-%p-%r -tt rhel7 '/bin/sh -c '"'"'LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
# LC_MESSAGES=en_US.UTF-8 /usr/bin/python /home/badger/.ansible/tmp/ansible-tmp-1461173013.93-9076457629738/ping'"'"''
# [...]
#
# Login to the remote machine and run the module file via from the previous
# step with the explode subcommand to extract the module payload into
# source files::
# $ ssh host1
# $ /usr/bin/python /home/badger/.ansible/tmp/ansible-tmp-1461173013.93-9076457629738/ping explode
# Module expanded into:
# /home/badger/.ansible/tmp/ansible-tmp-1461173408.08-279692652635227/ansible
#
# You can now edit the source files to instrument the code or experiment with
# different parameter values. When you're ready to run the code you've modified
# (instead of the code from the actual zipped module), use the execute subcommand like this::
# $ /usr/bin/python /home/badger/.ansible/tmp/ansible-tmp-1461173013.93-9076457629738/ping execute
# Okay to use __file__ here because we're running from a kept file
basedir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'debug_dir')
args_path = os.path.join(basedir, 'args')
script_path = os.path.join(basedir, 'ansible_module_service.py')
if command == 'explode':
# transform the ZIPDATA into an exploded directory of code and then
# print the path to the code. This is an easy way for people to look
# at the code on the remote machine for debugging it in that
# environment
z = zipfile.ZipFile(zipped_mod)
for filename in z.namelist():
if filename.startswith('/'):
raise Exception('Something wrong with this module zip file: should not contain absolute paths')
dest_filename = os.path.join(basedir, filename)
if dest_filename.endswith(os.path.sep) and not os.path.exists(dest_filename):
os.makedirs(dest_filename)
else:
directory = os.path.dirname(dest_filename)
if not os.path.exists(directory):
os.makedirs(directory)
f = open(dest_filename, 'w')
f.write(z.read(filename))
f.close()
# write the args file
f = open(args_path, 'w')
f.write(json_params)
f.close()
print('Module expanded into:')
print('%s' % basedir)
exitcode = 0
elif command == 'execute':
# Execute the exploded code instead of executing the module from the
# embedded ZIPDATA. This allows people to easily run their modified
# code on the remote machine to see how changes will affect it.
# This differs slightly from default Ansible execution of Python modules
# as it passes the arguments to the module via a file instead of stdin.
# Set pythonpath to the debug dir
pythonpath = os.environ.get('PYTHONPATH')
if pythonpath:
os.environ['PYTHONPATH'] = ':'.join((basedir, pythonpath))
else:
os.environ['PYTHONPATH'] = basedir
p = subprocess.Popen(['/usr/bin/python', script_path, args_path], env=os.environ, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
(stdout, stderr) = p.communicate()
if not isinstance(stderr, (bytes, unicode)):
stderr = stderr.read()
if not isinstance(stdout, (bytes, unicode)):
stdout = stdout.read()
if PY3:
sys.stderr.buffer.write(stderr)
sys.stdout.buffer.write(stdout)
else:
sys.stderr.write(stderr)
sys.stdout.write(stdout)
return p.returncode
elif command == 'excommunicate':
# This attempts to run the module in-process (by importing a main
# function and then calling it). It is not the way ansible generally
# invokes the module so it won't work in every case. It is here to
# aid certain debuggers which work better when the code doesn't change
# from one process to another but there may be problems that occur
# when using this that are only artifacts of how we're invoking here,
# not actual bugs (as they don't affect the real way that we invoke
# ansible modules)
# stub the args and python path
sys.argv = ['service', args_path]
sys.path.insert(0, basedir)
from ansible_module_service import main
main()
print('WARNING: Module returned to wrapper instead of exiting')
sys.exit(1)
else:
print('WARNING: Unknown debug command. Doing nothing.')
exitcode = 0
return exitcode
if __name__ == '__main__':
#
# See comments in the debug() method for information on debugging
#
ZIPLOADER_PARAMS = '{"ANSIBLE_MODULE_ARGS": {"_ansible_version": "2.1.2.0", "_ansible_selinux_special_fs": ["fuse", "nfs", "vboxsf", "ramfs"], "name": "coturn", "_ansible_verbosity": 3, "_ansible_syslog_facility": "LOG_USER", "state": "started", "_ansible_diff": false, "_ansible_debug": false, "_ansible_check_mode": false, "_ansible_no_log": false}}'
if PY3:
ZIPLOADER_PARAMS = ZIPLOADER_PARAMS.encode('utf-8')
try:
# There's a race condition with the controller removing the
# remote_tmpdir and this module executing under async. So we cannot
# store this in remote_tmpdir (use system tempdir instead)
temp_path = tempfile.mkdtemp(prefix='ansible_')
zipped_mod = os.path.join(temp_path, 'ansible_modlib.zip')
modlib = open(zipped_mod, 'wb')
modlib.write(base64.b64decode(ZIPDATA))
modlib.close()
if len(sys.argv) == 2:
exitcode = debug(sys.argv[1], zipped_mod, ZIPLOADER_PARAMS)
else:
z = zipfile.ZipFile(zipped_mod, mode='r')
module = os.path.join(temp_path, 'ansible_module_service.py')
f = open(module, 'wb')
f.write(z.read('ansible_module_service.py'))
f.close()
# When installed via setuptools (including python setup.py install),
# ansible may be installed with an easy-install.pth file. That file
# may load the system-wide install of ansible rather than the one in
# the module. sitecustomize is the only way to override that setting.
z = zipfile.ZipFile(zipped_mod, mode='a')
# py3: zipped_mod will be text, py2: it's bytes. Need bytes at the end
z = zipfile.ZipFile(zipped_mod, mode='a')
sitecustomize = u'import sys\nsys.path.insert(0,"%s")\n' % zipped_mod
sitecustomize = sitecustomize.encode('utf-8')
z.writestr('sitecustomize.py', sitecustomize)
z.close()
exitcode = invoke_module(module, zipped_mod, ZIPLOADER_PARAMS)
finally:
try:
shutil.rmtree(temp_path)
except OSError:
# tempdir creation probably failed
pass
sys.exit(exitcode)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment