1#!/usr/bin/python
2
3# (c) 2018-2019, NetApp, Inc
4# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
6from __future__ import absolute_import, division, print_function
7
8__metaclass__ = type
9
10ANSIBLE_METADATA = {'metadata_version': '1.1',
11                    'status': ['preview'],
12                    'supported_by': 'community'}
13
14DOCUMENTATION = '''
15module: na_ontap_vscan_scanner_pool
16short_description: NetApp ONTAP Vscan Scanner Pools Configuration.
17extends_documentation_fragment:
18    - netapp.na_ontap
19version_added: '2.8'
20author: NetApp Ansible Team (@carchi8py) <ng-ansibleteam@netapp.com>
21description:
22- Configure a Vscan Scanner Pool
23options:
24  state:
25    description:
26    - Whether a Vscan Scanner pool is present or not
27    choices: ['present', 'absent']
28    default: present
29
30  vserver:
31    description:
32    - the name of the data vserver to use.
33    required: true
34
35  hostnames:
36    description:
37    - List of hostnames of Vscan servers which are allowed to connect to Data ONTAP
38
39  privileged_users:
40    description:
41    - List of privileged usernames. Username must be in the form "domain-name\\user-name"
42
43  scanner_pool:
44    description:
45    - the name of the virus scanner pool
46    required: true
47
48  scanner_policy:
49    description:
50    - The name of the Virus scanner Policy
51    choices: ['primary', 'secondary', 'idle']
52'''
53
54EXAMPLES = """
55- name: Create and enable Scanner pool
56  na_ontap_vscan_scanner_pool:
57    state: present
58    username: '{{ netapp_username }}'
59    password: '{{ netapp_password }}'
60    hostname: '{{ netapp_hostname }}'
61    vserver: carchi-vsim2
62    hostnames: ['name', 'name2']
63    privileged_users: ['sim.rtp.openeng.netapp.com\\admin', 'sim.rtp.openeng.netapp.com\\carchi']
64    scanner_pool: Scanner1
65    scanner_policy: primary
66
67- name: Delete a scanner pool
68  na_ontap_vscan_scanner_pool:
69    state: absent
70    username: '{{ netapp_username }}'
71    password: '{{ netapp_password }}'
72    hostname: '{{ netapp_hostname }}'
73    vserver: carchi-vsim2
74    scanner_pool: Scanner1
75"""
76
77RETURN = """
78
79"""
80
81import traceback
82
83from ansible.module_utils.basic import AnsibleModule
84from ansible.module_utils._text import to_native
85import ansible.module_utils.netapp as netapp_utils
86
87HAS_NETAPP_LIB = netapp_utils.has_netapp_lib()
88
89
90class NetAppOntapVscanScannerPool(object):
91
92    def __init__(self):
93        self.argument_spec = netapp_utils.na_ontap_host_argument_spec()
94        self.argument_spec.update(dict(
95            state=dict(choices=['present', 'absent'], default='present'),
96            vserver=dict(required=True, type='str'),
97            hostnames=dict(required=False, type='list'),
98            privileged_users=dict(required=False, type='list'),
99            scanner_pool=dict(required=True, type='str'),
100            scanner_policy=dict(required=False, choices=['primary', 'secondary', 'idle'])
101        ))
102        self.module = AnsibleModule(
103            argument_spec=self.argument_spec,
104            supports_check_mode=True
105        )
106        parameters = self.module.params
107        self.hostnames = parameters['hostnames']
108        self.vserver = parameters['vserver']
109        self.privileged_users = parameters['privileged_users']
110        self.scanner_pool = parameters['scanner_pool']
111        self.state = parameters['state']
112        self.scanner_policy = parameters['scanner_policy']
113
114        if HAS_NETAPP_LIB is False:
115            self.module.fail_json(msg="the python NetApp-Lib module is required")
116        else:
117            self.server = netapp_utils.setup_na_ontap_zapi(module=self.module, vserver=self.vserver)
118
119    def create_scanner_pool(self):
120        """
121        Create a Vscan Scanner Pool
122        :return: nothing
123        """
124        scanner_pool_obj = netapp_utils.zapi.NaElement('vscan-scanner-pool-create')
125        if self.hostnames:
126            string_obj = netapp_utils.zapi.NaElement('hostnames')
127            scanner_pool_obj.add_child_elem(string_obj)
128            for hostname in self.hostnames:
129                string_obj.add_new_child('string', hostname)
130        if self.privileged_users:
131            users_obj = netapp_utils.zapi.NaElement('privileged-users')
132            scanner_pool_obj.add_child_elem(users_obj)
133            for user in self.privileged_users:
134                users_obj.add_new_child('privileged-user', user)
135        scanner_pool_obj.add_new_child('scanner-pool', self.scanner_pool)
136        try:
137            self.server.invoke_successfully(scanner_pool_obj, True)
138        except netapp_utils.zapi.NaApiError as error:
139            self.module.fail_json(msg='Error creating Vscan Scanner Pool %s: %s' %
140                                      (self.scanner_pool, to_native(error)),
141                                  exception=traceback.format_exc())
142
143    def apply_policy(self):
144        """
145        Apply a Scanner policy to a Scanner pool
146        :return: nothing
147        """
148        apply_policy_obj = netapp_utils.zapi.NaElement('vscan-scanner-pool-apply-policy')
149        apply_policy_obj.add_new_child('scanner-policy', self.scanner_policy)
150        apply_policy_obj.add_new_child('scanner-pool', self.scanner_pool)
151        try:
152            self.server.invoke_successfully(apply_policy_obj, True)
153        except netapp_utils.zapi.NaApiError as error:
154            self.module.fail_json(msg='Error applying policy %s to pool %s: %s' %
155                                      (self.scanner_policy, self.scanner_pool, to_native(error)),
156                                  exception=traceback.format_exc())
157
158    def get_scanner_pool(self):
159        """
160        Check to see if a scanner pool exist or not
161        :return: True if it exist, False if it does not
162        """
163        scanner_pool_obj = netapp_utils.zapi.NaElement('vscan-scanner-pool-get-iter')
164        scanner_pool_info = netapp_utils.zapi.NaElement('scan-scanner-pool-info')
165        scanner_pool_info.add_new_child('scanner-pool', self.scanner_pool)
166        scanner_pool_info.add_new_child('vserver', self.vserver)
167        query = netapp_utils.zapi.NaElement('query')
168        query.add_child_elem(scanner_pool_info)
169        scanner_pool_obj.add_child_elem(query)
170        try:
171            result = self.server.invoke_successfully(scanner_pool_obj, True)
172        except netapp_utils.zapi.NaApiError as error:
173            self.module.fail_json(msg='Error searching for Vscan Scanner Pool %s: %s' %
174                                      (self.scanner_pool, to_native(error)),
175                                  exception=traceback.format_exc())
176        if result.get_child_by_name('num-records') and int(result.get_child_content('num-records')) >= 1:
177            if result.get_child_by_name('attributes-list').get_child_by_name('vscan-scanner-pool-info').get_child_content(
178                    'scanner-pool') == self.scanner_pool:
179                return result.get_child_by_name('attributes-list').get_child_by_name('vscan-scanner-pool-info')
180            return False
181        return False
182
183    def delete_scanner_pool(self):
184        """
185        Delete a Scanner pool
186        :return: nothing
187        """
188        scanner_pool_obj = netapp_utils.zapi.NaElement('vscan-scanner-pool-delete')
189        scanner_pool_obj.add_new_child('scanner-pool', self.scanner_pool)
190        try:
191            self.server.invoke_successfully(scanner_pool_obj, True)
192        except netapp_utils.zapi.NaApiError as error:
193            self.module.fail_json(msg='Error deleting Vscan Scanner Pool %s: %s' %
194                                      (self.scanner_pool, to_native(error)),
195                                  exception=traceback.format_exc())
196
197    def asup_log_for_cserver(self, event_name):
198        """
199        Fetch admin vserver for the given cluster
200        Create and Autosupport log event with the given module name
201        :param event_name: Name of the event log
202        :return: None
203        """
204        results = netapp_utils.get_cserver(self.server)
205        cserver = netapp_utils.setup_na_ontap_zapi(module=self.module, vserver=results)
206        netapp_utils.ems_log_event(event_name, cserver)
207
208    def apply(self):
209        self.asup_log_for_cserver("na_ontap_vscan_scanner_pool")
210        changed = False
211        scanner_pool_obj = self.get_scanner_pool()
212        if self.state == 'present':
213            if not scanner_pool_obj:
214                self.create_scanner_pool()
215                if self.scanner_policy:
216                    self.apply_policy()
217                changed = True
218            # apply Scanner policy
219            if scanner_pool_obj:
220                if self.scanner_policy:
221                    if scanner_pool_obj.get_child_content('scanner-policy') != self.scanner_policy:
222                        self.apply_policy()
223                        changed = True
224        if self.state == 'absent':
225            if scanner_pool_obj:
226                self.delete_scanner_pool()
227                changed = True
228        self.module.exit_json(changed=changed)
229
230
231def main():
232    """
233    Execute action from playbook
234    """
235    command = NetAppOntapVscanScannerPool()
236    command.apply()
237
238
239if __name__ == '__main__':
240    main()
241