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