using CliWrap; using CliWrap.Buffered; using InnovEnergy.Lib.Utils; namespace InnovEnergy.App.Backend.S3; public class S3Cmd { private static readonly Command Python = Cli.Wrap("python3"); private const String S3CmdPath = "Resources/s3cmd.py"; private const String S3Prefix = "s3://"; private String[] DefaultArgs { get; } // ReSharper disable StringLiteralTypo // ReSharper enable StringLiteralTypo public S3Cmd(String key, String secret) { DefaultArgs = new[] { S3CmdPath, "--access_key", key, "--secret_key", secret, }; } public async Task SignUrl(String bucketName, TimeSpan validity) { var result = await Run(bucketName, "signurl", $"+{validity.TotalSeconds}"); return result .StandardOutput .Replace("\n", "") .Replace(" ", ""); } public async Task CreateBucket(String bucketName) { var result = await Run(bucketName, "mb"); return result.ExitCode == 0; } public async Task DeleteBucket(String bucketName) { var result = await Run(bucketName, "rb"); return result.ExitCode == 0; } private Task Run(String bucketName, String operation, params String[] optionalArgs) { var args = DefaultArgs .Append(operation) .Append(bucketName.EnsureStartsWith(S3Prefix)) .Concat(optionalArgs); return Python .WithArguments(args) .ExecuteBufferedAsync(); } }