From 15de5fb5bbfe5f940555a883f1655043259e2ca2 Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Sat, 8 Apr 2023 12:54:42 +0200 Subject: [PATCH] Use HardwareAddress (MAC) for Identifing Hardware Interfaces --- client/src/definitions.ts | 2 +- internal/definitions/hardwareaddress.go | 30 +++++++++++++++++++ internal/definitions/interface.go | 10 +++---- .../template/rename-hardware.link.tmpl | 2 +- 4 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 internal/definitions/hardwareaddress.go diff --git a/client/src/definitions.ts b/client/src/definitions.ts index 46b324d..08e1150 100644 --- a/client/src/definitions.ts +++ b/client/src/definitions.ts @@ -44,7 +44,7 @@ export const editTypes: { [key: string]: { [key: string]: any } } = { fields: [ { key: "name", label: "Name", as: "TextBox", default: "placeholder" }, { key: "type", label: "Type", as: "PillBar", props: { options: [{ name: 'Hardware', key: 'hardware' }, { name: 'VLAN', key: 'vlan' }, { name: 'Bond', key: 'bond' }, { name: 'Bridge', key: 'bridge' }] } }, - { key: "hardware_interface", label: "Hardware Interface", as: "TextBox", enabled: (values: any) => (values["type"] == 'hardware') }, + { key: "hardware_address", label: "Hardware Address", as: "TextBox", enabled: (values: any) => (values["type"] == 'hardware') }, { key: "vlan_parent", label: "VLAN Parent", as: "TextBox", enabled: (values: any) => (values["type"] == 'vlan') }, { key: "vlan_id", label: "VLAN ID", as: "NumberBox", props: { min: 1, max: 4094 }, enabled: (values: any) => (values["type"] == 'vlan') }, { key: "bond_members", label: "Bond Members", as: "TextBox", enabled: (values: any) => (values["type"] == 'bond') }, diff --git a/internal/definitions/hardwareaddress.go b/internal/definitions/hardwareaddress.go new file mode 100644 index 0000000..07f3a67 --- /dev/null +++ b/internal/definitions/hardwareaddress.go @@ -0,0 +1,30 @@ +package definitions + +import ( + "encoding/json" + "net" +) + +type HardwareAddress struct { + net.HardwareAddr +} + +// MarshalJSON for IPCIDR +func (i HardwareAddress) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON for IPCIDR +func (i *HardwareAddress) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + mac, err := net.ParseMAC(s) + if err != nil { + return err + } + i.HardwareAddr = mac + return nil +} diff --git a/internal/definitions/interface.go b/internal/definitions/interface.go index 11f4e44..a5e1cfc 100644 --- a/internal/definitions/interface.go +++ b/internal/definitions/interface.go @@ -5,11 +5,11 @@ import ( ) type Interface struct { - Alias string `json:"alias,omitempty" validate:"min=0,max=3"` - Type InterfaceType `json:"type" validate:"min=0,max=3"` - AddressingMode InterfaceAddressingMode `json:"addressing_mode" validate:"min=0,max=2"` - Address *IPCIDR `json:"address,omitempty" validate:"excluded_unless=AddressingMode 1"` - HardwareInterface *string `json:"hardware_interface,omitempty"` + Alias string `json:"alias,omitempty" validate:"min=0,max=3"` + Type InterfaceType `json:"type" validate:"min=0,max=3"` + AddressingMode InterfaceAddressingMode `json:"addressing_mode" validate:"min=0,max=2"` + Address *IPCIDR `json:"address,omitempty" validate:"excluded_unless=AddressingMode 1"` + HardwareAddress *HardwareAddress `json:"hardware_address,omitempty"` // TODO fix Validator for int pointers with min=0,max=4094 VlanID *uint `json:"vlan_id,omitempty"` VlanParent *string `json:"vlan_parent,omitempty"` diff --git a/internal/networkd/template/rename-hardware.link.tmpl b/internal/networkd/template/rename-hardware.link.tmpl index 19c280e..05e5125 100644 --- a/internal/networkd/template/rename-hardware.link.tmpl +++ b/internal/networkd/template/rename-hardware.link.tmpl @@ -1,5 +1,5 @@ [Match] -OriginalName= {{ .HardwareInterface }} +PermanentMACAddress= {{ .HardwareAddress }} [Link] Name= {{ .Name }}