public async override Task <bool> TestPackageInstalledAsync(SoftwarePackage package)
        {
            var fileinfo = await GetPackageFileAsync(package, ".appx");

            using var stream = ZipFile.OpenRead(fileinfo.FullName)?.GetEntry("AppxManifest.xml")?.Open();

            if (stream == null)
            {
                throw new Exception("Cannot test if package installed.  File does not exist.");
            }

            using var reader = new StreamReader(stream);

            XNamespace xdocNamespace = "http://schemas.microsoft.com/appx/manifest/foundation/windows10";

            var xml = await reader.ReadToEndAsync();

            var doc      = XDocument.Parse(xml);
            var appxName = doc.Descendants(xdocNamespace + "Identity")?.First()?.Attribute("Name")?.Value;

            if (appxName == null)
            {
                throw new Exception("Cannot find package identity of appx.");
            }

            var sessionState = InitialSessionState.CreateDefault();

            sessionState.ExecutionPolicy = ExecutionPolicy.Unrestricted;

            using var ps = PowerShell.Create(sessionState);
            ps.AddScript("Import-Module Appx -UseWindowsPowerShell");
            ps.AddScript($"Get-AppxPackage '{appxName}'");

            return((await ps.InvokeAsync()).Count > 0);
        }
Пример #2
0
        public override async Task InstallPackageAsync(SoftwarePackage package)
        {
            string arguments;

            if (await GetUpgradePending(package.PackageName))
            {
                arguments = $"upgrade {package.PackageName} -y";
            }
            else
            {
                arguments = $"install {package.PackageName} -y";
            }

            var process = Process.Start(new ProcessStartInfo
            {
                FileName  = "choco",
                Arguments = arguments
            });

            await(process?.WaitForExitAsync() ?? Task.CompletedTask);

            if (process == null || process.ExitCode != 0)
            {
                throw new InstallFailedException();
            }
        }
        public override async Task <bool> TestPackageInstalledAsync(SoftwarePackage package)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }

            if (package.PackageName == null)
            {
                throw new ArgumentNullException(nameof(package.PackageName));
            }

            // dotnet tool list --global
            var process = Process.Start(new ProcessStartInfo
            {
                FileName  = await operatingSystemProvider.GetFullExecutablePathAsync("dotnet"),
                Arguments = $"tool list --global",
                RedirectStandardOutput = true,
            });

            if (process == null)
            {
                throw new Exception("Process did not start correctly.");
            }

            await process.WaitForExitAsync();

            var results = await process.StandardOutput.ReadToEndAsync();

            return(results.Contains(package.PackageName, StringComparison.InvariantCultureIgnoreCase));
        }
Пример #4
0
        private async Task InstallSoftwarePackageAsync(SoftwarePackage package, Dictionary <string, SoftwarePackage> packagesByName)
        {
            if (package.Dependencies?.Any() ?? false)
            {
                var missingDependencies = (from d in package.Dependencies
                                           where !packagesByName.ContainsKey(d)
                                           select d).ToArray();

                if (missingDependencies.Any())
                {
                    throw new DependencyMissingException(missingDependencies.ToArray());
                }

                var dependencies = from d in package.Dependencies
                                   select packagesByName[d];

                foreach (var depend in dependencies)
                {
                    await InstallSoftwarePackageAsync(depend, packagesByName);
                }
            }

            if (!await package.TestPlatformAsync())
            {
                return;
            }

            if (!await package.TestInstalledAsync())
            {
                await package.InstallAsync();
            }
        }
Пример #5
0
        public override async Task InstallPackageAsync(SoftwarePackage package)
        {
            var process = Process.Start(new ProcessStartInfo
            {
                FileName  = await operatingSystemProvider.GetFullExecutablePathAsync("code"),
                Arguments = $"--install-extension {package.PackageName}"
            });

            await(process?.WaitForExitAsync() ?? Task.CompletedTask);

            if (process == null || process.ExitCode != 0)
            {
                throw new InstallFailedException();
            }
        }
        public override async Task <bool> TestPackageInstalledAsync(SoftwarePackage package)
        {
            var fileinfo = await GetPackageFileAsync(package, ".msi");

            var productName = GetProductName(fileinfo.FullName);

            if (OperatingSystem.IsWindows())
            {
                var productsKey = Registry.ClassesRoot.OpenSubKey($"Installer\\Products");
                return((from s in productsKey?.GetSubKeyNames()
                        where OperatingSystem.IsWindows() &&
                        productsKey?.OpenSubKey(s)?.GetValue("ProductName")?.ToString() == productName
                        select s).Any());
            }

            throw new NotImplementedException();
        }
        public override async Task <bool> TestPackageInstalledAsync(SoftwarePackage package)
        {
            var cachedFeatures = await GetCachedFeaturesAsync();

            if (cachedFeatures != null && cachedFeatures[package.PackageName] == DismPackageFeatureState.Installed)
            {
                return(true);
            }

            if (!await operatingSystemProvider.IsSuperUserAsync())
            {
                throw new SuperUserRequiredException();
            }

            var features = GetCurrentFeatures();

            return(features[package.PackageName] == DismPackageFeatureState.Installed);
        }
        public override async Task InstallPackageAsync(SoftwarePackage package)
        {
            var fileinfo = await GetPackageFileAsync(package, ".msi");

            var process = Process.Start(new ProcessStartInfo
            {
                FileName         = "msiexec",
                Arguments        = $"/i {fileinfo.Name} /quiet /qn /norestart",
                WorkingDirectory = fileinfo.DirectoryName
            });

            await(process?.WaitForExitAsync() ?? Task.CompletedTask);

            if (process == null || process.ExitCode != 0)
            {
                throw new InstallFailedException();
            }
        }
        public override async Task <bool> TestPackageInstalledAsync(SoftwarePackage package)
        {
            var process = Process.Start(new ProcessStartInfo
            {
                FileName  = await operatingSystemProvider.GetFullExecutablePathAsync("npm"),
                Arguments = $"list -g {package.PackageName}",
                RedirectStandardOutput = true,
            });

            if (process == null)
            {
                throw new Exception("Process did not start correctly.");
            }

            await process.WaitForExitAsync();

            return(process.ExitCode == 0);
        }
        public override async Task InstallPackageAsync(SoftwarePackage package)
        {
            var process = Process.Start(new ProcessStartInfo
            {
                FileName  = await operatingSystemProvider.GetFullExecutablePathAsync("dotnet"),
                Arguments = $"tool install --global {package.PackageName}"
            });

            if (process == null)
            {
                throw new Exception("Process did not start correctly.");
            }

            await process.WaitForExitAsync();

            if (process.ExitCode != 0)
            {
                throw new InstallFailedException();
            }
        }
        public async override Task InstallPackageAsync(SoftwarePackage package)
        {
            var fileinfo = await GetPackageFileAsync(package, ".appx");

            var sessionState = InitialSessionState.CreateDefault();

            sessionState.ExecutionPolicy = ExecutionPolicy.Unrestricted;

            using var ps = PowerShell.Create(sessionState);
            ps.AddScript($"cd \"{fileinfo.DirectoryName}\"");
            ps.AddScript("Import-Module Appx -UseWindowsPowerShell");
            ps.AddScript($"Add-AppxPackage '{package.PackageName}'");

            await ps.InvokeAsync();

            if (ps.HadErrors)
            {
                throw new InstallFailedException();
            }
        }
        public SoftwarePackage GetSoftwarePackage(string id)
        {
            OpenConnection();

            SoftwarePackage swPackg = null;
            string          sql     = $"";

            using (SqlCommand command = new SqlCommand(sql, _sqlConnection))
            {
                command.CommandType = CommandType.Text;
                SqlDataReader dataReader = command.ExecuteReader(CommandBehavior.CloseConnection);
                while (dataReader.Read())
                {
                    swPackg = new SoftwarePackage
                    {
                    };
                }
                dataReader.Close();
            }
            return(swPackg);
        }
Пример #13
0
        private async Task InstallPackageInternalAsync(SoftwarePackage package, bool classic)
        {
            var arguments = $"install {package.PackageName}";

            if (classic)
            {
                arguments += " --classic";
            }

            var process = Process.Start(new ProcessStartInfo
            {
                FileName              = "snap",
                Arguments             = arguments,
                RedirectStandardError = true,
                CreateNoWindow        = true
            });

            if (process != null)
            {
                await process.WaitForExitAsync();

                var results = await process.StandardError.ReadToEndAsync();

                var needsClassic = (from l in results.Split('\n', StringSplitOptions.RemoveEmptyEntries)
                                    where l.Contains(CLASSIC_CHECK)
                                    select l).Any();

                if (needsClassic && !classic)
                {
                    await InstallPackageInternalAsync(package, true);

                    return;
                }
            }

            if (process == null || process.ExitCode != 0)
            {
                throw new InstallFailedException();
            }
        }
        protected async Task <FileInfo> GetPackageFileAsync(SoftwarePackage package, string defaultExtension)
        {
            if (IsWebUrl(package))
            {
                var cachePath          = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Clcrutch", "DependencyManager", "cache");
                var cacheDirectoryInfo = new DirectoryInfo(cachePath);

                if (!cacheDirectoryInfo.Exists)
                {
                    cacheDirectoryInfo.Create();
                }

                var filename = Path.GetFileName(new Uri(package.PackageName).LocalPath);
                if (string.IsNullOrEmpty(Path.GetExtension(filename)))
                {
                    filename = $"{filename}{defaultExtension}";
                }
                var filepath = Path.Join(cachePath, filename);

                var fileinfo = new FileInfo(filepath);

                if (!fileinfo.Exists)
                {
                    using var client = new HttpClient();
                    var webStream = await client.GetStreamAsync(package.PackageName);

                    var fileStream = fileinfo.Create();

                    await webStream.CopyToAsync(fileStream);
                }

                return(fileinfo);
            }
            else
            {
                return(new FileInfo(package.PackageName));
            }
        }
Пример #15
0
        public override async Task <bool> TestPackageInstalledAsync(SoftwarePackage package)
        {
            var process = Process.Start(new ProcessStartInfo
            {
                FileName  = await operatingSystemProvider.GetFullExecutablePathAsync("code"),
                Arguments = "--list-extensions",
                RedirectStandardOutput = true,
                CreateNoWindow         = true
            });

            if (process != null)
            {
                await process.WaitForExitAsync();

                var packageString = await process.StandardOutput.ReadToEndAsync();

                var packageLines = packageString.Split('\n', StringSplitOptions.RemoveEmptyEntries).ToList();

                return(packageLines.Contains(package.PackageName));
            }

            return(false);
        }
Пример #16
0
        public override async Task <bool> TestPackageInstalledAsync(SoftwarePackage package)
        {
            var installedPackages = await GetInstalledPackagesAsync();

            return((installedPackages?.ContainsKey(package.PackageName) ?? false) && (true || !await GetUpgradePending(package.PackageName)));
        }
 private bool IsWebUrl(SoftwarePackage package) =>
 package.PackageName.Contains("https://") || package.PackageName.Contains("http://");
 public SoftwarePackageDisplay(SoftwarePackage package)
 {
     Name = package.Name;
     Description = package.Description;
 }
Пример #19
0
 public override async Task <bool> TestPackageInstalledAsync(SoftwarePackage package) =>
 (await GetInstalledPackagesAsync())?.ContainsKey(package.PackageName) ?? false;
Пример #20
0
 public override Task InstallPackageAsync(SoftwarePackage package) =>
 InstallPackageInternalAsync(package, false);
 public abstract Task InstallPackageAsync(SoftwarePackage package);
 public override Task InstallPackageAsync(SoftwarePackage package)
 {
     DismApi.EnableFeatureByPackageName(GetDismSession(), package.PackageName, null, false, true);
     return(UpdateCacheAsync(GetCurrentFeatures()));
 }
 public abstract Task <bool> TestPackageInstalledAsync(SoftwarePackage package);