Merge pull request 'add-sftp-mirror' (#5) from add-sftp-mirror into main

Reviewed-on: #5
This commit is contained in:
IsWaffle 2024-03-22 00:50:05 +00:00
commit 478aaa4daf
13 changed files with 204 additions and 8 deletions

View File

@ -5,8 +5,8 @@
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AssemblyVersion>1.5.1</AssemblyVersion>
<FileVersion>1.5.1</FileVersion>
<AssemblyVersion>1.5.3</AssemblyVersion>
<FileVersion>1.5.3</FileVersion>
</PropertyGroup>
<ItemGroup>
@ -25,6 +25,9 @@
<Reference Include="Gitea">
<HintPath>Resources\Gitea.dll</HintPath>
</Reference>
<Reference Include="WinSCPnet">
<HintPath>Resources\WinSCPnet.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>

View File

@ -12,6 +12,7 @@ namespace EftPatchHelper.Interfaces
public string ServiceName { get; set; }
public string HubEntryText { get; set; }
public FileInfo UploadFileInfo { get; }
public bool AddHubEntry { get; }
public string GetLink();
public Task<bool> UploadAsync(IProgress<double>? progress = null);
}

View File

@ -1,7 +1,11 @@
namespace EftPatchHelper.Model
using System.Text.Json.Serialization;
namespace EftPatchHelper.Model
{
public class DownloadMirror
{
[JsonIgnore]
public bool AddHubEntry { get; set; }
public string Link { get; set; }
public string Hash { get; set; }
}

View File

@ -18,6 +18,7 @@ namespace EftPatchHelper.Model
public string DisplayName { get; set; }
public string ServiceName { get; set; }
public string HubEntryText { get; set; }
public bool AddHubEntry { get; }
public GoFileUpload(FileInfo file, string apiToken, string folderId)
{
@ -31,6 +32,7 @@ namespace EftPatchHelper.Model
ServiceName = "GoFile";
DisplayName = $"{ServiceName} Upload: {UploadFileInfo.Name}";
HubEntryText = $"Download from {ServiceName}";
AddHubEntry = true;
}
public string GetLink()

View File

@ -17,6 +17,8 @@ namespace EftPatchHelper.Model
public string DisplayName { get; set; }
public string ServiceName { get; set; }
public string HubEntryText { get; set; }
public bool AddHubEntry { get; }
public MegaUpload(FileInfo file, string email, string password, string mfaKey = null)
{
@ -27,6 +29,7 @@ namespace EftPatchHelper.Model
ServiceName = "Mega";
DisplayName = $"{ServiceName} Upload: {UploadFileInfo.Name}";
HubEntryText = $"Download from {ServiceName}";
AddHubEntry = true;
}
private async Task<bool> CheckLoginStatus()

View File

@ -39,6 +39,11 @@ namespace EftPatchHelper.Model
/// </summary>
public bool UploadToMega = false;
/// <summary>
/// Whether or not to upload to all sftp site listing
/// </summary>
public bool UploadToSftpSites = false;
/// <summary>
/// List of mirrors to upload to Gitea
/// </summary>

View File

@ -57,6 +57,9 @@ namespace EftPatchHelper.Model
[JsonPropertyName("goFileFolderId")]
public string GoFileFolderId { get; set; } = "";
[JsonPropertyName("sftpUploads")]
public List<SftpUploadInfo> SftpUploads { get; set; } = new();
public bool Save()
{
try

View File

@ -0,0 +1,72 @@
using EftPatchHelper.Interfaces;
using WinSCP;
namespace EftPatchHelper.Model;
public class SftpUpload : IFileUpload
{
private readonly SftpUploadInfo _sftpInfo;
private readonly SessionOptions _sessionOptions;
public string DisplayName { get; set; }
public string ServiceName { get; set; }
public string HubEntryText { get; set; }
public bool AddHubEntry { get; }
public FileInfo UploadFileInfo { get; }
public SftpUpload(FileInfo file, SftpUploadInfo sftpInfo)
{
UploadFileInfo = file;
_sftpInfo = sftpInfo;
_sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
UserName = _sftpInfo.Username,
Password = _sftpInfo.Password,
HostName = _sftpInfo.Hostname,
PortNumber = _sftpInfo.Port,
SshHostKeyFingerprint = _sftpInfo.HostKey
};
ServiceName = _sftpInfo.Hostname;
DisplayName = $"{ServiceName} Upload: {UploadFileInfo.Name}";
HubEntryText = $"Download from {ServiceName}";
AddHubEntry = false;
}
public string GetLink()
{
return $"{_sftpInfo.HttpPath}/${UploadFileInfo.Name}";
}
public Task<bool> UploadAsync(IProgress<double>? progress = null)
{
TransferOptions transferOptions = new TransferOptions
{
TransferMode = TransferMode.Binary,
};
using Session session = new Session();
if (progress != null)
{
session.FileTransferProgress += (_, args) => progress.Report(Math.Floor(args.FileProgress * 100));
}
try
{
session.Open(_sessionOptions);
session.PutFiles(UploadFileInfo.FullName, $"{_sftpInfo.UploadPath}/{UploadFileInfo.Name}", false, transferOptions).Check();
return Task.FromResult(true);
}
catch
{
// ignored
}
return Task.FromResult(false);
}
}

View File

@ -0,0 +1,53 @@
using System.Text.Json.Serialization;
namespace EftPatchHelper.Model;
public class SftpUploadInfo
{
[JsonPropertyName("username")]
public string Username { get; set; } = "";
[JsonPropertyName("password")]
public string Password { get; set; } = "";
[JsonPropertyName("hostKey")]
public string HostKey { get; set; } = "";
[JsonPropertyName("hostname")]
public string Hostname { get; set; } = "";
[JsonPropertyName("port")]
public int Port { get; set; } = 0;
[JsonPropertyName("uploadPath")]
public string UploadPath { get; set; } = "";
[JsonPropertyName("httpPath")]
public string HttpPath { get; set; } = "";
public bool IsValid()
{
if (string.IsNullOrWhiteSpace(Username))
return false;
if (string.IsNullOrWhiteSpace(Password))
return false;
if (string.IsNullOrWhiteSpace(Hostname))
return false;
if (string.IsNullOrWhiteSpace(HostKey))
return false;
if (Port == 0)
return false;
if (string.IsNullOrWhiteSpace(UploadPath))
return false;
if (string.IsNullOrWhiteSpace(HttpPath))
return false;
return true;
}
}

Binary file not shown.

View File

@ -80,6 +80,12 @@ namespace EftPatchHelper.Tasks
{
_options.UploadToGoFile = new ConfirmationPrompt("Upload to GoFile?").Show(AnsiConsole.Console);
}
if (_settings.SftpUploads.Count > 0)
{
_options.UploadToSftpSites =
new ConfirmationPrompt($"Upload to SFTP sites? ( {_settings.SftpUploads.Count} sites )").Show(AnsiConsole.Console);
}
}
public void Run()

View File

@ -34,12 +34,18 @@ namespace EftPatchHelper.Tasks
{
var patcherFile = new FileInfo(_options.OutputPatchPath + ".zip");
if (!patcherFile.Exists) return false;
if (!patcherFile.Exists)
{
return false;
}
AnsiConsole.WriteLine("Building mirrors list ...");
if(_settings.UsingGoFile() && _options.UploadToGoFile)
{
var gofile = new GoFileUpload(patcherFile, _settings.GoFileApiKey, _settings.GoFileFolderId);
_fileUploads.Add(gofile);
AnsiConsole.WriteLine("Added MEGA");
}
if (_settings.UsingMega() && _options.UploadToMega)
@ -47,6 +53,21 @@ namespace EftPatchHelper.Tasks
var mega = new MegaUpload(patcherFile, _settings.MegaEmail, _settings.MegaPassword);
await mega.SetUploadFolder(_settings.MegaUploadFolder);
_fileUploads.Add(mega);
AnsiConsole.WriteLine("Added MEGA");
}
if (_settings.SftpUploads.Count > 0 && _options.UploadToSftpSites)
{
foreach (var sftpInfo in _settings.SftpUploads)
{
if (!sftpInfo.IsValid())
{
continue;
}
AnsiConsole.WriteLine($"Added SFTP: {sftpInfo.Hostname}");
_fileUploads.Add(new SftpUpload(patcherFile, sftpInfo));
}
}
return true;
@ -58,6 +79,11 @@ namespace EftPatchHelper.Tasks
foreach (var pair in _options.MirrorList)
{
if (!pair.Value.AddHubEntry)
{
continue;
}
var displayText = pair.Key;
var link = pair.Value.Link;
@ -90,8 +116,12 @@ namespace EftPatchHelper.Tasks
static string BytesToString(long byteCount)
{
string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" };
if (byteCount == 0)
{
return "0" + suf[0];
}
long bytes = Math.Abs(byteCount);
int place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024)));
double num = Math.Round(bytes / Math.Pow(1024, place), 1);
@ -134,8 +164,9 @@ namespace EftPatchHelper.Tasks
}
else
{
DownloadMirror mirror = new DownloadMirror()
DownloadMirror mirror = new DownloadMirror
{
AddHubEntry = pair.Key.AddHubEntry,
Link = pair.Key.GetLink(),
Hash = GetFileHash(pair.Key.UploadFileInfo)
};
@ -152,7 +183,7 @@ namespace EftPatchHelper.Tasks
public void Run()
{
if (!_options.UploadToGoFile && !_options.UploadToMega) return;
if (!_options.UploadToGoFile && !_options.UploadToMega && !_options.UploadToSftpSites) return;
UploadAllFiles().GetAwaiter().GetResult().ValidateOrExit();

View File

@ -14,5 +14,18 @@
"megaPassword": "",
"megaUploadFolder": "",
"goFileApiKey": "",
"goFileFolderId": ""
"goFileFolderId": "",
"sftpUploads": [
{
"username": "example-remove-before-using",
"password": "password123",
"hostKey": "ssh-ed12345 SLKDJFK3928D2LDKFJ2",
"hostname": "sftp.slugma-ligma.com",
"port": 12345,
"uploadPath": "/public/patchers",
"httpPath": "https://mirror.slugma-ligma.com/patchers"
}
]
}