This repository has been archived by the owner on Apr 18, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
filesystem_firmware_store.go
143 lines (118 loc) · 4.2 KB
/
filesystem_firmware_store.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package internal
import (
"fmt"
"io/fs"
"os"
"path/filepath"
. "github.com/petewall/firmware-service/v2/lib"
)
type FilesystemFirmwareStore struct {
Path string
}
func (firmwareStore *FilesystemFirmwareStore) walk(path string) (FirmwareList, error) {
firmware := FirmwareList{}
err := filepath.WalkDir(path, func(path string, info fs.DirEntry, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
relative, err := filepath.Rel(firmwareStore.Path, path)
if err != nil {
return fmt.Errorf("failed to parse the relative directory structure of %s and %s: %w", path, firmwareStore.Path, err)
}
firmwareInfo, err := info.Info()
if err != nil {
return fmt.Errorf("failed to read firmware file info: %w", err)
}
firmwareType, firmwareVersion := filepath.Split(relative)
firmware = append(firmware, &Firmware{
Type: filepath.Dir(firmwareType),
Version: firmwareVersion,
Size: firmwareInfo.Size(),
})
return nil
})
return firmware, err
}
func (firmwareStore *FilesystemFirmwareStore) GetAllFirmware() (FirmwareList, error) {
firmware, err := firmwareStore.walk(firmwareStore.Path)
if err != nil {
return nil, fmt.Errorf("failed to read firmware store directory: %w", err)
}
return firmware, nil
}
func (firmwareStore *FilesystemFirmwareStore) GetAllTypes() ([]string, error) {
firmware, err := firmwareStore.walk(firmwareStore.Path)
if err != nil {
return nil, fmt.Errorf("failed to read firmware store directory: %w", err)
}
return firmware.GetUniqueTypes(), nil
}
func (firmwareStore *FilesystemFirmwareStore) GetAllFirmwareByType(firmwareType string) (FirmwareList, error) {
firmwareTypeDirectory := filepath.Join(firmwareStore.Path, firmwareType)
firmware, err := firmwareStore.walk(firmwareTypeDirectory)
if os.IsNotExist(err) {
return FirmwareList{}, nil
}
if err != nil {
return nil, fmt.Errorf("failed to read firmware store directory: %w", err)
}
return firmware, nil
}
func (firmwareStore *FilesystemFirmwareStore) GetFirmware(firmwareType, firmwareVersion string) (*Firmware, error) {
firmwareFile := filepath.Join(firmwareStore.Path, firmwareType, firmwareVersion)
info, err := os.Stat(firmwareFile)
if os.IsNotExist(err) {
return nil, nil
}
if err != nil {
return nil, fmt.Errorf("failed to read firmware %s %s: %w", firmwareType, firmwareVersion, err)
}
return &Firmware{
Type: firmwareType,
Version: firmwareVersion,
Size: info.Size(),
}, nil
}
func (firmwareStore *FilesystemFirmwareStore) GetFirmwareData(firmwareType, firmwareVersion string) ([]byte, error) {
firmwareFile := filepath.Join(firmwareStore.Path, firmwareType, firmwareVersion)
data, err := os.ReadFile(firmwareFile)
if os.IsNotExist(err) {
return []byte{}, nil
}
if err != nil {
return nil, fmt.Errorf("failed to read firmware %s %s: %w", firmwareType, firmwareVersion, err)
}
return data, nil
}
func (firmwareStore *FilesystemFirmwareStore) AddFirmware(firmwareType, firmwareVersion string, data []byte) error {
typeDirectory := filepath.Join(firmwareStore.Path, firmwareType)
err := os.Mkdir(typeDirectory, os.ModePerm)
if err != nil && !os.IsExist(err) {
return fmt.Errorf("failed to create firmware %s type directory: %w", firmwareType, err)
}
firmwareFile := filepath.Join(firmwareStore.Path, firmwareType, firmwareVersion)
_, err = os.Stat(firmwareFile)
if err == nil {
return fmt.Errorf("firmware %s %s already exists", firmwareType, firmwareVersion)
} else if err != nil && !os.IsNotExist(err) {
return fmt.Errorf("failed to check firmware %s %s: %w", firmwareType, firmwareVersion, err)
}
err = os.WriteFile(firmwareFile, data, 0644)
if err != nil {
return fmt.Errorf("failed to write firmware %s %s: %w", firmwareType, firmwareVersion, err)
}
return nil
}
func (firmwareStore *FilesystemFirmwareStore) DeleteFirmware(firmwareType, firmwareVersion string) error {
firmwareFile := filepath.Join(firmwareStore.Path, firmwareType, firmwareVersion)
err := os.Remove(firmwareFile)
if os.IsNotExist(err) {
return fmt.Errorf("firmware %s %s does not exist", firmwareType, firmwareVersion)
} else if err != nil {
return fmt.Errorf("failed to delete firmware %s %s: %w", firmwareType, firmwareVersion, err)
}
return nil
}