private async Task <string> DownloadRelease(List <Asset> assets, bool isWindows, string version) { Variants variants = new Variants(); string artifactFileName = variants.GetArtifactFileName(variant); Asset targetAsset = assets.Where(a => a.Browser_download_url.EndsWith(artifactFileName, StringComparison.OrdinalIgnoreCase) && artifactFileName.Length > 0).FirstOrDefault(); if (targetAsset == null) { logger.Error("Failed to find asset to download!"); return(null); } var url = targetAsset.Browser_download_url; var data = await client.GetBytes(SetDownloadHeaders(new WebRequest() { Url = url, EmulateBrowser = true, Type = RequestType.GET })); while (data.IsRedirect) { data = await client.GetBytes(new WebRequest() { Url = data.RedirectingTo, EmulateBrowser = true, Type = RequestType.GET }); } var tempDir = Path.Combine(Path.GetTempPath(), "JackettUpdate-" + version + "-" + DateTime.Now.Ticks); if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, true); } Directory.CreateDirectory(tempDir); if (isWindows) { var zipPath = Path.Combine(tempDir, "Update.zip"); File.WriteAllBytes(zipPath, data.Content); var fastZip = new FastZip(); fastZip.ExtractZip(zipPath, tempDir, null); } else { var gzPath = Path.Combine(tempDir, "Update.tar.gz"); File.WriteAllBytes(gzPath, data.Content); Stream inStream = File.OpenRead(gzPath); Stream gzipStream = new GZipInputStream(inStream); TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream); tarArchive.ExtractContents(tempDir); tarArchive.Close(); gzipStream.Close(); inStream.Close(); } return(tempDir); }
private async Task <string> DownloadRelease(List <Asset> assets, bool isWindows, string version) { var variants = new Variants(); var artifactFileName = variants.GetArtifactFileName(variant); var targetAsset = assets.FirstOrDefault(a => a.Browser_download_url.EndsWith(artifactFileName, StringComparison.OrdinalIgnoreCase) && artifactFileName.Length > 0); if (targetAsset == null) { logger.Error("Failed to find asset to download!"); return(null); } var url = targetAsset.Browser_download_url; var data = await client.GetResultAsync(SetDownloadHeaders(new WebRequest() { Url = url, EmulateBrowser = true, Type = RequestType.GET })); while (data.IsRedirect) { data = await client.GetResultAsync(new WebRequest() { Url = data.RedirectingTo, EmulateBrowser = true, Type = RequestType.GET }); } var tempDir = Path.Combine(Path.GetTempPath(), "JackettUpdate-" + version + "-" + DateTime.Now.Ticks); if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, true); } Directory.CreateDirectory(tempDir); if (isWindows) { var zipPath = Path.Combine(tempDir, "Update.zip"); File.WriteAllBytes(zipPath, data.ContentBytes); var fastZip = new FastZip(); fastZip.ExtractZip(zipPath, tempDir, null); } else { var gzPath = Path.Combine(tempDir, "Update.tar.gz"); File.WriteAllBytes(gzPath, data.ContentBytes); Stream inStream = File.OpenRead(gzPath); Stream gzipStream = new GZipInputStream(inStream); var tarArchive = TarArchive.CreateInputTarArchive(gzipStream); tarArchive.ExtractContents(tempDir); tarArchive.Close(); gzipStream.Close(); inStream.Close(); if (variant == Variants.JackettVariant.CoreMacOs || variant == Variants.JackettVariant.CoreLinuxAmdx64 || variant == Variants.JackettVariant.CoreLinuxArm32 || variant == Variants.JackettVariant.CoreLinuxArm64 || variant == Variants.JackettVariant.Mono) { //Calling the file permission service to limit usage to netcoreapp. The Mono.Posix.NETStandard library causes issues outside of .NET Core //https://github.com/xamarin/XamarinComponents/issues/282 // When the files get extracted, the execute permission for jackett and JackettUpdater don't get carried across var jackettPath = tempDir + "/Jackett/jackett"; filePermissionService.MakeFileExecutable(jackettPath); var jackettUpdaterPath = tempDir + "/Jackett/JackettUpdater"; filePermissionService.MakeFileExecutable(jackettUpdaterPath); if (variant == Variants.JackettVariant.CoreMacOs) { filePermissionService.MakeFileExecutable(tempDir + "/Jackett/install_service_macos"); filePermissionService.MakeFileExecutable(tempDir + "/Jackett/uninstall_jackett_macos"); } else if (variant == Variants.JackettVariant.Mono) { var systemdPath = tempDir + "/Jackett/install_service_systemd_mono.sh"; filePermissionService.MakeFileExecutable(systemdPath); } else { var systemdPath = tempDir + "/Jackett/install_service_systemd.sh"; filePermissionService.MakeFileExecutable(systemdPath); var launcherPath = tempDir + "/Jackett/jackett_launcher.sh"; filePermissionService.MakeFileExecutable(launcherPath); } } } return(tempDir); }