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_router_ripng 27short_description: Configure RIPng 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 router feature and ripng 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 router_ripng: 68 description: 69 - Configure RIPng. 70 default: null 71 type: dict 72 suboptions: 73 aggregate_address: 74 description: 75 - Aggregate address. 76 type: list 77 suboptions: 78 id: 79 description: 80 - Aggregate address entry ID. 81 required: true 82 type: int 83 prefix6: 84 description: 85 - Aggregate address prefix. 86 type: str 87 default_information_originate: 88 description: 89 - Enable/disable generation of default route. 90 type: str 91 choices: 92 - enable 93 - disable 94 default_metric: 95 description: 96 - Default metric. 97 type: int 98 distance: 99 description: 100 - distance 101 type: list 102 suboptions: 103 access_list6: 104 description: 105 - Access list for route destination. Source router.access-list6.name. 106 type: str 107 distance: 108 description: 109 - Distance (1 - 255). 110 type: int 111 id: 112 description: 113 - Distance ID. 114 required: true 115 type: int 116 prefix6: 117 description: 118 - Distance prefix6. 119 type: str 120 distribute_list: 121 description: 122 - Distribute list. 123 type: list 124 suboptions: 125 direction: 126 description: 127 - Distribute list direction. 128 type: str 129 choices: 130 - in 131 - out 132 id: 133 description: 134 - Distribute list ID. 135 required: true 136 type: int 137 interface: 138 description: 139 - Distribute list interface name. Source system.interface.name. 140 type: str 141 listname: 142 description: 143 - Distribute access/prefix list name. Source router.access-list6.name router.prefix-list6.name. 144 type: str 145 status: 146 description: 147 - status 148 type: str 149 choices: 150 - enable 151 - disable 152 garbage_timer: 153 description: 154 - Garbage timer. 155 type: int 156 interface: 157 description: 158 - RIPng interface configuration. 159 type: list 160 suboptions: 161 flags: 162 description: 163 - Flags. 164 type: int 165 name: 166 description: 167 - Interface name. Source system.interface.name. 168 required: true 169 type: str 170 split_horizon: 171 description: 172 - Enable/disable split horizon. 173 type: str 174 choices: 175 - poisoned 176 - regular 177 split_horizon_status: 178 description: 179 - Enable/disable split horizon. 180 type: str 181 choices: 182 - enable 183 - disable 184 max_out_metric: 185 description: 186 - Maximum metric allowed to output(0 means "not set"). 187 type: int 188 neighbor: 189 description: 190 - neighbor 191 type: list 192 suboptions: 193 id: 194 description: 195 - Neighbor entry ID. 196 required: true 197 type: int 198 interface: 199 description: 200 - Interface name. Source system.interface.name. 201 type: str 202 ip6: 203 description: 204 - IPv6 link-local address. 205 type: str 206 network: 207 description: 208 - Network. 209 type: list 210 suboptions: 211 id: 212 description: 213 - Network entry ID. 214 required: true 215 type: int 216 prefix: 217 description: 218 - Network IPv6 link-local prefix. 219 type: str 220 offset_list: 221 description: 222 - Offset list. 223 type: list 224 suboptions: 225 access_list6: 226 description: 227 - IPv6 access list name. Source router.access-list6.name. 228 type: str 229 direction: 230 description: 231 - Offset list direction. 232 type: str 233 choices: 234 - in 235 - out 236 id: 237 description: 238 - Offset-list ID. 239 required: true 240 type: int 241 interface: 242 description: 243 - Interface name. Source system.interface.name. 244 type: str 245 offset: 246 description: 247 - offset 248 type: int 249 status: 250 description: 251 - status 252 type: str 253 choices: 254 - enable 255 - disable 256 passive_interface: 257 description: 258 - Passive interface configuration. 259 type: list 260 suboptions: 261 name: 262 description: 263 - Passive interface name. Source system.interface.name. 264 required: true 265 type: str 266 redistribute: 267 description: 268 - Redistribute configuration. 269 type: list 270 suboptions: 271 metric: 272 description: 273 - Redistribute metric setting. 274 type: int 275 name: 276 description: 277 - Redistribute name. 278 required: true 279 type: str 280 routemap: 281 description: 282 - Route map name. Source router.route-map.name. 283 type: str 284 status: 285 description: 286 - status 287 type: str 288 choices: 289 - enable 290 - disable 291 timeout_timer: 292 description: 293 - Timeout timer. 294 type: int 295 update_timer: 296 description: 297 - Update timer. 298 type: int 299''' 300 301EXAMPLES = ''' 302- hosts: fortigates 303 collections: 304 - fortinet.fortios 305 connection: httpapi 306 vars: 307 vdom: "root" 308 ansible_httpapi_use_ssl: yes 309 ansible_httpapi_validate_certs: no 310 ansible_httpapi_port: 443 311 tasks: 312 - name: Configure RIPng. 313 fortios_router_ripng: 314 vdom: "{{ vdom }}" 315 router_ripng: 316 aggregate_address: 317 - 318 id: "4" 319 prefix6: "<your_own_value>" 320 default_information_originate: "enable" 321 default_metric: "7" 322 distance: 323 - 324 access_list6: "<your_own_value> (source router.access-list6.name)" 325 distance: "10" 326 id: "11" 327 prefix6: "<your_own_value>" 328 distribute_list: 329 - 330 direction: "in" 331 id: "15" 332 interface: "<your_own_value> (source system.interface.name)" 333 listname: "<your_own_value> (source router.access-list6.name router.prefix-list6.name)" 334 status: "enable" 335 garbage_timer: "19" 336 interface: 337 - 338 flags: "21" 339 name: "default_name_22 (source system.interface.name)" 340 split_horizon: "poisoned" 341 split_horizon_status: "enable" 342 max_out_metric: "25" 343 neighbor: 344 - 345 id: "27" 346 interface: "<your_own_value> (source system.interface.name)" 347 ip6: "<your_own_value>" 348 network: 349 - 350 id: "31" 351 prefix: "<your_own_value>" 352 offset_list: 353 - 354 access_list6: "<your_own_value> (source router.access-list6.name)" 355 direction: "in" 356 id: "36" 357 interface: "<your_own_value> (source system.interface.name)" 358 offset: "38" 359 status: "enable" 360 passive_interface: 361 - 362 name: "default_name_41 (source system.interface.name)" 363 redistribute: 364 - 365 metric: "43" 366 name: "default_name_44" 367 routemap: "<your_own_value> (source router.route-map.name)" 368 status: "enable" 369 timeout_timer: "47" 370 update_timer: "48" 371 372''' 373 374RETURN = ''' 375build: 376 description: Build number of the fortigate image 377 returned: always 378 type: str 379 sample: '1547' 380http_method: 381 description: Last method used to provision the content into FortiGate 382 returned: always 383 type: str 384 sample: 'PUT' 385http_status: 386 description: Last result given by FortiGate on last operation applied 387 returned: always 388 type: str 389 sample: "200" 390mkey: 391 description: Master key (id) used in the last call to FortiGate 392 returned: success 393 type: str 394 sample: "id" 395name: 396 description: Name of the table used to fulfill the request 397 returned: always 398 type: str 399 sample: "urlfilter" 400path: 401 description: Path of the table used to fulfill the request 402 returned: always 403 type: str 404 sample: "webfilter" 405revision: 406 description: Internal revision number 407 returned: always 408 type: str 409 sample: "17.0.2.10658" 410serial: 411 description: Serial number of the unit 412 returned: always 413 type: str 414 sample: "FGVMEVYYQT3AB5352" 415status: 416 description: Indication of the operation's result 417 returned: always 418 type: str 419 sample: "success" 420vdom: 421 description: Virtual domain used 422 returned: always 423 type: str 424 sample: "root" 425version: 426 description: Version of the FortiGate 427 returned: always 428 type: str 429 sample: "v5.6.3" 430 431''' 432from ansible.module_utils.basic import AnsibleModule 433from ansible.module_utils.connection import Connection 434from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import FortiOSHandler 435from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_legacy_fortiosapi 436from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import schema_to_module_spec 437from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_schema_versioning 438from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import FAIL_SOCKET_MSG 439from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import is_same_comparison 440from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import serialize 441 442 443def filter_router_ripng_data(json): 444 option_list = ['aggregate_address', 'default_information_originate', 'default_metric', 445 'distance', 'distribute_list', 'garbage_timer', 446 'interface', 'max_out_metric', 'neighbor', 447 'network', 'offset_list', 'passive_interface', 448 'redistribute', 'timeout_timer', 'update_timer'] 449 dictionary = {} 450 451 for attribute in option_list: 452 if attribute in json and json[attribute] is not None: 453 dictionary[attribute] = json[attribute] 454 455 return dictionary 456 457 458def underscore_to_hyphen(data): 459 if isinstance(data, list): 460 for i, elem in enumerate(data): 461 data[i] = underscore_to_hyphen(elem) 462 elif isinstance(data, dict): 463 new_data = {} 464 for k, v in data.items(): 465 new_data[k.replace('_', '-')] = underscore_to_hyphen(v) 466 data = new_data 467 468 return data 469 470 471def router_ripng(data, fos): 472 vdom = data['vdom'] 473 router_ripng_data = data['router_ripng'] 474 filtered_data = underscore_to_hyphen(filter_router_ripng_data(router_ripng_data)) 475 476 return fos.set('router', 477 'ripng', 478 data=filtered_data, 479 vdom=vdom) 480 481 482def is_successful_status(status): 483 return status['status'] == "success" or \ 484 status['http_method'] == "DELETE" and status['http_status'] == 404 485 486 487def fortios_router(data, fos): 488 489 if data['router_ripng']: 490 resp = router_ripng(data, fos) 491 else: 492 fos._module.fail_json(msg='missing task body: %s' % ('router_ripng')) 493 494 return not is_successful_status(resp), \ 495 resp['status'] == "success" and \ 496 (resp['revision_changed'] if 'revision_changed' in resp else True), \ 497 resp 498 499 500versioned_schema = { 501 "type": "dict", 502 "children": { 503 "distance": { 504 "type": "list", 505 "children": { 506 "distance": { 507 "type": "integer", 508 "revisions": { 509 "v6.0.0": True, 510 "v7.0.0": True, 511 "v6.0.5": True, 512 "v6.4.4": True, 513 "v6.4.0": True, 514 "v6.4.1": True, 515 "v6.2.0": True, 516 "v6.2.3": True, 517 "v6.2.5": True, 518 "v6.2.7": True, 519 "v6.0.11": True 520 } 521 }, 522 "prefix6": { 523 "type": "string", 524 "revisions": { 525 "v6.0.0": True, 526 "v7.0.0": True, 527 "v6.0.5": True, 528 "v6.4.4": True, 529 "v6.4.0": True, 530 "v6.4.1": True, 531 "v6.2.0": True, 532 "v6.2.3": True, 533 "v6.2.5": True, 534 "v6.2.7": True, 535 "v6.0.11": True 536 } 537 }, 538 "access_list6": { 539 "type": "string", 540 "revisions": { 541 "v6.0.0": True, 542 "v7.0.0": True, 543 "v6.0.5": True, 544 "v6.4.4": True, 545 "v6.4.0": True, 546 "v6.4.1": True, 547 "v6.2.0": True, 548 "v6.2.3": True, 549 "v6.2.5": True, 550 "v6.2.7": True, 551 "v6.0.11": True 552 } 553 }, 554 "id": { 555 "type": "integer", 556 "revisions": { 557 "v6.0.0": True, 558 "v7.0.0": True, 559 "v6.0.5": True, 560 "v6.4.4": True, 561 "v6.4.0": True, 562 "v6.4.1": True, 563 "v6.2.0": True, 564 "v6.2.3": True, 565 "v6.2.5": True, 566 "v6.2.7": True, 567 "v6.0.11": True 568 } 569 } 570 }, 571 "revisions": { 572 "v6.0.0": True, 573 "v7.0.0": True, 574 "v6.0.5": True, 575 "v6.4.4": True, 576 "v6.4.0": True, 577 "v6.4.1": True, 578 "v6.2.0": True, 579 "v6.2.3": True, 580 "v6.2.5": True, 581 "v6.2.7": True, 582 "v6.0.11": True 583 } 584 }, 585 "redistribute": { 586 "type": "list", 587 "children": { 588 "status": { 589 "type": "string", 590 "options": [ 591 { 592 "value": "enable", 593 "revisions": { 594 "v6.0.0": True, 595 "v7.0.0": True, 596 "v6.0.5": True, 597 "v6.4.4": True, 598 "v6.4.0": True, 599 "v6.4.1": True, 600 "v6.2.0": True, 601 "v6.2.3": True, 602 "v6.2.5": True, 603 "v6.2.7": True, 604 "v6.0.11": True 605 } 606 }, 607 { 608 "value": "disable", 609 "revisions": { 610 "v6.0.0": True, 611 "v7.0.0": True, 612 "v6.0.5": True, 613 "v6.4.4": True, 614 "v6.4.0": True, 615 "v6.4.1": True, 616 "v6.2.0": True, 617 "v6.2.3": True, 618 "v6.2.5": True, 619 "v6.2.7": True, 620 "v6.0.11": True 621 } 622 } 623 ], 624 "revisions": { 625 "v6.0.0": True, 626 "v7.0.0": True, 627 "v6.0.5": True, 628 "v6.4.4": True, 629 "v6.4.0": True, 630 "v6.4.1": True, 631 "v6.2.0": True, 632 "v6.2.3": True, 633 "v6.2.5": True, 634 "v6.2.7": True, 635 "v6.0.11": True 636 } 637 }, 638 "metric": { 639 "type": "integer", 640 "revisions": { 641 "v6.0.0": True, 642 "v7.0.0": True, 643 "v6.0.5": True, 644 "v6.4.4": True, 645 "v6.4.0": True, 646 "v6.4.1": True, 647 "v6.2.0": True, 648 "v6.2.3": True, 649 "v6.2.5": True, 650 "v6.2.7": True, 651 "v6.0.11": True 652 } 653 }, 654 "routemap": { 655 "type": "string", 656 "revisions": { 657 "v6.0.0": True, 658 "v7.0.0": True, 659 "v6.0.5": True, 660 "v6.4.4": True, 661 "v6.4.0": True, 662 "v6.4.1": True, 663 "v6.2.0": True, 664 "v6.2.3": True, 665 "v6.2.5": True, 666 "v6.2.7": True, 667 "v6.0.11": True 668 } 669 }, 670 "name": { 671 "type": "string", 672 "revisions": { 673 "v6.0.0": True, 674 "v7.0.0": True, 675 "v6.0.5": True, 676 "v6.4.4": True, 677 "v6.4.0": True, 678 "v6.4.1": True, 679 "v6.2.0": True, 680 "v6.2.3": True, 681 "v6.2.5": True, 682 "v6.2.7": True, 683 "v6.0.11": True 684 } 685 } 686 }, 687 "revisions": { 688 "v6.0.0": True, 689 "v7.0.0": True, 690 "v6.0.5": True, 691 "v6.4.4": True, 692 "v6.4.0": True, 693 "v6.4.1": True, 694 "v6.2.0": True, 695 "v6.2.3": True, 696 "v6.2.5": True, 697 "v6.2.7": True, 698 "v6.0.11": True 699 } 700 }, 701 "distribute_list": { 702 "type": "list", 703 "children": { 704 "status": { 705 "type": "string", 706 "options": [ 707 { 708 "value": "enable", 709 "revisions": { 710 "v6.0.0": True, 711 "v7.0.0": True, 712 "v6.0.5": True, 713 "v6.4.4": True, 714 "v6.4.0": True, 715 "v6.4.1": True, 716 "v6.2.0": True, 717 "v6.2.3": True, 718 "v6.2.5": True, 719 "v6.2.7": True, 720 "v6.0.11": True 721 } 722 }, 723 { 724 "value": "disable", 725 "revisions": { 726 "v6.0.0": True, 727 "v7.0.0": True, 728 "v6.0.5": True, 729 "v6.4.4": True, 730 "v6.4.0": True, 731 "v6.4.1": True, 732 "v6.2.0": True, 733 "v6.2.3": True, 734 "v6.2.5": True, 735 "v6.2.7": True, 736 "v6.0.11": True 737 } 738 } 739 ], 740 "revisions": { 741 "v6.0.0": True, 742 "v7.0.0": True, 743 "v6.0.5": True, 744 "v6.4.4": True, 745 "v6.4.0": True, 746 "v6.4.1": True, 747 "v6.2.0": True, 748 "v6.2.3": True, 749 "v6.2.5": True, 750 "v6.2.7": True, 751 "v6.0.11": True 752 } 753 }, 754 "listname": { 755 "type": "string", 756 "revisions": { 757 "v6.0.0": True, 758 "v7.0.0": True, 759 "v6.0.5": True, 760 "v6.4.4": True, 761 "v6.4.0": True, 762 "v6.4.1": True, 763 "v6.2.0": True, 764 "v6.2.3": True, 765 "v6.2.5": True, 766 "v6.2.7": True, 767 "v6.0.11": True 768 } 769 }, 770 "direction": { 771 "type": "string", 772 "options": [ 773 { 774 "value": "in", 775 "revisions": { 776 "v6.0.0": True, 777 "v7.0.0": True, 778 "v6.0.5": True, 779 "v6.4.4": True, 780 "v6.4.0": True, 781 "v6.4.1": True, 782 "v6.2.0": True, 783 "v6.2.3": True, 784 "v6.2.5": True, 785 "v6.2.7": True, 786 "v6.0.11": True 787 } 788 }, 789 { 790 "value": "out", 791 "revisions": { 792 "v6.0.0": True, 793 "v7.0.0": True, 794 "v6.0.5": True, 795 "v6.4.4": True, 796 "v6.4.0": True, 797 "v6.4.1": True, 798 "v6.2.0": True, 799 "v6.2.3": True, 800 "v6.2.5": True, 801 "v6.2.7": True, 802 "v6.0.11": True 803 } 804 } 805 ], 806 "revisions": { 807 "v6.0.0": True, 808 "v7.0.0": True, 809 "v6.0.5": True, 810 "v6.4.4": True, 811 "v6.4.0": True, 812 "v6.4.1": True, 813 "v6.2.0": True, 814 "v6.2.3": True, 815 "v6.2.5": True, 816 "v6.2.7": True, 817 "v6.0.11": True 818 } 819 }, 820 "interface": { 821 "type": "string", 822 "revisions": { 823 "v6.0.0": True, 824 "v7.0.0": True, 825 "v6.0.5": True, 826 "v6.4.4": True, 827 "v6.4.0": True, 828 "v6.4.1": True, 829 "v6.2.0": True, 830 "v6.2.3": True, 831 "v6.2.5": True, 832 "v6.2.7": True, 833 "v6.0.11": True 834 } 835 }, 836 "id": { 837 "type": "integer", 838 "revisions": { 839 "v6.0.0": True, 840 "v7.0.0": True, 841 "v6.0.5": True, 842 "v6.4.4": True, 843 "v6.4.0": True, 844 "v6.4.1": True, 845 "v6.2.0": True, 846 "v6.2.3": True, 847 "v6.2.5": True, 848 "v6.2.7": True, 849 "v6.0.11": True 850 } 851 } 852 }, 853 "revisions": { 854 "v6.0.0": True, 855 "v7.0.0": True, 856 "v6.0.5": True, 857 "v6.4.4": True, 858 "v6.4.0": True, 859 "v6.4.1": True, 860 "v6.2.0": True, 861 "v6.2.3": True, 862 "v6.2.5": True, 863 "v6.2.7": True, 864 "v6.0.11": True 865 } 866 }, 867 "neighbor": { 868 "type": "list", 869 "children": { 870 "interface": { 871 "type": "string", 872 "revisions": { 873 "v6.0.0": True, 874 "v7.0.0": True, 875 "v6.0.5": True, 876 "v6.4.4": True, 877 "v6.4.0": True, 878 "v6.4.1": True, 879 "v6.2.0": True, 880 "v6.2.3": True, 881 "v6.2.5": True, 882 "v6.2.7": True, 883 "v6.0.11": True 884 } 885 }, 886 "ip6": { 887 "type": "string", 888 "revisions": { 889 "v6.0.0": True, 890 "v7.0.0": True, 891 "v6.0.5": True, 892 "v6.4.4": True, 893 "v6.4.0": True, 894 "v6.4.1": True, 895 "v6.2.0": True, 896 "v6.2.3": True, 897 "v6.2.5": True, 898 "v6.2.7": True, 899 "v6.0.11": True 900 } 901 }, 902 "id": { 903 "type": "integer", 904 "revisions": { 905 "v6.0.0": True, 906 "v7.0.0": True, 907 "v6.0.5": True, 908 "v6.4.4": True, 909 "v6.4.0": True, 910 "v6.4.1": True, 911 "v6.2.0": True, 912 "v6.2.3": True, 913 "v6.2.5": True, 914 "v6.2.7": True, 915 "v6.0.11": True 916 } 917 } 918 }, 919 "revisions": { 920 "v6.0.0": True, 921 "v7.0.0": True, 922 "v6.0.5": True, 923 "v6.4.4": True, 924 "v6.4.0": True, 925 "v6.4.1": True, 926 "v6.2.0": True, 927 "v6.2.3": True, 928 "v6.2.5": True, 929 "v6.2.7": True, 930 "v6.0.11": True 931 } 932 }, 933 "default_metric": { 934 "type": "integer", 935 "revisions": { 936 "v6.0.0": True, 937 "v7.0.0": True, 938 "v6.0.5": True, 939 "v6.4.4": True, 940 "v6.4.0": True, 941 "v6.4.1": True, 942 "v6.2.0": True, 943 "v6.2.3": True, 944 "v6.2.5": True, 945 "v6.2.7": True, 946 "v6.0.11": True 947 } 948 }, 949 "garbage_timer": { 950 "type": "integer", 951 "revisions": { 952 "v6.0.0": True, 953 "v7.0.0": True, 954 "v6.0.5": True, 955 "v6.4.4": True, 956 "v6.4.0": True, 957 "v6.4.1": True, 958 "v6.2.0": True, 959 "v6.2.3": True, 960 "v6.2.5": True, 961 "v6.2.7": True, 962 "v6.0.11": True 963 } 964 }, 965 "update_timer": { 966 "type": "integer", 967 "revisions": { 968 "v6.0.0": True, 969 "v7.0.0": True, 970 "v6.0.5": True, 971 "v6.4.4": True, 972 "v6.4.0": True, 973 "v6.4.1": True, 974 "v6.2.0": True, 975 "v6.2.3": True, 976 "v6.2.5": True, 977 "v6.2.7": True, 978 "v6.0.11": True 979 } 980 }, 981 "aggregate_address": { 982 "type": "list", 983 "children": { 984 "id": { 985 "type": "integer", 986 "revisions": { 987 "v6.0.0": True, 988 "v7.0.0": True, 989 "v6.0.5": True, 990 "v6.4.4": True, 991 "v6.4.0": True, 992 "v6.4.1": True, 993 "v6.2.0": True, 994 "v6.2.3": True, 995 "v6.2.5": True, 996 "v6.2.7": True, 997 "v6.0.11": True 998 } 999 }, 1000 "prefix6": { 1001 "type": "string", 1002 "revisions": { 1003 "v6.0.0": True, 1004 "v7.0.0": True, 1005 "v6.0.5": True, 1006 "v6.4.4": True, 1007 "v6.4.0": True, 1008 "v6.4.1": True, 1009 "v6.2.0": True, 1010 "v6.2.3": True, 1011 "v6.2.5": True, 1012 "v6.2.7": True, 1013 "v6.0.11": True 1014 } 1015 } 1016 }, 1017 "revisions": { 1018 "v6.0.0": True, 1019 "v7.0.0": True, 1020 "v6.0.5": True, 1021 "v6.4.4": True, 1022 "v6.4.0": True, 1023 "v6.4.1": True, 1024 "v6.2.0": True, 1025 "v6.2.3": True, 1026 "v6.2.5": True, 1027 "v6.2.7": True, 1028 "v6.0.11": True 1029 } 1030 }, 1031 "max_out_metric": { 1032 "type": "integer", 1033 "revisions": { 1034 "v6.0.0": True, 1035 "v7.0.0": True, 1036 "v6.0.5": True, 1037 "v6.4.4": True, 1038 "v6.4.0": True, 1039 "v6.4.1": True, 1040 "v6.2.0": True, 1041 "v6.2.3": True, 1042 "v6.2.5": True, 1043 "v6.2.7": True, 1044 "v6.0.11": True 1045 } 1046 }, 1047 "network": { 1048 "type": "list", 1049 "children": { 1050 "prefix": { 1051 "type": "string", 1052 "revisions": { 1053 "v6.0.0": True, 1054 "v7.0.0": True, 1055 "v6.0.5": True, 1056 "v6.4.4": True, 1057 "v6.4.0": True, 1058 "v6.4.1": True, 1059 "v6.2.0": True, 1060 "v6.2.3": True, 1061 "v6.2.5": True, 1062 "v6.2.7": True, 1063 "v6.0.11": True 1064 } 1065 }, 1066 "id": { 1067 "type": "integer", 1068 "revisions": { 1069 "v6.0.0": True, 1070 "v7.0.0": True, 1071 "v6.0.5": True, 1072 "v6.4.4": True, 1073 "v6.4.0": True, 1074 "v6.4.1": True, 1075 "v6.2.0": True, 1076 "v6.2.3": True, 1077 "v6.2.5": True, 1078 "v6.2.7": True, 1079 "v6.0.11": True 1080 } 1081 } 1082 }, 1083 "revisions": { 1084 "v6.0.0": True, 1085 "v7.0.0": True, 1086 "v6.0.5": True, 1087 "v6.4.4": True, 1088 "v6.4.0": True, 1089 "v6.4.1": True, 1090 "v6.2.0": True, 1091 "v6.2.3": True, 1092 "v6.2.5": True, 1093 "v6.2.7": True, 1094 "v6.0.11": True 1095 } 1096 }, 1097 "default_information_originate": { 1098 "type": "string", 1099 "options": [ 1100 { 1101 "value": "enable", 1102 "revisions": { 1103 "v6.0.0": True, 1104 "v7.0.0": True, 1105 "v6.0.5": True, 1106 "v6.4.4": True, 1107 "v6.4.0": True, 1108 "v6.4.1": True, 1109 "v6.2.0": True, 1110 "v6.2.3": True, 1111 "v6.2.5": True, 1112 "v6.2.7": True, 1113 "v6.0.11": True 1114 } 1115 }, 1116 { 1117 "value": "disable", 1118 "revisions": { 1119 "v6.0.0": True, 1120 "v7.0.0": True, 1121 "v6.0.5": True, 1122 "v6.4.4": True, 1123 "v6.4.0": True, 1124 "v6.4.1": True, 1125 "v6.2.0": True, 1126 "v6.2.3": True, 1127 "v6.2.5": True, 1128 "v6.2.7": True, 1129 "v6.0.11": True 1130 } 1131 } 1132 ], 1133 "revisions": { 1134 "v6.0.0": True, 1135 "v7.0.0": True, 1136 "v6.0.5": True, 1137 "v6.4.4": True, 1138 "v6.4.0": True, 1139 "v6.4.1": True, 1140 "v6.2.0": True, 1141 "v6.2.3": True, 1142 "v6.2.5": True, 1143 "v6.2.7": True, 1144 "v6.0.11": True 1145 } 1146 }, 1147 "passive_interface": { 1148 "type": "list", 1149 "children": { 1150 "name": { 1151 "type": "string", 1152 "revisions": { 1153 "v6.0.0": True, 1154 "v7.0.0": True, 1155 "v6.0.5": True, 1156 "v6.4.4": True, 1157 "v6.4.0": True, 1158 "v6.4.1": True, 1159 "v6.2.0": True, 1160 "v6.2.3": True, 1161 "v6.2.5": True, 1162 "v6.2.7": True, 1163 "v6.0.11": True 1164 } 1165 } 1166 }, 1167 "revisions": { 1168 "v6.0.0": True, 1169 "v7.0.0": True, 1170 "v6.0.5": True, 1171 "v6.4.4": True, 1172 "v6.4.0": True, 1173 "v6.4.1": True, 1174 "v6.2.0": True, 1175 "v6.2.3": True, 1176 "v6.2.5": True, 1177 "v6.2.7": True, 1178 "v6.0.11": True 1179 } 1180 }, 1181 "interface": { 1182 "type": "list", 1183 "children": { 1184 "split_horizon_status": { 1185 "type": "string", 1186 "options": [ 1187 { 1188 "value": "enable", 1189 "revisions": { 1190 "v6.0.0": True, 1191 "v7.0.0": True, 1192 "v6.0.5": True, 1193 "v6.4.4": True, 1194 "v6.4.0": True, 1195 "v6.4.1": True, 1196 "v6.2.0": True, 1197 "v6.2.3": True, 1198 "v6.2.5": True, 1199 "v6.2.7": True, 1200 "v6.0.11": True 1201 } 1202 }, 1203 { 1204 "value": "disable", 1205 "revisions": { 1206 "v6.0.0": True, 1207 "v7.0.0": True, 1208 "v6.0.5": True, 1209 "v6.4.4": True, 1210 "v6.4.0": True, 1211 "v6.4.1": True, 1212 "v6.2.0": True, 1213 "v6.2.3": True, 1214 "v6.2.5": True, 1215 "v6.2.7": True, 1216 "v6.0.11": True 1217 } 1218 } 1219 ], 1220 "revisions": { 1221 "v6.0.0": True, 1222 "v7.0.0": True, 1223 "v6.0.5": True, 1224 "v6.4.4": True, 1225 "v6.4.0": True, 1226 "v6.4.1": True, 1227 "v6.2.0": True, 1228 "v6.2.3": True, 1229 "v6.2.5": True, 1230 "v6.2.7": True, 1231 "v6.0.11": True 1232 } 1233 }, 1234 "flags": { 1235 "type": "integer", 1236 "revisions": { 1237 "v6.0.0": True, 1238 "v7.0.0": True, 1239 "v6.0.5": True, 1240 "v6.4.4": True, 1241 "v6.4.0": True, 1242 "v6.4.1": True, 1243 "v6.2.0": True, 1244 "v6.2.3": True, 1245 "v6.2.5": True, 1246 "v6.2.7": True, 1247 "v6.0.11": True 1248 } 1249 }, 1250 "split_horizon": { 1251 "type": "string", 1252 "options": [ 1253 { 1254 "value": "poisoned", 1255 "revisions": { 1256 "v6.0.0": True, 1257 "v7.0.0": True, 1258 "v6.0.5": True, 1259 "v6.4.4": True, 1260 "v6.4.0": True, 1261 "v6.4.1": True, 1262 "v6.2.0": True, 1263 "v6.2.3": True, 1264 "v6.2.5": True, 1265 "v6.2.7": True, 1266 "v6.0.11": True 1267 } 1268 }, 1269 { 1270 "value": "regular", 1271 "revisions": { 1272 "v6.0.0": True, 1273 "v7.0.0": True, 1274 "v6.0.5": True, 1275 "v6.4.4": True, 1276 "v6.4.0": True, 1277 "v6.4.1": True, 1278 "v6.2.0": True, 1279 "v6.2.3": True, 1280 "v6.2.5": True, 1281 "v6.2.7": True, 1282 "v6.0.11": True 1283 } 1284 } 1285 ], 1286 "revisions": { 1287 "v6.0.0": True, 1288 "v7.0.0": True, 1289 "v6.0.5": True, 1290 "v6.4.4": True, 1291 "v6.4.0": True, 1292 "v6.4.1": True, 1293 "v6.2.0": True, 1294 "v6.2.3": True, 1295 "v6.2.5": True, 1296 "v6.2.7": True, 1297 "v6.0.11": True 1298 } 1299 }, 1300 "name": { 1301 "type": "string", 1302 "revisions": { 1303 "v6.0.0": True, 1304 "v7.0.0": True, 1305 "v6.0.5": True, 1306 "v6.4.4": True, 1307 "v6.4.0": True, 1308 "v6.4.1": True, 1309 "v6.2.0": True, 1310 "v6.2.3": True, 1311 "v6.2.5": True, 1312 "v6.2.7": True, 1313 "v6.0.11": True 1314 } 1315 } 1316 }, 1317 "revisions": { 1318 "v6.0.0": True, 1319 "v7.0.0": True, 1320 "v6.0.5": True, 1321 "v6.4.4": True, 1322 "v6.4.0": True, 1323 "v6.4.1": True, 1324 "v6.2.0": True, 1325 "v6.2.3": True, 1326 "v6.2.5": True, 1327 "v6.2.7": True, 1328 "v6.0.11": True 1329 } 1330 }, 1331 "timeout_timer": { 1332 "type": "integer", 1333 "revisions": { 1334 "v6.0.0": True, 1335 "v7.0.0": True, 1336 "v6.0.5": True, 1337 "v6.4.4": True, 1338 "v6.4.0": True, 1339 "v6.4.1": True, 1340 "v6.2.0": True, 1341 "v6.2.3": True, 1342 "v6.2.5": True, 1343 "v6.2.7": True, 1344 "v6.0.11": True 1345 } 1346 }, 1347 "offset_list": { 1348 "type": "list", 1349 "children": { 1350 "status": { 1351 "type": "string", 1352 "options": [ 1353 { 1354 "value": "enable", 1355 "revisions": { 1356 "v6.0.0": True, 1357 "v7.0.0": True, 1358 "v6.0.5": True, 1359 "v6.4.4": True, 1360 "v6.4.0": True, 1361 "v6.4.1": True, 1362 "v6.2.0": True, 1363 "v6.2.3": True, 1364 "v6.2.5": True, 1365 "v6.2.7": True, 1366 "v6.0.11": True 1367 } 1368 }, 1369 { 1370 "value": "disable", 1371 "revisions": { 1372 "v6.0.0": True, 1373 "v7.0.0": True, 1374 "v6.0.5": True, 1375 "v6.4.4": True, 1376 "v6.4.0": True, 1377 "v6.4.1": True, 1378 "v6.2.0": True, 1379 "v6.2.3": True, 1380 "v6.2.5": True, 1381 "v6.2.7": True, 1382 "v6.0.11": True 1383 } 1384 } 1385 ], 1386 "revisions": { 1387 "v6.0.0": True, 1388 "v7.0.0": True, 1389 "v6.0.5": True, 1390 "v6.4.4": True, 1391 "v6.4.0": True, 1392 "v6.4.1": True, 1393 "v6.2.0": True, 1394 "v6.2.3": True, 1395 "v6.2.5": True, 1396 "v6.2.7": True, 1397 "v6.0.11": True 1398 } 1399 }, 1400 "direction": { 1401 "type": "string", 1402 "options": [ 1403 { 1404 "value": "in", 1405 "revisions": { 1406 "v6.0.0": True, 1407 "v7.0.0": True, 1408 "v6.0.5": True, 1409 "v6.4.4": True, 1410 "v6.4.0": True, 1411 "v6.4.1": True, 1412 "v6.2.0": True, 1413 "v6.2.3": True, 1414 "v6.2.5": True, 1415 "v6.2.7": True, 1416 "v6.0.11": True 1417 } 1418 }, 1419 { 1420 "value": "out", 1421 "revisions": { 1422 "v6.0.0": True, 1423 "v7.0.0": True, 1424 "v6.0.5": True, 1425 "v6.4.4": True, 1426 "v6.4.0": True, 1427 "v6.4.1": True, 1428 "v6.2.0": True, 1429 "v6.2.3": True, 1430 "v6.2.5": True, 1431 "v6.2.7": True, 1432 "v6.0.11": True 1433 } 1434 } 1435 ], 1436 "revisions": { 1437 "v6.0.0": True, 1438 "v7.0.0": True, 1439 "v6.0.5": True, 1440 "v6.4.4": True, 1441 "v6.4.0": True, 1442 "v6.4.1": True, 1443 "v6.2.0": True, 1444 "v6.2.3": True, 1445 "v6.2.5": True, 1446 "v6.2.7": True, 1447 "v6.0.11": True 1448 } 1449 }, 1450 "access_list6": { 1451 "type": "string", 1452 "revisions": { 1453 "v6.0.0": True, 1454 "v7.0.0": True, 1455 "v6.0.5": True, 1456 "v6.4.4": True, 1457 "v6.4.0": True, 1458 "v6.4.1": True, 1459 "v6.2.0": True, 1460 "v6.2.3": True, 1461 "v6.2.5": True, 1462 "v6.2.7": True, 1463 "v6.0.11": True 1464 } 1465 }, 1466 "offset": { 1467 "type": "integer", 1468 "revisions": { 1469 "v6.0.0": True, 1470 "v7.0.0": True, 1471 "v6.0.5": True, 1472 "v6.4.4": True, 1473 "v6.4.0": True, 1474 "v6.4.1": True, 1475 "v6.2.0": True, 1476 "v6.2.3": True, 1477 "v6.2.5": True, 1478 "v6.2.7": True, 1479 "v6.0.11": True 1480 } 1481 }, 1482 "interface": { 1483 "type": "string", 1484 "revisions": { 1485 "v6.0.0": True, 1486 "v7.0.0": True, 1487 "v6.0.5": True, 1488 "v6.4.4": True, 1489 "v6.4.0": True, 1490 "v6.4.1": True, 1491 "v6.2.0": True, 1492 "v6.2.3": True, 1493 "v6.2.5": True, 1494 "v6.2.7": True, 1495 "v6.0.11": True 1496 } 1497 }, 1498 "id": { 1499 "type": "integer", 1500 "revisions": { 1501 "v6.0.0": True, 1502 "v7.0.0": True, 1503 "v6.0.5": True, 1504 "v6.4.4": True, 1505 "v6.4.0": True, 1506 "v6.4.1": True, 1507 "v6.2.0": True, 1508 "v6.2.3": True, 1509 "v6.2.5": True, 1510 "v6.2.7": True, 1511 "v6.0.11": True 1512 } 1513 } 1514 }, 1515 "revisions": { 1516 "v6.0.0": True, 1517 "v7.0.0": True, 1518 "v6.0.5": True, 1519 "v6.4.4": True, 1520 "v6.4.0": True, 1521 "v6.4.1": True, 1522 "v6.2.0": True, 1523 "v6.2.3": True, 1524 "v6.2.5": True, 1525 "v6.2.7": True, 1526 "v6.0.11": True 1527 } 1528 } 1529 }, 1530 "revisions": { 1531 "v6.0.0": True, 1532 "v7.0.0": True, 1533 "v6.0.5": True, 1534 "v6.4.4": True, 1535 "v6.4.0": True, 1536 "v6.4.1": True, 1537 "v6.2.0": True, 1538 "v6.2.3": True, 1539 "v6.2.5": True, 1540 "v6.2.7": True, 1541 "v6.0.11": True 1542 } 1543} 1544 1545 1546def main(): 1547 module_spec = schema_to_module_spec(versioned_schema) 1548 mkeyname = None 1549 fields = { 1550 "access_token": {"required": False, "type": "str", "no_log": True}, 1551 "enable_log": {"required": False, "type": bool}, 1552 "vdom": {"required": False, "type": "str", "default": "root"}, 1553 "router_ripng": { 1554 "required": False, "type": "dict", "default": None, 1555 "options": { 1556 } 1557 } 1558 } 1559 for attribute_name in module_spec['options']: 1560 fields["router_ripng"]['options'][attribute_name] = module_spec['options'][attribute_name] 1561 if mkeyname and mkeyname == attribute_name: 1562 fields["router_ripng"]['options'][attribute_name]['required'] = True 1563 1564 check_legacy_fortiosapi() 1565 module = AnsibleModule(argument_spec=fields, 1566 supports_check_mode=False) 1567 1568 versions_check_result = None 1569 if module._socket_path: 1570 connection = Connection(module._socket_path) 1571 if 'access_token' in module.params: 1572 connection.set_option('access_token', module.params['access_token']) 1573 1574 if 'enable_log' in module.params: 1575 connection.set_option('enable_log', module.params['enable_log']) 1576 else: 1577 connection.set_option('enable_log', False) 1578 fos = FortiOSHandler(connection, module, mkeyname) 1579 versions_check_result = check_schema_versioning(fos, versioned_schema, "router_ripng") 1580 1581 is_error, has_changed, result = fortios_router(module.params, fos) 1582 1583 else: 1584 module.fail_json(**FAIL_SOCKET_MSG) 1585 1586 if versions_check_result and versions_check_result['matched'] is False: 1587 module.warn("Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv") 1588 1589 if not is_error: 1590 if versions_check_result and versions_check_result['matched'] is False: 1591 module.exit_json(changed=has_changed, version_check_warning=versions_check_result, meta=result) 1592 else: 1593 module.exit_json(changed=has_changed, meta=result) 1594 else: 1595 if versions_check_result and versions_check_result['matched'] is False: 1596 module.fail_json(msg="Error in repo", version_check_warning=versions_check_result, meta=result) 1597 else: 1598 module.fail_json(msg="Error in repo", meta=result) 1599 1600 1601if __name__ == '__main__': 1602 main() 1603