Revert "Merge pull request #106 from Moonlight-Panel/DiscordBot"
This reverts commitf71fcc0f5d, reversing changes made toe0bea9b61c.
This commit is contained in:
206
Moonlight/App/Helpers/Files/SftpFileAccess.cs
Normal file
206
Moonlight/App/Helpers/Files/SftpFileAccess.cs
Normal file
@@ -0,0 +1,206 @@
|
||||
using Logging.Net;
|
||||
using Renci.SshNet;
|
||||
using ConnectionInfo = Renci.SshNet.ConnectionInfo;
|
||||
|
||||
namespace Moonlight.App.Helpers.Files;
|
||||
|
||||
public class SftpFileAccess : FileAccess
|
||||
{
|
||||
private readonly string SftpHost;
|
||||
private readonly string SftpUser;
|
||||
private readonly string SftpPassword;
|
||||
private readonly int SftpPort;
|
||||
private readonly bool ForceUserDir;
|
||||
|
||||
private readonly SftpClient Client;
|
||||
|
||||
private string InternalPath
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ForceUserDir)
|
||||
return $"/home/{SftpUser}{CurrentPath}";
|
||||
|
||||
return InternalPath;
|
||||
}
|
||||
}
|
||||
|
||||
public SftpFileAccess(string sftpHost, string sftpUser, string sftpPassword, int sftpPort,
|
||||
bool forceUserDir = false)
|
||||
{
|
||||
SftpHost = sftpHost;
|
||||
SftpUser = sftpUser;
|
||||
SftpPassword = sftpPassword;
|
||||
SftpPort = sftpPort;
|
||||
ForceUserDir = forceUserDir;
|
||||
|
||||
Client = new(
|
||||
new ConnectionInfo(
|
||||
SftpHost,
|
||||
SftpPort,
|
||||
SftpUser,
|
||||
new PasswordAuthenticationMethod(
|
||||
SftpUser,
|
||||
SftpPassword
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private void EnsureConnect()
|
||||
{
|
||||
if (!Client.IsConnected)
|
||||
Client.Connect();
|
||||
}
|
||||
|
||||
|
||||
public override Task<FileData[]> Ls()
|
||||
{
|
||||
EnsureConnect();
|
||||
|
||||
var x = new List<FileData>();
|
||||
|
||||
foreach (var file in Client.ListDirectory(InternalPath))
|
||||
{
|
||||
if (file.Name != "." && file.Name != "..")
|
||||
{
|
||||
x.Add(new()
|
||||
{
|
||||
Name = file.Name,
|
||||
Size = file.Attributes.Size,
|
||||
IsFile = !file.IsDirectory
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return Task.FromResult(x.ToArray());
|
||||
}
|
||||
|
||||
public override Task Cd(string dir)
|
||||
{
|
||||
var x = Path.Combine(CurrentPath, dir).Replace("\\", "/") + "/";
|
||||
x = x.Replace("//", "/");
|
||||
CurrentPath = x;
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override Task Up()
|
||||
{
|
||||
CurrentPath = Path.GetFullPath(Path.Combine(CurrentPath, "..")).Replace("\\", "/").Replace("C:", "");
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override Task SetDir(string dir)
|
||||
{
|
||||
CurrentPath = dir;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override Task<string> Read(FileData fileData)
|
||||
{
|
||||
EnsureConnect();
|
||||
|
||||
var textStream = Client.Open(InternalPath.TrimEnd('/') + "/" + fileData.Name, FileMode.Open);
|
||||
|
||||
if (textStream == null)
|
||||
return Task.FromResult("");
|
||||
|
||||
var streamReader = new StreamReader(textStream);
|
||||
|
||||
var text = streamReader.ReadToEnd();
|
||||
|
||||
streamReader.Close();
|
||||
textStream.Close();
|
||||
|
||||
return Task.FromResult(text);
|
||||
}
|
||||
|
||||
public override Task Write(FileData fileData, string content)
|
||||
{
|
||||
EnsureConnect();
|
||||
|
||||
var textStream = Client.Open(InternalPath.TrimEnd('/') + "/" + fileData.Name, FileMode.Create);
|
||||
|
||||
var streamWriter = new StreamWriter(textStream);
|
||||
streamWriter.Write(content);
|
||||
|
||||
streamWriter.Flush();
|
||||
textStream.Flush();
|
||||
|
||||
streamWriter.Close();
|
||||
textStream.Close();
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override async Task Upload(string name, Stream stream, Action<int>? progressUpdated = null)
|
||||
{
|
||||
var dataStream = new SyncStreamAdapter(stream);
|
||||
|
||||
await Task.Factory.FromAsync((x, _) => Client.BeginUploadFile(dataStream, InternalPath + name, x, null, u =>
|
||||
{
|
||||
progressUpdated?.Invoke((int)((long)u / stream.Length));
|
||||
}),
|
||||
Client.EndUploadFile, null);
|
||||
}
|
||||
|
||||
public override Task MkDir(string name)
|
||||
{
|
||||
Client.CreateDirectory(InternalPath + name);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override Task<string> Pwd()
|
||||
{
|
||||
return Task.FromResult(CurrentPath);
|
||||
}
|
||||
|
||||
public override Task<string> DownloadUrl(FileData fileData)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override Task<Stream> DownloadStream(FileData fileData)
|
||||
{
|
||||
var stream = new MemoryStream(100 * 1024 * 1024);
|
||||
Client.DownloadFile(InternalPath + fileData.Name, stream);
|
||||
|
||||
return Task.FromResult<Stream>(stream);
|
||||
}
|
||||
|
||||
public override Task Delete(FileData fileData)
|
||||
{
|
||||
Client.Delete(InternalPath + fileData.Name);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override Task Move(FileData fileData, string newPath)
|
||||
{
|
||||
Client.RenameFile(InternalPath + fileData.Name, InternalPath + newPath);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override Task Compress(params FileData[] files)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override Task Decompress(FileData fileData)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override Task<string> GetLaunchUrl()
|
||||
{
|
||||
return Task.FromResult($"sftp://{SftpUser}@{SftpHost}:{SftpPort}");
|
||||
}
|
||||
|
||||
public override object Clone()
|
||||
{
|
||||
return new SftpFileAccess(SftpHost, SftpUser, SftpPassword, SftpPort, ForceUserDir);
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,23 @@
|
||||
namespace Moonlight.App.Helpers;
|
||||
using Logging.Net;
|
||||
|
||||
namespace Moonlight.App.Helpers;
|
||||
|
||||
public static class ParseHelper
|
||||
{
|
||||
public static int MinecraftToInt(string raw)
|
||||
{
|
||||
var versionWithoutPre = raw.Split("-")[0];
|
||||
var versionWithoutPre = raw.Split("_")[0];
|
||||
versionWithoutPre = versionWithoutPre.Split("-")[0];
|
||||
|
||||
// Fuck you 1.7.10 ;)
|
||||
versionWithoutPre = versionWithoutPre.Replace("1.7.10", "1.7");
|
||||
|
||||
if (versionWithoutPre.Count(x => x == "."[0]) == 1)
|
||||
versionWithoutPre += ".0";
|
||||
|
||||
return int.Parse(versionWithoutPre.Replace(".", ""));
|
||||
var x = versionWithoutPre.Replace(".", "");
|
||||
|
||||
return int.Parse(x);
|
||||
}
|
||||
|
||||
public static string FirstPartStartingWithNumber(string raw)
|
||||
@@ -29,4 +37,61 @@ public static class ParseHelper
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public static string GetHighestVersion(string[] versions)
|
||||
{
|
||||
// Initialize the highest version to the first version in the array
|
||||
string highestVersion = versions[0];
|
||||
|
||||
// Loop through the remaining versions in the array
|
||||
for (int i = 1; i < versions.Length; i++)
|
||||
{
|
||||
// Compare the current version to the highest version
|
||||
if (CompareVersions(versions[i], highestVersion) > 0)
|
||||
{
|
||||
// If the current version is higher, update the highest version
|
||||
highestVersion = versions[i];
|
||||
}
|
||||
}
|
||||
|
||||
return highestVersion;
|
||||
}
|
||||
|
||||
public static int CompareVersions(string version1, string version2)
|
||||
{
|
||||
// Split the versions into their component parts
|
||||
string[] version1Parts = version1.Split('.');
|
||||
string[] version2Parts = version2.Split('.');
|
||||
|
||||
// Compare each component part in turn
|
||||
for (int i = 0; i < version1Parts.Length && i < version2Parts.Length; i++)
|
||||
{
|
||||
int part1 = int.Parse(version1Parts[i]);
|
||||
int part2 = int.Parse(version2Parts[i]);
|
||||
|
||||
if (part1 < part2)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (part1 > part2)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// If we get here, the versions are equal up to the length of the shorter one.
|
||||
// If one version has more parts than the other, the longer one is considered higher.
|
||||
if (version1Parts.Length < version2Parts.Length)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (version1Parts.Length > version2Parts.Length)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,220 +0,0 @@
|
||||
using System.Text;
|
||||
using Moonlight.App.Database.Entities;
|
||||
using Moonlight.App.Exceptions;
|
||||
using Newtonsoft.Json;
|
||||
using RestSharp;
|
||||
|
||||
namespace Moonlight.App.Helpers;
|
||||
|
||||
public class PleskApiHelper
|
||||
{
|
||||
private readonly RestClient Client;
|
||||
|
||||
public PleskApiHelper()
|
||||
{
|
||||
Client = new();
|
||||
}
|
||||
|
||||
public async Task<T> Get<T>(PleskServer server, string resource)
|
||||
{
|
||||
var request = CreateRequest(server, resource);
|
||||
|
||||
request.Method = Method.Get;
|
||||
|
||||
var response = await Client.ExecuteAsync(request);
|
||||
|
||||
if (!response.IsSuccessful)
|
||||
{
|
||||
if (response.StatusCode != 0)
|
||||
{
|
||||
throw new PleskException(
|
||||
$"An error occured: ({response.StatusCode}) {response.Content}",
|
||||
(int)response.StatusCode
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"An internal error occured: {response.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
|
||||
return JsonConvert.DeserializeObject<T>(response.Content!)!;
|
||||
}
|
||||
|
||||
public async Task<string> GetRaw(PleskServer server, string resource)
|
||||
{
|
||||
var request = CreateRequest(server, resource);
|
||||
|
||||
request.Method = Method.Get;
|
||||
|
||||
var response = await Client.ExecuteAsync(request);
|
||||
|
||||
if (!response.IsSuccessful)
|
||||
{
|
||||
if (response.StatusCode != 0)
|
||||
{
|
||||
throw new PleskException(
|
||||
$"An error occured: ({response.StatusCode}) {response.Content}",
|
||||
(int)response.StatusCode
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"An internal error occured: {response.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
|
||||
return response.Content!;
|
||||
}
|
||||
|
||||
public async Task<T> Post<T>(PleskServer server, string resource, object? body)
|
||||
{
|
||||
var request = CreateRequest(server, resource);
|
||||
|
||||
request.Method = Method.Post;
|
||||
|
||||
request.AddParameter("text/plain",
|
||||
JsonConvert.SerializeObject(body),
|
||||
ParameterType.RequestBody
|
||||
);
|
||||
|
||||
var response = await Client.ExecuteAsync(request);
|
||||
|
||||
if (!response.IsSuccessful)
|
||||
{
|
||||
if (response.StatusCode != 0)
|
||||
{
|
||||
throw new PleskException(
|
||||
$"An error occured: ({response.StatusCode}) {response.Content}",
|
||||
(int)response.StatusCode
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"An internal error occured: {response.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
|
||||
return JsonConvert.DeserializeObject<T>(response.Content!)!;
|
||||
}
|
||||
|
||||
public async Task Post(PleskServer server, string resource, object? body)
|
||||
{
|
||||
var request = CreateRequest(server, resource);
|
||||
|
||||
request.Method = Method.Post;
|
||||
|
||||
if(body != null)
|
||||
request.AddParameter("text/plain", JsonConvert.SerializeObject(body), ParameterType.RequestBody);
|
||||
|
||||
var response = await Client.ExecuteAsync(request);
|
||||
|
||||
if (!response.IsSuccessful)
|
||||
{
|
||||
if (response.StatusCode != 0)
|
||||
{
|
||||
throw new PleskException(
|
||||
$"An error occured: ({response.StatusCode}) {response.Content}",
|
||||
(int)response.StatusCode
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"An internal error occured: {response.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async Task PostRaw(PleskServer server, string resource, object body)
|
||||
{
|
||||
var request = CreateRequest(server, resource);
|
||||
|
||||
request.Method = Method.Post;
|
||||
|
||||
request.AddParameter("text/plain", body, ParameterType.RequestBody);
|
||||
|
||||
var response = await Client.ExecuteAsync(request);
|
||||
|
||||
if (!response.IsSuccessful)
|
||||
{
|
||||
if (response.StatusCode != 0)
|
||||
{
|
||||
throw new PleskException(
|
||||
$"An error occured: ({response.StatusCode}) {response.Content}",
|
||||
(int)response.StatusCode
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"An internal error occured: {response.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async Task Delete(PleskServer server, string resource, object? body)
|
||||
{
|
||||
var request = CreateRequest(server, resource);
|
||||
|
||||
request.Method = Method.Delete;
|
||||
|
||||
if(body != null)
|
||||
request.AddParameter("text/plain", JsonConvert.SerializeObject(body), ParameterType.RequestBody);
|
||||
|
||||
var response = await Client.ExecuteAsync(request);
|
||||
|
||||
if (!response.IsSuccessful)
|
||||
{
|
||||
if (response.StatusCode != 0)
|
||||
{
|
||||
throw new PleskException(
|
||||
$"An error occured: ({response.StatusCode}) {response.Content}",
|
||||
(int)response.StatusCode
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"An internal error occured: {response.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async Task Put(PleskServer server, string resource, object? body)
|
||||
{
|
||||
var request = CreateRequest(server, resource);
|
||||
|
||||
request.Method = Method.Put;
|
||||
|
||||
request.AddParameter("text/plain", JsonConvert.SerializeObject(body), ParameterType.RequestBody);
|
||||
|
||||
var response = await Client.ExecuteAsync(request);
|
||||
|
||||
if (!response.IsSuccessful)
|
||||
{
|
||||
if (response.StatusCode != 0)
|
||||
{
|
||||
throw new PleskException(
|
||||
$"An error occured: ({response.StatusCode}) {response.Content}",
|
||||
(int)response.StatusCode
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"An internal error occured: {response.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private RestRequest CreateRequest(PleskServer pleskServer, string resource)
|
||||
{
|
||||
var url = $"{pleskServer.ApiUrl}/" + resource;
|
||||
|
||||
var request = new RestRequest(url);
|
||||
var ba = Convert.ToBase64String(Encoding.UTF8.GetBytes(pleskServer.ApiKey));
|
||||
|
||||
request.AddHeader("Content-Type", "application/json");
|
||||
request.AddHeader("Accept", "application/json");
|
||||
request.AddHeader("Authorization", "Basic " + ba);
|
||||
|
||||
return request;
|
||||
}
|
||||
}
|
||||
58
Moonlight/App/Helpers/SyncStreamAdapter.cs
Normal file
58
Moonlight/App/Helpers/SyncStreamAdapter.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
namespace Moonlight.App.Helpers;
|
||||
|
||||
public class SyncStreamAdapter : Stream
|
||||
{
|
||||
private readonly Stream _stream;
|
||||
|
||||
public SyncStreamAdapter(Stream stream)
|
||||
{
|
||||
_stream = stream ?? throw new ArgumentNullException(nameof(stream));
|
||||
}
|
||||
|
||||
public override bool CanRead => _stream.CanRead;
|
||||
public override bool CanSeek => _stream.CanSeek;
|
||||
public override bool CanWrite => _stream.CanWrite;
|
||||
public override long Length => _stream.Length;
|
||||
|
||||
public override long Position
|
||||
{
|
||||
get => _stream.Position;
|
||||
set => _stream.Position = value;
|
||||
}
|
||||
|
||||
public override void Flush()
|
||||
{
|
||||
_stream.Flush();
|
||||
}
|
||||
|
||||
public override int Read(byte[] buffer, int offset, int count)
|
||||
{
|
||||
var task = Task.Run(() => _stream.ReadAsync(buffer, offset, count));
|
||||
return task.GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
public override long Seek(long offset, SeekOrigin origin)
|
||||
{
|
||||
return _stream.Seek(offset, origin);
|
||||
}
|
||||
|
||||
public override void SetLength(long value)
|
||||
{
|
||||
_stream.SetLength(value);
|
||||
}
|
||||
|
||||
public override void Write(byte[] buffer, int offset, int count)
|
||||
{
|
||||
var task = Task.Run(() => _stream.WriteAsync(buffer, offset, count));
|
||||
task.GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
_stream?.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user