11package system
22
33import (
4- "encoding/json"
54 "fmt"
6- "os/exec"
7- "strings"
85
6+ "github.com/kubernetes-csi/csi-proxy/pkg/cim"
7+ "github.com/kubernetes-csi/csi-proxy/pkg/server/system/impl"
98 "github.com/kubernetes-csi/csi-proxy/pkg/utils"
109)
1110
@@ -25,52 +24,85 @@ type ServiceInfo struct {
2524 Status uint32 `json:"Status"`
2625}
2726
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+
2856type APIImplementor struct {}
2957
3058func New () APIImplementor {
3159 return APIImplementor {}
3260}
3361
3462func (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" })
3864 if err != nil {
39- return "" , err
65+ return "" , fmt . Errorf ( "failed to get BIOS element: %w" , err )
4066 }
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 )
5171 }
52- return lines [1 ], nil
72+
73+ return sn , nil
5374}
5475
5576func (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 ()
6088 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 )
6290 }
6391
64- var serviceInfo ServiceInfo
65- err = json .Unmarshal (out , & serviceInfo )
92+ startMode , err := service .GetPropertyStartMode ()
6693 if err != nil {
67- return nil , err
94+ return nil , fmt . Errorf ( "failed to get startMode property of service %s: %w" , name , err )
6895 }
6996
70- return & serviceInfo , nil
97+ return & ServiceInfo {
98+ DisplayName : displayName ,
99+ StartType : serviceStartModeToStartType (startMode ),
100+ Status : serviceState (state ),
101+ }, nil
71102}
72103
73104func (APIImplementor ) StartService (name string ) error {
105+ // Note: both StartService and StopService are not implemented by WMI
74106 script := `Start-Service -Name $env:ServiceName`
75107 cmdEnv := fmt .Sprintf ("ServiceName=%s" , name )
76108 out , err := utils .RunPowershellCmd (script , cmdEnv )
0 commit comments