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