1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4# (c) 2018, Simon Dodsley (simon@purestorage.com)
5# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
6
7from __future__ import absolute_import, division, print_function
8__metaclass__ = type
9
10ANSIBLE_METADATA = {'metadata_version': '1.1',
11                    'status': ['preview'],
12                    'supported_by': 'community'}
13
14DOCUMENTATION = r'''
15---
16module: purefa_syslog
17version_added: '2.9'
18short_description: Configure Pure Storage FlashArray syslog settings
19description:
20- Configure syslog configuration for Pure Storage FlashArrays.
21- Add or delete an individual syslog server to the existing
22  list of serves.
23author:
24- Pure Storage Ansible Team (@sdodsley) <pure-ansible-team@purestorage.com>
25options:
26  state:
27    description:
28    - Create or delete syslog servers configuration
29    default: present
30    type: str
31    choices: [ absent, present ]
32  protocol:
33    description:
34    - Protocol which server uses
35    required: true
36    type: str
37    choices: [ tcp, tls, udp ]
38  port:
39    description:
40    - Port at which the server is listening. If no port is specified
41      the system will use 514
42    type: str
43  address:
44    description:
45    - Syslog server address.
46      This field supports IPv4, IPv6 or FQDN.
47      An invalid IP addresses will cause the module to fail.
48      No validation is performed for FQDNs.
49    type: str
50    required: true
51extends_documentation_fragment:
52- purestorage.fa
53'''
54
55EXAMPLES = r'''
56- name: Delete existing syslog server entries
57  purefa_syslog:
58    address: syslog1.com
59    protocol: tcp
60    state: absent
61    fa_url: 10.10.10.2
62    api_token: e31060a7-21fc-e277-6240-25983c6c4592
63
64- name: Set array syslog servers
65  purefa_syslog:
66    state: present
67    address: syslog1.com
68    protocol: udp
69    fa_url: 10.10.10.2
70    api_token: e31060a7-21fc-e277-6240-25983c6c4592
71'''
72
73RETURN = r'''
74'''
75
76from ansible.module_utils.basic import AnsibleModule
77from ansible.module_utils.pure import get_system, purefa_argument_spec
78
79
80def delete_syslog(module, array):
81    """Delete Syslog Server"""
82    changed = False
83    noport_address = module.params['protocol'] + "://" + module.params['address']
84
85    if module.params['port']:
86        full_address = noport_address + ":" + module.params['port']
87    else:
88        full_address = noport_address
89
90    address_list = array.get(syslogserver=True)['syslogserver']
91
92    if address_list:
93        for address in range(0, len(address_list)):
94            if address_list[address] == full_address:
95                del address_list[address]
96                try:
97                    array.set(syslogserver=address_list)
98                    changed = True
99                    break
100                except Exception:
101                    module.fail_json(msg='Failed to remove syslog server: {0}'.format(full_address))
102
103    module.exit_json(changed=changed)
104
105
106def add_syslog(module, array):
107    """Add Syslog Server"""
108    changed = False
109    noport_address = module.params['protocol'] + "://" + module.params['address']
110
111    if module.params['port']:
112        full_address = noport_address + ":" + module.params['port']
113    else:
114        full_address = noport_address
115
116    address_list = array.get(syslogserver=True)['syslogserver']
117    exists = False
118
119    if address_list:
120        for address in range(0, len(address_list)):
121            if address_list[address] == full_address:
122                exists = True
123                break
124    if not exists:
125        try:
126            address_list.append(full_address)
127            array.set(syslogserver=address_list)
128            changed = True
129        except Exception:
130            module.fail_json(msg='Failed to add syslog server: {0}'.format(full_address))
131
132    module.exit_json(changed=changed)
133
134
135def main():
136    argument_spec = purefa_argument_spec()
137    argument_spec.update(dict(
138        address=dict(type='str', required=True),
139        protocol=dict(type='str', choices=['tcp', 'tls', 'udp'], required=True),
140        port=dict(type='str'),
141        state=dict(type='str', default='present', choices=['absent', 'present']),
142    ))
143
144    module = AnsibleModule(argument_spec,
145                           supports_check_mode=False)
146
147    array = get_system(module)
148
149    if module.params['state'] == 'absent':
150        delete_syslog(module, array)
151    else:
152        add_syslog(module, array)
153
154    module.exit_json(changed=False)
155
156
157if __name__ == '__main__':
158    main()
159