Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Some fixes & wireless interface support #567

Merged
merged 13 commits into from
Sep 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/module_testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ jobs:
os: [ubuntu-latest]
routeros_version:
- "7.12"
- "7.13"
- "7.14"
- "7.15"
- "7.16"

steps:
- name: Check out code into the Go module directory
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ For more in-depth documentation about each of the resources and datasources, ple

### Versions tested

- go 1.21 and ROS 7.12, 7.13, 7.14 (stable)
- go 1.21 and ROS 7.12, 7.15, 7.16 (stable)

## Changelog

Expand Down
3 changes: 3 additions & 0 deletions examples/resources/routeros_interface_wireless/import.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#The ID can be found via API or the terminal
#The command for the terminal is -> :put [/interface/wireless get [print show-ids]]
terraform import routeros_interface_wireless.test *3
17 changes: 17 additions & 0 deletions examples/resources/routeros_interface_wireless/resource.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
resource "routeros_interface_wireless_security_profiles" "test" {
name = "test-profile"
mode = "dynamic-keys"
authentication_types = ["wpa-psk", "wpa2-psk"]
wpa_pre_shared_key = "wpa_psk_key"
wpa2_pre_shared_key = "wpa2_psk_key"
}

resource "routeros_interface_wireless" "test" {
depends_on = [resource.routeros_interface_wireless_security_profiles.test]
security_profile = resource.routeros_interface_wireless_security_profiles.test.name
mode = "ap-bridge"
master_interface = "wlan1"
name = "wlan-guest"
ssid = "guests"
basic_rates_ag = ["6Mbps", "9Mbps"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#The ID can be found via API or the terminal
#The command for the terminal is -> :put [/interface/wireless/access-list get [print show-ids]]
terraform import routeros_interface_wireless_access_list.test *3
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
resource "routeros_interface_wireless_access_list" "test" {
signal_range = "-100..100"
time = "3h3m-5h,mon,tue,wed,thu,fri"
mac_address = "00:AA:BB:CC:DD:EE"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#The ID can be found via API or the terminal
#The command for the terminal is -> :put [/interface/wireless/security-profiles get [print show-ids]]
terraform import routeros_interface_wireless_security_profiles.test *3
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
resource "routeros_interface_wireless_security_profiles" "test" {
name = "test-profile"
mode = "dynamic-keys"
authentication_types = ["wpa-psk", "wpa2-psk"]
wpa_pre_shared_key = "wpa_psk_key"
wpa2_pre_shared_key = "wpa2_psk_key"
}
4 changes: 3 additions & 1 deletion examples/resources/routeros_tool_sniffer/resource.tf
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
resource "routeros_tool_sniffer" "test" {
enabled = true

streaming_enabled = true
streaming_server = "192.168.88.5:37008"
filter_stream = true

filter_interface = ["ether2"]
filter_direction = "rx"
filter_operator_between_entries = "and"
}
}
13 changes: 10 additions & 3 deletions routeros/mikrotik_serialize.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,9 @@ func TerraformResourceDataToMikrotik(s map[string]*schema.Schema, d *schema.Reso
var transformSet map[string]string
var skipFields, setUnsetFields map[string]struct{}

// {"channel.config": "channel", "schema-field-name": "mikrotik-field-name"}
// {"channel: channel.config", "datapath: datapath.config", "schema-field-name": "mikrotik-field-name"}
if ts, ok := s[MetaTransformSet]; ok {
transformSet = loadTransformSet(ts.Default.(string), true)
transformSet = loadTransformSet(ts.Default.(string), false)
}

// "field_first", "field_second", "field_third"
Expand Down Expand Up @@ -196,6 +196,13 @@ func TerraformResourceDataToMikrotik(s map[string]*schema.Schema, d *schema.Reso
mikrotikKebabName := SnakeToKebab(terraformSnakeName)
value := d.Get(terraformSnakeName)

// WiFi basic_rates_ag -> basic-rates-a/g
if transformSet != nil && terraformMetadata.Type != schema.TypeMap {
if new, ok := transformSet[terraformSnakeName]; ok {
mikrotikKebabName = SnakeToKebab(new)
}
}

switch terraformMetadata.Type {
case schema.TypeString:
if _, ok := setUnsetFields[terraformSnakeName]; ok && value.(string) == "" {
Expand Down Expand Up @@ -322,7 +329,7 @@ func MikrotikResourceDataToTerraform(item MikrotikItem, s map[string]*schema.Sch

// {"channel": "channel.config", "mikrotik-field-name": "schema-field-name"}
if ts, ok := s[MetaTransformSet]; ok {
transformSet = loadTransformSet(ts.Default.(string), false)
transformSet = loadTransformSet(ts.Default.(string), true)
}

// "field_first", "field_second", "field_third"
Expand Down
29 changes: 16 additions & 13 deletions routeros/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,37 +137,40 @@ func Provider() *schema.Provider {
"routeros_dns_record": ResourceDnsRecord(),

// Interface Objects
"routeros_interface_bridge": ResourceInterfaceBridge(),
"routeros_interface_bonding": ResourceInterfaceBonding(),
"routeros_interface_bridge_port": ResourceInterfaceBridgePort(),
"routeros_interface_bridge_vlan": ResourceInterfaceBridgeVlan(),
"routeros_interface_bridge_settings": ResourceInterfaceBridgeSettings(),
"routeros_interface_bridge_vlan": ResourceInterfaceBridgeVlan(),
"routeros_interface_bridge": ResourceInterfaceBridge(),
"routeros_interface_dot1x_client": ResourceInterfaceDot1xClient(),
"routeros_interface_dot1x_server": ResourceInterfaceDot1xServer(),
"routeros_interface_eoip": ResourceInterfaceEoip(),
"routeros_interface_ethernet": ResourceInterfaceEthernet(),
"routeros_interface_ethernet_switch": ResourceInterfaceEthernetSwitch(),
"routeros_interface_ethernet_switch_host": ResourceInterfaceEthernetSwitchHost(),
"routeros_interface_ethernet_switch_port": ResourceInterfaceEthernetSwitchPort(),
"routeros_interface_ethernet_switch_port_isolation": ResourceInterfaceEthernetSwitchPortIsolation(),
"routeros_interface_ethernet_switch_vlan": ResourceInterfaceEthernetSwitchVlan(),
"routeros_interface_ethernet_switch_rule": ResourceInterfaceEthernetSwitchRule(),
"routeros_interface_ethernet_switch_vlan": ResourceInterfaceEthernetSwitchVlan(),
"routeros_interface_gre": ResourceInterfaceGre(),
"routeros_interface_macvlan": ResourceInterfaceMacVlan(),
"routeros_interface_ipip": ResourceInterfaceIPIP(),
"routeros_interface_vlan": ResourceInterfaceVlan(),
"routeros_interface_vrrp": ResourceInterfaceVrrp(),
"routeros_interface_wireguard": ResourceInterfaceWireguard(),
"routeros_interface_wireguard_peer": ResourceInterfaceWireguardPeer(),
"routeros_interface_wireless_cap": ResourceInterfaceWirelessCap(),
"routeros_interface_list": ResourceInterfaceList(),
"routeros_interface_list_member": ResourceInterfaceListMember(),
"routeros_interface_lte": ResourceInterfaceLte(),
"routeros_interface_lte_apn": ResourceInterfaceLteApn(),
"routeros_interface_ovpn_server": ResourceInterfaceOpenVPNServer(),
"routeros_interface_macvlan": ResourceInterfaceMacVlan(),
"routeros_interface_ovpn_client": ResourceOpenVPNClient(),
"routeros_interface_veth": ResourceInterfaceVeth(),
"routeros_interface_bonding": ResourceInterfaceBonding(),
"routeros_interface_ovpn_server": ResourceInterfaceOpenVPNServer(),
"routeros_interface_pppoe_client": ResourceInterfacePPPoEClient(),
"routeros_interface_ethernet": ResourceInterfaceEthernet(),
"routeros_interface_veth": ResourceInterfaceVeth(),
"routeros_interface_vlan": ResourceInterfaceVlan(),
"routeros_interface_vrrp": ResourceInterfaceVrrp(),
"routeros_interface_wireguard": ResourceInterfaceWireguard(),
"routeros_interface_wireguard_peer": ResourceInterfaceWireguardPeer(),
"routeros_interface_wireless": ResourceInterfaceWireless(),
"routeros_interface_wireless_access_list": ResourceInterfaceWirelessAccessList(),
"routeros_interface_wireless_cap": ResourceInterfaceWirelessCap(),
"routeros_interface_wireless_security_profiles": ResourceInterfaceWirelessSecurityProfiles(),

// Aliases for interface objects to retain compatibility between original and fork
"routeros_bridge": ResourceInterfaceBridge(),
Expand Down
8 changes: 7 additions & 1 deletion routeros/provider_schema_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ const (
KeyArpTimeout = "arp_timeout"
KeyClampTcpMss = "clamp_tcp_mss"
KeyComment = "comment"
KeyDefault = "default"
KeyDynamic = "dynamic"
KeyDefaultName = "default_name"
KeyDisabled = "disabled"
Expand Down Expand Up @@ -108,7 +109,7 @@ func PropDropByValue(s ...string) *schema.Schema {
}
}

// PropTransformSet List of []string{"TF", "MT"} string pairs.
// PropTransformSet List of []string{"TF : MT", "TF : MT", ...} string pairs.
func PropTransformSet(s ...string) *schema.Schema {
return &schema.Schema{
Type: schema.TypeString,
Expand Down Expand Up @@ -255,6 +256,11 @@ var (
Optional: true,
DiffSuppressFunc: AlwaysPresentNotUserProvided,
}
PropDefaultRo = &schema.Schema{
Type: schema.TypeBool,
Computed: true,
Description: "It's the default item.",
}
PropDontFragmentRw = &schema.Schema{
Type: schema.TypeString,
Optional: true,
Expand Down
5 changes: 1 addition & 4 deletions routeros/resource_bgp_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,7 @@ func ResourceRoutingBGPTemplate() *schema.Resource {
ValidateFunc: validation.IsIPv4Address,
},
KeyComment: PropCommentRw,
"default": {
Type: schema.TypeBool,
Computed: true,
},
KeyDefault: PropDefaultRo,
KeyDisabled: PropDisabledRw,
// hold-time ( time[3s..1h] | infinity ; Default: 3m )
"hold_time": {
Expand Down
4 changes: 2 additions & 2 deletions routeros/resource_capsman_configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ func ResourceCapsManConfiguration() *schema.Resource {
resSchema := map[string]*schema.Schema{
MetaResourcePath: PropResourcePath("/caps-man/configuration"),
MetaId: PropId(Id),
MetaTransformSet: PropTransformSet("channel: channel.config", "datapath: datapath.config",
"rates: rates.config", "security: security.config"),
MetaTransformSet: PropTransformSet("channel.config: channel", "datapath.config: datapath",
"rates.config: rates", "security.config: security"),

"channel": {
Type: schema.TypeMap,
Expand Down
4 changes: 2 additions & 2 deletions routeros/resource_capsman_configuration_v0.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ func ResourceCapsManConfigurationV0() *schema.Resource {
Schema: map[string]*schema.Schema{
MetaResourcePath: PropResourcePath("/caps-man/configuration"),
MetaId: PropId(Name),
MetaTransformSet: PropTransformSet("channel: channel.config", "datapath: datapath.config",
"rates: rates.config", "security: security.config"),
MetaTransformSet: PropTransformSet("channel.config: channel", "datapath.config: datapath",
"rates.config: rates", "security.config: security"),

"channel": {
Type: schema.TypeMap,
Expand Down
4 changes: 2 additions & 2 deletions routeros/resource_capsman_interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ func ResourceCapsManInterface() *schema.Resource {
MetaId: PropId(Id),
MetaSkipFields: PropSkipFields("current_authorized_clients", "current_basic_rate_set", "current_channel",
"current_rate_set", "current_registered_clients", "current_state"),
MetaTransformSet: PropTransformSet("channel: channel.config", "configuration: configuration.config",
"datapath: datapath.config", "rates: rates.config", "security: security.config"),
MetaTransformSet: PropTransformSet("channel.config: channel", "datapath.config: datapath",
"rates.config: rates", "security.config: security"),

KeyArpTimeout: PropArpTimeoutRw,
"bound": {
Expand Down
7 changes: 2 additions & 5 deletions routeros/resource_capsman_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,8 @@ func ResourceCapsManManagerInterface() *schema.Resource {
MetaResourcePath: PropResourcePath("/caps-man/manager/interface"),
MetaId: PropId(Id),

KeyComment: PropCommentRw,
"default": {
Type: schema.TypeBool,
Computed: true,
},
KeyComment: PropCommentRw,
KeyDefault: PropDefaultRo,
KeyDisabled: PropDisabledRw,
KeyDynamic: PropDynamicRo,
"forbid": {
Expand Down
5 changes: 1 addition & 4 deletions routeros/resource_interface_lte_apn.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,7 @@ func ResourceInterfaceLteApn() *schema.Resource {
DiffSuppressFunc: AlwaysPresentNotUserProvided,
},
KeyComment: PropCommentRw,
"default": {
Type: schema.TypeBool,
Computed: true,
},
KeyDefault: PropDefaultRo,
"default_route_distance": {
Type: schema.TypeInt,
Optional: true,
Expand Down
Loading