Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelogs/fragments/5022-lastpass-lookup-cleanup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
minor_changes:
- lastpass - use config manager for handling plugin options (https://github.com/ansible-collections/community.general/pull/5022).
23 changes: 14 additions & 9 deletions plugins/lookup/lastpass.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,24 @@
- Andrew Zenk (!UNKNOWN) <azenk@umn.edu>
requirements:
- lpass (command line utility)
- must have already logged into lastpass
short_description: fetch data from lastpass
- must have already logged into LastPass
short_description: fetch data from LastPass
description:
- use the lpass command line utility to fetch specific fields from lastpass
- Use the lpass command line utility to fetch specific fields from LastPass.
options:
_terms:
description: key from which you want to retrieve the field
required: True
description: Key from which you want to retrieve the field.
required: true
type: list
elements: str
field:
description: field to return from lastpass
description: Field to return from LastPass.
default: 'password'
type: str
'''

EXAMPLES = """
- name: get 'custom_field' from lastpass entry 'entry-name'
- name: get 'custom_field' from LastPass entry 'entry-name'
ansible.builtin.debug:
msg: "{{ lookup('community.general.lastpass', 'entry-name', field='custom_field') }}"
"""
Expand Down Expand Up @@ -88,12 +91,14 @@ def get_field(self, key, field):
class LookupModule(LookupBase):

def run(self, terms, variables=None, **kwargs):
self.set_options(var_options=variables, direct=kwargs)
field = self.get_option('field')

lp = LPass()

if not lp.logged_in:
raise AnsibleError("Not logged into lastpass: please run 'lpass login' first")
raise AnsibleError("Not logged into LastPass: please run 'lpass login' first")

field = kwargs.get('field', 'password')
values = []
for term in terms:
values.append(lp.get_field(term, field))
Expand Down
19 changes: 10 additions & 9 deletions tests/unit/plugins/lookup/test_lastpass.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

from ansible.errors import AnsibleError
from ansible.module_utils import six
from ansible.plugins.loader import lookup_loader
from ansible_collections.community.general.plugins.lookup.lastpass import LookupModule, LPass, LPassException


Expand Down Expand Up @@ -126,6 +127,9 @@ class LoggedOutMockLPass(MockLPass):

class TestLPass(unittest.TestCase):

def setUp(self):
self.lookup = lookup_loader.get('community.general.lastpass')

def test_lastpass_cli_path(self):
lp = MockLPass(path='/dev/null')
self.assertEqual('/dev/null', lp.cli_path)
Expand Down Expand Up @@ -158,30 +162,27 @@ def test_lastpass_show(self):

class TestLastpassPlugin(unittest.TestCase):

def setUp(self):
self.lookup = lookup_loader.get('community.general.lastpass')

@patch('ansible_collections.community.general.plugins.lookup.lastpass.LPass', new=MockLPass)
def test_lastpass_plugin_normal(self):
lookup_plugin = LookupModule()

for entry in MOCK_ENTRIES:
entry_id = entry.get('id')
for k, v in six.iteritems(entry):
self.assertEqual(v.strip(),
lookup_plugin.run([entry_id], field=k)[0])
self.lookup.run([entry_id], field=k)[0])

@patch('ansible_collections.community.general.plugins.lookup.lastpass.LPass', LoggedOutMockLPass)
def test_lastpass_plugin_logged_out(self):
lookup_plugin = LookupModule()

entry = MOCK_ENTRIES[0]
entry_id = entry.get('id')
with self.assertRaises(AnsibleError):
lookup_plugin.run([entry_id], field='password')
self.lookup.run([entry_id], field='password')

@patch('ansible_collections.community.general.plugins.lookup.lastpass.LPass', DisconnectedMockLPass)
def test_lastpass_plugin_disconnected(self):
lookup_plugin = LookupModule()

entry = MOCK_ENTRIES[0]
entry_id = entry.get('id')
with self.assertRaises(AnsibleError):
lookup_plugin.run([entry_id], field='password')
self.lookup.run([entry_id], field='password')