summaryrefslogtreecommitdiffstats
path: root/ansible_collections/community/general/plugins/lookup/shelvefile.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:04:41 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:04:41 +0000
commit975f66f2eebe9dadba04f275774d4ab83f74cf25 (patch)
tree89bd26a93aaae6a25749145b7e4bca4a1e75b2be /ansible_collections/community/general/plugins/lookup/shelvefile.py
parentInitial commit. (diff)
downloadansible-975f66f2eebe9dadba04f275774d4ab83f74cf25.tar.xz
ansible-975f66f2eebe9dadba04f275774d4ab83f74cf25.zip
Adding upstream version 7.7.0+dfsg.upstream/7.7.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ansible_collections/community/general/plugins/lookup/shelvefile.py')
-rw-r--r--ansible_collections/community/general/plugins/lookup/shelvefile.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/ansible_collections/community/general/plugins/lookup/shelvefile.py b/ansible_collections/community/general/plugins/lookup/shelvefile.py
new file mode 100644
index 000000000..35f1097c8
--- /dev/null
+++ b/ansible_collections/community/general/plugins/lookup/shelvefile.py
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Alejandro Guirao <lekumberri@gmail.com>
+# Copyright (c) 2012-17 Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+DOCUMENTATION = '''
+ name: shelvefile
+ author: Alejandro Guirao (!UNKNOWN) <lekumberri@gmail.com>
+ short_description: read keys from Python shelve file
+ description:
+ - Read keys from Python shelve file.
+ options:
+ _terms:
+ description: Sets of key value pairs of parameters.
+ key:
+ description: Key to query.
+ required: true
+ file:
+ description: Path to shelve file.
+ required: true
+'''
+
+EXAMPLES = """
+- name: Retrieve a string value corresponding to a key inside a Python shelve file
+ ansible.builtin.debug:
+ msg: "{{ lookup('community.general.shelvefile', 'file=path_to_some_shelve_file.db key=key_to_retrieve') }}"
+"""
+
+RETURN = """
+_list:
+ description: Value(s) of key(s) in shelve file(s).
+ type: list
+ elements: str
+"""
+import shelve
+
+from ansible.errors import AnsibleError, AnsibleAssertionError
+from ansible.plugins.lookup import LookupBase
+from ansible.module_utils.common.text.converters import to_bytes, to_text
+
+
+class LookupModule(LookupBase):
+
+ def read_shelve(self, shelve_filename, key):
+ """
+ Read the value of "key" from a shelve file
+ """
+ d = shelve.open(to_bytes(shelve_filename))
+ res = d.get(key, None)
+ d.close()
+ return res
+
+ def run(self, terms, variables=None, **kwargs):
+ if not isinstance(terms, list):
+ terms = [terms]
+
+ ret = []
+
+ for term in terms:
+ paramvals = {"file": None, "key": None}
+ params = term.split()
+
+ try:
+ for param in params:
+ name, value = param.split('=')
+ if name not in paramvals:
+ raise AnsibleAssertionError('%s not in paramvals' % name)
+ paramvals[name] = value
+
+ except (ValueError, AssertionError) as e:
+ # In case "file" or "key" are not present
+ raise AnsibleError(e)
+
+ key = paramvals['key']
+
+ # Search also in the role/files directory and in the playbook directory
+ shelvefile = self.find_file_in_search_path(variables, 'files', paramvals['file'])
+
+ if shelvefile:
+ res = self.read_shelve(shelvefile, key)
+ if res is None:
+ raise AnsibleError("Key %s not found in shelve file %s" % (key, shelvefile))
+ # Convert the value read to string
+ ret.append(to_text(res))
+ break
+ else:
+ raise AnsibleError("Could not locate shelve file in lookup: %s" % paramvals['file'])
+
+ return ret