mirror of
https://github.com/frosch95/K8sFileBrowser.git
synced 2026-04-11 12:58:22 +02:00
copy files via tar
This commit is contained in:
@@ -27,5 +27,6 @@
|
|||||||
<PackageReference Include="KubernetesClient" Version="11.0.44" />
|
<PackageReference Include="KubernetesClient" Version="11.0.44" />
|
||||||
<PackageReference Include="Serilog" Version="3.0.1" />
|
<PackageReference Include="Serilog" Version="3.0.1" />
|
||||||
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
|
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
|
||||||
|
<PackageReference Include="SharpZipLib" Version="1.4.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using ICSharpCode.SharpZipLib.Tar;
|
||||||
using k8s;
|
using k8s;
|
||||||
using k8s.KubeConfigModels;
|
using k8s.KubeConfigModels;
|
||||||
using K8sFileBrowser.Models;
|
using K8sFileBrowser.Models;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
using static ICSharpCode.SharpZipLib.Core.StreamUtils;
|
||||||
|
|
||||||
namespace K8sFileBrowser.Services;
|
namespace K8sFileBrowser.Services;
|
||||||
|
|
||||||
@@ -74,9 +78,9 @@ public class KubernetesService
|
|||||||
.GetAwaiter()
|
.GetAwaiter()
|
||||||
.GetResult();
|
.GetResult();
|
||||||
return execResult.FileInformations
|
return execResult.FileInformations
|
||||||
.Where(f => f.Name != "." && f.Name != path)
|
.Where(f => f.Name != "." && f.Name != path)
|
||||||
.OrderBy(f => f.Type).ThenBy(f => f.Name)
|
.OrderBy(f => f.Type).ThenBy(f => f.Name)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -95,10 +99,49 @@ public class KubernetesService
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task DownloadFile(Namespace? selectedNamespace, Pod? selectedPod, FileInformation selectedFile, string? saveFileName)
|
public async Task DownloadFile(Namespace? selectedNamespace, Pod? selectedPod, FileInformation selectedFile,
|
||||||
|
string? saveFileName)
|
||||||
{
|
{
|
||||||
Log.Information($"{selectedNamespace} - {selectedPod} - {selectedFile} - {saveFileName}");
|
Log.Information("{SelectedNamespace} - {SelectedPod} - {SelectedFile} - {SaveFileName}",
|
||||||
await Task.Delay(10000);
|
selectedNamespace, selectedPod, selectedFile, saveFileName);
|
||||||
// TODO: this is done with Tar
|
var handler = new ExecAsyncCallback(async (_, stdOut, stdError) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await using var outputFileStream = File.OpenWrite(saveFileName!);
|
||||||
|
await using var tarInputStream = new TarInputStream(stdOut, Encoding.Default);
|
||||||
|
|
||||||
|
var entry = await tarInputStream.GetNextEntryAsync(default);
|
||||||
|
if (entry == null)
|
||||||
|
{
|
||||||
|
throw new IOException("Copy command failed: no files found");
|
||||||
|
}
|
||||||
|
|
||||||
|
var bytes = new byte[entry.Size];
|
||||||
|
ReadFully( tarInputStream, bytes );
|
||||||
|
await outputFileStream.WriteAsync(bytes, default);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new IOException($"Copy command failed: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
using var streamReader = new StreamReader(stdError);
|
||||||
|
while (streamReader.EndOfStream == false)
|
||||||
|
{
|
||||||
|
var error = await streamReader.ReadToEndAsync(default);
|
||||||
|
Log.Error(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// the kubectl uses also tar for copying files
|
||||||
|
await _kubernetesClient.NamespacedPodExecAsync(
|
||||||
|
selectedPod.Name,
|
||||||
|
selectedNamespace.Name,
|
||||||
|
selectedPod.Containers.First(),
|
||||||
|
new[] { "sh", "-c", $"tar cf - {selectedFile.Name}" },
|
||||||
|
false,
|
||||||
|
handler,
|
||||||
|
default);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user