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_system_modem
27short_description: Configure MODEM 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 system feature and modem 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    system_modem:
68        description:
69            - Configure MODEM.
70        default: null
71        type: dict
72        suboptions:
73            action:
74                description:
75                    - Dial up/stop MODEM.
76                type: str
77                choices:
78                    - dial
79                    - stop
80                    - none
81            altmode:
82                description:
83                    - Enable/disable altmode for installations using PPP in China.
84                type: str
85                choices:
86                    - enable
87                    - disable
88            authtype1:
89                description:
90                    - Allowed authentication types for ISP 1.
91                type: list
92                choices:
93                    - pap
94                    - chap
95                    - mschap
96                    - mschapv2
97            authtype2:
98                description:
99                    - Allowed authentication types for ISP 2.
100                type: list
101                choices:
102                    - pap
103                    - chap
104                    - mschap
105                    - mschapv2
106            authtype3:
107                description:
108                    - Allowed authentication types for ISP 3.
109                type: list
110                choices:
111                    - pap
112                    - chap
113                    - mschap
114                    - mschapv2
115            auto_dial:
116                description:
117                    - Enable/disable auto-dial after a reboot or disconnection.
118                type: str
119                choices:
120                    - enable
121                    - disable
122            connect_timeout:
123                description:
124                    - Connection completion timeout (30 - 255 sec).
125                type: int
126            dial_cmd1:
127                description:
128                    - Dial command (this is often an ATD or ATDT command).
129                type: str
130            dial_cmd2:
131                description:
132                    - Dial command (this is often an ATD or ATDT command).
133                type: str
134            dial_cmd3:
135                description:
136                    - Dial command (this is often an ATD or ATDT command).
137                type: str
138            dial_on_demand:
139                description:
140                    - Enable/disable to dial the modem when packets are routed to the modem interface.
141                type: str
142                choices:
143                    - enable
144                    - disable
145            distance:
146                description:
147                    - Distance of learned routes (1 - 255).
148                type: int
149            dont_send_CR1:
150                description:
151                    - Do not send CR when connected (ISP1).
152                type: str
153                choices:
154                    - enable
155                    - disable
156            dont_send_CR2:
157                description:
158                    - Do not send CR when connected (ISP2).
159                type: str
160                choices:
161                    - enable
162                    - disable
163            dont_send_CR3:
164                description:
165                    - Do not send CR when connected (ISP3).
166                type: str
167                choices:
168                    - enable
169                    - disable
170            extra_init1:
171                description:
172                    - Extra initialization string to ISP 1.
173                type: str
174            extra_init2:
175                description:
176                    - Extra initialization string to ISP 2.
177                type: str
178            extra_init3:
179                description:
180                    - Extra initialization string to ISP 3.
181                type: str
182            holddown_timer:
183                description:
184                    - Hold down timer in seconds (1 - 60 sec).
185                type: int
186            idle_timer:
187                description:
188                    - MODEM connection idle time (1 - 9999 min).
189                type: int
190            interface:
191                description:
192                    - Name of redundant interface. Source system.interface.name.
193                type: str
194            lockdown_lac:
195                description:
196                    - Allow connection only to the specified Location Area Code (LAC).
197                type: str
198            mode:
199                description:
200                    - Set MODEM operation mode to redundant or standalone.
201                type: str
202                choices:
203                    - standalone
204                    - redundant
205            network_init:
206                description:
207                    - AT command to set the Network name/type (AT+COPS=<mode>,[<format>,<oper>[,<AcT>]]).
208                type: str
209            passwd1:
210                description:
211                    - Password to access the specified dialup account.
212                type: str
213            passwd2:
214                description:
215                    - Password to access the specified dialup account.
216                type: str
217            passwd3:
218                description:
219                    - Password to access the specified dialup account.
220                type: str
221            peer_modem1:
222                description:
223                    - Specify peer MODEM type for phone1.
224                type: str
225                choices:
226                    - generic
227                    - actiontec
228                    - ascend_TNT
229            peer_modem2:
230                description:
231                    - Specify peer MODEM type for phone2.
232                type: str
233                choices:
234                    - generic
235                    - actiontec
236                    - ascend_TNT
237            peer_modem3:
238                description:
239                    - Specify peer MODEM type for phone3.
240                type: str
241                choices:
242                    - generic
243                    - actiontec
244                    - ascend_TNT
245            phone1:
246                description:
247                    - Phone number to connect to the dialup account (must not contain spaces, and should include standard special characters).
248                type: str
249            phone2:
250                description:
251                    - Phone number to connect to the dialup account (must not contain spaces, and should include standard special characters).
252                type: str
253            phone3:
254                description:
255                    - Phone number to connect to the dialup account (must not contain spaces, and should include standard special characters).
256                type: str
257            pin_init:
258                description:
259                    - AT command to set the PIN (AT+PIN=<pin>).
260                type: str
261            ppp_echo_request1:
262                description:
263                    - Enable/disable PPP echo-request to ISP 1.
264                type: str
265                choices:
266                    - enable
267                    - disable
268            ppp_echo_request2:
269                description:
270                    - Enable/disable PPP echo-request to ISP 2.
271                type: str
272                choices:
273                    - enable
274                    - disable
275            ppp_echo_request3:
276                description:
277                    - Enable/disable PPP echo-request to ISP 3.
278                type: str
279                choices:
280                    - enable
281                    - disable
282            priority:
283                description:
284                    - Priority of learned routes (0 - 4294967295).
285                type: int
286            redial:
287                description:
288                    - Redial limit (1 - 10 attempts, none = redial forever).
289                type: str
290                choices:
291                    - none
292                    - 1
293                    - 2
294                    - 3
295                    - 4
296                    - 5
297                    - 6
298                    - 7
299                    - 8
300                    - 9
301                    - 10
302            reset:
303                description:
304                    - Number of dial attempts before resetting modem (0 = never reset).
305                type: int
306            status:
307                description:
308                    - Enable/disable Modem support (equivalent to bringing an interface up or down).
309                type: str
310                choices:
311                    - enable
312                    - disable
313            traffic_check:
314                description:
315                    - Enable/disable traffic-check.
316                type: str
317                choices:
318                    - enable
319                    - disable
320            username1:
321                description:
322                    - User name to access the specified dialup account.
323                type: str
324            username2:
325                description:
326                    - User name to access the specified dialup account.
327                type: str
328            username3:
329                description:
330                    - User name to access the specified dialup account.
331                type: str
332            wireless_port:
333                description:
334                    - Enter wireless port number, 0 for default, 1 for first port, ... (0 - 4294967295)
335                type: int
336'''
337
338EXAMPLES = '''
339- hosts: fortigates
340  collections:
341    - fortinet.fortios
342  connection: httpapi
343  vars:
344   vdom: "root"
345   ansible_httpapi_use_ssl: yes
346   ansible_httpapi_validate_certs: no
347   ansible_httpapi_port: 443
348  tasks:
349  - name: Configure MODEM.
350    fortios_system_modem:
351      vdom:  "{{ vdom }}"
352      system_modem:
353        action: "dial"
354        altmode: "enable"
355        authtype1: "pap"
356        authtype2: "pap"
357        authtype3: "pap"
358        auto_dial: "enable"
359        connect_timeout: "9"
360        dial_cmd1: "<your_own_value>"
361        dial_cmd2: "<your_own_value>"
362        dial_cmd3: "<your_own_value>"
363        dial_on_demand: "enable"
364        distance: "14"
365        dont_send_CR1: "enable"
366        dont_send_CR2: "enable"
367        dont_send_CR3: "enable"
368        extra_init1: "<your_own_value>"
369        extra_init2: "<your_own_value>"
370        extra_init3: "<your_own_value>"
371        holddown_timer: "21"
372        idle_timer: "22"
373        interface: "<your_own_value> (source system.interface.name)"
374        lockdown_lac: "<your_own_value>"
375        mode: "standalone"
376        network_init: "<your_own_value>"
377        passwd1: "<your_own_value>"
378        passwd2: "<your_own_value>"
379        passwd3: "<your_own_value>"
380        peer_modem1: "generic"
381        peer_modem2: "generic"
382        peer_modem3: "generic"
383        phone1: "<your_own_value>"
384        phone2: "<your_own_value>"
385        phone3: "<your_own_value>"
386        pin_init: "<your_own_value>"
387        ppp_echo_request1: "enable"
388        ppp_echo_request2: "enable"
389        ppp_echo_request3: "enable"
390        priority: "40"
391        redial: "none"
392        reset: "42"
393        status: "enable"
394        traffic_check: "enable"
395        username1: "<your_own_value>"
396        username2: "<your_own_value>"
397        username3: "<your_own_value>"
398        wireless_port: "48"
399
400'''
401
402RETURN = '''
403build:
404  description: Build number of the fortigate image
405  returned: always
406  type: str
407  sample: '1547'
408http_method:
409  description: Last method used to provision the content into FortiGate
410  returned: always
411  type: str
412  sample: 'PUT'
413http_status:
414  description: Last result given by FortiGate on last operation applied
415  returned: always
416  type: str
417  sample: "200"
418mkey:
419  description: Master key (id) used in the last call to FortiGate
420  returned: success
421  type: str
422  sample: "id"
423name:
424  description: Name of the table used to fulfill the request
425  returned: always
426  type: str
427  sample: "urlfilter"
428path:
429  description: Path of the table used to fulfill the request
430  returned: always
431  type: str
432  sample: "webfilter"
433revision:
434  description: Internal revision number
435  returned: always
436  type: str
437  sample: "17.0.2.10658"
438serial:
439  description: Serial number of the unit
440  returned: always
441  type: str
442  sample: "FGVMEVYYQT3AB5352"
443status:
444  description: Indication of the operation's result
445  returned: always
446  type: str
447  sample: "success"
448vdom:
449  description: Virtual domain used
450  returned: always
451  type: str
452  sample: "root"
453version:
454  description: Version of the FortiGate
455  returned: always
456  type: str
457  sample: "v5.6.3"
458
459'''
460from ansible.module_utils.basic import AnsibleModule
461from ansible.module_utils.connection import Connection
462from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import FortiOSHandler
463from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_legacy_fortiosapi
464from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import schema_to_module_spec
465from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_schema_versioning
466from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import FAIL_SOCKET_MSG
467from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import is_same_comparison
468from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import serialize
469
470
471def filter_system_modem_data(json):
472    option_list = ['action', 'altmode', 'authtype1',
473                   'authtype2', 'authtype3', 'auto_dial',
474                   'connect_timeout', 'dial_cmd1', 'dial_cmd2',
475                   'dial_cmd3', 'dial_on_demand', 'distance',
476                   'dont_send_CR1', 'dont_send_CR2', 'dont_send_CR3',
477                   'extra_init1', 'extra_init2', 'extra_init3',
478                   'holddown_timer', 'idle_timer', 'interface',
479                   'lockdown_lac', 'mode', 'network_init',
480                   'passwd1', 'passwd2', 'passwd3',
481                   'peer_modem1', 'peer_modem2', 'peer_modem3',
482                   'phone1', 'phone2', 'phone3',
483                   'pin_init', 'ppp_echo_request1', 'ppp_echo_request2',
484                   'ppp_echo_request3', 'priority', 'redial',
485                   'reset', 'status', 'traffic_check',
486                   'username1', 'username2', 'username3',
487                   'wireless_port']
488    dictionary = {}
489
490    for attribute in option_list:
491        if attribute in json and json[attribute] is not None:
492            dictionary[attribute] = json[attribute]
493
494    return dictionary
495
496
497def flatten_single_path(data, path, index):
498    if not data or index == len(path) or path[index] not in data or not data[path[index]]:
499        return
500
501    if index == len(path) - 1:
502        data[path[index]] = ' '.join(str(elem) for elem in data[path[index]])
503    elif isinstance(data[path[index]], list):
504        for value in data[path[index]]:
505            flatten_single_path(value, path, index + 1)
506    else:
507        flatten_single_path(data[path[index]], path, index + 1)
508
509
510def flatten_multilists_attributes(data):
511    multilist_attrs = [[u'authtype3'], [u'authtype2'], [u'authtype1']]
512
513    for attr in multilist_attrs:
514        flatten_single_path(data, attr, 0)
515
516    return data
517
518
519def underscore_to_hyphen(data):
520    if isinstance(data, list):
521        for i, elem in enumerate(data):
522            data[i] = underscore_to_hyphen(elem)
523    elif isinstance(data, dict):
524        new_data = {}
525        for k, v in data.items():
526            new_data[k.replace('_', '-')] = underscore_to_hyphen(v)
527        data = new_data
528
529    return data
530
531
532def system_modem(data, fos):
533    vdom = data['vdom']
534    system_modem_data = data['system_modem']
535    system_modem_data = flatten_multilists_attributes(system_modem_data)
536    filtered_data = underscore_to_hyphen(filter_system_modem_data(system_modem_data))
537
538    return fos.set('system',
539                   'modem',
540                   data=filtered_data,
541                   vdom=vdom)
542
543
544def is_successful_status(status):
545    return status['status'] == "success" or \
546        status['http_method'] == "DELETE" and status['http_status'] == 404
547
548
549def fortios_system(data, fos):
550
551    if data['system_modem']:
552        resp = system_modem(data, fos)
553    else:
554        fos._module.fail_json(msg='missing task body: %s' % ('system_modem'))
555
556    return not is_successful_status(resp), \
557        resp['status'] == "success" and \
558        (resp['revision_changed'] if 'revision_changed' in resp else True), \
559        resp
560
561
562versioned_schema = {
563    "type": "dict",
564    "children": {
565        "status": {
566            "type": "string",
567            "options": [
568                {
569                    "value": "enable",
570                    "revisions": {
571                        "v6.0.0": True,
572                        "v7.0.0": True,
573                        "v6.0.5": True,
574                        "v6.4.4": True,
575                        "v6.4.0": True,
576                        "v6.4.1": True,
577                        "v6.2.0": True,
578                        "v6.2.3": True,
579                        "v6.2.5": True,
580                        "v6.2.7": True,
581                        "v6.0.11": True
582                    }
583                },
584                {
585                    "value": "disable",
586                    "revisions": {
587                        "v6.0.0": True,
588                        "v7.0.0": True,
589                        "v6.0.5": True,
590                        "v6.4.4": True,
591                        "v6.4.0": True,
592                        "v6.4.1": True,
593                        "v6.2.0": True,
594                        "v6.2.3": True,
595                        "v6.2.5": True,
596                        "v6.2.7": True,
597                        "v6.0.11": True
598                    }
599                }
600            ],
601            "revisions": {
602                "v6.0.0": True,
603                "v7.0.0": True,
604                "v6.0.5": True,
605                "v6.4.4": True,
606                "v6.4.0": True,
607                "v6.4.1": True,
608                "v6.2.0": True,
609                "v6.2.3": True,
610                "v6.2.5": True,
611                "v6.2.7": True,
612                "v6.0.11": True
613            }
614        },
615        "ppp_echo_request3": {
616            "type": "string",
617            "options": [
618                {
619                    "value": "enable",
620                    "revisions": {
621                        "v6.0.0": True,
622                        "v7.0.0": True,
623                        "v6.0.5": 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                        "v6.0.11": True
632                    }
633                },
634                {
635                    "value": "disable",
636                    "revisions": {
637                        "v6.0.0": True,
638                        "v7.0.0": True,
639                        "v6.0.5": True,
640                        "v6.4.4": True,
641                        "v6.4.0": True,
642                        "v6.4.1": True,
643                        "v6.2.0": True,
644                        "v6.2.3": True,
645                        "v6.2.5": True,
646                        "v6.2.7": True,
647                        "v6.0.11": True
648                    }
649                }
650            ],
651            "revisions": {
652                "v6.0.0": True,
653                "v7.0.0": True,
654                "v6.0.5": True,
655                "v6.4.4": True,
656                "v6.4.0": True,
657                "v6.4.1": True,
658                "v6.2.0": True,
659                "v6.2.3": True,
660                "v6.2.5": True,
661                "v6.2.7": True,
662                "v6.0.11": True
663            }
664        },
665        "dial_cmd1": {
666            "type": "string",
667            "revisions": {
668                "v6.0.0": True,
669                "v7.0.0": True,
670                "v6.0.5": True,
671                "v6.4.4": True,
672                "v6.4.0": True,
673                "v6.4.1": True,
674                "v6.2.0": True,
675                "v6.2.3": True,
676                "v6.2.5": True,
677                "v6.2.7": True,
678                "v6.0.11": True
679            }
680        },
681        "dial_cmd2": {
682            "type": "string",
683            "revisions": {
684                "v6.0.0": True,
685                "v7.0.0": True,
686                "v6.0.5": True,
687                "v6.4.4": True,
688                "v6.4.0": True,
689                "v6.4.1": True,
690                "v6.2.0": True,
691                "v6.2.3": True,
692                "v6.2.5": True,
693                "v6.2.7": True,
694                "v6.0.11": True
695            }
696        },
697        "dial_cmd3": {
698            "type": "string",
699            "revisions": {
700                "v6.0.0": True,
701                "v7.0.0": True,
702                "v6.0.5": True,
703                "v6.4.4": True,
704                "v6.4.0": True,
705                "v6.4.1": True,
706                "v6.2.0": True,
707                "v6.2.3": True,
708                "v6.2.5": True,
709                "v6.2.7": True,
710                "v6.0.11": True
711            }
712        },
713        "holddown_timer": {
714            "type": "integer",
715            "revisions": {
716                "v6.0.0": True,
717                "v7.0.0": True,
718                "v6.0.5": True,
719                "v6.4.4": True,
720                "v6.4.0": True,
721                "v6.4.1": True,
722                "v6.2.0": True,
723                "v6.2.3": True,
724                "v6.2.5": True,
725                "v6.2.7": True,
726                "v6.0.11": True
727            }
728        },
729        "username1": {
730            "type": "string",
731            "revisions": {
732                "v6.0.0": True,
733                "v7.0.0": True,
734                "v6.0.5": True,
735                "v6.4.4": True,
736                "v6.4.0": True,
737                "v6.4.1": True,
738                "v6.2.0": True,
739                "v6.2.3": True,
740                "v6.2.5": True,
741                "v6.2.7": True,
742                "v6.0.11": True
743            }
744        },
745        "dial_on_demand": {
746            "type": "string",
747            "options": [
748                {
749                    "value": "enable",
750                    "revisions": {
751                        "v6.0.0": True,
752                        "v7.0.0": True,
753                        "v6.0.5": 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                        "v6.0.11": True
762                    }
763                },
764                {
765                    "value": "disable",
766                    "revisions": {
767                        "v6.0.0": True,
768                        "v7.0.0": True,
769                        "v6.0.5": True,
770                        "v6.4.4": True,
771                        "v6.4.0": True,
772                        "v6.4.1": True,
773                        "v6.2.0": True,
774                        "v6.2.3": True,
775                        "v6.2.5": True,
776                        "v6.2.7": True,
777                        "v6.0.11": True
778                    }
779                }
780            ],
781            "revisions": {
782                "v6.0.0": True,
783                "v7.0.0": True,
784                "v6.0.5": True,
785                "v6.4.4": True,
786                "v6.4.0": True,
787                "v6.4.1": True,
788                "v6.2.0": True,
789                "v6.2.3": True,
790                "v6.2.5": True,
791                "v6.2.7": True,
792                "v6.0.11": True
793            }
794        },
795        "redial": {
796            "type": "string",
797            "options": [
798                {
799                    "value": "none",
800                    "revisions": {
801                        "v6.0.0": True,
802                        "v7.0.0": True,
803                        "v6.0.5": True,
804                        "v6.4.4": True,
805                        "v6.4.0": True,
806                        "v6.4.1": True,
807                        "v6.2.0": True,
808                        "v6.2.3": True,
809                        "v6.2.5": True,
810                        "v6.2.7": True,
811                        "v6.0.11": True
812                    }
813                },
814                {
815                    "value": "1",
816                    "revisions": {
817                        "v6.0.0": True,
818                        "v7.0.0": True,
819                        "v6.0.5": True,
820                        "v6.4.4": True,
821                        "v6.4.0": True,
822                        "v6.4.1": True,
823                        "v6.2.0": True,
824                        "v6.2.3": True,
825                        "v6.2.5": True,
826                        "v6.2.7": True,
827                        "v6.0.11": True
828                    }
829                },
830                {
831                    "value": "2",
832                    "revisions": {
833                        "v6.0.0": True,
834                        "v7.0.0": True,
835                        "v6.0.5": True,
836                        "v6.4.4": True,
837                        "v6.4.0": True,
838                        "v6.4.1": True,
839                        "v6.2.0": True,
840                        "v6.2.3": True,
841                        "v6.2.5": True,
842                        "v6.2.7": True,
843                        "v6.0.11": True
844                    }
845                },
846                {
847                    "value": "3",
848                    "revisions": {
849                        "v6.0.0": True,
850                        "v7.0.0": True,
851                        "v6.0.5": True,
852                        "v6.4.4": True,
853                        "v6.4.0": True,
854                        "v6.4.1": True,
855                        "v6.2.0": True,
856                        "v6.2.3": True,
857                        "v6.2.5": True,
858                        "v6.2.7": True,
859                        "v6.0.11": True
860                    }
861                },
862                {
863                    "value": "4",
864                    "revisions": {
865                        "v6.0.0": True,
866                        "v7.0.0": True,
867                        "v6.0.5": True,
868                        "v6.4.4": True,
869                        "v6.4.0": True,
870                        "v6.4.1": True,
871                        "v6.2.0": True,
872                        "v6.2.3": True,
873                        "v6.2.5": True,
874                        "v6.2.7": True,
875                        "v6.0.11": True
876                    }
877                },
878                {
879                    "value": "5",
880                    "revisions": {
881                        "v6.0.0": True,
882                        "v7.0.0": True,
883                        "v6.0.5": True,
884                        "v6.4.4": True,
885                        "v6.4.0": True,
886                        "v6.4.1": True,
887                        "v6.2.0": True,
888                        "v6.2.3": True,
889                        "v6.2.5": True,
890                        "v6.2.7": True,
891                        "v6.0.11": True
892                    }
893                },
894                {
895                    "value": "6",
896                    "revisions": {
897                        "v6.0.0": True,
898                        "v7.0.0": True,
899                        "v6.0.5": True,
900                        "v6.4.4": True,
901                        "v6.4.0": True,
902                        "v6.4.1": True,
903                        "v6.2.0": True,
904                        "v6.2.3": True,
905                        "v6.2.5": True,
906                        "v6.2.7": True,
907                        "v6.0.11": True
908                    }
909                },
910                {
911                    "value": "7",
912                    "revisions": {
913                        "v6.0.0": True,
914                        "v7.0.0": True,
915                        "v6.0.5": True,
916                        "v6.4.4": True,
917                        "v6.4.0": True,
918                        "v6.4.1": True,
919                        "v6.2.0": True,
920                        "v6.2.3": True,
921                        "v6.2.5": True,
922                        "v6.2.7": True,
923                        "v6.0.11": True
924                    }
925                },
926                {
927                    "value": "8",
928                    "revisions": {
929                        "v6.0.0": True,
930                        "v7.0.0": True,
931                        "v6.0.5": True,
932                        "v6.4.4": True,
933                        "v6.4.0": True,
934                        "v6.4.1": True,
935                        "v6.2.0": True,
936                        "v6.2.3": True,
937                        "v6.2.5": True,
938                        "v6.2.7": True,
939                        "v6.0.11": True
940                    }
941                },
942                {
943                    "value": "9",
944                    "revisions": {
945                        "v6.0.0": True,
946                        "v7.0.0": True,
947                        "v6.0.5": True,
948                        "v6.4.4": True,
949                        "v6.4.0": True,
950                        "v6.4.1": True,
951                        "v6.2.0": True,
952                        "v6.2.3": True,
953                        "v6.2.5": True,
954                        "v6.2.7": True,
955                        "v6.0.11": True
956                    }
957                },
958                {
959                    "value": "10",
960                    "revisions": {
961                        "v6.0.0": True,
962                        "v7.0.0": True,
963                        "v6.0.5": True,
964                        "v6.4.4": True,
965                        "v6.4.0": True,
966                        "v6.4.1": True,
967                        "v6.2.0": True,
968                        "v6.2.3": True,
969                        "v6.2.5": True,
970                        "v6.2.7": True,
971                        "v6.0.11": True
972                    }
973                }
974            ],
975            "revisions": {
976                "v6.0.0": True,
977                "v7.0.0": True,
978                "v6.0.5": True,
979                "v6.4.4": True,
980                "v6.4.0": True,
981                "v6.4.1": True,
982                "v6.2.0": True,
983                "v6.2.3": True,
984                "v6.2.5": True,
985                "v6.2.7": True,
986                "v6.0.11": True
987            }
988        },
989        "extra_init3": {
990            "type": "string",
991            "revisions": {
992                "v6.0.0": True,
993                "v7.0.0": True,
994                "v6.0.5": True,
995                "v6.4.4": True,
996                "v6.4.0": True,
997                "v6.4.1": True,
998                "v6.2.0": True,
999                "v6.2.3": True,
1000                "v6.2.5": True,
1001                "v6.2.7": True,
1002                "v6.0.11": True
1003            }
1004        },
1005        "pin_init": {
1006            "type": "string",
1007            "revisions": {
1008                "v6.0.0": True,
1009                "v7.0.0": True,
1010                "v6.0.5": True,
1011                "v6.4.4": True,
1012                "v6.4.0": True,
1013                "v6.4.1": True,
1014                "v6.2.0": True,
1015                "v6.2.3": True,
1016                "v6.2.5": True,
1017                "v6.2.7": True,
1018                "v6.0.11": True
1019            }
1020        },
1021        "priority": {
1022            "type": "integer",
1023            "revisions": {
1024                "v6.0.0": True,
1025                "v7.0.0": True,
1026                "v6.0.5": True,
1027                "v6.4.4": True,
1028                "v6.4.0": True,
1029                "v6.4.1": True,
1030                "v6.2.0": True,
1031                "v6.2.3": True,
1032                "v6.2.5": True,
1033                "v6.2.7": True,
1034                "v6.0.11": True
1035            }
1036        },
1037        "auto_dial": {
1038            "type": "string",
1039            "options": [
1040                {
1041                    "value": "enable",
1042                    "revisions": {
1043                        "v6.0.0": True,
1044                        "v7.0.0": True,
1045                        "v6.0.5": True,
1046                        "v6.4.4": True,
1047                        "v6.4.0": True,
1048                        "v6.4.1": True,
1049                        "v6.2.0": True,
1050                        "v6.2.3": True,
1051                        "v6.2.5": True,
1052                        "v6.2.7": True,
1053                        "v6.0.11": True
1054                    }
1055                },
1056                {
1057                    "value": "disable",
1058                    "revisions": {
1059                        "v6.0.0": True,
1060                        "v7.0.0": True,
1061                        "v6.0.5": True,
1062                        "v6.4.4": True,
1063                        "v6.4.0": True,
1064                        "v6.4.1": True,
1065                        "v6.2.0": True,
1066                        "v6.2.3": True,
1067                        "v6.2.5": True,
1068                        "v6.2.7": True,
1069                        "v6.0.11": True
1070                    }
1071                }
1072            ],
1073            "revisions": {
1074                "v6.0.0": True,
1075                "v7.0.0": True,
1076                "v6.0.5": True,
1077                "v6.4.4": True,
1078                "v6.4.0": True,
1079                "v6.4.1": True,
1080                "v6.2.0": True,
1081                "v6.2.3": True,
1082                "v6.2.5": True,
1083                "v6.2.7": True,
1084                "v6.0.11": True
1085            }
1086        },
1087        "altmode": {
1088            "type": "string",
1089            "options": [
1090                {
1091                    "value": "enable",
1092                    "revisions": {
1093                        "v6.0.0": True,
1094                        "v7.0.0": True,
1095                        "v6.0.5": True,
1096                        "v6.4.4": True,
1097                        "v6.4.0": True,
1098                        "v6.4.1": True,
1099                        "v6.2.0": True,
1100                        "v6.2.3": True,
1101                        "v6.2.5": True,
1102                        "v6.2.7": True,
1103                        "v6.0.11": True
1104                    }
1105                },
1106                {
1107                    "value": "disable",
1108                    "revisions": {
1109                        "v6.0.0": True,
1110                        "v7.0.0": True,
1111                        "v6.0.5": True,
1112                        "v6.4.4": True,
1113                        "v6.4.0": True,
1114                        "v6.4.1": True,
1115                        "v6.2.0": True,
1116                        "v6.2.3": True,
1117                        "v6.2.5": True,
1118                        "v6.2.7": True,
1119                        "v6.0.11": True
1120                    }
1121                }
1122            ],
1123            "revisions": {
1124                "v6.0.0": True,
1125                "v7.0.0": True,
1126                "v6.0.5": True,
1127                "v6.4.4": True,
1128                "v6.4.0": True,
1129                "v6.4.1": True,
1130                "v6.2.0": True,
1131                "v6.2.3": True,
1132                "v6.2.5": True,
1133                "v6.2.7": True,
1134                "v6.0.11": True
1135            }
1136        },
1137        "dont_send_CR3": {
1138            "type": "string",
1139            "options": [
1140                {
1141                    "value": "enable",
1142                    "revisions": {
1143                        "v6.0.0": True,
1144                        "v7.0.0": True,
1145                        "v6.0.5": True,
1146                        "v6.4.4": True,
1147                        "v6.4.0": True,
1148                        "v6.4.1": True,
1149                        "v6.2.0": True,
1150                        "v6.2.3": True,
1151                        "v6.2.5": True,
1152                        "v6.2.7": True,
1153                        "v6.0.11": True
1154                    }
1155                },
1156                {
1157                    "value": "disable",
1158                    "revisions": {
1159                        "v6.0.0": True,
1160                        "v7.0.0": True,
1161                        "v6.0.5": True,
1162                        "v6.4.4": True,
1163                        "v6.4.0": True,
1164                        "v6.4.1": True,
1165                        "v6.2.0": True,
1166                        "v6.2.3": True,
1167                        "v6.2.5": True,
1168                        "v6.2.7": True,
1169                        "v6.0.11": True
1170                    }
1171                }
1172            ],
1173            "revisions": {
1174                "v6.0.0": True,
1175                "v7.0.0": True,
1176                "v6.0.5": True,
1177                "v6.4.4": True,
1178                "v6.4.0": True,
1179                "v6.4.1": True,
1180                "v6.2.0": True,
1181                "v6.2.3": True,
1182                "v6.2.5": True,
1183                "v6.2.7": True,
1184                "v6.0.11": True
1185            }
1186        },
1187        "dont_send_CR2": {
1188            "type": "string",
1189            "options": [
1190                {
1191                    "value": "enable",
1192                    "revisions": {
1193                        "v6.0.0": True,
1194                        "v7.0.0": True,
1195                        "v6.0.5": True,
1196                        "v6.4.4": True,
1197                        "v6.4.0": True,
1198                        "v6.4.1": True,
1199                        "v6.2.0": True,
1200                        "v6.2.3": True,
1201                        "v6.2.5": True,
1202                        "v6.2.7": True,
1203                        "v6.0.11": True
1204                    }
1205                },
1206                {
1207                    "value": "disable",
1208                    "revisions": {
1209                        "v6.0.0": True,
1210                        "v7.0.0": True,
1211                        "v6.0.5": True,
1212                        "v6.4.4": True,
1213                        "v6.4.0": True,
1214                        "v6.4.1": True,
1215                        "v6.2.0": True,
1216                        "v6.2.3": True,
1217                        "v6.2.5": True,
1218                        "v6.2.7": True,
1219                        "v6.0.11": True
1220                    }
1221                }
1222            ],
1223            "revisions": {
1224                "v6.0.0": True,
1225                "v7.0.0": True,
1226                "v6.0.5": True,
1227                "v6.4.4": True,
1228                "v6.4.0": True,
1229                "v6.4.1": True,
1230                "v6.2.0": True,
1231                "v6.2.3": True,
1232                "v6.2.5": True,
1233                "v6.2.7": True,
1234                "v6.0.11": True
1235            }
1236        },
1237        "dont_send_CR1": {
1238            "type": "string",
1239            "options": [
1240                {
1241                    "value": "enable",
1242                    "revisions": {
1243                        "v6.0.0": True,
1244                        "v7.0.0": True,
1245                        "v6.0.5": True,
1246                        "v6.4.4": True,
1247                        "v6.4.0": True,
1248                        "v6.4.1": True,
1249                        "v6.2.0": True,
1250                        "v6.2.3": True,
1251                        "v6.2.5": True,
1252                        "v6.2.7": True,
1253                        "v6.0.11": True
1254                    }
1255                },
1256                {
1257                    "value": "disable",
1258                    "revisions": {
1259                        "v6.0.0": True,
1260                        "v7.0.0": True,
1261                        "v6.0.5": True,
1262                        "v6.4.4": True,
1263                        "v6.4.0": True,
1264                        "v6.4.1": True,
1265                        "v6.2.0": True,
1266                        "v6.2.3": True,
1267                        "v6.2.5": True,
1268                        "v6.2.7": True,
1269                        "v6.0.11": True
1270                    }
1271                }
1272            ],
1273            "revisions": {
1274                "v6.0.0": True,
1275                "v7.0.0": True,
1276                "v6.0.5": True,
1277                "v6.4.4": True,
1278                "v6.4.0": True,
1279                "v6.4.1": True,
1280                "v6.2.0": True,
1281                "v6.2.3": True,
1282                "v6.2.5": True,
1283                "v6.2.7": True,
1284                "v6.0.11": True
1285            }
1286        },
1287        "mode": {
1288            "type": "string",
1289            "options": [
1290                {
1291                    "value": "standalone",
1292                    "revisions": {
1293                        "v6.0.0": True,
1294                        "v7.0.0": True,
1295                        "v6.0.5": True,
1296                        "v6.4.4": True,
1297                        "v6.4.0": True,
1298                        "v6.4.1": True,
1299                        "v6.2.0": True,
1300                        "v6.2.3": True,
1301                        "v6.2.5": True,
1302                        "v6.2.7": True,
1303                        "v6.0.11": True
1304                    }
1305                },
1306                {
1307                    "value": "redundant",
1308                    "revisions": {
1309                        "v6.0.0": True,
1310                        "v7.0.0": True,
1311                        "v6.0.5": True,
1312                        "v6.4.4": True,
1313                        "v6.4.0": True,
1314                        "v6.4.1": True,
1315                        "v6.2.0": True,
1316                        "v6.2.3": True,
1317                        "v6.2.5": True,
1318                        "v6.2.7": True,
1319                        "v6.0.11": True
1320                    }
1321                }
1322            ],
1323            "revisions": {
1324                "v6.0.0": True,
1325                "v7.0.0": True,
1326                "v6.0.5": True,
1327                "v6.4.4": True,
1328                "v6.4.0": True,
1329                "v6.4.1": True,
1330                "v6.2.0": True,
1331                "v6.2.3": True,
1332                "v6.2.5": True,
1333                "v6.2.7": True,
1334                "v6.0.11": True
1335            }
1336        },
1337        "peer_modem2": {
1338            "type": "string",
1339            "options": [
1340                {
1341                    "value": "generic",
1342                    "revisions": {
1343                        "v6.0.0": True,
1344                        "v7.0.0": True,
1345                        "v6.0.5": True,
1346                        "v6.4.4": True,
1347                        "v6.4.0": True,
1348                        "v6.4.1": True,
1349                        "v6.2.0": True,
1350                        "v6.2.3": True,
1351                        "v6.2.5": True,
1352                        "v6.2.7": True,
1353                        "v6.0.11": True
1354                    }
1355                },
1356                {
1357                    "value": "actiontec",
1358                    "revisions": {
1359                        "v6.0.0": True,
1360                        "v7.0.0": True,
1361                        "v6.0.5": True,
1362                        "v6.4.4": True,
1363                        "v6.4.0": True,
1364                        "v6.4.1": True,
1365                        "v6.2.0": True,
1366                        "v6.2.3": True,
1367                        "v6.2.5": True,
1368                        "v6.2.7": True,
1369                        "v6.0.11": True
1370                    }
1371                },
1372                {
1373                    "value": "ascend_TNT",
1374                    "revisions": {
1375                        "v6.0.0": True,
1376                        "v7.0.0": True,
1377                        "v6.0.5": True,
1378                        "v6.4.4": True,
1379                        "v6.4.0": True,
1380                        "v6.4.1": True,
1381                        "v6.2.0": True,
1382                        "v6.2.3": True,
1383                        "v6.2.5": True,
1384                        "v6.2.7": True,
1385                        "v6.0.11": True
1386                    }
1387                }
1388            ],
1389            "revisions": {
1390                "v6.0.0": True,
1391                "v7.0.0": True,
1392                "v6.0.5": True,
1393                "v6.4.4": True,
1394                "v6.4.0": True,
1395                "v6.4.1": True,
1396                "v6.2.0": True,
1397                "v6.2.3": True,
1398                "v6.2.5": True,
1399                "v6.2.7": True,
1400                "v6.0.11": True
1401            }
1402        },
1403        "peer_modem3": {
1404            "type": "string",
1405            "options": [
1406                {
1407                    "value": "generic",
1408                    "revisions": {
1409                        "v6.0.0": True,
1410                        "v7.0.0": True,
1411                        "v6.0.5": True,
1412                        "v6.4.4": True,
1413                        "v6.4.0": True,
1414                        "v6.4.1": True,
1415                        "v6.2.0": True,
1416                        "v6.2.3": True,
1417                        "v6.2.5": True,
1418                        "v6.2.7": True,
1419                        "v6.0.11": True
1420                    }
1421                },
1422                {
1423                    "value": "actiontec",
1424                    "revisions": {
1425                        "v6.0.0": True,
1426                        "v7.0.0": True,
1427                        "v6.0.5": True,
1428                        "v6.4.4": True,
1429                        "v6.4.0": True,
1430                        "v6.4.1": True,
1431                        "v6.2.0": True,
1432                        "v6.2.3": True,
1433                        "v6.2.5": True,
1434                        "v6.2.7": True,
1435                        "v6.0.11": True
1436                    }
1437                },
1438                {
1439                    "value": "ascend_TNT",
1440                    "revisions": {
1441                        "v6.0.0": True,
1442                        "v7.0.0": True,
1443                        "v6.0.5": True,
1444                        "v6.4.4": True,
1445                        "v6.4.0": True,
1446                        "v6.4.1": True,
1447                        "v6.2.0": True,
1448                        "v6.2.3": True,
1449                        "v6.2.5": True,
1450                        "v6.2.7": True,
1451                        "v6.0.11": True
1452                    }
1453                }
1454            ],
1455            "revisions": {
1456                "v6.0.0": True,
1457                "v7.0.0": True,
1458                "v6.0.5": True,
1459                "v6.4.4": True,
1460                "v6.4.0": True,
1461                "v6.4.1": True,
1462                "v6.2.0": True,
1463                "v6.2.3": True,
1464                "v6.2.5": True,
1465                "v6.2.7": True,
1466                "v6.0.11": True
1467            }
1468        },
1469        "peer_modem1": {
1470            "type": "string",
1471            "options": [
1472                {
1473                    "value": "generic",
1474                    "revisions": {
1475                        "v6.0.0": True,
1476                        "v7.0.0": True,
1477                        "v6.0.5": True,
1478                        "v6.4.4": True,
1479                        "v6.4.0": True,
1480                        "v6.4.1": True,
1481                        "v6.2.0": True,
1482                        "v6.2.3": True,
1483                        "v6.2.5": True,
1484                        "v6.2.7": True,
1485                        "v6.0.11": True
1486                    }
1487                },
1488                {
1489                    "value": "actiontec",
1490                    "revisions": {
1491                        "v6.0.0": True,
1492                        "v7.0.0": True,
1493                        "v6.0.5": True,
1494                        "v6.4.4": True,
1495                        "v6.4.0": True,
1496                        "v6.4.1": True,
1497                        "v6.2.0": True,
1498                        "v6.2.3": True,
1499                        "v6.2.5": True,
1500                        "v6.2.7": True,
1501                        "v6.0.11": True
1502                    }
1503                },
1504                {
1505                    "value": "ascend_TNT",
1506                    "revisions": {
1507                        "v6.0.0": True,
1508                        "v7.0.0": True,
1509                        "v6.0.5": True,
1510                        "v6.4.4": True,
1511                        "v6.4.0": True,
1512                        "v6.4.1": True,
1513                        "v6.2.0": True,
1514                        "v6.2.3": True,
1515                        "v6.2.5": True,
1516                        "v6.2.7": True,
1517                        "v6.0.11": True
1518                    }
1519                }
1520            ],
1521            "revisions": {
1522                "v6.0.0": True,
1523                "v7.0.0": True,
1524                "v6.0.5": True,
1525                "v6.4.4": True,
1526                "v6.4.0": True,
1527                "v6.4.1": True,
1528                "v6.2.0": True,
1529                "v6.2.3": True,
1530                "v6.2.5": True,
1531                "v6.2.7": True,
1532                "v6.0.11": True
1533            }
1534        },
1535        "phone2": {
1536            "type": "string",
1537            "revisions": {
1538                "v6.0.0": True,
1539                "v7.0.0": True,
1540                "v6.0.5": True,
1541                "v6.4.4": True,
1542                "v6.4.0": True,
1543                "v6.4.1": True,
1544                "v6.2.0": True,
1545                "v6.2.3": True,
1546                "v6.2.5": True,
1547                "v6.2.7": True,
1548                "v6.0.11": True
1549            }
1550        },
1551        "phone3": {
1552            "type": "string",
1553            "revisions": {
1554                "v6.0.0": True,
1555                "v7.0.0": True,
1556                "v6.0.5": True,
1557                "v6.4.4": True,
1558                "v6.4.0": True,
1559                "v6.4.1": True,
1560                "v6.2.0": True,
1561                "v6.2.3": True,
1562                "v6.2.5": True,
1563                "v6.2.7": True,
1564                "v6.0.11": True
1565            }
1566        },
1567        "phone1": {
1568            "type": "string",
1569            "revisions": {
1570                "v6.0.0": True,
1571                "v7.0.0": True,
1572                "v6.0.5": True,
1573                "v6.4.4": True,
1574                "v6.4.0": True,
1575                "v6.4.1": True,
1576                "v6.2.0": True,
1577                "v6.2.3": True,
1578                "v6.2.5": True,
1579                "v6.2.7": True,
1580                "v6.0.11": True
1581            }
1582        },
1583        "extra_init2": {
1584            "type": "string",
1585            "revisions": {
1586                "v6.0.0": True,
1587                "v7.0.0": True,
1588                "v6.0.5": True,
1589                "v6.4.4": True,
1590                "v6.4.0": True,
1591                "v6.4.1": True,
1592                "v6.2.0": True,
1593                "v6.2.3": True,
1594                "v6.2.5": True,
1595                "v6.2.7": True,
1596                "v6.0.11": True
1597            }
1598        },
1599        "username3": {
1600            "type": "string",
1601            "revisions": {
1602                "v6.0.0": True,
1603                "v7.0.0": True,
1604                "v6.0.5": True,
1605                "v6.4.4": True,
1606                "v6.4.0": True,
1607                "v6.4.1": True,
1608                "v6.2.0": True,
1609                "v6.2.3": True,
1610                "v6.2.5": True,
1611                "v6.2.7": True,
1612                "v6.0.11": True
1613            }
1614        },
1615        "extra_init1": {
1616            "type": "string",
1617            "revisions": {
1618                "v6.0.0": True,
1619                "v7.0.0": True,
1620                "v6.0.5": True,
1621                "v6.4.4": True,
1622                "v6.4.0": True,
1623                "v6.4.1": True,
1624                "v6.2.0": True,
1625                "v6.2.3": True,
1626                "v6.2.5": True,
1627                "v6.2.7": True,
1628                "v6.0.11": True
1629            }
1630        },
1631        "lockdown_lac": {
1632            "type": "string",
1633            "revisions": {
1634                "v6.0.0": True,
1635                "v7.0.0": True,
1636                "v6.0.5": True,
1637                "v6.4.4": True,
1638                "v6.4.0": True,
1639                "v6.4.1": True,
1640                "v6.2.0": True,
1641                "v6.2.3": True,
1642                "v6.2.5": True,
1643                "v6.2.7": True,
1644                "v6.0.11": True
1645            }
1646        },
1647        "ppp_echo_request1": {
1648            "type": "string",
1649            "options": [
1650                {
1651                    "value": "enable",
1652                    "revisions": {
1653                        "v6.0.0": True,
1654                        "v7.0.0": True,
1655                        "v6.0.5": True,
1656                        "v6.4.4": True,
1657                        "v6.4.0": True,
1658                        "v6.4.1": True,
1659                        "v6.2.0": True,
1660                        "v6.2.3": True,
1661                        "v6.2.5": True,
1662                        "v6.2.7": True,
1663                        "v6.0.11": True
1664                    }
1665                },
1666                {
1667                    "value": "disable",
1668                    "revisions": {
1669                        "v6.0.0": True,
1670                        "v7.0.0": True,
1671                        "v6.0.5": True,
1672                        "v6.4.4": True,
1673                        "v6.4.0": True,
1674                        "v6.4.1": True,
1675                        "v6.2.0": True,
1676                        "v6.2.3": True,
1677                        "v6.2.5": True,
1678                        "v6.2.7": True,
1679                        "v6.0.11": True
1680                    }
1681                }
1682            ],
1683            "revisions": {
1684                "v6.0.0": True,
1685                "v7.0.0": True,
1686                "v6.0.5": True,
1687                "v6.4.4": True,
1688                "v6.4.0": True,
1689                "v6.4.1": True,
1690                "v6.2.0": True,
1691                "v6.2.3": True,
1692                "v6.2.5": True,
1693                "v6.2.7": True,
1694                "v6.0.11": True
1695            }
1696        },
1697        "interface": {
1698            "type": "string",
1699            "revisions": {
1700                "v6.0.0": True,
1701                "v7.0.0": True,
1702                "v6.0.5": True,
1703                "v6.4.4": True,
1704                "v6.4.0": True,
1705                "v6.4.1": True,
1706                "v6.2.0": True,
1707                "v6.2.3": True,
1708                "v6.2.5": True,
1709                "v6.2.7": True,
1710                "v6.0.11": True
1711            }
1712        },
1713        "traffic_check": {
1714            "type": "string",
1715            "options": [
1716                {
1717                    "value": "enable",
1718                    "revisions": {
1719                        "v6.0.0": True,
1720                        "v7.0.0": True,
1721                        "v6.0.5": True,
1722                        "v6.4.4": True,
1723                        "v6.4.0": True,
1724                        "v6.4.1": True,
1725                        "v6.2.0": True,
1726                        "v6.2.3": True,
1727                        "v6.2.5": True,
1728                        "v6.2.7": True,
1729                        "v6.0.11": True
1730                    }
1731                },
1732                {
1733                    "value": "disable",
1734                    "revisions": {
1735                        "v6.0.0": True,
1736                        "v7.0.0": True,
1737                        "v6.0.5": True,
1738                        "v6.4.4": True,
1739                        "v6.4.0": True,
1740                        "v6.4.1": True,
1741                        "v6.2.0": True,
1742                        "v6.2.3": True,
1743                        "v6.2.5": True,
1744                        "v6.2.7": True,
1745                        "v6.0.11": True
1746                    }
1747                }
1748            ],
1749            "revisions": {
1750                "v6.0.0": True,
1751                "v7.0.0": True,
1752                "v6.0.5": True,
1753                "v6.4.4": True,
1754                "v6.4.0": True,
1755                "v6.4.1": True,
1756                "v6.2.0": True,
1757                "v6.2.3": True,
1758                "v6.2.5": True,
1759                "v6.2.7": True,
1760                "v6.0.11": True
1761            }
1762        },
1763        "passwd1": {
1764            "type": "string",
1765            "revisions": {
1766                "v6.0.0": True,
1767                "v7.0.0": True,
1768                "v6.0.5": True,
1769                "v6.4.4": True,
1770                "v6.4.0": True,
1771                "v6.4.1": True,
1772                "v6.2.0": True,
1773                "v6.2.3": True,
1774                "v6.2.5": True,
1775                "v6.2.7": True,
1776                "v6.0.11": True
1777            }
1778        },
1779        "passwd3": {
1780            "type": "string",
1781            "revisions": {
1782                "v6.0.0": True,
1783                "v7.0.0": True,
1784                "v6.0.5": True,
1785                "v6.4.4": True,
1786                "v6.4.0": True,
1787                "v6.4.1": True,
1788                "v6.2.0": True,
1789                "v6.2.3": True,
1790                "v6.2.5": True,
1791                "v6.2.7": True,
1792                "v6.0.11": True
1793            }
1794        },
1795        "wireless_port": {
1796            "type": "integer",
1797            "revisions": {
1798                "v6.0.0": True,
1799                "v7.0.0": True,
1800                "v6.0.5": True,
1801                "v6.4.4": True,
1802                "v6.4.0": True,
1803                "v6.4.1": True,
1804                "v6.2.0": True,
1805                "v6.2.3": True,
1806                "v6.2.5": True,
1807                "v6.2.7": True,
1808                "v6.0.11": True
1809            }
1810        },
1811        "reset": {
1812            "type": "integer",
1813            "revisions": {
1814                "v6.0.0": True,
1815                "v7.0.0": True,
1816                "v6.0.5": True,
1817                "v6.4.4": True,
1818                "v6.4.0": True,
1819                "v6.4.1": True,
1820                "v6.2.0": True,
1821                "v6.2.3": True,
1822                "v6.2.5": True,
1823                "v6.2.7": True,
1824                "v6.0.11": True
1825            }
1826        },
1827        "distance": {
1828            "type": "integer",
1829            "revisions": {
1830                "v6.0.0": True,
1831                "v7.0.0": True,
1832                "v6.0.5": True,
1833                "v6.4.4": True,
1834                "v6.4.0": True,
1835                "v6.4.1": True,
1836                "v6.2.0": True,
1837                "v6.2.3": True,
1838                "v6.2.5": True,
1839                "v6.2.7": True,
1840                "v6.0.11": True
1841            }
1842        },
1843        "network_init": {
1844            "type": "string",
1845            "revisions": {
1846                "v6.0.0": True,
1847                "v7.0.0": True,
1848                "v6.0.5": True,
1849                "v6.4.4": True,
1850                "v6.4.0": True,
1851                "v6.4.1": True,
1852                "v6.2.0": True,
1853                "v6.2.3": True,
1854                "v6.2.5": True,
1855                "v6.2.7": True,
1856                "v6.0.11": True
1857            }
1858        },
1859        "username2": {
1860            "type": "string",
1861            "revisions": {
1862                "v6.0.0": True,
1863                "v7.0.0": True,
1864                "v6.0.5": True,
1865                "v6.4.4": True,
1866                "v6.4.0": True,
1867                "v6.4.1": True,
1868                "v6.2.0": True,
1869                "v6.2.3": True,
1870                "v6.2.5": True,
1871                "v6.2.7": True,
1872                "v6.0.11": True
1873            }
1874        },
1875        "authtype3": {
1876            "multiple_values": True,
1877            "type": "list",
1878            "options": [
1879                {
1880                    "value": "pap",
1881                    "revisions": {
1882                        "v6.0.0": True,
1883                        "v7.0.0": True,
1884                        "v6.0.5": True,
1885                        "v6.4.4": True,
1886                        "v6.4.0": True,
1887                        "v6.4.1": True,
1888                        "v6.2.0": True,
1889                        "v6.2.3": True,
1890                        "v6.2.5": True,
1891                        "v6.2.7": True,
1892                        "v6.0.11": True
1893                    }
1894                },
1895                {
1896                    "value": "chap",
1897                    "revisions": {
1898                        "v6.0.0": True,
1899                        "v7.0.0": True,
1900                        "v6.0.5": True,
1901                        "v6.4.4": True,
1902                        "v6.4.0": True,
1903                        "v6.4.1": True,
1904                        "v6.2.0": True,
1905                        "v6.2.3": True,
1906                        "v6.2.5": True,
1907                        "v6.2.7": True,
1908                        "v6.0.11": True
1909                    }
1910                },
1911                {
1912                    "value": "mschap",
1913                    "revisions": {
1914                        "v6.0.0": True,
1915                        "v7.0.0": True,
1916                        "v6.0.5": True,
1917                        "v6.4.4": True,
1918                        "v6.4.0": True,
1919                        "v6.4.1": True,
1920                        "v6.2.0": True,
1921                        "v6.2.3": True,
1922                        "v6.2.5": True,
1923                        "v6.2.7": True,
1924                        "v6.0.11": True
1925                    }
1926                },
1927                {
1928                    "value": "mschapv2",
1929                    "revisions": {
1930                        "v6.0.0": True,
1931                        "v7.0.0": True,
1932                        "v6.0.5": True,
1933                        "v6.4.4": True,
1934                        "v6.4.0": True,
1935                        "v6.4.1": True,
1936                        "v6.2.0": True,
1937                        "v6.2.3": True,
1938                        "v6.2.5": True,
1939                        "v6.2.7": True,
1940                        "v6.0.11": True
1941                    }
1942                }
1943            ],
1944            "revisions": {
1945                "v6.0.0": True,
1946                "v7.0.0": True,
1947                "v6.0.5": True,
1948                "v6.4.4": True,
1949                "v6.4.0": True,
1950                "v6.4.1": True,
1951                "v6.2.0": True,
1952                "v6.2.3": True,
1953                "v6.2.5": True,
1954                "v6.2.7": True,
1955                "v6.0.11": True
1956            }
1957        },
1958        "authtype2": {
1959            "multiple_values": True,
1960            "type": "list",
1961            "options": [
1962                {
1963                    "value": "pap",
1964                    "revisions": {
1965                        "v6.0.0": True,
1966                        "v7.0.0": True,
1967                        "v6.0.5": True,
1968                        "v6.4.4": True,
1969                        "v6.4.0": True,
1970                        "v6.4.1": True,
1971                        "v6.2.0": True,
1972                        "v6.2.3": True,
1973                        "v6.2.5": True,
1974                        "v6.2.7": True,
1975                        "v6.0.11": True
1976                    }
1977                },
1978                {
1979                    "value": "chap",
1980                    "revisions": {
1981                        "v6.0.0": True,
1982                        "v7.0.0": True,
1983                        "v6.0.5": True,
1984                        "v6.4.4": True,
1985                        "v6.4.0": True,
1986                        "v6.4.1": True,
1987                        "v6.2.0": True,
1988                        "v6.2.3": True,
1989                        "v6.2.5": True,
1990                        "v6.2.7": True,
1991                        "v6.0.11": True
1992                    }
1993                },
1994                {
1995                    "value": "mschap",
1996                    "revisions": {
1997                        "v6.0.0": True,
1998                        "v7.0.0": True,
1999                        "v6.0.5": True,
2000                        "v6.4.4": True,
2001                        "v6.4.0": True,
2002                        "v6.4.1": True,
2003                        "v6.2.0": True,
2004                        "v6.2.3": True,
2005                        "v6.2.5": True,
2006                        "v6.2.7": True,
2007                        "v6.0.11": True
2008                    }
2009                },
2010                {
2011                    "value": "mschapv2",
2012                    "revisions": {
2013                        "v6.0.0": True,
2014                        "v7.0.0": True,
2015                        "v6.0.5": True,
2016                        "v6.4.4": True,
2017                        "v6.4.0": True,
2018                        "v6.4.1": True,
2019                        "v6.2.0": True,
2020                        "v6.2.3": True,
2021                        "v6.2.5": True,
2022                        "v6.2.7": True,
2023                        "v6.0.11": True
2024                    }
2025                }
2026            ],
2027            "revisions": {
2028                "v6.0.0": True,
2029                "v7.0.0": True,
2030                "v6.0.5": True,
2031                "v6.4.4": True,
2032                "v6.4.0": True,
2033                "v6.4.1": True,
2034                "v6.2.0": True,
2035                "v6.2.3": True,
2036                "v6.2.5": True,
2037                "v6.2.7": True,
2038                "v6.0.11": True
2039            }
2040        },
2041        "authtype1": {
2042            "multiple_values": True,
2043            "type": "list",
2044            "options": [
2045                {
2046                    "value": "pap",
2047                    "revisions": {
2048                        "v6.0.0": True,
2049                        "v7.0.0": True,
2050                        "v6.0.5": True,
2051                        "v6.4.4": True,
2052                        "v6.4.0": True,
2053                        "v6.4.1": True,
2054                        "v6.2.0": True,
2055                        "v6.2.3": True,
2056                        "v6.2.5": True,
2057                        "v6.2.7": True,
2058                        "v6.0.11": True
2059                    }
2060                },
2061                {
2062                    "value": "chap",
2063                    "revisions": {
2064                        "v6.0.0": True,
2065                        "v7.0.0": True,
2066                        "v6.0.5": True,
2067                        "v6.4.4": True,
2068                        "v6.4.0": True,
2069                        "v6.4.1": True,
2070                        "v6.2.0": True,
2071                        "v6.2.3": True,
2072                        "v6.2.5": True,
2073                        "v6.2.7": True,
2074                        "v6.0.11": True
2075                    }
2076                },
2077                {
2078                    "value": "mschap",
2079                    "revisions": {
2080                        "v6.0.0": True,
2081                        "v7.0.0": True,
2082                        "v6.0.5": True,
2083                        "v6.4.4": True,
2084                        "v6.4.0": True,
2085                        "v6.4.1": True,
2086                        "v6.2.0": True,
2087                        "v6.2.3": True,
2088                        "v6.2.5": True,
2089                        "v6.2.7": True,
2090                        "v6.0.11": True
2091                    }
2092                },
2093                {
2094                    "value": "mschapv2",
2095                    "revisions": {
2096                        "v6.0.0": True,
2097                        "v7.0.0": True,
2098                        "v6.0.5": True,
2099                        "v6.4.4": True,
2100                        "v6.4.0": True,
2101                        "v6.4.1": True,
2102                        "v6.2.0": True,
2103                        "v6.2.3": True,
2104                        "v6.2.5": True,
2105                        "v6.2.7": True,
2106                        "v6.0.11": True
2107                    }
2108                }
2109            ],
2110            "revisions": {
2111                "v6.0.0": True,
2112                "v7.0.0": True,
2113                "v6.0.5": True,
2114                "v6.4.4": True,
2115                "v6.4.0": True,
2116                "v6.4.1": True,
2117                "v6.2.0": True,
2118                "v6.2.3": True,
2119                "v6.2.5": True,
2120                "v6.2.7": True,
2121                "v6.0.11": True
2122            }
2123        },
2124        "connect_timeout": {
2125            "type": "integer",
2126            "revisions": {
2127                "v6.0.0": True,
2128                "v7.0.0": True,
2129                "v6.0.5": True,
2130                "v6.4.4": True,
2131                "v6.4.0": True,
2132                "v6.4.1": True,
2133                "v6.2.0": True,
2134                "v6.2.3": True,
2135                "v6.2.5": True,
2136                "v6.2.7": True,
2137                "v6.0.11": True
2138            }
2139        },
2140        "ppp_echo_request2": {
2141            "type": "string",
2142            "options": [
2143                {
2144                    "value": "enable",
2145                    "revisions": {
2146                        "v6.0.0": True,
2147                        "v7.0.0": True,
2148                        "v6.0.5": True,
2149                        "v6.4.4": True,
2150                        "v6.4.0": True,
2151                        "v6.4.1": True,
2152                        "v6.2.0": True,
2153                        "v6.2.3": True,
2154                        "v6.2.5": True,
2155                        "v6.2.7": True,
2156                        "v6.0.11": True
2157                    }
2158                },
2159                {
2160                    "value": "disable",
2161                    "revisions": {
2162                        "v6.0.0": True,
2163                        "v7.0.0": True,
2164                        "v6.0.5": True,
2165                        "v6.4.4": True,
2166                        "v6.4.0": True,
2167                        "v6.4.1": True,
2168                        "v6.2.0": True,
2169                        "v6.2.3": True,
2170                        "v6.2.5": True,
2171                        "v6.2.7": True,
2172                        "v6.0.11": True
2173                    }
2174                }
2175            ],
2176            "revisions": {
2177                "v6.0.0": True,
2178                "v7.0.0": True,
2179                "v6.0.5": True,
2180                "v6.4.4": True,
2181                "v6.4.0": True,
2182                "v6.4.1": True,
2183                "v6.2.0": True,
2184                "v6.2.3": True,
2185                "v6.2.5": True,
2186                "v6.2.7": True,
2187                "v6.0.11": True
2188            }
2189        },
2190        "idle_timer": {
2191            "type": "integer",
2192            "revisions": {
2193                "v6.0.0": True,
2194                "v7.0.0": True,
2195                "v6.0.5": True,
2196                "v6.4.4": True,
2197                "v6.4.0": True,
2198                "v6.4.1": True,
2199                "v6.2.0": True,
2200                "v6.2.3": True,
2201                "v6.2.5": True,
2202                "v6.2.7": True,
2203                "v6.0.11": True
2204            }
2205        },
2206        "action": {
2207            "type": "string",
2208            "options": [
2209                {
2210                    "value": "dial",
2211                    "revisions": {
2212                        "v6.0.0": True,
2213                        "v7.0.0": True,
2214                        "v6.0.5": True,
2215                        "v6.4.4": True,
2216                        "v6.4.0": True,
2217                        "v6.4.1": True,
2218                        "v6.2.0": True,
2219                        "v6.2.3": True,
2220                        "v6.2.5": True,
2221                        "v6.2.7": True,
2222                        "v6.0.11": True
2223                    }
2224                },
2225                {
2226                    "value": "stop",
2227                    "revisions": {
2228                        "v6.0.0": True,
2229                        "v7.0.0": True,
2230                        "v6.0.5": True,
2231                        "v6.4.4": True,
2232                        "v6.4.0": True,
2233                        "v6.4.1": True,
2234                        "v6.2.0": True,
2235                        "v6.2.3": True,
2236                        "v6.2.5": True,
2237                        "v6.2.7": True,
2238                        "v6.0.11": True
2239                    }
2240                },
2241                {
2242                    "value": "none",
2243                    "revisions": {
2244                        "v6.0.0": True,
2245                        "v7.0.0": True,
2246                        "v6.0.5": True,
2247                        "v6.4.4": True,
2248                        "v6.4.0": True,
2249                        "v6.4.1": True,
2250                        "v6.2.0": True,
2251                        "v6.2.3": True,
2252                        "v6.2.5": True,
2253                        "v6.2.7": True,
2254                        "v6.0.11": True
2255                    }
2256                }
2257            ],
2258            "revisions": {
2259                "v6.0.0": True,
2260                "v7.0.0": True,
2261                "v6.0.5": True,
2262                "v6.4.4": True,
2263                "v6.4.0": True,
2264                "v6.4.1": True,
2265                "v6.2.0": True,
2266                "v6.2.3": True,
2267                "v6.2.5": True,
2268                "v6.2.7": True,
2269                "v6.0.11": True
2270            }
2271        },
2272        "passwd2": {
2273            "type": "string",
2274            "revisions": {
2275                "v6.0.0": True,
2276                "v7.0.0": True,
2277                "v6.0.5": True,
2278                "v6.4.4": True,
2279                "v6.4.0": True,
2280                "v6.4.1": True,
2281                "v6.2.0": True,
2282                "v6.2.3": True,
2283                "v6.2.5": True,
2284                "v6.2.7": True,
2285                "v6.0.11": True
2286            }
2287        }
2288    },
2289    "revisions": {
2290        "v6.0.0": True,
2291        "v7.0.0": True,
2292        "v6.0.5": True,
2293        "v6.4.4": True,
2294        "v6.4.0": True,
2295        "v6.4.1": True,
2296        "v6.2.0": True,
2297        "v6.2.3": True,
2298        "v6.2.5": True,
2299        "v6.2.7": True,
2300        "v6.0.11": True
2301    }
2302}
2303
2304
2305def main():
2306    module_spec = schema_to_module_spec(versioned_schema)
2307    mkeyname = None
2308    fields = {
2309        "access_token": {"required": False, "type": "str", "no_log": True},
2310        "enable_log": {"required": False, "type": bool},
2311        "vdom": {"required": False, "type": "str", "default": "root"},
2312        "system_modem": {
2313            "required": False, "type": "dict", "default": None,
2314            "options": {
2315            }
2316        }
2317    }
2318    for attribute_name in module_spec['options']:
2319        fields["system_modem"]['options'][attribute_name] = module_spec['options'][attribute_name]
2320        if mkeyname and mkeyname == attribute_name:
2321            fields["system_modem"]['options'][attribute_name]['required'] = True
2322
2323    check_legacy_fortiosapi()
2324    module = AnsibleModule(argument_spec=fields,
2325                           supports_check_mode=False)
2326
2327    versions_check_result = None
2328    if module._socket_path:
2329        connection = Connection(module._socket_path)
2330        if 'access_token' in module.params:
2331            connection.set_option('access_token', module.params['access_token'])
2332
2333        if 'enable_log' in module.params:
2334            connection.set_option('enable_log', module.params['enable_log'])
2335        else:
2336            connection.set_option('enable_log', False)
2337        fos = FortiOSHandler(connection, module, mkeyname)
2338        versions_check_result = check_schema_versioning(fos, versioned_schema, "system_modem")
2339
2340        is_error, has_changed, result = fortios_system(module.params, fos)
2341
2342    else:
2343        module.fail_json(**FAIL_SOCKET_MSG)
2344
2345    if versions_check_result and versions_check_result['matched'] is False:
2346        module.warn("Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv")
2347
2348    if not is_error:
2349        if versions_check_result and versions_check_result['matched'] is False:
2350            module.exit_json(changed=has_changed, version_check_warning=versions_check_result, meta=result)
2351        else:
2352            module.exit_json(changed=has_changed, meta=result)
2353    else:
2354        if versions_check_result and versions_check_result['matched'] is False:
2355            module.fail_json(msg="Error in repo", version_check_warning=versions_check_result, meta=result)
2356        else:
2357            module.fail_json(msg="Error in repo", meta=result)
2358
2359
2360if __name__ == '__main__':
2361    main()
2362