2018-03-14 20:41:36 +00:00
|
|
|
using System;
|
2013-10-16 04:11:45 +00:00
|
|
|
using System.Collections.Generic;
|
2019-12-22 22:08:53 +00:00
|
|
|
using System.IO;
|
2013-10-16 04:11:45 +00:00
|
|
|
using System.Linq;
|
2018-10-30 21:07:51 +00:00
|
|
|
using System.Text.RegularExpressions;
|
2013-10-16 04:11:45 +00:00
|
|
|
using NLog;
|
2014-01-06 06:20:08 +00:00
|
|
|
using NzbDrone.Common.Disk;
|
2023-08-04 00:55:50 +00:00
|
|
|
using NzbDrone.Common.Extensions;
|
2018-03-14 20:41:36 +00:00
|
|
|
using NzbDrone.Core.Movies;
|
2013-10-16 04:11:45 +00:00
|
|
|
|
|
|
|
namespace NzbDrone.Core.DiskSpace
|
|
|
|
{
|
|
|
|
public interface IDiskSpaceService
|
|
|
|
{
|
|
|
|
List<DiskSpace> GetFreeSpace();
|
|
|
|
}
|
|
|
|
|
|
|
|
public class DiskSpaceService : IDiskSpaceService
|
|
|
|
{
|
2018-03-14 20:41:36 +00:00
|
|
|
private readonly IMovieService _movieService;
|
2013-10-16 04:11:45 +00:00
|
|
|
private readonly IDiskProvider _diskProvider;
|
|
|
|
private readonly Logger _logger;
|
|
|
|
|
2019-07-10 03:14:53 +00:00
|
|
|
private static readonly Regex _regexSpecialDrive = new Regex("^/var/lib/(docker|rancher|kubelet)(/|$)|^/(boot|etc)(/|$)|/docker(/var)?/aufs(/|$)", RegexOptions.Compiled);
|
2018-10-30 21:07:51 +00:00
|
|
|
|
2018-11-23 07:03:32 +00:00
|
|
|
public DiskSpaceService(IMovieService movieService, IDiskProvider diskProvider, Logger logger)
|
2013-10-16 04:11:45 +00:00
|
|
|
{
|
2018-03-14 20:41:36 +00:00
|
|
|
_movieService = movieService;
|
2013-10-16 04:11:45 +00:00
|
|
|
_diskProvider = diskProvider;
|
|
|
|
_logger = logger;
|
|
|
|
}
|
|
|
|
|
|
|
|
public List<DiskSpace> GetFreeSpace()
|
|
|
|
{
|
2019-07-13 03:15:13 +00:00
|
|
|
var importantRootFolders = GetMoviesRootPaths().Distinct().ToList();
|
2013-10-16 04:11:45 +00:00
|
|
|
|
2019-07-13 03:15:13 +00:00
|
|
|
var optionalRootFolders = GetFixedDisksRootPaths().Except(importantRootFolders).Distinct().ToList();
|
|
|
|
|
|
|
|
var diskSpace = GetDiskSpace(importantRootFolders).Concat(GetDiskSpace(optionalRootFolders, true)).ToList();
|
|
|
|
|
|
|
|
return diskSpace;
|
2013-10-16 04:11:45 +00:00
|
|
|
}
|
|
|
|
|
2019-07-13 03:15:13 +00:00
|
|
|
private IEnumerable<string> GetMoviesRootPaths()
|
2013-10-16 04:11:45 +00:00
|
|
|
{
|
2019-12-18 21:56:41 +00:00
|
|
|
return _movieService.AllMoviePaths()
|
2023-08-04 00:55:50 +00:00
|
|
|
.Where(s => s.Value.IsPathValid(PathValidationType.CurrentOs) && _diskProvider.FolderExists(s.Value))
|
2020-12-05 03:13:13 +00:00
|
|
|
.Select(s => _diskProvider.GetPathRoot(s.Value))
|
2019-07-13 03:15:13 +00:00
|
|
|
.Distinct();
|
2013-10-16 04:11:45 +00:00
|
|
|
}
|
|
|
|
|
2019-07-13 03:15:13 +00:00
|
|
|
private IEnumerable<string> GetFixedDisksRootPaths()
|
2013-10-16 04:11:45 +00:00
|
|
|
{
|
2019-07-13 03:15:13 +00:00
|
|
|
return _diskProvider.GetMounts()
|
2018-10-30 21:07:51 +00:00
|
|
|
.Where(d => d.DriveType == DriveType.Fixed)
|
|
|
|
.Where(d => !_regexSpecialDrive.IsMatch(d.RootDirectory))
|
2019-07-13 03:15:13 +00:00
|
|
|
.Select(d => d.RootDirectory);
|
2013-10-16 04:11:45 +00:00
|
|
|
}
|
|
|
|
|
2015-10-03 17:45:26 +00:00
|
|
|
private IEnumerable<DiskSpace> GetDiskSpace(IEnumerable<string> paths, bool suppressWarnings = false)
|
2013-10-16 04:11:45 +00:00
|
|
|
{
|
|
|
|
foreach (var path in paths)
|
|
|
|
{
|
|
|
|
DiskSpace diskSpace = null;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2014-02-26 16:08:04 +00:00
|
|
|
var freeSpace = _diskProvider.GetAvailableSpace(path);
|
|
|
|
var totalSpace = _diskProvider.GetTotalSize(path);
|
|
|
|
|
|
|
|
if (!freeSpace.HasValue || !totalSpace.HasValue)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
2013-10-16 04:11:45 +00:00
|
|
|
|
|
|
|
diskSpace = new DiskSpace
|
2019-12-22 22:08:53 +00:00
|
|
|
{
|
|
|
|
Path = path,
|
|
|
|
FreeSpace = freeSpace.Value,
|
|
|
|
TotalSpace = totalSpace.Value
|
|
|
|
};
|
2013-10-16 04:11:45 +00:00
|
|
|
|
|
|
|
diskSpace.Label = _diskProvider.GetVolumeLabel(path);
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
2015-06-03 05:59:30 +00:00
|
|
|
if (!suppressWarnings)
|
|
|
|
{
|
2016-02-11 21:13:42 +00:00
|
|
|
_logger.Warn(ex, "Unable to get free space for: " + path);
|
2015-06-03 05:59:30 +00:00
|
|
|
}
|
2013-10-16 04:11:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (diskSpace != null)
|
|
|
|
{
|
|
|
|
yield return diskSpace;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|