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_switch_controller_remote_log
27short_description: Configure logging by FortiSwitch device to a remote syslog server 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 switch_controller feature and remote_log category.
31      Examples include all parameters and values need to be adjusted to datasources before usage.
32      Tested with FOS v6.0.0
33version_added: "2.10"
34author:
35    - Link Zheng (@chillancezen)
36    - Jie Xue (@JieX19)
37    - Hongbin Lu (@fgtdev-hblu)
38    - Frank Shen (@frankshen01)
39    - Miguel Angel Munoz (@mamunozgonzalez)
40    - Nicolas Thomas (@thomnico)
41notes:
42    - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
43
44requirements:
45    - ansible>=2.9.0
46options:
47    access_token:
48        description:
49            - Token-based authentication.
50              Generated from GUI of Fortigate.
51        type: str
52        required: false
53    enable_log:
54        description:
55            - Enable/Disable logging for task.
56        type: bool
57        required: false
58        default: false
59    vdom:
60        description:
61            - Virtual domain, among those defined previously. A vdom is a
62              virtual instance of the FortiGate that can be configured and
63              used as a different unit.
64        type: str
65        default: root
66
67    state:
68        description:
69            - Indicates whether to create or remove the object.
70        type: str
71        required: true
72        choices:
73            - present
74            - absent
75    switch_controller_remote_log:
76        description:
77            - Configure logging by FortiSwitch device to a remote syslog server.
78        default: null
79        type: dict
80        suboptions:
81            csv:
82                description:
83                    - Enable/disable comma-separated value (CSV) strings.
84                type: str
85                choices:
86                    - enable
87                    - disable
88            facility:
89                description:
90                    - Facility to log to remote syslog server.
91                type: str
92                choices:
93                    - kernel
94                    - user
95                    - mail
96                    - daemon
97                    - auth
98                    - syslog
99                    - lpr
100                    - news
101                    - uucp
102                    - cron
103                    - authpriv
104                    - ftp
105                    - ntp
106                    - audit
107                    - alert
108                    - clock
109                    - local0
110                    - local1
111                    - local2
112                    - local3
113                    - local4
114                    - local5
115                    - local6
116                    - local7
117            name:
118                description:
119                    - Remote log name.
120                required: true
121                type: str
122            port:
123                description:
124                    - Remote syslog server listening port.
125                type: int
126            server:
127                description:
128                    - IPv4 address of the remote syslog server.
129                type: str
130            severity:
131                description:
132                    - Severity of logs to be transferred to remote log server.
133                type: str
134                choices:
135                    - emergency
136                    - alert
137                    - critical
138                    - error
139                    - warning
140                    - notification
141                    - information
142                    - debug
143            status:
144                description:
145                    - Enable/disable logging by FortiSwitch device to a remote syslog server.
146                type: str
147                choices:
148                    - enable
149                    - disable
150'''
151
152EXAMPLES = '''
153- hosts: fortigates
154  collections:
155    - fortinet.fortios
156  connection: httpapi
157  vars:
158   vdom: "root"
159   ansible_httpapi_use_ssl: yes
160   ansible_httpapi_validate_certs: no
161   ansible_httpapi_port: 443
162  tasks:
163  - name: Configure logging by FortiSwitch device to a remote syslog server.
164    fortios_switch_controller_remote_log:
165      vdom:  "{{ vdom }}"
166      state: "present"
167      access_token: "<your_own_value>"
168      switch_controller_remote_log:
169        csv: "enable"
170        facility: "kernel"
171        name: "default_name_5"
172        port: "6"
173        server: "192.168.100.40"
174        severity: "emergency"
175        status: "enable"
176
177'''
178
179RETURN = '''
180build:
181  description: Build number of the fortigate image
182  returned: always
183  type: str
184  sample: '1547'
185http_method:
186  description: Last method used to provision the content into FortiGate
187  returned: always
188  type: str
189  sample: 'PUT'
190http_status:
191  description: Last result given by FortiGate on last operation applied
192  returned: always
193  type: str
194  sample: "200"
195mkey:
196  description: Master key (id) used in the last call to FortiGate
197  returned: success
198  type: str
199  sample: "id"
200name:
201  description: Name of the table used to fulfill the request
202  returned: always
203  type: str
204  sample: "urlfilter"
205path:
206  description: Path of the table used to fulfill the request
207  returned: always
208  type: str
209  sample: "webfilter"
210revision:
211  description: Internal revision number
212  returned: always
213  type: str
214  sample: "17.0.2.10658"
215serial:
216  description: Serial number of the unit
217  returned: always
218  type: str
219  sample: "FGVMEVYYQT3AB5352"
220status:
221  description: Indication of the operation's result
222  returned: always
223  type: str
224  sample: "success"
225vdom:
226  description: Virtual domain used
227  returned: always
228  type: str
229  sample: "root"
230version:
231  description: Version of the FortiGate
232  returned: always
233  type: str
234  sample: "v5.6.3"
235
236'''
237from ansible.module_utils.basic import AnsibleModule
238from ansible.module_utils.connection import Connection
239from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import FortiOSHandler
240from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_legacy_fortiosapi
241from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import schema_to_module_spec
242from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_schema_versioning
243from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import FAIL_SOCKET_MSG
244from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import is_same_comparison
245from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import serialize
246
247
248def filter_switch_controller_remote_log_data(json):
249    option_list = ['csv', 'facility', 'name',
250                   'port', 'server', 'severity',
251                   'status']
252    dictionary = {}
253
254    for attribute in option_list:
255        if attribute in json and json[attribute] is not None:
256            dictionary[attribute] = json[attribute]
257
258    return dictionary
259
260
261def underscore_to_hyphen(data):
262    if isinstance(data, list):
263        for i, elem in enumerate(data):
264            data[i] = underscore_to_hyphen(elem)
265    elif isinstance(data, dict):
266        new_data = {}
267        for k, v in data.items():
268            new_data[k.replace('_', '-')] = underscore_to_hyphen(v)
269        data = new_data
270
271    return data
272
273
274def switch_controller_remote_log(data, fos, check_mode=False):
275
276    vdom = data['vdom']
277
278    state = data['state']
279
280    switch_controller_remote_log_data = data['switch_controller_remote_log']
281    filtered_data = underscore_to_hyphen(filter_switch_controller_remote_log_data(switch_controller_remote_log_data))
282
283    # check_mode starts from here
284    if check_mode:
285        mkey = fos.get_mkey('system', 'interface', filtered_data, vdom=vdom)
286        current_data = fos.get('system', 'interface', vdom=vdom, mkey=mkey)
287        is_existed = current_data and current_data.get('http_status') == 200 \
288            and isinstance(current_data.get('results'), list) \
289            and len(current_data['results']) > 0
290
291        # 2. if it exists and the state is 'present' then compare current settings with desired
292        if state == 'present' or state is True:
293            if mkey is None:
294                return False, True, filtered_data
295
296            # if mkey exists then compare each other
297            # record exits and they're matched or not
298            if is_existed:
299                is_same = is_same_comparison(
300                    serialize(current_data['results'][0]), serialize(filtered_data))
301                return False, not is_same, filtered_data
302
303            # record does not exist
304            return False, True, filtered_data
305
306        if state == 'absent':
307            if mkey is None:
308                return False, False, filtered_data
309
310            if is_existed:
311                return False, True, filtered_data
312            return False, False, filtered_data
313
314        return True, False, {'reason: ': 'Must provide state parameter'}
315
316    if state == "present" or state is True:
317        return fos.set('switch-controller',
318                       'remote-log',
319                       data=filtered_data,
320                       vdom=vdom)
321
322    elif state == "absent":
323        return fos.delete('switch-controller',
324                          'remote-log',
325                          mkey=filtered_data['name'],
326                          vdom=vdom)
327    else:
328        fos._module.fail_json(msg='state must be present or absent!')
329
330
331def is_successful_status(status):
332    return status['status'] == "success" or \
333        status['http_method'] == "DELETE" and status['http_status'] == 404
334
335
336def fortios_switch_controller(data, fos, check_mode):
337
338    if data['switch_controller_remote_log']:
339        resp = switch_controller_remote_log(data, fos, check_mode)
340    else:
341        fos._module.fail_json(msg='missing task body: %s' % ('switch_controller_remote_log'))
342    if check_mode:
343        return resp
344    return not is_successful_status(resp), \
345        resp['status'] == "success" and \
346        (resp['revision_changed'] if 'revision_changed' in resp else True), \
347        resp
348
349
350versioned_schema = {
351    "type": "list",
352    "children": {
353        "status": {
354            "type": "string",
355            "options": [
356                {
357                    "value": "enable",
358                    "revisions": {
359                        "v7.0.0": True,
360                        "v6.4.4": True,
361                        "v6.4.0": True,
362                        "v6.4.1": True,
363                        "v6.2.0": True,
364                        "v6.2.3": True,
365                        "v6.2.5": True,
366                        "v6.2.7": True
367                    }
368                },
369                {
370                    "value": "disable",
371                    "revisions": {
372                        "v7.0.0": True,
373                        "v6.4.4": True,
374                        "v6.4.0": True,
375                        "v6.4.1": True,
376                        "v6.2.0": True,
377                        "v6.2.3": True,
378                        "v6.2.5": True,
379                        "v6.2.7": True
380                    }
381                }
382            ],
383            "revisions": {
384                "v7.0.0": True,
385                "v6.4.4": True,
386                "v6.4.0": True,
387                "v6.4.1": True,
388                "v6.2.0": True,
389                "v6.2.3": True,
390                "v6.2.5": True,
391                "v6.2.7": True
392            }
393        },
394        "severity": {
395            "type": "string",
396            "options": [
397                {
398                    "value": "emergency",
399                    "revisions": {
400                        "v7.0.0": True,
401                        "v6.4.4": True,
402                        "v6.4.0": True,
403                        "v6.4.1": True,
404                        "v6.2.0": True,
405                        "v6.2.3": True,
406                        "v6.2.5": True,
407                        "v6.2.7": True
408                    }
409                },
410                {
411                    "value": "alert",
412                    "revisions": {
413                        "v7.0.0": True,
414                        "v6.4.4": True,
415                        "v6.4.0": True,
416                        "v6.4.1": True,
417                        "v6.2.0": True,
418                        "v6.2.3": True,
419                        "v6.2.5": True,
420                        "v6.2.7": True
421                    }
422                },
423                {
424                    "value": "critical",
425                    "revisions": {
426                        "v7.0.0": True,
427                        "v6.4.4": True,
428                        "v6.4.0": True,
429                        "v6.4.1": True,
430                        "v6.2.0": True,
431                        "v6.2.3": True,
432                        "v6.2.5": True,
433                        "v6.2.7": True
434                    }
435                },
436                {
437                    "value": "error",
438                    "revisions": {
439                        "v7.0.0": True,
440                        "v6.4.4": True,
441                        "v6.4.0": True,
442                        "v6.4.1": True,
443                        "v6.2.0": True,
444                        "v6.2.3": True,
445                        "v6.2.5": True,
446                        "v6.2.7": True
447                    }
448                },
449                {
450                    "value": "warning",
451                    "revisions": {
452                        "v7.0.0": True,
453                        "v6.4.4": True,
454                        "v6.4.0": True,
455                        "v6.4.1": True,
456                        "v6.2.0": True,
457                        "v6.2.3": True,
458                        "v6.2.5": True,
459                        "v6.2.7": True
460                    }
461                },
462                {
463                    "value": "notification",
464                    "revisions": {
465                        "v7.0.0": True,
466                        "v6.4.4": True,
467                        "v6.4.0": True,
468                        "v6.4.1": True,
469                        "v6.2.0": True,
470                        "v6.2.3": True,
471                        "v6.2.5": True,
472                        "v6.2.7": True
473                    }
474                },
475                {
476                    "value": "information",
477                    "revisions": {
478                        "v7.0.0": True,
479                        "v6.4.4": True,
480                        "v6.4.0": True,
481                        "v6.4.1": True,
482                        "v6.2.0": True,
483                        "v6.2.3": True,
484                        "v6.2.5": True,
485                        "v6.2.7": True
486                    }
487                },
488                {
489                    "value": "debug",
490                    "revisions": {
491                        "v7.0.0": True,
492                        "v6.4.4": True,
493                        "v6.4.0": True,
494                        "v6.4.1": True,
495                        "v6.2.0": True,
496                        "v6.2.3": True,
497                        "v6.2.5": True,
498                        "v6.2.7": True
499                    }
500                }
501            ],
502            "revisions": {
503                "v7.0.0": True,
504                "v6.4.4": True,
505                "v6.4.0": True,
506                "v6.4.1": True,
507                "v6.2.0": True,
508                "v6.2.3": True,
509                "v6.2.5": True,
510                "v6.2.7": True
511            }
512        },
513        "facility": {
514            "type": "string",
515            "options": [
516                {
517                    "value": "kernel",
518                    "revisions": {
519                        "v7.0.0": True,
520                        "v6.4.4": True,
521                        "v6.4.0": True,
522                        "v6.4.1": True,
523                        "v6.2.0": True,
524                        "v6.2.3": True,
525                        "v6.2.5": True,
526                        "v6.2.7": True
527                    }
528                },
529                {
530                    "value": "user",
531                    "revisions": {
532                        "v7.0.0": True,
533                        "v6.4.4": True,
534                        "v6.4.0": True,
535                        "v6.4.1": True,
536                        "v6.2.0": True,
537                        "v6.2.3": True,
538                        "v6.2.5": True,
539                        "v6.2.7": True
540                    }
541                },
542                {
543                    "value": "mail",
544                    "revisions": {
545                        "v7.0.0": True,
546                        "v6.4.4": True,
547                        "v6.4.0": True,
548                        "v6.4.1": True,
549                        "v6.2.0": True,
550                        "v6.2.3": True,
551                        "v6.2.5": True,
552                        "v6.2.7": True
553                    }
554                },
555                {
556                    "value": "daemon",
557                    "revisions": {
558                        "v7.0.0": True,
559                        "v6.4.4": True,
560                        "v6.4.0": True,
561                        "v6.4.1": True,
562                        "v6.2.0": True,
563                        "v6.2.3": True,
564                        "v6.2.5": True,
565                        "v6.2.7": True
566                    }
567                },
568                {
569                    "value": "auth",
570                    "revisions": {
571                        "v7.0.0": True,
572                        "v6.4.4": True,
573                        "v6.4.0": True,
574                        "v6.4.1": True,
575                        "v6.2.0": True,
576                        "v6.2.3": True,
577                        "v6.2.5": True,
578                        "v6.2.7": True
579                    }
580                },
581                {
582                    "value": "syslog",
583                    "revisions": {
584                        "v7.0.0": True,
585                        "v6.4.4": True,
586                        "v6.4.0": True,
587                        "v6.4.1": True,
588                        "v6.2.0": True,
589                        "v6.2.3": True,
590                        "v6.2.5": True,
591                        "v6.2.7": True
592                    }
593                },
594                {
595                    "value": "lpr",
596                    "revisions": {
597                        "v7.0.0": True,
598                        "v6.4.4": True,
599                        "v6.4.0": True,
600                        "v6.4.1": True,
601                        "v6.2.0": True,
602                        "v6.2.3": True,
603                        "v6.2.5": True,
604                        "v6.2.7": True
605                    }
606                },
607                {
608                    "value": "news",
609                    "revisions": {
610                        "v7.0.0": True,
611                        "v6.4.4": True,
612                        "v6.4.0": True,
613                        "v6.4.1": True,
614                        "v6.2.0": True,
615                        "v6.2.3": True,
616                        "v6.2.5": True,
617                        "v6.2.7": True
618                    }
619                },
620                {
621                    "value": "uucp",
622                    "revisions": {
623                        "v7.0.0": True,
624                        "v6.4.4": True,
625                        "v6.4.0": True,
626                        "v6.4.1": True,
627                        "v6.2.0": True,
628                        "v6.2.3": True,
629                        "v6.2.5": True,
630                        "v6.2.7": True
631                    }
632                },
633                {
634                    "value": "cron",
635                    "revisions": {
636                        "v7.0.0": True,
637                        "v6.4.4": True,
638                        "v6.4.0": True,
639                        "v6.4.1": True,
640                        "v6.2.0": True,
641                        "v6.2.3": True,
642                        "v6.2.5": True,
643                        "v6.2.7": True
644                    }
645                },
646                {
647                    "value": "authpriv",
648                    "revisions": {
649                        "v7.0.0": True,
650                        "v6.4.4": True,
651                        "v6.4.0": True,
652                        "v6.4.1": True,
653                        "v6.2.0": True,
654                        "v6.2.3": True,
655                        "v6.2.5": True,
656                        "v6.2.7": True
657                    }
658                },
659                {
660                    "value": "ftp",
661                    "revisions": {
662                        "v7.0.0": True,
663                        "v6.4.4": True,
664                        "v6.4.0": True,
665                        "v6.4.1": True,
666                        "v6.2.0": True,
667                        "v6.2.3": True,
668                        "v6.2.5": True,
669                        "v6.2.7": True
670                    }
671                },
672                {
673                    "value": "ntp",
674                    "revisions": {
675                        "v7.0.0": 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                    }
684                },
685                {
686                    "value": "audit",
687                    "revisions": {
688                        "v7.0.0": True,
689                        "v6.4.4": True,
690                        "v6.4.0": True,
691                        "v6.4.1": True,
692                        "v6.2.0": True,
693                        "v6.2.3": True,
694                        "v6.2.5": True,
695                        "v6.2.7": True
696                    }
697                },
698                {
699                    "value": "alert",
700                    "revisions": {
701                        "v7.0.0": True,
702                        "v6.4.4": True,
703                        "v6.4.0": True,
704                        "v6.4.1": True,
705                        "v6.2.0": True,
706                        "v6.2.3": True,
707                        "v6.2.5": True,
708                        "v6.2.7": True
709                    }
710                },
711                {
712                    "value": "clock",
713                    "revisions": {
714                        "v7.0.0": True,
715                        "v6.4.4": True,
716                        "v6.4.0": True,
717                        "v6.4.1": True,
718                        "v6.2.0": True,
719                        "v6.2.3": True,
720                        "v6.2.5": True,
721                        "v6.2.7": True
722                    }
723                },
724                {
725                    "value": "local0",
726                    "revisions": {
727                        "v7.0.0": True,
728                        "v6.4.4": True,
729                        "v6.4.0": True,
730                        "v6.4.1": True,
731                        "v6.2.0": True,
732                        "v6.2.3": True,
733                        "v6.2.5": True,
734                        "v6.2.7": True
735                    }
736                },
737                {
738                    "value": "local1",
739                    "revisions": {
740                        "v7.0.0": True,
741                        "v6.4.4": True,
742                        "v6.4.0": True,
743                        "v6.4.1": True,
744                        "v6.2.0": True,
745                        "v6.2.3": True,
746                        "v6.2.5": True,
747                        "v6.2.7": True
748                    }
749                },
750                {
751                    "value": "local2",
752                    "revisions": {
753                        "v7.0.0": True,
754                        "v6.4.4": True,
755                        "v6.4.0": True,
756                        "v6.4.1": True,
757                        "v6.2.0": True,
758                        "v6.2.3": True,
759                        "v6.2.5": True,
760                        "v6.2.7": True
761                    }
762                },
763                {
764                    "value": "local3",
765                    "revisions": {
766                        "v7.0.0": True,
767                        "v6.4.4": True,
768                        "v6.4.0": True,
769                        "v6.4.1": True,
770                        "v6.2.0": True,
771                        "v6.2.3": True,
772                        "v6.2.5": True,
773                        "v6.2.7": True
774                    }
775                },
776                {
777                    "value": "local4",
778                    "revisions": {
779                        "v7.0.0": True,
780                        "v6.4.4": True,
781                        "v6.4.0": True,
782                        "v6.4.1": True,
783                        "v6.2.0": True,
784                        "v6.2.3": True,
785                        "v6.2.5": True,
786                        "v6.2.7": True
787                    }
788                },
789                {
790                    "value": "local5",
791                    "revisions": {
792                        "v7.0.0": True,
793                        "v6.4.4": True,
794                        "v6.4.0": True,
795                        "v6.4.1": True,
796                        "v6.2.0": True,
797                        "v6.2.3": True,
798                        "v6.2.5": True,
799                        "v6.2.7": True
800                    }
801                },
802                {
803                    "value": "local6",
804                    "revisions": {
805                        "v7.0.0": True,
806                        "v6.4.4": True,
807                        "v6.4.0": True,
808                        "v6.4.1": True,
809                        "v6.2.0": True,
810                        "v6.2.3": True,
811                        "v6.2.5": True,
812                        "v6.2.7": True
813                    }
814                },
815                {
816                    "value": "local7",
817                    "revisions": {
818                        "v7.0.0": True,
819                        "v6.4.4": True,
820                        "v6.4.0": True,
821                        "v6.4.1": True,
822                        "v6.2.0": True,
823                        "v6.2.3": True,
824                        "v6.2.5": True,
825                        "v6.2.7": True
826                    }
827                }
828            ],
829            "revisions": {
830                "v7.0.0": True,
831                "v6.4.4": True,
832                "v6.4.0": True,
833                "v6.4.1": True,
834                "v6.2.0": True,
835                "v6.2.3": True,
836                "v6.2.5": True,
837                "v6.2.7": True
838            }
839        },
840        "server": {
841            "type": "string",
842            "revisions": {
843                "v7.0.0": True,
844                "v6.4.4": True,
845                "v6.4.0": True,
846                "v6.4.1": True,
847                "v6.2.0": True,
848                "v6.2.3": True,
849                "v6.2.5": True,
850                "v6.2.7": True
851            }
852        },
853        "csv": {
854            "type": "string",
855            "options": [
856                {
857                    "value": "enable",
858                    "revisions": {
859                        "v7.0.0": True,
860                        "v6.4.4": True,
861                        "v6.4.0": True,
862                        "v6.4.1": True,
863                        "v6.2.0": True,
864                        "v6.2.3": True,
865                        "v6.2.5": True,
866                        "v6.2.7": True
867                    }
868                },
869                {
870                    "value": "disable",
871                    "revisions": {
872                        "v7.0.0": True,
873                        "v6.4.4": True,
874                        "v6.4.0": True,
875                        "v6.4.1": True,
876                        "v6.2.0": True,
877                        "v6.2.3": True,
878                        "v6.2.5": True,
879                        "v6.2.7": True
880                    }
881                }
882            ],
883            "revisions": {
884                "v7.0.0": True,
885                "v6.4.4": True,
886                "v6.4.0": True,
887                "v6.4.1": True,
888                "v6.2.0": True,
889                "v6.2.3": True,
890                "v6.2.5": True,
891                "v6.2.7": True
892            }
893        },
894        "port": {
895            "type": "integer",
896            "revisions": {
897                "v7.0.0": True,
898                "v6.4.4": True,
899                "v6.4.0": True,
900                "v6.4.1": True,
901                "v6.2.0": True,
902                "v6.2.3": True,
903                "v6.2.5": True,
904                "v6.2.7": True
905            }
906        },
907        "name": {
908            "type": "string",
909            "revisions": {
910                "v7.0.0": True,
911                "v6.4.4": True,
912                "v6.4.0": True,
913                "v6.4.1": True,
914                "v6.2.0": True,
915                "v6.2.3": True,
916                "v6.2.5": True,
917                "v6.2.7": True
918            }
919        }
920    },
921    "revisions": {
922        "v7.0.0": 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    }
931}
932
933
934def main():
935    module_spec = schema_to_module_spec(versioned_schema)
936    mkeyname = 'name'
937    fields = {
938        "access_token": {"required": False, "type": "str", "no_log": True},
939        "enable_log": {"required": False, "type": bool},
940        "vdom": {"required": False, "type": "str", "default": "root"},
941        "state": {"required": True, "type": "str",
942                  "choices": ["present", "absent"]},
943        "switch_controller_remote_log": {
944            "required": False, "type": "dict", "default": None,
945            "options": {
946            }
947        }
948    }
949    for attribute_name in module_spec['options']:
950        fields["switch_controller_remote_log"]['options'][attribute_name] = module_spec['options'][attribute_name]
951        if mkeyname and mkeyname == attribute_name:
952            fields["switch_controller_remote_log"]['options'][attribute_name]['required'] = True
953
954    check_legacy_fortiosapi()
955    module = AnsibleModule(argument_spec=fields,
956                           supports_check_mode=True)
957
958    versions_check_result = None
959    if module._socket_path:
960        connection = Connection(module._socket_path)
961        if 'access_token' in module.params:
962            connection.set_option('access_token', module.params['access_token'])
963
964        if 'enable_log' in module.params:
965            connection.set_option('enable_log', module.params['enable_log'])
966        else:
967            connection.set_option('enable_log', False)
968        fos = FortiOSHandler(connection, module, mkeyname)
969        versions_check_result = check_schema_versioning(fos, versioned_schema, "switch_controller_remote_log")
970
971        is_error, has_changed, result = fortios_switch_controller(module.params, fos, module.check_mode)
972
973    else:
974        module.fail_json(**FAIL_SOCKET_MSG)
975
976    if versions_check_result and versions_check_result['matched'] is False:
977        module.warn("Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv")
978
979    if not is_error:
980        if versions_check_result and versions_check_result['matched'] is False:
981            module.exit_json(changed=has_changed, version_check_warning=versions_check_result, meta=result)
982        else:
983            module.exit_json(changed=has_changed, meta=result)
984    else:
985        if versions_check_result and versions_check_result['matched'] is False:
986            module.fail_json(msg="Error in repo", version_check_warning=versions_check_result, meta=result)
987        else:
988            module.fail_json(msg="Error in repo", meta=result)
989
990
991if __name__ == '__main__':
992    main()
993