Replace octal characters from mounts in /proc/mounts

Fixed: Replace octal characters in mount points
Closes #1295
pull/4/head
Mark McDowall 8 years ago
parent e4e3770e54
commit ff3fc8de2e

@ -0,0 +1,18 @@
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Common.Test.ExtensionTests
{
[TestFixture]
public class FromOctalStringFixture
{
[TestCase("\\040", " ")]
[TestCase("\\043", "#")]
[TestCase("\\101", "A")]
public void should_convert_octal_character_string_to_ascii_string(string octalString, string expected)
{
octalString.FromOctalString().Should().Be(expected);
}
}
}

@ -79,6 +79,7 @@
<Compile Include="EnvironmentProviderTest.cs" />
<Compile Include="EnvironmentTests\EnvironmentProviderTest.cs" />
<Compile Include="EnvironmentTests\StartupArgumentsFixture.cs" />
<Compile Include="ExtensionTests\FromOctalStringFixture.cs" />
<Compile Include="ExtensionTests\Int64ExtensionFixture.cs" />
<Compile Include="Http\HttpClientFixture.cs" />
<Compile Include="Http\HttpRequestBuilderFixture.cs" />

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace NzbDrone.Common.Disk
{

@ -105,5 +105,17 @@ namespace NzbDrone.Common.Extensions
{
return string.Concat(Array.ConvertAll(input, x => x.ToString("X2")));
}
public static string FromOctalString(this string octalValue)
{
octalValue = octalValue.TrimStart('\\');
var first = int.Parse(octalValue.Substring(0, 1));
var second = int.Parse(octalValue.Substring(1, 1));
var third = int.Parse(octalValue.Substring(2, 1));
var byteResult = (byte)((first << 6) | (second << 3) | (third));
return Encoding.ASCII.GetString(new [] { byteResult });
}
}
}

@ -62,6 +62,10 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\Libraries\Mono.Posix.dll</HintPath>
</Reference>
<Reference Include="Moq, Version=4.0.10827.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="nunit.framework, Version=3.2.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.2.0\lib\net40\nunit.framework.dll</HintPath>
<Private>True</Private>

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FluentAssertions" version="4.2.1" targetFramework="net40" />
<package id="Moq" version="4.0.10827" targetFramework="net40" />
<package id="NUnit" version="3.2.0" targetFramework="net40" />
</packages>

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Mono.Unix;
@ -83,7 +84,7 @@ namespace NzbDrone.Mono
SetOwner(path, user, group);
}
public override System.Collections.Generic.List<IMount> GetMounts()
public override List<IMount> GetMounts()
{
return base.GetMounts()
.Concat(_procMountProvider.GetMounts())

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
@ -17,6 +18,10 @@ namespace NzbDrone.Mono
{
private static string[] _fixedTypes = new [] { "ext3", "ext2", "ext4", "vfat", "fuseblk", "xfs", "jfs", "msdos", "ntfs", "minix", "hfs", "hfsplus", "qnx4", "ufs", "btrfs" };
private static string[] _networkDriveTypes = new [] { "cifs", "nfs", "nfs4", "nfsd", "sshfs" };
private static readonly Regex OctalRegex = new Regex(@"\\\d{3}", RegexOptions.Compiled);
private const string PROC_MOUNTS_FILENAME = @"/proc/mounts";
private const string PROC_FILESYSTEMS_FILENAME = @"/proc/filesystems";
private static Dictionary<string, bool> _fileSystems;
@ -31,16 +36,16 @@ namespace NzbDrone.Mono
{
try
{
if (File.Exists(@"/proc/mounts"))
if (File.Exists(PROC_MOUNTS_FILENAME))
{
var lines = File.ReadAllLines(@"/proc/mounts");
var lines = File.ReadAllLines(PROC_MOUNTS_FILENAME);
return lines.Select(ParseLine).OfType<IMount>().ToList();
}
}
catch (Exception ex)
{
_logger.Debug(ex, "Failed to retrieve mounts from /proc/mounts");
_logger.Debug(ex, "Failed to retrieve mounts from {0}", PROC_MOUNTS_FILENAME);
}
return new List<IMount>();
@ -53,9 +58,9 @@ namespace NzbDrone.Mono
var result = new Dictionary<string, bool>();
try
{
if (File.Exists(@"/proc/filesystems"))
if (File.Exists(PROC_FILESYSTEMS_FILENAME))
{
var lines = File.ReadAllLines(@"/proc/filesystems");
var lines = File.ReadAllLines(PROC_FILESYSTEMS_FILENAME);
foreach (var line in lines)
{
@ -67,7 +72,7 @@ namespace NzbDrone.Mono
}
catch (Exception ex)
{
_logger.Debug(ex, "Failed to get filesystem types from /proc/filesystems, using default set.");
_logger.Debug(ex, "Failed to get filesystem types from {0}, using default set.", PROC_FILESYSTEMS_FILENAME);
}
if (result.Empty())
@ -86,11 +91,11 @@ namespace NzbDrone.Mono
private IMount ParseLine(string line)
{
var split = line.Split(' ');
var split = line.Split(' ').Select(ExpandEscapes).ToArray();
if (split.Length != 6)
{
_logger.Debug("Unable to parser /proc/mount line: {0}", line);
_logger.Debug("Unable to parse {0} line: {1}", PROC_MOUNTS_FILENAME, line);
}
var name = split[0];
@ -132,5 +137,10 @@ namespace NzbDrone.Mono
return result;
}
private string ExpandEscapes(string mount)
{
return OctalRegex.Replace(mount, match => match.Captures[0].Value.FromOctalString());
}
}
}

Loading…
Cancel
Save