1#!/usr/local/bin/python3.8
2from __future__ import (absolute_import, division, print_function)
3# Copyright 2019-2020 Fortinet, Inc.
4#
5# This program is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program.  If not, see <https://www.gnu.org/licenses/>.
17
18__metaclass__ = type
19
20ANSIBLE_METADATA = {'status': ['preview'],
21                    'supported_by': 'community',
22                    'metadata_version': '1.1'}
23
24DOCUMENTATION = '''
25---
26module: fortios_wireless_controller_hotspot20_h2qp_conn_capability
27short_description: Configure connection capability in Fortinet's FortiOS and FortiGate.
28description:
29    - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the
30      user to set and modify wireless_controller_hotspot20 feature and h2qp_conn_capability category.
31      Examples include all parameters and values need to be adjusted to datasources before usage.
32      Tested with FOS v6.0.0
33version_added: "2.10"
34author:
35    - Link Zheng (@chillancezen)
36    - Jie Xue (@JieX19)
37    - Hongbin Lu (@fgtdev-hblu)
38    - Frank Shen (@frankshen01)
39    - Miguel Angel Munoz (@mamunozgonzalez)
40    - Nicolas Thomas (@thomnico)
41notes:
42    - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
43
44requirements:
45    - ansible>=2.9.0
46options:
47    access_token:
48        description:
49            - Token-based authentication.
50              Generated from GUI of Fortigate.
51        type: str
52        required: false
53    enable_log:
54        description:
55            - Enable/Disable logging for task.
56        type: bool
57        required: false
58        default: false
59    vdom:
60        description:
61            - Virtual domain, among those defined previously. A vdom is a
62              virtual instance of the FortiGate that can be configured and
63              used as a different unit.
64        type: str
65        default: root
66
67    state:
68        description:
69            - Indicates whether to create or remove the object.
70        type: str
71        required: true
72        choices:
73            - present
74            - absent
75    wireless_controller_hotspot20_h2qp_conn_capability:
76        description:
77            - Configure connection capability.
78        default: null
79        type: dict
80        suboptions:
81            esp_port:
82                description:
83                    - Set ESP port service (used by IPsec VPNs) status.
84                type: str
85                choices:
86                    - closed
87                    - open
88                    - unknown
89            ftp_port:
90                description:
91                    - Set FTP port service status.
92                type: str
93                choices:
94                    - closed
95                    - open
96                    - unknown
97            http_port:
98                description:
99                    - Set HTTP port service status.
100                type: str
101                choices:
102                    - closed
103                    - open
104                    - unknown
105            icmp_port:
106                description:
107                    - Set ICMP port service status.
108                type: str
109                choices:
110                    - closed
111                    - open
112                    - unknown
113            ikev2_port:
114                description:
115                    - Set IKEv2 port service for IPsec VPN status.
116                type: str
117                choices:
118                    - closed
119                    - open
120                    - unknown
121            ikev2_xx_port:
122                description:
123                    - Set UDP port 4500 (which may be used by IKEv2 for IPsec VPN) service status.
124                type: str
125                choices:
126                    - closed
127                    - open
128                    - unknown
129            name:
130                description:
131                    - Connection capability name.
132                required: true
133                type: str
134            pptp_vpn_port:
135                description:
136                    - Set Point to Point Tunneling Protocol (PPTP) VPN port service status.
137                type: str
138                choices:
139                    - closed
140                    - open
141                    - unknown
142            ssh_port:
143                description:
144                    - Set SSH port service status.
145                type: str
146                choices:
147                    - closed
148                    - open
149                    - unknown
150            tls_port:
151                description:
152                    - Set TLS VPN (HTTPS) port service status.
153                type: str
154                choices:
155                    - closed
156                    - open
157                    - unknown
158            voip_tcp_port:
159                description:
160                    - Set VoIP TCP port service status.
161                type: str
162                choices:
163                    - closed
164                    - open
165                    - unknown
166            voip_udp_port:
167                description:
168                    - Set VoIP UDP port service status.
169                type: str
170                choices:
171                    - closed
172                    - open
173                    - unknown
174'''
175
176EXAMPLES = '''
177- hosts: fortigates
178  collections:
179    - fortinet.fortios
180  connection: httpapi
181  vars:
182   vdom: "root"
183   ansible_httpapi_use_ssl: yes
184   ansible_httpapi_validate_certs: no
185   ansible_httpapi_port: 443
186  tasks:
187  - name: Configure connection capability.
188    fortios_wireless_controller_hotspot20_h2qp_conn_capability:
189      vdom:  "{{ vdom }}"
190      state: "present"
191      access_token: "<your_own_value>"
192      wireless_controller_hotspot20_h2qp_conn_capability:
193        esp_port: "closed"
194        ftp_port: "closed"
195        http_port: "closed"
196        icmp_port: "closed"
197        ikev2_port: "closed"
198        ikev2_xx_port: "closed"
199        name: "default_name_9"
200        pptp_vpn_port: "closed"
201        ssh_port: "closed"
202        tls_port: "closed"
203        voip_tcp_port: "closed"
204        voip_udp_port: "closed"
205
206'''
207
208RETURN = '''
209build:
210  description: Build number of the fortigate image
211  returned: always
212  type: str
213  sample: '1547'
214http_method:
215  description: Last method used to provision the content into FortiGate
216  returned: always
217  type: str
218  sample: 'PUT'
219http_status:
220  description: Last result given by FortiGate on last operation applied
221  returned: always
222  type: str
223  sample: "200"
224mkey:
225  description: Master key (id) used in the last call to FortiGate
226  returned: success
227  type: str
228  sample: "id"
229name:
230  description: Name of the table used to fulfill the request
231  returned: always
232  type: str
233  sample: "urlfilter"
234path:
235  description: Path of the table used to fulfill the request
236  returned: always
237  type: str
238  sample: "webfilter"
239revision:
240  description: Internal revision number
241  returned: always
242  type: str
243  sample: "17.0.2.10658"
244serial:
245  description: Serial number of the unit
246  returned: always
247  type: str
248  sample: "FGVMEVYYQT3AB5352"
249status:
250  description: Indication of the operation's result
251  returned: always
252  type: str
253  sample: "success"
254vdom:
255  description: Virtual domain used
256  returned: always
257  type: str
258  sample: "root"
259version:
260  description: Version of the FortiGate
261  returned: always
262  type: str
263  sample: "v5.6.3"
264
265'''
266from ansible.module_utils.basic import AnsibleModule
267from ansible.module_utils.connection import Connection
268from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import FortiOSHandler
269from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_legacy_fortiosapi
270from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import schema_to_module_spec
271from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_schema_versioning
272from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import FAIL_SOCKET_MSG
273from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import is_same_comparison
274from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import serialize
275
276
277def filter_wireless_controller_hotspot20_h2qp_conn_capability_data(json):
278    option_list = ['esp_port', 'ftp_port', 'http_port',
279                   'icmp_port', 'ikev2_port', 'ikev2_xx_port',
280                   'name', 'pptp_vpn_port', 'ssh_port',
281                   'tls_port', 'voip_tcp_port', 'voip_udp_port']
282    dictionary = {}
283
284    for attribute in option_list:
285        if attribute in json and json[attribute] is not None:
286            dictionary[attribute] = json[attribute]
287
288    return dictionary
289
290
291def underscore_to_hyphen(data):
292    if isinstance(data, list):
293        for i, elem in enumerate(data):
294            data[i] = underscore_to_hyphen(elem)
295    elif isinstance(data, dict):
296        new_data = {}
297        for k, v in data.items():
298            new_data[k.replace('_', '-')] = underscore_to_hyphen(v)
299        data = new_data
300
301    return data
302
303
304def wireless_controller_hotspot20_h2qp_conn_capability(data, fos, check_mode=False):
305
306    vdom = data['vdom']
307
308    state = data['state']
309
310    wireless_controller_hotspot20_h2qp_conn_capability_data = data['wireless_controller_hotspot20_h2qp_conn_capability']
311    filtered_data = \
312        underscore_to_hyphen(filter_wireless_controller_hotspot20_h2qp_conn_capability_data(wireless_controller_hotspot20_h2qp_conn_capability_data))
313
314    # check_mode starts from here
315    if check_mode:
316        mkey = fos.get_mkey('system', 'interface', filtered_data, vdom=vdom)
317        current_data = fos.get('system', 'interface', vdom=vdom, mkey=mkey)
318        is_existed = current_data and current_data.get('http_status') == 200 \
319            and type(current_data.get('results')) == list \
320            and len(current_data['results']) > 0
321
322        # 2. if it exists and the state is 'present' then compare current settings with desired
323        if state == 'present' or state is True:
324            if mkey is None:
325                return False, True, filtered_data
326
327            # if mkey exists then compare each other
328            # record exits and they're matched or not
329            if is_existed:
330                is_same = is_same_comparison(
331                    serialize(current_data['results'][0]), serialize(filtered_data))
332                return False, not is_same, filtered_data
333
334            # record does not exist
335            return False, True, filtered_data
336
337        if state == 'absent':
338            if mkey is None:
339                return False, False, filtered_data
340
341            if is_existed:
342                return False, True, filtered_data
343            return False, False, filtered_data
344
345        return True, False, {'reason: ': 'Must provide state parameter'}
346
347    if state == "present" or state is True:
348        return fos.set('wireless-controller.hotspot20',
349                       'h2qp-conn-capability',
350                       data=filtered_data,
351                       vdom=vdom)
352
353    elif state == "absent":
354        return fos.delete('wireless-controller.hotspot20',
355                          'h2qp-conn-capability',
356                          mkey=filtered_data['name'],
357                          vdom=vdom)
358    else:
359        fos._module.fail_json(msg='state must be present or absent!')
360
361
362def is_successful_status(status):
363    return status['status'] == "success" or \
364        status['http_method'] == "DELETE" and status['http_status'] == 404
365
366
367def fortios_wireless_controller_hotspot20(data, fos, check_mode):
368
369    if data['wireless_controller_hotspot20_h2qp_conn_capability']:
370        resp = wireless_controller_hotspot20_h2qp_conn_capability(data, fos, check_mode)
371    else:
372        fos._module.fail_json(msg='missing task body: %s' % ('wireless_controller_hotspot20_h2qp_conn_capability'))
373    if check_mode:
374        return resp
375    return not is_successful_status(resp), \
376        resp['status'] == "success" and \
377        (resp['revision_changed'] if 'revision_changed' in resp else True), \
378        resp
379
380
381versioned_schema = {
382    "type": "list",
383    "children": {
384        "icmp_port": {
385            "type": "string",
386            "options": [
387                {
388                    "value": "closed",
389                    "revisions": {
390                        "v6.0.0": True,
391                        "v7.0.0": True,
392                        "v6.0.5": True,
393                        "v6.4.4": True,
394                        "v6.4.0": True,
395                        "v6.4.1": True,
396                        "v6.2.0": True,
397                        "v6.2.3": True,
398                        "v6.2.5": True,
399                        "v6.2.7": True,
400                        "v6.0.11": True
401                    }
402                },
403                {
404                    "value": "open",
405                    "revisions": {
406                        "v6.0.0": True,
407                        "v7.0.0": True,
408                        "v6.0.5": True,
409                        "v6.4.4": True,
410                        "v6.4.0": True,
411                        "v6.4.1": True,
412                        "v6.2.0": True,
413                        "v6.2.3": True,
414                        "v6.2.5": True,
415                        "v6.2.7": True,
416                        "v6.0.11": True
417                    }
418                },
419                {
420                    "value": "unknown",
421                    "revisions": {
422                        "v6.0.0": True,
423                        "v7.0.0": True,
424                        "v6.0.5": True,
425                        "v6.4.4": True,
426                        "v6.4.0": True,
427                        "v6.4.1": True,
428                        "v6.2.0": True,
429                        "v6.2.3": True,
430                        "v6.2.5": True,
431                        "v6.2.7": True,
432                        "v6.0.11": True
433                    }
434                }
435            ],
436            "revisions": {
437                "v6.0.0": True,
438                "v7.0.0": True,
439                "v6.0.5": True,
440                "v6.4.4": True,
441                "v6.4.0": True,
442                "v6.4.1": True,
443                "v6.2.0": True,
444                "v6.2.3": True,
445                "v6.2.5": True,
446                "v6.2.7": True,
447                "v6.0.11": True
448            }
449        },
450        "http_port": {
451            "type": "string",
452            "options": [
453                {
454                    "value": "closed",
455                    "revisions": {
456                        "v6.0.0": True,
457                        "v7.0.0": True,
458                        "v6.0.5": True,
459                        "v6.4.4": True,
460                        "v6.4.0": True,
461                        "v6.4.1": True,
462                        "v6.2.0": True,
463                        "v6.2.3": True,
464                        "v6.2.5": True,
465                        "v6.2.7": True,
466                        "v6.0.11": True
467                    }
468                },
469                {
470                    "value": "open",
471                    "revisions": {
472                        "v6.0.0": True,
473                        "v7.0.0": True,
474                        "v6.0.5": True,
475                        "v6.4.4": True,
476                        "v6.4.0": True,
477                        "v6.4.1": True,
478                        "v6.2.0": True,
479                        "v6.2.3": True,
480                        "v6.2.5": True,
481                        "v6.2.7": True,
482                        "v6.0.11": True
483                    }
484                },
485                {
486                    "value": "unknown",
487                    "revisions": {
488                        "v6.0.0": True,
489                        "v7.0.0": True,
490                        "v6.0.5": True,
491                        "v6.4.4": True,
492                        "v6.4.0": True,
493                        "v6.4.1": True,
494                        "v6.2.0": True,
495                        "v6.2.3": True,
496                        "v6.2.5": True,
497                        "v6.2.7": True,
498                        "v6.0.11": True
499                    }
500                }
501            ],
502            "revisions": {
503                "v6.0.0": True,
504                "v7.0.0": True,
505                "v6.0.5": True,
506                "v6.4.4": True,
507                "v6.4.0": True,
508                "v6.4.1": True,
509                "v6.2.0": True,
510                "v6.2.3": True,
511                "v6.2.5": True,
512                "v6.2.7": True,
513                "v6.0.11": True
514            }
515        },
516        "ftp_port": {
517            "type": "string",
518            "options": [
519                {
520                    "value": "closed",
521                    "revisions": {
522                        "v6.0.0": True,
523                        "v7.0.0": True,
524                        "v6.0.5": True,
525                        "v6.4.4": True,
526                        "v6.4.0": True,
527                        "v6.4.1": True,
528                        "v6.2.0": True,
529                        "v6.2.3": True,
530                        "v6.2.5": True,
531                        "v6.2.7": True,
532                        "v6.0.11": True
533                    }
534                },
535                {
536                    "value": "open",
537                    "revisions": {
538                        "v6.0.0": True,
539                        "v7.0.0": True,
540                        "v6.0.5": True,
541                        "v6.4.4": True,
542                        "v6.4.0": True,
543                        "v6.4.1": True,
544                        "v6.2.0": True,
545                        "v6.2.3": True,
546                        "v6.2.5": True,
547                        "v6.2.7": True,
548                        "v6.0.11": True
549                    }
550                },
551                {
552                    "value": "unknown",
553                    "revisions": {
554                        "v6.0.0": True,
555                        "v7.0.0": True,
556                        "v6.0.5": True,
557                        "v6.4.4": True,
558                        "v6.4.0": True,
559                        "v6.4.1": True,
560                        "v6.2.0": True,
561                        "v6.2.3": True,
562                        "v6.2.5": True,
563                        "v6.2.7": True,
564                        "v6.0.11": True
565                    }
566                }
567            ],
568            "revisions": {
569                "v6.0.0": True,
570                "v7.0.0": True,
571                "v6.0.5": True,
572                "v6.4.4": True,
573                "v6.4.0": True,
574                "v6.4.1": True,
575                "v6.2.0": True,
576                "v6.2.3": True,
577                "v6.2.5": True,
578                "v6.2.7": True,
579                "v6.0.11": True
580            }
581        },
582        "name": {
583            "type": "string",
584            "revisions": {
585                "v6.0.0": True,
586                "v7.0.0": True,
587                "v6.0.5": True,
588                "v6.4.4": True,
589                "v6.4.0": True,
590                "v6.4.1": True,
591                "v6.2.0": True,
592                "v6.2.3": True,
593                "v6.2.5": True,
594                "v6.2.7": True,
595                "v6.0.11": True
596            }
597        },
598        "voip_udp_port": {
599            "type": "string",
600            "options": [
601                {
602                    "value": "closed",
603                    "revisions": {
604                        "v6.0.0": True,
605                        "v7.0.0": True,
606                        "v6.0.5": True,
607                        "v6.4.4": True,
608                        "v6.4.0": True,
609                        "v6.4.1": True,
610                        "v6.2.0": True,
611                        "v6.2.3": True,
612                        "v6.2.5": True,
613                        "v6.2.7": True,
614                        "v6.0.11": True
615                    }
616                },
617                {
618                    "value": "open",
619                    "revisions": {
620                        "v6.0.0": True,
621                        "v7.0.0": True,
622                        "v6.0.5": True,
623                        "v6.4.4": True,
624                        "v6.4.0": True,
625                        "v6.4.1": True,
626                        "v6.2.0": True,
627                        "v6.2.3": True,
628                        "v6.2.5": True,
629                        "v6.2.7": True,
630                        "v6.0.11": True
631                    }
632                },
633                {
634                    "value": "unknown",
635                    "revisions": {
636                        "v6.0.0": True,
637                        "v7.0.0": True,
638                        "v6.0.5": True,
639                        "v6.4.4": True,
640                        "v6.4.0": True,
641                        "v6.4.1": True,
642                        "v6.2.0": True,
643                        "v6.2.3": True,
644                        "v6.2.5": True,
645                        "v6.2.7": True,
646                        "v6.0.11": True
647                    }
648                }
649            ],
650            "revisions": {
651                "v6.0.0": True,
652                "v7.0.0": True,
653                "v6.0.5": True,
654                "v6.4.4": True,
655                "v6.4.0": True,
656                "v6.4.1": True,
657                "v6.2.0": True,
658                "v6.2.3": True,
659                "v6.2.5": True,
660                "v6.2.7": True,
661                "v6.0.11": True
662            }
663        },
664        "ssh_port": {
665            "type": "string",
666            "options": [
667                {
668                    "value": "closed",
669                    "revisions": {
670                        "v6.0.0": True,
671                        "v7.0.0": True,
672                        "v6.0.5": True,
673                        "v6.4.4": True,
674                        "v6.4.0": True,
675                        "v6.4.1": True,
676                        "v6.2.0": True,
677                        "v6.2.3": True,
678                        "v6.2.5": True,
679                        "v6.2.7": True,
680                        "v6.0.11": True
681                    }
682                },
683                {
684                    "value": "open",
685                    "revisions": {
686                        "v6.0.0": True,
687                        "v7.0.0": True,
688                        "v6.0.5": True,
689                        "v6.4.4": True,
690                        "v6.4.0": True,
691                        "v6.4.1": True,
692                        "v6.2.0": True,
693                        "v6.2.3": True,
694                        "v6.2.5": True,
695                        "v6.2.7": True,
696                        "v6.0.11": True
697                    }
698                },
699                {
700                    "value": "unknown",
701                    "revisions": {
702                        "v6.0.0": True,
703                        "v7.0.0": True,
704                        "v6.0.5": True,
705                        "v6.4.4": True,
706                        "v6.4.0": True,
707                        "v6.4.1": True,
708                        "v6.2.0": True,
709                        "v6.2.3": True,
710                        "v6.2.5": True,
711                        "v6.2.7": True,
712                        "v6.0.11": True
713                    }
714                }
715            ],
716            "revisions": {
717                "v6.0.0": True,
718                "v7.0.0": True,
719                "v6.0.5": True,
720                "v6.4.4": True,
721                "v6.4.0": True,
722                "v6.4.1": True,
723                "v6.2.0": True,
724                "v6.2.3": True,
725                "v6.2.5": True,
726                "v6.2.7": True,
727                "v6.0.11": True
728            }
729        },
730        "ikev2_port": {
731            "type": "string",
732            "options": [
733                {
734                    "value": "closed",
735                    "revisions": {
736                        "v6.0.0": True,
737                        "v7.0.0": True,
738                        "v6.0.5": True,
739                        "v6.4.4": True,
740                        "v6.4.0": True,
741                        "v6.4.1": True,
742                        "v6.2.0": True,
743                        "v6.2.3": True,
744                        "v6.2.5": True,
745                        "v6.2.7": True,
746                        "v6.0.11": True
747                    }
748                },
749                {
750                    "value": "open",
751                    "revisions": {
752                        "v6.0.0": True,
753                        "v7.0.0": True,
754                        "v6.0.5": True,
755                        "v6.4.4": True,
756                        "v6.4.0": True,
757                        "v6.4.1": True,
758                        "v6.2.0": True,
759                        "v6.2.3": True,
760                        "v6.2.5": True,
761                        "v6.2.7": True,
762                        "v6.0.11": True
763                    }
764                },
765                {
766                    "value": "unknown",
767                    "revisions": {
768                        "v6.0.0": True,
769                        "v7.0.0": True,
770                        "v6.0.5": True,
771                        "v6.4.4": True,
772                        "v6.4.0": True,
773                        "v6.4.1": True,
774                        "v6.2.0": True,
775                        "v6.2.3": True,
776                        "v6.2.5": True,
777                        "v6.2.7": True,
778                        "v6.0.11": True
779                    }
780                }
781            ],
782            "revisions": {
783                "v6.0.0": True,
784                "v7.0.0": True,
785                "v6.0.5": True,
786                "v6.4.4": True,
787                "v6.4.0": True,
788                "v6.4.1": True,
789                "v6.2.0": True,
790                "v6.2.3": True,
791                "v6.2.5": True,
792                "v6.2.7": True,
793                "v6.0.11": True
794            }
795        },
796        "voip_tcp_port": {
797            "type": "string",
798            "options": [
799                {
800                    "value": "closed",
801                    "revisions": {
802                        "v6.0.0": True,
803                        "v7.0.0": True,
804                        "v6.0.5": True,
805                        "v6.4.4": True,
806                        "v6.4.0": True,
807                        "v6.4.1": True,
808                        "v6.2.0": True,
809                        "v6.2.3": True,
810                        "v6.2.5": True,
811                        "v6.2.7": True,
812                        "v6.0.11": True
813                    }
814                },
815                {
816                    "value": "open",
817                    "revisions": {
818                        "v6.0.0": True,
819                        "v7.0.0": True,
820                        "v6.0.5": True,
821                        "v6.4.4": True,
822                        "v6.4.0": True,
823                        "v6.4.1": True,
824                        "v6.2.0": True,
825                        "v6.2.3": True,
826                        "v6.2.5": True,
827                        "v6.2.7": True,
828                        "v6.0.11": True
829                    }
830                },
831                {
832                    "value": "unknown",
833                    "revisions": {
834                        "v6.0.0": True,
835                        "v7.0.0": True,
836                        "v6.0.5": True,
837                        "v6.4.4": True,
838                        "v6.4.0": True,
839                        "v6.4.1": True,
840                        "v6.2.0": True,
841                        "v6.2.3": True,
842                        "v6.2.5": True,
843                        "v6.2.7": True,
844                        "v6.0.11": True
845                    }
846                }
847            ],
848            "revisions": {
849                "v6.0.0": True,
850                "v7.0.0": True,
851                "v6.0.5": True,
852                "v6.4.4": True,
853                "v6.4.0": True,
854                "v6.4.1": True,
855                "v6.2.0": True,
856                "v6.2.3": True,
857                "v6.2.5": True,
858                "v6.2.7": True,
859                "v6.0.11": True
860            }
861        },
862        "ikev2_xx_port": {
863            "type": "string",
864            "options": [
865                {
866                    "value": "closed",
867                    "revisions": {
868                        "v6.0.0": True,
869                        "v7.0.0": True,
870                        "v6.0.5": True,
871                        "v6.4.4": True,
872                        "v6.4.0": True,
873                        "v6.4.1": True,
874                        "v6.2.0": True,
875                        "v6.2.3": True,
876                        "v6.2.5": True,
877                        "v6.2.7": True,
878                        "v6.0.11": True
879                    }
880                },
881                {
882                    "value": "open",
883                    "revisions": {
884                        "v6.0.0": True,
885                        "v7.0.0": True,
886                        "v6.0.5": True,
887                        "v6.4.4": True,
888                        "v6.4.0": True,
889                        "v6.4.1": True,
890                        "v6.2.0": True,
891                        "v6.2.3": True,
892                        "v6.2.5": True,
893                        "v6.2.7": True,
894                        "v6.0.11": True
895                    }
896                },
897                {
898                    "value": "unknown",
899                    "revisions": {
900                        "v6.0.0": True,
901                        "v7.0.0": True,
902                        "v6.0.5": True,
903                        "v6.4.4": True,
904                        "v6.4.0": True,
905                        "v6.4.1": True,
906                        "v6.2.0": True,
907                        "v6.2.3": True,
908                        "v6.2.5": True,
909                        "v6.2.7": True,
910                        "v6.0.11": True
911                    }
912                }
913            ],
914            "revisions": {
915                "v6.0.0": True,
916                "v7.0.0": True,
917                "v6.0.5": True,
918                "v6.4.4": True,
919                "v6.4.0": True,
920                "v6.4.1": True,
921                "v6.2.0": True,
922                "v6.2.3": True,
923                "v6.2.5": True,
924                "v6.2.7": True,
925                "v6.0.11": True
926            }
927        },
928        "esp_port": {
929            "type": "string",
930            "options": [
931                {
932                    "value": "closed",
933                    "revisions": {
934                        "v6.0.0": True,
935                        "v7.0.0": True,
936                        "v6.0.5": True,
937                        "v6.4.4": True,
938                        "v6.4.0": True,
939                        "v6.4.1": True,
940                        "v6.2.0": True,
941                        "v6.2.3": True,
942                        "v6.2.5": True,
943                        "v6.2.7": True,
944                        "v6.0.11": True
945                    }
946                },
947                {
948                    "value": "open",
949                    "revisions": {
950                        "v6.0.0": True,
951                        "v7.0.0": True,
952                        "v6.0.5": True,
953                        "v6.4.4": True,
954                        "v6.4.0": True,
955                        "v6.4.1": True,
956                        "v6.2.0": True,
957                        "v6.2.3": True,
958                        "v6.2.5": True,
959                        "v6.2.7": True,
960                        "v6.0.11": True
961                    }
962                },
963                {
964                    "value": "unknown",
965                    "revisions": {
966                        "v6.0.0": True,
967                        "v7.0.0": True,
968                        "v6.0.5": True,
969                        "v6.4.4": True,
970                        "v6.4.0": True,
971                        "v6.4.1": True,
972                        "v6.2.0": True,
973                        "v6.2.3": True,
974                        "v6.2.5": True,
975                        "v6.2.7": True,
976                        "v6.0.11": True
977                    }
978                }
979            ],
980            "revisions": {
981                "v6.0.0": True,
982                "v7.0.0": True,
983                "v6.0.5": True,
984                "v6.4.4": True,
985                "v6.4.0": True,
986                "v6.4.1": True,
987                "v6.2.0": True,
988                "v6.2.3": True,
989                "v6.2.5": True,
990                "v6.2.7": True,
991                "v6.0.11": True
992            }
993        },
994        "tls_port": {
995            "type": "string",
996            "options": [
997                {
998                    "value": "closed",
999                    "revisions": {
1000                        "v6.0.0": True,
1001                        "v7.0.0": True,
1002                        "v6.0.5": True,
1003                        "v6.4.4": True,
1004                        "v6.4.0": True,
1005                        "v6.4.1": True,
1006                        "v6.2.0": True,
1007                        "v6.2.3": True,
1008                        "v6.2.5": True,
1009                        "v6.2.7": True,
1010                        "v6.0.11": True
1011                    }
1012                },
1013                {
1014                    "value": "open",
1015                    "revisions": {
1016                        "v6.0.0": True,
1017                        "v7.0.0": True,
1018                        "v6.0.5": True,
1019                        "v6.4.4": True,
1020                        "v6.4.0": True,
1021                        "v6.4.1": True,
1022                        "v6.2.0": True,
1023                        "v6.2.3": True,
1024                        "v6.2.5": True,
1025                        "v6.2.7": True,
1026                        "v6.0.11": True
1027                    }
1028                },
1029                {
1030                    "value": "unknown",
1031                    "revisions": {
1032                        "v6.0.0": True,
1033                        "v7.0.0": True,
1034                        "v6.0.5": True,
1035                        "v6.4.4": True,
1036                        "v6.4.0": True,
1037                        "v6.4.1": True,
1038                        "v6.2.0": True,
1039                        "v6.2.3": True,
1040                        "v6.2.5": True,
1041                        "v6.2.7": True,
1042                        "v6.0.11": True
1043                    }
1044                }
1045            ],
1046            "revisions": {
1047                "v6.0.0": True,
1048                "v7.0.0": True,
1049                "v6.0.5": True,
1050                "v6.4.4": True,
1051                "v6.4.0": True,
1052                "v6.4.1": True,
1053                "v6.2.0": True,
1054                "v6.2.3": True,
1055                "v6.2.5": True,
1056                "v6.2.7": True,
1057                "v6.0.11": True
1058            }
1059        },
1060        "pptp_vpn_port": {
1061            "type": "string",
1062            "options": [
1063                {
1064                    "value": "closed",
1065                    "revisions": {
1066                        "v6.0.0": True,
1067                        "v7.0.0": True,
1068                        "v6.0.5": True,
1069                        "v6.4.4": True,
1070                        "v6.4.0": True,
1071                        "v6.4.1": True,
1072                        "v6.2.0": True,
1073                        "v6.2.3": True,
1074                        "v6.2.5": True,
1075                        "v6.2.7": True,
1076                        "v6.0.11": True
1077                    }
1078                },
1079                {
1080                    "value": "open",
1081                    "revisions": {
1082                        "v6.0.0": True,
1083                        "v7.0.0": True,
1084                        "v6.0.5": True,
1085                        "v6.4.4": True,
1086                        "v6.4.0": True,
1087                        "v6.4.1": True,
1088                        "v6.2.0": True,
1089                        "v6.2.3": True,
1090                        "v6.2.5": True,
1091                        "v6.2.7": True,
1092                        "v6.0.11": True
1093                    }
1094                },
1095                {
1096                    "value": "unknown",
1097                    "revisions": {
1098                        "v6.0.0": True,
1099                        "v7.0.0": True,
1100                        "v6.0.5": True,
1101                        "v6.4.4": True,
1102                        "v6.4.0": True,
1103                        "v6.4.1": True,
1104                        "v6.2.0": True,
1105                        "v6.2.3": True,
1106                        "v6.2.5": True,
1107                        "v6.2.7": True,
1108                        "v6.0.11": True
1109                    }
1110                }
1111            ],
1112            "revisions": {
1113                "v6.0.0": True,
1114                "v7.0.0": True,
1115                "v6.0.5": True,
1116                "v6.4.4": True,
1117                "v6.4.0": True,
1118                "v6.4.1": True,
1119                "v6.2.0": True,
1120                "v6.2.3": True,
1121                "v6.2.5": True,
1122                "v6.2.7": True,
1123                "v6.0.11": True
1124            }
1125        }
1126    },
1127    "revisions": {
1128        "v6.0.0": True,
1129        "v7.0.0": True,
1130        "v6.0.5": True,
1131        "v6.4.4": True,
1132        "v6.4.0": True,
1133        "v6.4.1": True,
1134        "v6.2.0": True,
1135        "v6.2.3": True,
1136        "v6.2.5": True,
1137        "v6.2.7": True,
1138        "v6.0.11": True
1139    }
1140}
1141
1142
1143def main():
1144    module_spec = schema_to_module_spec(versioned_schema)
1145    mkeyname = 'name'
1146    fields = {
1147        "access_token": {"required": False, "type": "str", "no_log": True},
1148        "enable_log": {"required": False, "type": bool},
1149        "vdom": {"required": False, "type": "str", "default": "root"},
1150        "state": {"required": True, "type": "str",
1151                  "choices": ["present", "absent"]},
1152        "wireless_controller_hotspot20_h2qp_conn_capability": {
1153            "required": False, "type": "dict", "default": None,
1154            "options": {
1155            }
1156        }
1157    }
1158    for attribute_name in module_spec['options']:
1159        fields["wireless_controller_hotspot20_h2qp_conn_capability"]['options'][attribute_name] = module_spec['options'][attribute_name]
1160        if mkeyname and mkeyname == attribute_name:
1161            fields["wireless_controller_hotspot20_h2qp_conn_capability"]['options'][attribute_name]['required'] = True
1162
1163    check_legacy_fortiosapi()
1164    module = AnsibleModule(argument_spec=fields,
1165                           supports_check_mode=True)
1166
1167    versions_check_result = None
1168    if module._socket_path:
1169        connection = Connection(module._socket_path)
1170        if 'access_token' in module.params:
1171            connection.set_option('access_token', module.params['access_token'])
1172
1173        if 'enable_log' in module.params:
1174            connection.set_option('enable_log', module.params['enable_log'])
1175        else:
1176            connection.set_option('enable_log', False)
1177        fos = FortiOSHandler(connection, module, mkeyname)
1178        versions_check_result = check_schema_versioning(fos, versioned_schema, "wireless_controller_hotspot20_h2qp_conn_capability")
1179
1180        is_error, has_changed, result = fortios_wireless_controller_hotspot20(module.params, fos, module.check_mode)
1181
1182    else:
1183        module.fail_json(**FAIL_SOCKET_MSG)
1184
1185    if versions_check_result and versions_check_result['matched'] is False:
1186        module.warn("Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv")
1187
1188    if not is_error:
1189        if versions_check_result and versions_check_result['matched'] is False:
1190            module.exit_json(changed=has_changed, version_check_warning=versions_check_result, meta=result)
1191        else:
1192            module.exit_json(changed=has_changed, meta=result)
1193    else:
1194        if versions_check_result and versions_check_result['matched'] is False:
1195            module.fail_json(msg="Error in repo", version_check_warning=versions_check_result, meta=result)
1196        else:
1197            module.fail_json(msg="Error in repo", meta=result)
1198
1199
1200if __name__ == '__main__':
1201    main()
1202