Added comments, clean-up
This commit is contained in:
@@ -409,11 +409,17 @@ public sealed class CacheMonitor : DisposableMediatorSubscriberBase
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileCacheSize = -1;
|
FileCacheSize = -1;
|
||||||
DriveInfo di = new(new DirectoryInfo(_configService.Current.CacheFolder).Root.FullName);
|
|
||||||
|
var drive = DriveInfo.GetDrives().FirstOrDefault(d => _configService.Current.CacheFolder.StartsWith(d.Name, StringComparison.Ordinal));
|
||||||
|
if (drive == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
FileCacheDriveFree = di.AvailableFreeSpace;
|
FileCacheDriveFree = drive.AvailableFreeSpace;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
using LightlessSync.LightlessConfiguration;
|
using LightlessSync.LightlessConfiguration;
|
||||||
using LightlessSync.Services;
|
using LightlessSync.Services;
|
||||||
using LightlessSync.Utils;
|
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading.Channels;
|
using System.Threading.Channels;
|
||||||
using static LightlessSync.Utils.FileSystemHelper;
|
using static LightlessSync.Utils.FileSystemHelper;
|
||||||
@@ -106,6 +104,7 @@ public sealed class FileCompactor : IDisposable
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
long blocks = RunStatGetBlocks(fileInfo.FullName);
|
long blocks = RunStatGetBlocks(fileInfo.FullName);
|
||||||
|
//st_blocks are always calculated in 512-byte units, hence we use 512L
|
||||||
return blocks * 512L;
|
return blocks * 512L;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -161,17 +160,17 @@ public sealed class FileCompactor : IDisposable
|
|||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
private struct Statvfs
|
private struct Statvfs
|
||||||
{
|
{
|
||||||
public ulong f_bsize;
|
public ulong f_bsize; /* Filesystem block size */
|
||||||
public ulong f_frsize;
|
public ulong f_frsize; /* Fragment size */
|
||||||
public ulong f_blocks;
|
public ulong f_blocks; /* Size of fs in f_frsize units */
|
||||||
public ulong f_bfree;
|
public ulong f_bfree; /* Number of free blocks */
|
||||||
public ulong f_bavail;
|
public ulong f_bavail; /* Number of free blocks for unprivileged users */
|
||||||
public ulong f_files;
|
public ulong f_files; /* Number of inodes */
|
||||||
public ulong f_ffree;
|
public ulong f_ffree; /* Number of free inodes */
|
||||||
public ulong f_favail;
|
public ulong f_favail; /* Number of free inodes for unprivileged users */
|
||||||
public ulong f_fsid;
|
public ulong f_fsid; /* Filesystem ID */
|
||||||
public ulong f_flag;
|
public ulong f_flag; /* Mount flags */
|
||||||
public ulong f_namemax;
|
public ulong f_namemax; /* Maximum filename length */
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int GetLinuxBlockSize(string path)
|
private static int GetLinuxBlockSize(string path)
|
||||||
@@ -182,6 +181,7 @@ public sealed class FileCompactor : IDisposable
|
|||||||
if (result != 0)
|
if (result != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
//return fragment size of linux
|
||||||
return (int)buf.f_frsize;
|
return (int)buf.f_frsize;
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
@@ -346,9 +346,7 @@ public sealed class FileCompactor : IDisposable
|
|||||||
var mountOptions = GetMountOptionsForPath(path);
|
var mountOptions = GetMountOptionsForPath(path);
|
||||||
if (mountOptions.Contains("compress", StringComparison.OrdinalIgnoreCase))
|
if (mountOptions.Contains("compress", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
_logger.LogWarning(
|
_logger.LogWarning("Cannot safely decompress {file}: filesystem mounted with compression ({opts}). Remount with 'compress=no' before running decompression.", path, mountOptions);
|
||||||
"Cannot safely decompress {file}: filesystem mounted with compression ({opts}). " +
|
|
||||||
"Remount with 'compress=no' before running decompression.", path, mountOptions);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -369,6 +367,7 @@ public sealed class FileCompactor : IDisposable
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//End stream of process to read the files
|
||||||
var stdout = proc.StandardOutput.ReadToEnd();
|
var stdout = proc.StandardOutput.ReadToEnd();
|
||||||
var stderr = proc.StandardError.ReadToEnd();
|
var stderr = proc.StandardError.ReadToEnd();
|
||||||
proc.WaitForExit();
|
proc.WaitForExit();
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
using System;
|
using System.Security.Cryptography;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Security.Cryptography;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace LightlessSync.Utils;
|
namespace LightlessSync.Utils;
|
||||||
|
|
||||||
public static class Crypto
|
public static class Crypto
|
||||||
{
|
{
|
||||||
|
//This buffersize seems to be the best sweetpoint for Linux and Windows
|
||||||
|
private const int _bufferSize = 65536;
|
||||||
#pragma warning disable SYSLIB0021 // Type or member is obsolete
|
#pragma warning disable SYSLIB0021 // Type or member is obsolete
|
||||||
|
|
||||||
private static readonly Dictionary<(string, ushort), string> _hashListPlayersSHA256 = new();
|
private static readonly Dictionary<(string, ushort), string> _hashListPlayersSHA256 = [];
|
||||||
private static readonly Dictionary<string, string> _hashListSHA256 = new(StringComparer.Ordinal);
|
private static readonly Dictionary<string, string> _hashListSHA256 = new(StringComparer.Ordinal);
|
||||||
private static readonly SHA256CryptoServiceProvider _sha256CryptoProvider = new();
|
private static readonly SHA256CryptoServiceProvider _sha256CryptoProvider = new();
|
||||||
|
|
||||||
@@ -23,21 +22,21 @@ public static class Crypto
|
|||||||
|
|
||||||
public static async Task<string> GetFileHashAsync(string filePath, CancellationToken cancellationToken = default)
|
public static async Task<string> GetFileHashAsync(string filePath, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete, bufferSize: 65536, options: FileOptions.Asynchronous);
|
var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete, bufferSize: _bufferSize, options: FileOptions.Asynchronous);
|
||||||
await using (stream.ConfigureAwait(false))
|
await using (stream.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
using var sha1 = SHA1.Create();
|
using var sha1 = SHA1.Create();
|
||||||
|
|
||||||
var buffer = new byte[8192];
|
var buffer = new byte[8192];
|
||||||
int bytesRead;
|
int bytesRead;
|
||||||
while ((bytesRead = await stream.ReadAsync(buffer, cancellationToken).ConfigureAwait(false)) > 0)
|
while ((bytesRead = await stream.ReadAsync(buffer, cancellationToken).ConfigureAwait(false)) > 0)
|
||||||
{
|
{
|
||||||
sha1.TransformBlock(buffer, 0, bytesRead, outputBuffer: null, 0);
|
sha1.TransformBlock(buffer, 0, bytesRead, outputBuffer: null, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
sha1.TransformFinalBlock([], 0, 0);
|
sha1.TransformFinalBlock([], 0, 0);
|
||||||
|
|
||||||
return BitConverter.ToString(sha1.Hash!).Replace("-", "", StringComparison.Ordinal);
|
return Convert.ToHexString(sha1.Hash!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,17 +8,18 @@ namespace LightlessSync.Utils
|
|||||||
public enum FilesystemType
|
public enum FilesystemType
|
||||||
{
|
{
|
||||||
Unknown = 0,
|
Unknown = 0,
|
||||||
NTFS,
|
NTFS, // Compressable
|
||||||
Btrfs,
|
Btrfs, // Compressable
|
||||||
Ext4,
|
Ext4,
|
||||||
Xfs,
|
Xfs,
|
||||||
Apfs,
|
Apfs,
|
||||||
HfsPlus,
|
HfsPlus,
|
||||||
Fat,
|
Fat,
|
||||||
Exfat,
|
Exfat,
|
||||||
Zfs
|
Zfs // Compressable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private const string _mountPath = "/proc/mounts";
|
||||||
private static readonly ConcurrentDictionary<string, FilesystemType> _filesystemTypeCache = new(StringComparer.OrdinalIgnoreCase);
|
private static readonly ConcurrentDictionary<string, FilesystemType> _filesystemTypeCache = new(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
public static FilesystemType GetFilesystemType(string filePath, bool isWine = false)
|
public static FilesystemType GetFilesystemType(string filePath, bool isWine = false)
|
||||||
@@ -75,8 +76,8 @@ namespace LightlessSync.Utils
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var path = Path.GetFullPath(filePath);
|
var path = Path.GetFullPath(filePath);
|
||||||
if (!File.Exists("/proc/mounts")) return "/";
|
if (!File.Exists(_mountPath)) return "/";
|
||||||
var mounts = File.ReadAllLines("/proc/mounts");
|
var mounts = File.ReadAllLines(_mountPath);
|
||||||
|
|
||||||
string bestMount = "/";
|
string bestMount = "/";
|
||||||
foreach (var line in mounts)
|
foreach (var line in mounts)
|
||||||
@@ -109,7 +110,7 @@ namespace LightlessSync.Utils
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var mountPoint = GetMountPoint(filePath);
|
var mountPoint = GetMountPoint(filePath);
|
||||||
var mounts = File.ReadAllLines("/proc/mounts");
|
var mounts = File.ReadAllLines(_mountPath);
|
||||||
|
|
||||||
foreach (var line in mounts)
|
foreach (var line in mounts)
|
||||||
{
|
{
|
||||||
@@ -140,6 +141,7 @@ namespace LightlessSync.Utils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Extra check on
|
||||||
private static bool IsProbablyWine() => Environment.GetEnvironmentVariable("WINELOADERNOEXEC") != null || Environment.GetEnvironmentVariable("WINEDLLPATH") != null || Directory.Exists("/proc/self") && File.Exists("/proc/mounts");
|
private static bool IsProbablyWine() => Environment.GetEnvironmentVariable("WINELOADERNOEXEC") != null || Environment.GetEnvironmentVariable("WINEDLLPATH") != null || Directory.Exists("/proc/self") && File.Exists("/proc/mounts");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user