summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmriti <sgarg@msystechnologies.com>2021-05-26 14:41:53 +0530
committerpratixha <pratiksha.prajapati@msystechnologies.com>2022-04-06 12:54:38 +0530
commitdaace13458d0e144d4d1807dd5390915caea9842 (patch)
tree499552d0d990ab2a809b9e44496f14626d93ae5f
parentf61168f78a52f28c170feb3c6a65061d91e7cb25 (diff)
downloadchef-daace13458d0e144d4d1807dd5390915caea9842.tar.gz
Mount: device name space character substituted with ascii value
Signed-off-by: smriti <sgarg@msystechnologies.com>
-rw-r--r--lib/chef/provider/mount/linux.rb5
-rw-r--r--lib/chef/provider/mount/mount.rb8
-rw-r--r--spec/unit/provider/mount/linux_spec.rb10
3 files changed, 23 insertions, 0 deletions
diff --git a/lib/chef/provider/mount/linux.rb b/lib/chef/provider/mount/linux.rb
index 83fbfab957..899053b613 100644
--- a/lib/chef/provider/mount/linux.rb
+++ b/lib/chef/provider/mount/linux.rb
@@ -71,6 +71,11 @@ class Chef
when /\A#{Regexp.escape(real_mount_point)}\s+#{device_mount_regex}\[/
mounted = true
logger.trace("Network device #{device_logstring} mounted as #{real_mount_point}")
+ # Permalink for network device mounted with a space in device name https://rubular.com/r/CK5zWWms96CRES
+ # See the comment in "device_with_space_escape" for an explanation what's going here.
+ when /\A#{Regexp.escape(real_mount_point)}\s+#{device_with_space_escape}\s/
+ mounted = true
+ logger.trace("Network device #{device_logstring} mounted as #{real_mount_point}")
end
end
@current_resource.mounted(mounted)
diff --git a/lib/chef/provider/mount/mount.rb b/lib/chef/provider/mount/mount.rb
index 2bc9d2c78f..6b062d1225 100644
--- a/lib/chef/provider/mount/mount.rb
+++ b/lib/chef/provider/mount/mount.rb
@@ -217,6 +217,14 @@ class Chef
end
end
+ def device_with_space_escape
+ # For CIFS (and perhaps other remote network mounts) when a space is in the "device name"
+ # it will appear with the space substituted with a special character. However, when mounting,
+ # the mount needs to be done with an actual space. This function provides the device name with
+ # the special character to determine if the device is mounted.
+ device_mount_regex.gsub(" ", "\\x20")
+ end
+
def device_mount_regex
if network_device?
# ignore trailing slash
diff --git a/spec/unit/provider/mount/linux_spec.rb b/spec/unit/provider/mount/linux_spec.rb
index 188777a19b..21f45d7fdd 100644
--- a/spec/unit/provider/mount/linux_spec.rb
+++ b/spec/unit/provider/mount/linux_spec.rb
@@ -25,6 +25,7 @@ describe Chef::Provider::Mount::Linux do
allow(::File).to receive(:exists?).with("/dev/sdz1").and_return true
allow(::File).to receive(:exists?).with("/tmp/foo").and_return true
allow(::File).to receive(:exists?).with("//192.168.11.102/Share/backup").and_return true
+ allow(::File).to receive(:exists?).with("//192.168.11.102/Share/backup folder").and_return true
allow(::File).to receive(:realpath).with("/dev/sdz1").and_return "/dev/sdz1"
allow(::File).to receive(:realpath).with("/tmp/foo").and_return "/tmp/foo"
end
@@ -103,6 +104,15 @@ describe Chef::Provider::Mount::Linux do
provider.load_current_resource
expect(provider.current_resource.mounted).to be_truthy
end
+
+ it "should set mounted true if device name has a space and the mount point is found in the mounts list" do
+ new_resource.device "//192.168.11.102/Share/backup folder"
+ new_resource.fstype "cifs"
+ mount = "/tmp/foo //192.168.11.102/Share/backup\x20folder cifs rw\n"
+ allow(provider).to receive(:shell_out!).and_return(double(stdout: mount))
+ provider.load_current_resource
+ expect(provider.current_resource.mounted).to be_truthy
+ end
end
context "to check if loop resource is mounted" do