zahodi.ansible-mikrotik/library/mt_ip_pool.py
2017-05-25 16:30:10 -07:00

202 lines
5.7 KiB
Python

# -*- coding: utf-8 -*-
DOCUMENTATION = '''
module: mt_dhcp_server
author:
- "Valentin Gurmeza"
- "Shaun Smiley"
version_added: "2.3"
short_description: Manage mikrotik ip pools
requirements:
- mt_api
description:
- Add or remove ip pool
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
state:
description:
- ip pool present or absent
required: True
name:
description:
- name of the ip pool
required: True
ranges:
description:
- IP address list of non-overlapping IP address ranges
required: False
next_pool:
description:
- When address is acquired from pool that has no free addresses, and next_pool property is set to another pool, then next IP address will be acquired from next_pool
required: False
'''
EXAMPLES = '''
# Add a new dhcp server
- mt_dhcp_server:
hostname: "{{ inventory_hostname }}"
username: "{{ mt_user }}"
password: "{{ mt_pass }}"
state: present
name: ansible_test
address_pool: 'pool1'
interface: vlan15
'''
import mt_api
from ansible.module_utils.basic import AnsibleModule
import re
def main():
module = AnsibleModule(
argument_spec=dict(
hostname=dict(required=True),
username=dict(required=True),
password=dict(required=True),
name=dict(required=True, type='str'),
ranges=dict(required=False, type='str'),
next_pool=dict(required=False, type='str'),
state=dict(
required = True,
choices = ['present', 'absent'],
type = 'str'
)
)
)
hostname = module.params['hostname']
username = module.params['username']
password = module.params['password']
ip_pool_name = module.params['name']
state = module.params['state']
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.",
)
ip_pool_path = '/ip/pool'
response = mk.api_print(base_path=ip_pool_path)
ip_pool_params = module.params
mikrotik_ip_pool= {}
for item in response:
if 'name' in item[1]:
if ip_pool_name == item[1]['name']:
ip_pool_name = item[1]['name']
mikrotik_ip_pool = item[1]
#################################################################
# Since we are grabbing all the parameters passed by the module
# We need to remove the one that won't be used
# as mikrotik parameters
#################################################
remove_params = ['hostname', 'username', 'password', 'state']
for i in remove_params:
ip_pool_params.pop(i)
#######################################
# remove keys with empty values
# convert vars with '_' to '-'
# convert yes/no to true/false
######################################
for key in ip_pool_params.keys():
if ip_pool_params[key] is None:
ip_pool_params.pop(key)
for key in ip_pool_params.keys():
new_key = re.sub('_','-', key)
if new_key != key:
ip_pool_params[new_key] = ip_pool_params[key]
del ip_pool_params[key]
for key in ip_pool_params:
if ip_pool_params[key] == "yes":
ip_pool_params[key] = "true"
if ip_pool_params[key] == "no":
ip_pool_params[key] = "false"
##########################################################
# Define client_id to be used by remove and edit function
##########################################################
if '.id' in mikrotik_ip_pool:
client_id = mikrotik_ip_pool['.id']
else:
client_id = False
if state == "present":
if mikrotik_ip_pool == {}:
mk.api_add(base_path=ip_pool_path, params=ip_pool_params)
module.exit_json(
failed=False,
changed=True,
msg="Added dhcp server " + ip_pool_name
)
###################################################
# If an item exists we check if all the parameters
# match what we have in ansible
######################################
else:
ip_pool_diff_keys = {}
for key in ip_pool_params:
if key in mikrotik_ip_pool:
if ip_pool_params[key] != mikrotik_ip_pool[key]:
ip_pool_diff_keys[key] = ip_pool_params[key]
else:
ip_pool_diff_keys[key] = ip_pool_params[key]
if ip_pool_diff_keys != {}:
ip_pool_diff_keys['numbers'] = client_id
mk.api_edit(base_path=ip_pool_path, params=ip_pool_diff_keys)
module.exit_json(
failed=False,
changed=True,
msg="Changed dhcp sever item: " + ip_pool_params['name'],
)
else:
####################
# Already up date
module.exit_json(
failed=False,
changed=False,
)
elif state == "absent":
if client_id:
mk.api_remove(base_path=ip_pool_path, remove_id=client_id)
module.exit_json(
failed=False,
changed=True,
msg=ip_pool_params['name'] + " removed"
)
#####################################################
# if client_id is not set there is nothing to remove
#####################################################
else:
module.exit_json(
failed=False,
changed=False,
ms=mikrotik_ip_pool
)
else:
module.exit_json(
failed=True,
changed=False,
)
if __name__ == '__main__':
main()