From 8adb22dc299310d4dfefd167dbbd8753fd113b7b Mon Sep 17 00:00:00 2001 From: Alexandre Ferreira Date: Tue, 18 May 2021 12:11:31 -0500 Subject: [PATCH] Fix access to files on subdirectorties on /dev --- README.md | 4 ++++ main.go | 41 +++++++++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 4993b46..cd292f2 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,10 @@ The smarter-device-manager starts by reading a YAML configuration file. This con nummaxdevices: 10 ``` +Devices in subdirectories have the slash replaced with underscore in the +resource name, due to kubernetes naming restrictions: e.g. `/dev/net/tun` +becomes `smarter-devices/net_tun`. + The default config file provided will enable most of the devices available on a Raspberry Pi (vers 1-4) or equivalent boards. I2C, SPI, video devices, sound and others would be enabled. The config file can be replaced using a configmap to enable or disable access to different devices, like accelerators, GPUs, etc. The node will show the devices it recognizes as resources in the node object in Kubernetes. The example below shows a raspberry PI. diff --git a/main.go b/main.go index 578a396..88ca27c 100644 --- a/main.go +++ b/main.go @@ -56,17 +56,33 @@ func init() { } func readDevDirectory(dirToList string) (files []string, err error) { - f, err := os.Open(dirToList) - if err != nil { - return nil, err - } - files, err = f.Readdirnames(-1) - f.Close() - if err != nil { - return nil, err - } + var foundFiles []string - return files, nil + f, err := os.Open(dirToList) + if err != nil { + return nil, err + } + files, err = f.Readdirnames(-1) + if err != nil { + f.Close() + return nil, err + } + f.Close() + for _, subDir := range files { + foundFiles = append(foundFiles, subDir) + filesDir, err := readDevDirectory(dirToList+"/"+subDir) + if err == nil { + for _, fileName := range filesDir { + foundFiles = append(foundFiles, subDir+"/"+fileName) + } + } + } + + return foundFiles, nil +} + +func sanitizeName(path string) string { + return strings.Replace(path, "/", "_" ,-1) } func findDevicesPattern(listDevices []string, pattern string) ([]string,error) { @@ -151,9 +167,10 @@ func main() { if len(foundDevices) > 0 { for _, deviceToCreate := range foundDevices { var newDevice DeviceInstance + deviceSafeName := sanitizeName(deviceToCreate) newDevice.deviceType = deviceFileType - newDevice.deviceName = "smarter-devices/" + deviceToCreate - newDevice.socketName = pluginapi.DevicePluginPath + "smarter-" + deviceToCreate + ".sock" + newDevice.deviceName = "smarter-devices/" + deviceSafeName + newDevice.socketName = pluginapi.DevicePluginPath + "smarter-" + deviceSafeName + ".sock" newDevice.deviceFile = "/dev/" + deviceToCreate newDevice.numDevices = deviceToTest.NumMaxDevices listDevicesAvailable = append(listDevicesAvailable, newDevice)