diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index 98050c32b..29b37fb26 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -127,7 +127,7 @@ namespace NzbDrone.Common.Disk try { - var testPath = Path.Combine(path, "Lidarr_write_test.txt"); + var testPath = Path.Combine(path, "lidarr_write_test.txt"); var testContent = $"This file was created to verify if '{path}' is writable. It should've been automatically deleted. Feel free to delete it."; File.WriteAllText(testPath, testContent); File.Delete(testPath); @@ -418,7 +418,12 @@ namespace NzbDrone.Common.Disk return new FileStream(path, FileMode.Create); } - public virtual List GetMounts() + public List GetMounts() + { + return GetAllMounts().Where(d => !IsSpecialMount(d)).ToList(); + } + + protected virtual List GetAllMounts() { return GetDriveInfoMounts().Where(d => d.DriveType == DriveType.Fixed || d.DriveType == DriveType.Network || d.DriveType == DriveType.Removable) .Select(d => new DriveInfoMount(d)) @@ -426,11 +431,16 @@ namespace NzbDrone.Common.Disk .ToList(); } + protected virtual bool IsSpecialMount(IMount mount) + { + return false; + } + public virtual IMount GetMount(string path) { try { - var mounts = GetMounts(); + var mounts = GetAllMounts(); return mounts.Where(drive => drive.RootDirectory.PathEquals(path) || drive.RootDirectory.IsParentPath(path)) diff --git a/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs b/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs index 7a768e702..956734535 100644 --- a/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs +++ b/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs @@ -1,8 +1,12 @@ using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using FluentAssertions; using Mono.Unix; +using Moq; using NUnit.Framework; +using NzbDrone.Common.Disk; using NzbDrone.Common.Test.DiskTests; using NzbDrone.Mono.Disk; @@ -87,5 +91,41 @@ namespace NzbDrone.Mono.Test.DiskProviderTests File.ReadAllText(source).Should().Be("Some content"); File.ReadAllText(destination).Should().Be("Some content"); } + + private void GivenSpecialMount(string rootDir) + { + Mocker.GetMock() + .Setup(v => v.GetCompleteRealPath(It.IsAny())) + .Returns(s => s); + + Mocker.GetMock() + .Setup(v => v.GetMounts()) + .Returns(new List { + new ProcMount(DriveType.Fixed, rootDir, rootDir, "myfs", new MountOptions(new Dictionary())) + }); + } + + [TestCase("/snap/blaat")] + [TestCase("/var/lib/docker/zfs-storage-mount")] + public void should_ignore_special_mounts(string rootDir) + { + GivenSpecialMount(rootDir); + + var mounts = Subject.GetMounts(); + + mounts.Select(d => d.RootDirectory).Should().NotContain(rootDir); + } + + [TestCase("/snap/blaat")] + [TestCase("/var/lib/docker/zfs-storage-mount")] + public void should_return_special_mount_when_queried(string rootDir) + { + GivenSpecialMount(rootDir); + + var mount = Subject.GetMount(Path.Combine(rootDir, "dir/somefile.mkv")); + + mount.Should().NotBeNull(); + mount.RootDirectory.Should().Be(rootDir); + } } } diff --git a/src/NzbDrone.Mono/Disk/DiskProvider.cs b/src/NzbDrone.Mono/Disk/DiskProvider.cs index c78332e62..2f63b0dfa 100644 --- a/src/NzbDrone.Mono/Disk/DiskProvider.cs +++ b/src/NzbDrone.Mono/Disk/DiskProvider.cs @@ -75,7 +75,7 @@ namespace NzbDrone.Mono.Disk SetOwner(path, user, group); } - public override List GetMounts() + protected override List GetAllMounts() { return _procMountProvider.GetMounts() .Concat(GetDriveInfoMounts() @@ -87,6 +87,25 @@ namespace NzbDrone.Mono.Disk .ToList(); } + protected override bool IsSpecialMount(IMount mount) + { + var root = mount.RootDirectory; + + if (root.StartsWith("/var/lib/")) + { + // Could be /var/lib/docker when docker uses zfs. Very unlikely that a useful mount is located in /var/lib. + return true; + } + + if (root.StartsWith("/snap/")) + { + // Mount point for snap packages + return true; + } + + return false; + } + public override long? GetTotalSize(string path) { Ensure.That(path, () => path).IsValidPath(); diff --git a/src/NzbDrone.Mono/Disk/ProcMountProvider.cs b/src/NzbDrone.Mono/Disk/ProcMountProvider.cs index 3e3c0e7c6..88e834d8a 100644 --- a/src/NzbDrone.Mono/Disk/ProcMountProvider.cs +++ b/src/NzbDrone.Mono/Disk/ProcMountProvider.cs @@ -111,18 +111,6 @@ namespace NzbDrone.Mono.Disk return null; } - if (mount.StartsWith("/var/lib/")) - { - // Could be /var/lib/docker when docker uses zfs. Very unlikely that a useful mount is located in /var/lib. - return null; - } - - if (mount.StartsWith("/snap/")) - { - // Mount point for snap packages - return null; - } - var driveType = FindDriveType.Find(type); if (name.StartsWith("/dev/") || GetFileSystems().GetValueOrDefault(type, false))