Remove bslurp module
This module was used in the Ceph deployment support, which was removed long ago. Change-Id: I599ef47199bc68e8f5cf62709157d3f096ac68a9
This commit is contained in:
parent
da1670241b
commit
2f6a8fa233
@ -1,215 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
# Copyright 2015 Sam Yaple
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
# This module has been relicensed from the source below:
|
|
||||||
# https://github.com/SamYaple/yaodu/blob/master/ansible/library/bslurp
|
|
||||||
|
|
||||||
import base64
|
|
||||||
import hashlib
|
|
||||||
import os
|
|
||||||
import traceback
|
|
||||||
import zlib
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
|
|
||||||
DOCUMENTATION = '''
|
|
||||||
---
|
|
||||||
module: bslurp
|
|
||||||
short_description: Slurps a file from a remote node
|
|
||||||
description:
|
|
||||||
- Used for fetching a binary blob containing the file, then push that file
|
|
||||||
to other hosts.
|
|
||||||
options:
|
|
||||||
src:
|
|
||||||
description:
|
|
||||||
- File to fetch. When dest is used, src is expected to be a str with data
|
|
||||||
required: True
|
|
||||||
type: str
|
|
||||||
compress:
|
|
||||||
description:
|
|
||||||
- Compress file with zlib
|
|
||||||
default: True
|
|
||||||
type: bool
|
|
||||||
dest:
|
|
||||||
description:
|
|
||||||
- Where to write out binary blob
|
|
||||||
required: False
|
|
||||||
type: str
|
|
||||||
mode:
|
|
||||||
description:
|
|
||||||
- Destination file permissions
|
|
||||||
default: '0644'
|
|
||||||
type: str
|
|
||||||
sha1:
|
|
||||||
description:
|
|
||||||
- sha1 hash of the underlying data
|
|
||||||
default: None
|
|
||||||
type: bool
|
|
||||||
sha256:
|
|
||||||
description:
|
|
||||||
- sha256 hash of the underlying data
|
|
||||||
default: None
|
|
||||||
type: bool
|
|
||||||
author: Sam Yaple
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = '''
|
|
||||||
Distribute a file from single to many hosts:
|
|
||||||
|
|
||||||
- hosts: web_servers
|
|
||||||
tasks:
|
|
||||||
- name: Pull in web config
|
|
||||||
bslurp: src="/path/to/file"
|
|
||||||
register: file_data
|
|
||||||
run_once: True
|
|
||||||
- name: Push if changed
|
|
||||||
bslurp:
|
|
||||||
src: "{{ file_data.content }}"
|
|
||||||
dest: "{{ file_data.source }}"
|
|
||||||
mode: "{{ file_data.mode }}"
|
|
||||||
sha1: "{{ file_data.sha1 }}"
|
|
||||||
|
|
||||||
Distribute multiple files from single to many hosts:
|
|
||||||
|
|
||||||
- hosts: web_servers
|
|
||||||
tasks:
|
|
||||||
- name: Pull in web config
|
|
||||||
bslurp: src="{{ item }}"
|
|
||||||
with_items:
|
|
||||||
- "/path/to/file1"
|
|
||||||
- "/path/to/file2"
|
|
||||||
- "/path/to/file3"
|
|
||||||
register: file_data
|
|
||||||
run_once: True
|
|
||||||
- name: Push if changed
|
|
||||||
bslurp:
|
|
||||||
src: "{{ item.content }}"
|
|
||||||
dest: "{{ item.source }}"
|
|
||||||
mode: "{{ item.mode }}"
|
|
||||||
sha1: "{{ item.sha1 }}"
|
|
||||||
with_items: file_data.results
|
|
||||||
|
|
||||||
Distribute a file to many hosts without compression; Change
|
|
||||||
permissions on dest:
|
|
||||||
|
|
||||||
- hosts: web_servers
|
|
||||||
tasks:
|
|
||||||
- name: Pull in web config
|
|
||||||
bslurp: src="/path/to/file"
|
|
||||||
register: file_data
|
|
||||||
run_once: True
|
|
||||||
- name: Push if changed
|
|
||||||
bslurp:
|
|
||||||
src: "{{ file_data.content }}"
|
|
||||||
dest: "/new/path/to/file"
|
|
||||||
mode: "0777"
|
|
||||||
compress: False
|
|
||||||
sha1: "{{ file_data.sha1 }}"
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
def copy_from_host(module):
|
|
||||||
compress = module.params.get('compress')
|
|
||||||
src = module.params.get('src')
|
|
||||||
|
|
||||||
if not os.path.exists(src):
|
|
||||||
module.fail_json(msg="file not found: {}".format(src))
|
|
||||||
if not os.access(src, os.R_OK):
|
|
||||||
module.fail_json(msg="file is not readable: {}".format(src))
|
|
||||||
|
|
||||||
mode = oct(os.stat(src).st_mode & 0o777)
|
|
||||||
|
|
||||||
with open(src, 'rb') as f:
|
|
||||||
raw_data = f.read()
|
|
||||||
|
|
||||||
sha1 = hashlib.sha1(raw_data).hexdigest()
|
|
||||||
sha256 = hashlib.sha256(raw_data).hexdigest()
|
|
||||||
|
|
||||||
data = zlib.compress(raw_data) if compress else raw_data
|
|
||||||
|
|
||||||
module.exit_json(content=base64.b64encode(data), sha1=sha1, sha256=sha256,
|
|
||||||
mode=mode, source=src)
|
|
||||||
|
|
||||||
|
|
||||||
def copy_to_host(module):
|
|
||||||
compress = module.params.get('compress')
|
|
||||||
dest = module.params.get('dest')
|
|
||||||
mode = int(module.params.get('mode'), 0)
|
|
||||||
sha1 = module.params.get('sha1')
|
|
||||||
sha256 = module.params.get('sha256')
|
|
||||||
src = module.params.get('src')
|
|
||||||
|
|
||||||
data = base64.b64decode(src)
|
|
||||||
raw_data = zlib.decompress(data) if compress else data
|
|
||||||
|
|
||||||
if sha256:
|
|
||||||
if os.path.exists(dest):
|
|
||||||
if os.access(dest, os.R_OK):
|
|
||||||
with open(dest, 'rb') as f:
|
|
||||||
if hashlib.sha256(f.read()).hexdigest() == sha256:
|
|
||||||
module.exit_json(changed=False)
|
|
||||||
else:
|
|
||||||
module.exit_json(failed=True, changed=False,
|
|
||||||
msg='file is not accessible: {}'.format(dest))
|
|
||||||
|
|
||||||
if sha256 != hashlib.sha256(raw_data).hexdigest():
|
|
||||||
module.exit_json(failed=True, changed=False,
|
|
||||||
msg='sha256 sum does not match data')
|
|
||||||
elif sha1:
|
|
||||||
if os.path.exists(dest):
|
|
||||||
if os.access(dest, os.R_OK):
|
|
||||||
with open(dest, 'rb') as f:
|
|
||||||
if hashlib.sha1(f.read()).hexdigest() == sha1:
|
|
||||||
module.exit_json(changed=False)
|
|
||||||
else:
|
|
||||||
module.exit_json(failed=True, changed=False,
|
|
||||||
msg='file is not accessible: {}'.format(dest))
|
|
||||||
|
|
||||||
if sha1 != hashlib.sha1(raw_data).hexdigest():
|
|
||||||
module.exit_json(failed=True, changed=False,
|
|
||||||
msg='sha1 sum does not match data')
|
|
||||||
|
|
||||||
with os.fdopen(os.open(dest, os.O_WRONLY | os.O_CREAT, mode), 'wb') as f:
|
|
||||||
f.write(raw_data)
|
|
||||||
|
|
||||||
module.exit_json(changed=True)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
argument_spec = dict(
|
|
||||||
compress=dict(default=True, type='bool'),
|
|
||||||
dest=dict(type='str'),
|
|
||||||
mode=dict(default='0644', type='str'),
|
|
||||||
sha1=dict(default=None, type='str'),
|
|
||||||
sha256=dict(default=None, type='str'),
|
|
||||||
src=dict(required=True, type='str')
|
|
||||||
)
|
|
||||||
module = AnsibleModule(argument_spec)
|
|
||||||
|
|
||||||
dest = module.params.get('dest')
|
|
||||||
|
|
||||||
try:
|
|
||||||
if dest:
|
|
||||||
copy_to_host(module)
|
|
||||||
else:
|
|
||||||
copy_from_host(module)
|
|
||||||
except Exception:
|
|
||||||
module.exit_json(failed=True, changed=True,
|
|
||||||
msg=repr(traceback.format_exc()))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
Loading…
Reference in New Issue
Block a user