copy files via tar

This commit is contained in:
2023-07-31 22:04:46 +02:00
parent 1af741155a
commit 47ae3d1141
2 changed files with 51 additions and 7 deletions

View File

@@ -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>

View File

@@ -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);
} }
} }