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