1
1
package system
2
2
3
3
import (
4
- "encoding/json"
5
4
"fmt"
6
- "os/exec"
7
- "strings"
8
5
6
+ "github.com/kubernetes-csi/csi-proxy/pkg/cim"
7
+ "github.com/kubernetes-csi/csi-proxy/pkg/server/system/impl"
9
8
"github.com/kubernetes-csi/csi-proxy/pkg/utils"
10
9
)
11
10
@@ -25,52 +24,85 @@ type ServiceInfo struct {
25
24
Status uint32 `json:"Status"`
26
25
}
27
26
27
+ var (
28
+ startModeMappings = map [string ]uint32 {
29
+ "Boot" : impl .START_TYPE_BOOT ,
30
+ "System" : impl .START_TYPE_SYSTEM ,
31
+ "Auto" : impl .START_TYPE_AUTOMATIC ,
32
+ "Manual" : impl .START_TYPE_MANUAL ,
33
+ "Disabled" : impl .START_TYPE_DISABLED ,
34
+ }
35
+
36
+ statusMappings = map [string ]uint32 {
37
+ "Unknown" : impl .SERVICE_STATUS_UNKNOWN ,
38
+ "Stopped" : impl .SERVICE_STATUS_STOPPED ,
39
+ "Start Pending" : impl .SERVICE_STATUS_START_PENDING ,
40
+ "Stop Pending" : impl .SERVICE_STATUS_STOP_PENDING ,
41
+ "Running" : impl .SERVICE_STATUS_RUNNING ,
42
+ "Continue Pending" : impl .SERVICE_STATUS_CONTINUE_PENDING ,
43
+ "Pause Pending" : impl .SERVICE_STATUS_PAUSE_PENDING ,
44
+ "Paused" : impl .SERVICE_STATUS_PAUSED ,
45
+ }
46
+ )
47
+
48
+ func serviceStartModeToStartType (startMode string ) uint32 {
49
+ return startModeMappings [startMode ]
50
+ }
51
+
52
+ func serviceState (status string ) uint32 {
53
+ return statusMappings [status ]
54
+ }
55
+
28
56
type APIImplementor struct {}
29
57
30
58
func New () APIImplementor {
31
59
return APIImplementor {}
32
60
}
33
61
34
62
func (APIImplementor ) GetBIOSSerialNumber () (string , error ) {
35
- // Taken from Kubernetes vSphere cloud provider
36
- // https://github.com/kubernetes/kubernetes/blob/103e926604de6f79161b78af3e792d0ed282bc06/staging/src/k8s.io/legacy-cloud-providers/vsphere/vsphere_util_windows.go#L28
37
- result , err := exec .Command ("wmic" , "bios" , "get" , "serialnumber" ).Output ()
63
+ bios , err := cim .QueryBIOSElement ([]string {"SerialNumber" })
38
64
if err != nil {
39
- return "" , err
65
+ return "" , fmt . Errorf ( "failed to get BIOS element: %w" , err )
40
66
}
41
- lines := strings .FieldsFunc (string (result ), func (r rune ) bool {
42
- switch r {
43
- case '\n' , '\r' :
44
- return true
45
- default :
46
- return false
47
- }
48
- })
49
- if len (lines ) != 2 {
50
- return "" , fmt .Errorf ("received unexpected value retrieving host uuid: %q" , string (result ))
67
+
68
+ sn , err := bios .GetPropertySerialNumber ()
69
+ if err != nil {
70
+ return "" , fmt .Errorf ("failed to get BIOS serial number property: %w" , err )
51
71
}
52
- return lines [1 ], nil
72
+
73
+ return sn , nil
53
74
}
54
75
55
76
func (APIImplementor ) GetService (name string ) (* ServiceInfo , error ) {
56
- script := `Get-Service -Name $env:ServiceName | Select-Object DisplayName, Status, StartType | ` +
57
- `ConvertTo-JSON`
58
- cmdEnv := fmt .Sprintf ("ServiceName=%s" , name )
59
- out , err := utils .RunPowershellCmd (script , cmdEnv )
77
+ service , err := cim .QueryServiceByName (name , []string {"DisplayName" , "State" , "StartMode" })
78
+ if err != nil {
79
+ return nil , fmt .Errorf ("failed to get service %s: %w" , name , err )
80
+ }
81
+
82
+ displayName , err := service .GetPropertyDisplayName ()
83
+ if err != nil {
84
+ return nil , fmt .Errorf ("failed to get displayName property of service %s: %w" , name , err )
85
+ }
86
+
87
+ state , err := service .GetPropertyState ()
60
88
if err != nil {
61
- return nil , fmt .Errorf ("error querying service name=%s. cmd: %s, output: %s, error : %v " , name , script , string ( out ) , err )
89
+ return nil , fmt .Errorf ("failed to get state property of service %s: %w " , name , err )
62
90
}
63
91
64
- var serviceInfo ServiceInfo
65
- err = json .Unmarshal (out , & serviceInfo )
92
+ startMode , err := service .GetPropertyStartMode ()
66
93
if err != nil {
67
- return nil , err
94
+ return nil , fmt . Errorf ( "failed to get startMode property of service %s: %w" , name , err )
68
95
}
69
96
70
- return & serviceInfo , nil
97
+ return & ServiceInfo {
98
+ DisplayName : displayName ,
99
+ StartType : serviceStartModeToStartType (startMode ),
100
+ Status : serviceState (state ),
101
+ }, nil
71
102
}
72
103
73
104
func (APIImplementor ) StartService (name string ) error {
105
+ // Note: both StartService and StopService are not implemented by WMI
74
106
script := `Start-Service -Name $env:ServiceName`
75
107
cmdEnv := fmt .Sprintf ("ServiceName=%s" , name )
76
108
out , err := utils .RunPowershellCmd (script , cmdEnv )
0 commit comments