...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package sysfs
18
19 import (
20 "os"
21 "path/filepath"
22 "regexp"
23 )
24
25 const sasPortClassPath = "class/sas_port"
26
27 type SASPort struct {
28 Name string
29 SASPhys []string
30 Expanders []string
31 EndDevices []string
32 }
33
34 type SASPortClass map[string]*SASPort
35
36 var (
37 sasExpanderDeviceRegexp = regexp.MustCompile(`^expander-[0-9:]+$`)
38 sasEndDeviceRegexp = regexp.MustCompile(`^end_device-[0-9:]+$`)
39 )
40
41
42
43
44
45
46
47
48
49
50
51
52 func (fs FS) SASPortClass() (SASPortClass, error) {
53 path := fs.sys.Path(sasPortClassPath)
54
55 dirs, err := os.ReadDir(path)
56 if err != nil {
57 return nil, err
58 }
59
60 spc := make(SASPortClass, len(dirs))
61
62 for _, d := range dirs {
63 port, err := fs.parseSASPort(d.Name())
64 if err != nil {
65 return nil, err
66 }
67
68 spc[port.Name] = port
69 }
70
71 return spc, nil
72 }
73
74
75 func (fs FS) parseSASPort(name string) (*SASPort, error) {
76 port := SASPort{Name: name}
77
78 portpath := fs.sys.Path(filepath.Join(sasPortClassPath, name, "device"))
79
80 dirs, err := os.ReadDir(portpath)
81 if err != nil {
82 return nil, err
83 }
84
85 for _, d := range dirs {
86 if sasPhyDeviceRegexp.MatchString(d.Name()) {
87 port.SASPhys = append(port.SASPhys, d.Name())
88 }
89 if sasExpanderDeviceRegexp.MatchString(d.Name()) {
90 port.Expanders = append(port.Expanders, d.Name())
91 }
92 if sasEndDeviceRegexp.MatchString(d.Name()) {
93 port.EndDevices = append(port.EndDevices, d.Name())
94 }
95 }
96
97 return &port, nil
98 }
99
100
101 func (spc *SASPortClass) GetByName(name string) *SASPort {
102 return (*spc)[name]
103 }
104
105
106 func (spc *SASPortClass) GetByPhy(name string) *SASPort {
107 for _, d := range *spc {
108 for _, p := range d.SASPhys {
109 if p == name {
110 return d
111 }
112 }
113 }
114 return nil
115 }
116
117
118 func (spc *SASPortClass) GetByExpander(name string) *SASPort {
119 for _, d := range *spc {
120 for _, e := range d.Expanders {
121 if e == name {
122 return d
123 }
124 }
125 }
126 return nil
127 }
128
129
130 func (spc *SASPortClass) GetByEndDevice(name string) *SASPort {
131 for _, d := range *spc {
132 for _, e := range d.EndDevices {
133 if e == name {
134 return d
135 }
136 }
137 }
138 return nil
139 }
140
View as plain text