Skip to content

Commit

Permalink
linux/udev: fix udevadm info parser to not be fatal
Browse files Browse the repository at this point in the history
The current parser returns an error when it encounters newer prefix
values in the output of udevadm info.  Anytime a system upgrades to
a newer release, there is a change new fields will be present preventing
disko from producing any output.

- Update and document prefixes defined in systemd v255
- Replace error with an warning output
- make sure we have two tokens when parsing udevadm info output

Signed-off-by: Ryan Harper <[email protected]>
  • Loading branch information
raharper committed Feb 16, 2024
1 parent 7c6624f commit 0ef4318
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 4 deletions.
41 changes: 37 additions & 4 deletions linux/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,50 @@ func parseUdevInfo(out []byte, info *disko.UdevInfo) error {
}

toks = bytes.SplitN(line, []byte(": "), 2)
payload = string(toks[1])

if len(toks) != 2 {
log.Printf("parseUdevInfo: ignoring unparsable line %q\n", line)
continue

Check warning on line 54 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L53-L54

Added lines #L53 - L54 were not covered by tests
}

payload = string(toks[1])
switch toks[0][0] {
case 'P':
// Device path in /sys/
info.SysPath = payload
case 'M':
// Device name in /sys/ (i.e. the last component of "P:")
continue
case 'R':

Check warning on line 65 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L65

Added line #L65 was not covered by tests
// Device number in /sys/ (i.e. the numeric suffix of the last component of "P:")
continue
case 'U':

Check warning on line 68 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L67-L68

Added lines #L67 - L68 were not covered by tests
// Kernel subsystem
continue
case 'T':

Check warning on line 71 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L70-L71

Added lines #L70 - L71 were not covered by tests
// Kernel device type with subsystem
continue
case 'D':

Check warning on line 74 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L73-L74

Added lines #L73 - L74 were not covered by tests
// Kernel device node major/minor
continue
case 'I':

Check warning on line 77 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L76-L77

Added lines #L76 - L77 were not covered by tests
// Network interface index
continue

Check warning on line 79 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L79

Added line #L79 was not covered by tests
case 'N':
// Kernel device node name
info.Name = payload
case 'L':
// Device node symlink priority
continue
case 'S':
// Device node symlink
info.Symlinks = append(info.Symlinks, strings.Split(payload, " ")...)
case 'Q':

Check warning on line 89 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L89

Added line #L89 was not covered by tests
// Block device sequence number (DISKSEQ)
continue
case 'V':

Check warning on line 92 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L91-L92

Added lines #L91 - L92 were not covered by tests
// Attached driver
continue

Check warning on line 94 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L94

Added line #L94 was not covered by tests
case 'E':
kv := strings.SplitN(payload, "=", 2)
// use of Unquote is to decode \x20, \x2f and friends.
Expand All @@ -68,10 +103,8 @@ func parseUdevInfo(out []byte, info *disko.UdevInfo) error {
}

info.Properties[kv[0]] = strings.TrimSpace(s)
case 'L':
// a 'devlink priority'. skip for now.
default:
return fmt.Errorf("error parsing line: (%s)", line)
log.Printf("parseUdevInfo: ignoring unknown udevadm info prefix %q in %q\n", toks[0][0], line)

Check warning on line 107 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L107

Added line #L107 was not covered by tests
}
}

Expand Down
2 changes: 2 additions & 0 deletions linux/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
func TestParseUdevInfo(t *testing.T) {
data := []byte(`P: /devices/virtual/block/dm-0
N: dm-0
M: dm-0
S: disk/by-id/dm-name-nvme0n1p6_crypt
S: disk/by-id/dm-uuid-CRYPT-LUKS1-b174c64e7a714359a8b56b79fb66e92b-nvme0n1p6_crypt
S: disk/by-uuid/25df9069-80c7-46f4-a47c-305613c2cb6b
Expand Down Expand Up @@ -49,6 +50,7 @@ E: DEVNAME=/dev/dm-0
func TestParseUdevInfo2(t *testing.T) {
data := []byte(`P: /devices/pci0000:00/..../block/sda
N: sda
M: sda
S: disk/by-id/scsi-35000c500a0d8963f
S: disk/by-id/wwn-0x5000c500a0d8963f
S: disk/by-path/pci-0000:05:00.0-scsi-0:0:8:0
Expand Down

0 comments on commit 0ef4318

Please sign in to comment.