zahodi.ansible-mikrotik/library/mt_service.py

191 lines
4.6 KiB
Python
Raw Normal View History

2017-05-25 16:30:10 -07:00
# -*- coding: utf-8 -*-
DOCUMENTATION = '''
module: mt_service
author:
- "Valentin Gurmeza"
- "Shaun Smiley"
version_added: "2.3"
short_description: Manage mikrotik ip service
requirements:
- mt_api
description:
- enable, disable, or modify a ip service
options:
hostname:
description:
- hotstname of mikrotik router
required: True
username:
description:
- username used to connect to mikrotik router
required: True
password:
description:
- password used for authentication to mikrotik router
required: True
disabled:
description:
- service enabled or disabled
required: True
choices:
- no
- yes
name:
description:
- name of the service
required: True
choices:
- api
- api-ssl
- ftp
- ssh
- telnet
- winbox
- www
- www-ssl
address:
description:
- List of IP/IPv6 prefixes from which the service is accessible
certificate:
description:
- The name of the certificate used by particular service. Applicable only for services that depends on certificates (www-ssl, api-ssl)
port:
description:
- The port particular service listens on
'''
EXAMPLES = '''
- mt_service:
hostname: "{{ inventory_hostname }}"
username: "{{ mt_user }}"
password: "{{ mt_pass }}"
disabled: no
name: ftp
address: 192.168.52.3
'''
import mt_api
import re
from ansible.module_utils.basic import AnsibleModule
def main():
module = AnsibleModule(
argument_spec=dict(
hostname = dict(required=True),
username = dict(required=True),
password = dict(required=True),
interface = dict(required=False, type='str'),
address = dict(required=False, type='str'),
certificate= dict(required=False, type='str'),
name = dict(
required=True,
choices=[
'api',
'api-ssl',
'ftp',
'ssh',
'telnet',
'winbox',
'www',
'www-ssl'
],
type='str'
),
disabled=dict(
required = True,
choices = ['yes', 'no'],
type = 'str'
),
)
)
hostname = module.params['hostname']
username = module.params['username']
password = module.params['password']
ansible_service_name = module.params['name']
changed = False
msg = ""
mk = mt_api.Mikrotik(hostname, username, password)
try:
mk.login()
except:
module.fail_json(
msg="Could not log into Mikrotik device." +
" Check the username and password.",
)
service_path = '/ip/service'
response = mk.api_print(base_path=service_path)
service_params = module.params
mikrotik_service = {}
for item in response:
if 'name' in item[1].keys():
if ansible_service_name == item[1]['name']:
mikrotik_service = item[1]
#######################################
# remove keys with empty values
# remove unneeded parameters
# modify keys with '_' to match mikrotik parameters
# convert yes/no to true/false
######################################
remove_params = ['hostname', 'username', 'password']
for i in remove_params:
del service_params[i]
for key in service_params.keys():
if service_params[key] is None:
del service_params[key]
for key in service_params:
if service_params[key] == "yes":
service_params[key] = "true"
if service_params[key] == "no":
service_params[key] = "false"
if '.id' in mikrotik_service:
client_id = mikrotik_service['.id']
else:
client_id = False
service_diff_keys = {}
for key in service_params:
if key in mikrotik_service:
if service_params[key] != mikrotik_service[key]:
service_diff_keys[key] = service_params[key]
else:
service_diff_keys[key] = service_params[key]
if service_diff_keys == {}:
####################
# Already up date
###################
module.exit_json(
failed=False,
changed=False,
)
elif service_diff_keys != {}:
service_diff_keys['numbers'] = client_id
mk.api_edit(base_path=service_path, params=service_diff_keys)
module.exit_json(
failed=False,
changed=True,
msg="Changed service item: " + service_params['name'],
)
else:
####################
# Failure
###################
module.exit_json(
failed=True,
changed=False
)
if __name__ == '__main__':
main()