Add networking (#1)

Initial commit of network content that was previously in community.general
This commit is contained in:
John R Barker 2020-04-06 14:17:43 +01:00 committed by Felix Fontein
commit bcfea39ddc
22 changed files with 1481 additions and 0 deletions

View file

View file

@ -0,0 +1,26 @@
# sep/25/2018 10:10:52 by RouterOS 6.42.5
# software id = 9EER-511K
#
#
#
/interface wireless security-profiles
set [ find default=yes ] supplicant-identity=MikroTik
/tool user-manager customer
set admin access=own-routers,own-users,own-profiles,own-limits,config-payment-gw
/ip address
add address=192.168.88.1/24 comment=defconf interface=ether1 network=192.168.88.0
/ip dhcp-client
add dhcp-options=hostname,clientid disabled=no interface=ether1
/system lcd
set contrast=0 enabled=no port=parallel type=24x4
/system lcd page
set time disabled=yes display-time=5s
set resources disabled=yes display-time=5s
set uptime disabled=yes display-time=5s
set packets disabled=yes display-time=5s
set bits disabled=yes display-time=5s
set version disabled=yes display-time=5s
set identity disabled=yes display-time=5s
set ether1 disabled=yes display-time=5s
/tool user-manager database
set db-path=user-manager

View file

@ -0,0 +1,34 @@
Flags: D - dynamic, X - disabled, R - running, S - slave
0 R name="ether1" default-name="ether1" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:90 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
1 R name="ether2" default-name="ether2" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:91 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
2 R name="ether3" default-name="ether3" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:92 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
3 R name="ether4" default-name="ether4" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:93 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
4 R name="ether5" default-name="ether5" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:94 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
5 R name="ether6" default-name="ether6" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:95 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
6 R name="ether7" default-name="ether7" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:96 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
7 R name="ether8" default-name="ether8" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:97 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
8 R name="ether9" default-name="ether9" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:98 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
9 R name="ether10" default-name="ether10" type="ether" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:99 last-link-up-time=sep/25/2018 06:30:04
link-downs=0
10 R name="pppoe" default-name="pppoe" type="ppp" mtu=1500 actual-mtu=1500
mac-address=00:1C:42:36:52:00 last-link-up-time=sep/25/2018 06:30:04
link-downs=0

View file

@ -0,0 +1,10 @@
Flags: X - disabled, I - invalid, D - dynamic
0 ;;; defconf
address=192.168.88.1/24 network=192.168.88.0 interface=ether1
actual-interface=ether1
1 D address=10.37.129.3/24 network=10.37.129.0 interface=ether1
actual-interface=ether1
2 D address=10.37.0.0/24 network=10.37.0.1 interface=pppoe
actual-interface=pppoe

View file

@ -0,0 +1,15 @@
0 interface=ether2-master address=10.37.129.3 address4=10.37.129.3 mac-address=D4:CA:6D:C6:16:4C identity="router1" platform="MikroTik" version="6.42.2 (stable)" unpack=none age=59s
uptime=3w19h11m36s software-id="1234-1234" board="RBwAPG-5HacT2HnD" interface-name="bridge" system-description="MikroTik RouterOS 6.42.2 (stable) RBwAPG-5HacT2HnD"
system-caps="" system-caps-enabled=""
1 interface=ether3 address=10.37.129.4 address4=10.37.129.4 mac-address=D4:CA:6D:C6:18:2F identity="router2" platform="MikroTik" version="6.42.2 (stable)" unpack=none age=54s
uptime=3w19h11m30s software-id="1234-1234" board="RBwAPG-5HacT2HnD" ipv6=no interface-name="bridge" system-description="MikroTik RouterOS 6.42.2 (stable) RBwAPG-5HacT2HnD"
system-caps="" system-caps-enabled=""
2 interface=ether5 address=10.37.129.5 address4=10.37.129.5 mac-address=B8:69:F4:37:F0:C8 identity="router3" platform="MikroTik" version="6.40.8 (bugfix)" unpack=none age=43s
uptime=3d14h25m31s software-id="1234-1234" board="RB960PGS" interface-name="ether1" system-description="MikroTik RouterOS 6.40.8 (bugfix) RB960PGS" system-caps=""
system-caps-enabled=""
3 interface=ether10 address=10.37.129.6 address4=10.37.129.6 mac-address=6C:3B:6B:A1:0B:63 identity="router4" platform="MikroTik" version="6.42.2 (stable)" unpack=none age=54s
uptime=3w6d1h11m44s software-id="1234-1234" board="RBSXTLTE3-7" interface-name="bridge" system-description="MikroTik RouterOS 6.42.2 (stable) RBSXTLTE3-7" system-caps=""
system-caps-enabled=""

View file

@ -0,0 +1,3 @@
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
0 DL address=fe80::21c:42ff:fe36:5290/64 from-pool="" interface=ether1
actual-interface=ether1 eui-64=no advertise=no no-dad=no

View file

@ -0,0 +1 @@
bad command name address (line 1 column 7)

View file

@ -0,0 +1 @@
name: MikroTik

View file

@ -0,0 +1,16 @@
uptime: 3h28m52s
version: 6.42.5 (stable)
build-time: Jun/26/2018 12:12:08
free-memory: 988.3MiB
total-memory: 1010.8MiB
cpu: Intel(R)
cpu-count: 2
cpu-frequency: 2496MHz
cpu-load: 0%
free-hdd-space: 63.4GiB
total-hdd-space: 63.5GiB
write-sect-since-reboot: 4576
write-sect-total: 4576
architecture-name: x86
board-name: x86
platform: MikroTik

View file

@ -0,0 +1,7 @@
routerboard: yes
model: RouterBOARD 3011UiAS
serial-number: 1234567890
firmware-type: ipq8060
factory-firmware: 3.41
current-firmware: 3.41
upgrade-firmware: 6.42.2

View file

@ -0,0 +1,106 @@
MMM MMM KKK TTTTTTTTTTT KKK
MMMM MMMM KKK TTTTTTTTTTT KKK
MMM MMMM MMM III KKK KKK RRRRRR OOOOOO TTT III KKK KKK
MMM MM MMM III KKKKK RRR RRR OOO OOO TTT III KKKKK
MMM MMM III KKK KKK RRRRRR OOO OOO TTT III KKK KKK
MMM MMM III KKK KKK RRR RRR OOOOOO TTT III KKK KKK
MikroTik RouterOS 6.42.5 (c) 1999-2018 http://www.mikrotik.com/
[?] Gives the list of available commands
command [?] Gives help on the command and list of arguments
[Tab] Completes the command/word. If the input is ambiguous,
a second [Tab] gives possible options
/ Move up to base level
.. Move up one level
/command Use command at the base level

Z <[?47l[?7h[?5l[?25h
[admin@MainRouter] >
[admin@MainRouter] > /system routerboard print
[admin@MainRouter] > /system routerboard print
routerboard: yes
model: 750GL
serial-number: 1234567890AB
firmware-type: ar7240
factory-firmware: 3.09
current-firmware: 6.41.2
upgrade-firmware: 6.42.5
[admin@MainRouter] >
[admin@MainRouter] > /system identity print
[admin@MainRouter] > /system identity print
name: MikroTik
[admin@MainRouter] >
[admin@MainRouter] > /system package print
[admin@MainRouter] > /system package print
Flags: X - disabled
 # NAME VERSION SCHEDULED
 0 routeros-mipsbe 6.42.5
1 system 6.42.5
2 ipv6 6.42.5
3 wireless 6.42.5
4 hotspot 6.42.5
5 dhcp 6.42.5
6 mpls 6.42.5
7 routing 6.42.5
8 ppp 6.42.5
9 security 6.42.5
10 advanced-tools 6.42.5
[admin@MainRouter] >
[admin@MainRouter] >

View file

@ -0,0 +1,17 @@
[admin@RB1100test] /system resource> print
uptime: 2w1d23h34m57s
version: "5.0rc1"
free-memory: 385272KiB
total-memory: 516708KiB
cpu: "e500v2"
cpu-count: 1
cpu-frequency: 799MHz
cpu-load: 9%
free-hdd-space: 466328KiB
total-hdd-space: 520192KiB
write-sect-since-reboot: 1411
write-sect-total: 70625
bad-blocks: 0.2%
architecture-name: "powerpc"
board-name: "RB1100"
platform: "MikroTik"

View file

@ -0,0 +1,88 @@
# (c) 2016 Red Hat Inc.
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# Make coding more python3-ish
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import json
from ansible_collections.community.routeros.tests.unit.plugins.modules.utils import AnsibleExitJson, AnsibleFailJson, ModuleTestCase
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
fixture_data = {}
def load_fixture(name):
path = os.path.join(fixture_path, name)
if path in fixture_data:
return fixture_data[path]
with open(path) as f:
data = f.read()
try:
data = json.loads(data)
except Exception:
pass
fixture_data[path] = data
return data
class TestRouterosModule(ModuleTestCase):
def execute_module(self, failed=False, changed=False, commands=None, sort=True, defaults=False):
self.load_fixtures(commands)
if failed:
result = self.failed()
self.assertTrue(result['failed'], result)
else:
result = self.changed(changed)
self.assertEqual(result['changed'], changed, result)
if commands is not None:
if sort:
self.assertEqual(sorted(commands), sorted(result['commands']), result['commands'])
else:
self.assertEqual(commands, result['commands'], result['commands'])
return result
def failed(self):
with self.assertRaises(AnsibleFailJson) as exc:
self.module.main()
result = exc.exception.args[0]
self.assertTrue(result['failed'], result)
return result
def changed(self, changed=False):
with self.assertRaises(AnsibleExitJson) as exc:
self.module.main()
result = exc.exception.args[0]
self.assertEqual(result['changed'], changed, result)
return result
def load_fixtures(self, commands=None):
pass

View file

@ -0,0 +1,113 @@
# (c) 2016 Red Hat Inc.
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# Make coding more python3-ish
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import json
from ansible_collections.community.routeros.tests.unit.compat.mock import patch
from ansible_collections.community.routeros.plugins.modules import command
from ansible_collections.community.routeros.tests.unit.plugins.modules.utils import set_module_args
from .routeros_module import TestRouterosModule, load_fixture
class TestRouterosCommandModule(TestRouterosModule):
module = command
def setUp(self):
super(TestRouterosCommandModule, self).setUp()
self.mock_run_commands = patch('ansible_collections.community.routeros.plugins.modules.command.run_commands')
self.run_commands = self.mock_run_commands.start()
def tearDown(self):
super(TestRouterosCommandModule, self).tearDown()
self.mock_run_commands.stop()
def load_fixtures(self, commands=None):
def load_from_file(*args, **kwargs):
module, commands = args
output = list()
for item in commands:
try:
obj = json.loads(item)
command = obj
except ValueError:
command = item
filename = str(command).replace(' ', '_').replace('/', '')
output.append(load_fixture(filename))
return output
self.run_commands.side_effect = load_from_file
def test_command_simple(self):
set_module_args(dict(commands=['/system resource print']))
result = self.execute_module()
self.assertEqual(len(result['stdout']), 1)
self.assertTrue('platform: "MikroTik"' in result['stdout'][0])
def test_command_multiple(self):
set_module_args(dict(commands=['/system resource print', '/system resource print']))
result = self.execute_module()
self.assertEqual(len(result['stdout']), 2)
self.assertTrue('platform: "MikroTik"' in result['stdout'][0])
def test_command_wait_for(self):
wait_for = 'result[0] contains "MikroTik"'
set_module_args(dict(commands=['/system resource print'], wait_for=wait_for))
self.execute_module()
def test_command_wait_for_fails(self):
wait_for = 'result[0] contains "test string"'
set_module_args(dict(commands=['/system resource print'], wait_for=wait_for))
self.execute_module(failed=True)
self.assertEqual(self.run_commands.call_count, 10)
def test_command_retries(self):
wait_for = 'result[0] contains "test string"'
set_module_args(dict(commands=['/system resource print'], wait_for=wait_for, retries=2))
self.execute_module(failed=True)
self.assertEqual(self.run_commands.call_count, 2)
def test_command_match_any(self):
wait_for = ['result[0] contains "MikroTik"',
'result[0] contains "test string"']
set_module_args(dict(commands=['/system resource print'], wait_for=wait_for, match='any'))
self.execute_module()
def test_command_match_all(self):
wait_for = ['result[0] contains "MikroTik"',
'result[0] contains "RB1100"']
set_module_args(dict(commands=['/system resource print'], wait_for=wait_for, match='all'))
self.execute_module()
def test_command_match_all_failure(self):
wait_for = ['result[0] contains "MikroTik"',
'result[0] contains "test string"']
commands = ['/system resource print', '/system resource print']
set_module_args(dict(commands=commands, wait_for=wait_for, match='all'))
self.execute_module(failed=True)
def test_command_wait_for_2(self):
wait_for = 'result[0] contains "wireless"'
set_module_args(dict(commands=['/system package print'], wait_for=wait_for))
self.execute_module()

View file

@ -0,0 +1,119 @@
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# Make coding more python3-ish
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from ansible_collections.community.routeros.tests.unit.compat.mock import patch
from ansible_collections.community.routeros.plugins.modules import facts
from ansible_collections.community.routeros.tests.unit.plugins.modules.utils import set_module_args
from .routeros_module import TestRouterosModule, load_fixture
class TestRouterosFactsModule(TestRouterosModule):
module = facts
def setUp(self):
super(TestRouterosFactsModule, self).setUp()
self.mock_run_commands = patch('ansible_collections.community.routeros.plugins.modules.facts.run_commands')
self.run_commands = self.mock_run_commands.start()
def tearDown(self):
super(TestRouterosFactsModule, self).tearDown()
self.mock_run_commands.stop()
def load_fixtures(self, commands=None):
def load_from_file(*args, **kwargs):
module = args
commands = kwargs['commands']
output = list()
for command in commands:
filename = str(command).split(' | ')[0].replace(' ', '_')
output.append(load_fixture('facts%s' % filename))
return output
self.run_commands.side_effect = load_from_file
def test_facts_default(self):
set_module_args(dict(gather_subset='default'))
result = self.execute_module()
self.assertEqual(
result['ansible_facts']['ansible_net_hostname'], 'MikroTik'
)
self.assertEqual(
result['ansible_facts']['ansible_net_version'], '6.42.5 (stable)'
)
self.assertEqual(
result['ansible_facts']['ansible_net_model'], 'RouterBOARD 3011UiAS'
)
self.assertEqual(
result['ansible_facts']['ansible_net_serialnum'], '1234567890'
)
def test_facts_hardware(self):
set_module_args(dict(gather_subset='hardware'))
result = self.execute_module()
self.assertEqual(
result['ansible_facts']['ansible_net_spacefree_mb'], 64921.6
)
self.assertEqual(
result['ansible_facts']['ansible_net_spacetotal_mb'], 65024.0
)
self.assertEqual(
result['ansible_facts']['ansible_net_memfree_mb'], 988.3
)
self.assertEqual(
result['ansible_facts']['ansible_net_memtotal_mb'], 1010.8
)
def test_facts_config(self):
set_module_args(dict(gather_subset='config'))
result = self.execute_module()
self.assertIsInstance(
result['ansible_facts']['ansible_net_config'], str
)
def test_facts_interfaces(self):
set_module_args(dict(gather_subset='interfaces'))
result = self.execute_module()
self.assertIn(
result['ansible_facts']['ansible_net_all_ipv4_addresses'][0], ['10.37.129.3', '10.37.0.0']
)
self.assertEqual(
result['ansible_facts']['ansible_net_all_ipv6_addresses'], ['fe80::21c:42ff:fe36:5290']
)
self.assertEqual(
result['ansible_facts']['ansible_net_all_ipv6_addresses'][0],
result['ansible_facts']['ansible_net_interfaces']['ether1']['ipv6'][0]['address']
)
self.assertEqual(
len(result['ansible_facts']['ansible_net_interfaces'].keys()), 11
)
self.assertEqual(
len(result['ansible_facts']['ansible_net_neighbors'].keys()), 4
)
def test_facts_interfaces_no_ipv6(self):
fixture = load_fixture(
'facts/ipv6_address_print_detail_without-paging_no-ipv6'
)
interfaces = self.module.Interfaces(module=self.module)
addresses = interfaces.parse_addresses(data=fixture)
result = interfaces.populate_ipv6_interfaces(data=addresses)
self.assertEqual(result, None)