Skip to content

Commit 314dbd8

Browse files
committed
preflight: add check, fix and cleanup funcs for enabling SMB share on windows
earlier these were part of the MSI since we want to enable this only when user has set 'enable-shared-dirs' setting, this is moved to the preflight package where we can check this config value before hand this should remove at least of the warnings reported by virustotal for the MSI https://www.virustotal.com/gui/file/31b402dcc1da24265074a21a26018d6cde8eef0b63c77a18f89eb079b6556790
1 parent 168e685 commit 314dbd8

5 files changed

+107
-10
lines changed

pkg/crc/preflight/preflight_checks_windows.go

+63
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package preflight
22

33
import (
4+
"errors"
45
"fmt"
6+
"os/user"
57
"strconv"
68
"strings"
79

@@ -209,3 +211,64 @@ func checkAdminHelperNamedPipeAccessible() error {
209211
}
210212
return nil
211213
}
214+
215+
func checkFileAndPrinterSharingIsEnabled() error {
216+
cmd := `(Get-NetFirewallRule -Group '@FirewallAPI.dll,-28502' | Where-Object {$_.Profile -eq 'Private, Public'}).Enabled`
217+
stdout, stderr, err := powershell.Execute(cmd)
218+
if err != nil {
219+
return fmt.Errorf("unable to check if Printer and File Sharing is enabled %v: %s", err, stderr)
220+
}
221+
if strings.Contains(stdout, "False") {
222+
return errors.New("Printer and File Sharing is disabled")
223+
}
224+
return nil
225+
}
226+
227+
func fixFileAndPrinterSharing() error {
228+
cmd := `Set-NetFirewallRule -Group '@FirewallAPI.dll,-28502' -Enabled True -Profile 'Private,Public'`
229+
stdout, stderr, err := powershell.ExecuteAsAdmin("to enable Printer and File Sharing", cmd)
230+
if err != nil {
231+
return fmt.Errorf("unable to check if Printer and File Sharing is enabled %v: %s: %s", err, stdout, stderr)
232+
}
233+
return nil
234+
}
235+
236+
func checkCRCSmbShareCreated() error {
237+
cmd := `Get-SmbShare -Name crc-dir0`
238+
stdout, stderr, err := powershell.Execute(cmd)
239+
if err != nil {
240+
return fmt.Errorf("unable to check if Printer and File Sharing is enabled %v: %s: %s", err, stdout, stderr)
241+
}
242+
return nil
243+
}
244+
245+
func fixCRCSmbShareCreated() error {
246+
u, err := user.Current()
247+
if err != nil {
248+
return fmt.Errorf("unable to get user information for homedir and username: %v", err)
249+
}
250+
cmd := fmt.Sprintf(`New-SmbShare -Name 'crc-dir0' -Path '%s' -FullAccess '%s'`, u.HomeDir, username())
251+
_, stderr, err := powershell.ExecuteAsAdmin("create new SMB share for home directory", cmd)
252+
if err != nil {
253+
return fmt.Errorf("unable to get create new SMB share %v: %s", err, stderr)
254+
}
255+
return nil
256+
}
257+
258+
func removeSmbShare() error {
259+
cmd := `Remove-SmbShare -Name 'crc-dir0' -Force`
260+
_, stderr, err := powershell.ExecuteAsAdmin("remove SMB share for home directory", cmd)
261+
if err != nil {
262+
return fmt.Errorf("unable to get create new SMB share %v: %s", err, stderr)
263+
}
264+
return nil
265+
}
266+
267+
func removeFirewallRuleAllowingPrinterAndFileSharing() error {
268+
cmd := `Set-NetFirewallRule -Group '@FirewallAPI.dll,-28502' -Enabled False -Profile 'Private,Public'`
269+
stdout, stderr, err := powershell.ExecuteAsAdmin("to disable Printer and File Sharing", cmd)
270+
if err != nil {
271+
logging.Warnf("unable to turn off Printer and File Sharing %v: %s: %s", err, stdout, stderr)
272+
}
273+
return nil
274+
}

pkg/crc/preflight/preflight_darwin.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ var daemonLaunchdChecks = []Check{
110110
// Passing 'SystemNetworkingMode' to getPreflightChecks currently achieves this
111111
// as there are no user networking specific checks
112112
func getAllPreflightChecks() []Check {
113-
return getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false)
113+
return getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false)
114114
}
115115

116116
func getChecks(_ network.Mode, bundlePath string, preset crcpreset.Preset, enableBundleQuayFallback bool) []Check {

pkg/crc/preflight/preflight_darwin_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ func TestCountConfigurationOptions(t *testing.T) {
1717
}
1818

1919
func TestCountPreflights(t *testing.T) {
20-
assert.Len(t, getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false), 21)
21-
assert.Len(t, getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false), 21)
20+
assert.Len(t, getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false), 21)
21+
assert.Len(t, getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false), 21)
2222

23-
assert.Len(t, getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false), 20)
24-
assert.Len(t, getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false), 20)
23+
assert.Len(t, getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false), 20)
24+
assert.Len(t, getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false), 20)
2525
}

pkg/crc/preflight/preflight_windows.go

+29-1
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,32 @@ var userPartOfCrcUsersAndHypervAdminsGroupCheck = Check{
167167
labels: labels{Os: Windows},
168168
}
169169

170+
// Checks to verify and setup SMB share is created and file sharing is enabled
171+
var smbShareCreatedAndFileSharingEnabledChecks = []Check{
172+
{
173+
configKeySuffix: "check-file-sharing-enabled",
174+
checkDescription: "Checking if Printer and File Sharing is enabled",
175+
check: checkFileAndPrinterSharingIsEnabled,
176+
fixDescription: "Enabling Printer and File Sharing",
177+
fix: fixFileAndPrinterSharing,
178+
cleanupDescription: "Disabling Printer and File Sharing",
179+
cleanup: removeFirewallRuleAllowingPrinterAndFileSharing,
180+
181+
labels: labels{Os: Windows, SharedDir: Enabled},
182+
},
183+
{
184+
configKeySuffix: "check-smb-share-exists",
185+
checkDescription: "Checking if SMB share crc-dir0 exists",
186+
check: checkCRCSmbShareCreated,
187+
fixDescription: "Creating SMB share crc-dir0",
188+
fix: fixCRCSmbShareCreated,
189+
cleanupDescription: "Removing SMB share crc-dir0",
190+
cleanup: removeSmbShare,
191+
192+
labels: labels{Os: Windows, SharedDir: Enabled},
193+
},
194+
}
195+
170196
var errReboot = errors.New("Please reboot your system and run 'crc setup' to complete the setup process")
171197

172198
func username() string {
@@ -202,7 +228,7 @@ func checkVsock() error {
202228
// Passing 'UserNetworkingMode' to getPreflightChecks currently achieves this
203229
// as there are no system networking specific checks
204230
func getAllPreflightChecks() []Check {
205-
return getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false)
231+
return getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, true, true)
206232
}
207233

208234
func getChecks(bundlePath string, preset crcpreset.Preset, enableBundleQuayFallback bool) []Check {
@@ -219,12 +245,14 @@ func getChecks(bundlePath string, preset crcpreset.Preset, enableBundleQuayFallb
219245
checks = append(checks, daemonTaskChecks...)
220246
checks = append(checks, adminHelperServiceCheks...)
221247
checks = append(checks, sshPortCheck())
248+
checks = append(checks, smbShareCreatedAndFileSharingEnabledChecks...)
222249
return checks
223250
}
224251

225252
func getPreflightChecks(_ bool, networkMode network.Mode, bundlePath string, preset crcpreset.Preset, enableBundleQuayFallback, sharedDirEnabled bool) []Check {
226253
filter := newFilter()
227254
filter.SetNetworkMode(networkMode)
255+
filter.SetSharedDirStatus(sharedDirEnabled)
228256

229257
return filter.Apply(getChecks(bundlePath, preset, enableBundleQuayFallback))
230258
}

pkg/crc/preflight/preflight_windows_test.go

+10-4
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,15 @@ func TestCountConfigurationOptions(t *testing.T) {
1717
}
1818

1919
func TestCountPreflights(t *testing.T) {
20-
assert.Len(t, getPreflightChecks(false, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false), 23)
21-
assert.Len(t, getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false), 23)
20+
assert.Len(t, getPreflightChecks(false, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false), 23)
21+
assert.Len(t, getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false), 23)
2222

23-
assert.Len(t, getPreflightChecks(false, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false), 24)
24-
assert.Len(t, getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false), 24)
23+
assert.Len(t, getPreflightChecks(false, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false), 24)
24+
assert.Len(t, getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, false), 24)
25+
26+
assert.Len(t, getPreflightChecks(false, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, true), 25)
27+
assert.Len(t, getPreflightChecks(true, network.SystemNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, true), 25)
28+
29+
assert.Len(t, getPreflightChecks(false, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, true), 26)
30+
assert.Len(t, getPreflightChecks(true, network.UserNetworkingMode, constants.GetDefaultBundlePath(preset.OpenShift), preset.OpenShift, false, true), 26)
2531
}

0 commit comments

Comments
 (0)