Beispiel #1
0
        public async Task <IReadOnlyList <OutdatedPackage> > GetOutdatedPackages(bool includePrerelease = false, string packageName = null, bool forceCheckForOutdatedPackages = false)
        {
            var preventAutomatedOutdatedPackagesCheck = _configService.GetAppConfiguration().PreventAutomatedOutdatedPackagesCheck;

            if (preventAutomatedOutdatedPackagesCheck && !forceCheckForOutdatedPackages)
            {
                return(new List <OutdatedPackage>());
            }

            var outdatedPackagesFile = _fileSystem.combine_paths(_localAppDataPath, "outdatedPackages.xml");

            var outdatedPackagesCacheDurationInMinutesSetting = _configService.GetAppConfiguration().OutdatedPackagesCacheDurationInMinutes;
            int outdatedPackagesCacheDurationInMinutes        = 0;

            if (!string.IsNullOrWhiteSpace(outdatedPackagesCacheDurationInMinutesSetting))
            {
                int.TryParse(outdatedPackagesCacheDurationInMinutesSetting, out outdatedPackagesCacheDurationInMinutes);
            }

            if (_fileSystem.file_exists(outdatedPackagesFile) && (DateTime.Now - _fileSystem.get_file_modified_date(outdatedPackagesFile)).TotalMinutes < outdatedPackagesCacheDurationInMinutes)
            {
                return(_xmlService.deserialize <List <OutdatedPackage> >(outdatedPackagesFile));
            }
            else
            {
                var choco = Lets.GetChocolatey();
                choco.Set(
                    config =>
                {
                    config.CommandName  = "outdated";
                    config.PackageNames = packageName ?? chocolatey.infrastructure.app.ApplicationParameters.AllPackages;
                    config.UpgradeCommand.NotifyOnlyAvailableUpgrades = true;
                    config.RegularOutput = false;
                    config.QuietOutput   = true;
                    config.Prerelease    = false;
                });
                var chocoConfig = choco.GetConfiguration();

                // If there are no Sources configured, for example, if they are all disabled, then figuring out
                // which packages are outdated can't be completed.
                if (chocoConfig.Sources != null)
                {
                    var nugetService = choco.Container().GetInstance <INugetService>();
                    var packages     = await Task.Run(() => nugetService.upgrade_noop(chocoConfig, null));

                    var results = packages
                                  .Where(p => !p.Value.Inconclusive)
                                  .Select(p => new OutdatedPackage
                    {
                        Id = p.Value.Package.Id, VersionString = p.Value.Package.Version.ToNormalizedString()
                    })
                                  .ToArray();

                    try
                    {
                        _xmlService.serialize(results, outdatedPackagesFile);
                    }
                    catch (Exception ex)
                    {
                        Logger.Error(ex, "Unable to serialize Outdated Packages Cache file.");
                    }

                    return(results.ToList());
                }
                else
                {
                    return(new List <OutdatedPackage>());
                }
            }
        }
Beispiel #2
0
        protected override void Load(ContainerBuilder builder)
        {
            var viewModelAssembly = typeof(ShellViewModel).Assembly;
            var viewAssembly      = typeof(ShellView).Assembly;

            // Register Providers
            builder.RegisterType <VersionNumberProvider>().As <IVersionNumberProvider>().SingleInstance();
            builder.RegisterType <Elevation>().SingleInstance();
            builder.RegisterType <ChocolateyConfigurationProvider>().As <IChocolateyConfigurationProvider>().SingleInstance();
            builder.RegisterType <ChocolateyService>().As <IChocolateyService>().SingleInstance();
            builder.RegisterType <DotNetFileSystem>().As <chocolatey.infrastructure.filesystem.IFileSystem>().SingleInstance();

            // Register ViewModels
            builder.RegisterAssemblyTypes(viewModelAssembly)
            .Where(type => type.Name.EndsWith("ViewModel", StringComparison.Ordinal))
            .Where(type => type.GetInterface(typeof(INotifyPropertyChanged).Name) != null)
            .AsSelf()
            .InstancePerDependency();

            builder.RegisterType <PackageViewModel>().As <IPackageViewModel>();

            var choco = Lets.GetChocolatey();

            builder.RegisterInstance(choco.Container().GetInstance <IChocolateyConfigSettingsService>())
            .As <IChocolateyConfigSettingsService>().SingleInstance();
            builder.RegisterInstance(choco.Container().GetInstance <IXmlService>())
            .As <IXmlService>().SingleInstance();

            // Register Views
            builder.RegisterAssemblyTypes(viewAssembly)
            .Where(type => type.Name.EndsWith("View", StringComparison.Ordinal))
            .AsSelf()
            .InstancePerDependency();

            // Register the single window manager for this container
            builder.Register <IWindowManager>(c => new WindowManager()).InstancePerLifetimeScope();

            // Register the single event aggregator for this container
            builder.Register <IEventAggregator>(c => new EventAggregator()).InstancePerLifetimeScope();

            // Register Services
            builder.RegisterType <DialogService>().As <IDialogService>().SingleInstance();
            builder.RegisterType <ProgressService>().As <IProgressService>().SingleInstance();
            builder.RegisterType <PersistenceService>().As <IPersistenceService>().SingleInstance();
            builder.RegisterType <LiteDBFileStorageService>().As <IFileStorageService>().SingleInstance();
            builder.RegisterType <ChocolateyGuiCacheService>().As <IChocolateyGuiCacheService>().SingleInstance();
            builder.RegisterType <AllowedCommandsService>().As <IAllowedCommandsService>().SingleInstance();

            // Register Mapper
            var mapperConfiguration = new MapperConfiguration(config =>
            {
                config.CreateMap <IPackageViewModel, IPackageViewModel>()
                .ForMember(vm => vm.IsInstalled, options => options.Ignore());

                config.CreateMap <DataServicePackage, Package>()
                .ForMember(dest => dest.Authors, opt => opt.MapFrom(src => src.Authors.Split(new[] { ',' })))
                .ForMember(dest => dest.Owners, opt => opt.MapFrom(src => src.Owners.Split(new[] { ',' })));
                config.CreateMap <IPackage, Package>();

                config.CreateMap <ConfigFileFeatureSetting, ChocolateyFeature>();
                config.CreateMap <ConfigFileConfigSetting, ChocolateySetting>();
                config.CreateMap <ConfigFileSourceSetting, Common.Models.ChocolateySource>()
                .ForMember(dest => dest.Password, opt => opt.MapFrom(src => NugetEncryptionUtility.DecryptString(src.Password)))
                .ForMember(dest => dest.CertificatePassword, opt => opt.MapFrom(src => NugetEncryptionUtility.DecryptString(src.CertificatePassword)));

                config.CreateMap <ChocolateySource, Common.Models.ChocolateySource>()
                .ForMember(dest => dest.VisibleToAdminsOnly, opt => opt.MapFrom(src => src.VisibleToAdminOnly));
            });

            builder.RegisterType <BundledThemeService>().As <IBundledThemeService>().SingleInstance();
            builder.RegisterInstance(mapperConfiguration.CreateMapper()).As <IMapper>();

            try
            {
                var userDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.LocalAppDataPath, "data.db")};upgrade=true");

                LiteDatabase globalDatabase;
                if (Hacks.IsElevated)
                {
                    string dir = Path.Combine(Bootstrapper.AppDataPath, "Config");
                    if (!Directory.Exists(dir))
                    {
                        Directory.CreateDirectory(dir);
                    }

                    globalDatabase = new LiteDatabase($"filename={Path.Combine(dir, "data.db")};upgrade=true");
                }
                else
                {
                    if (!File.Exists(Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")))
                    {
                        // Since the global configuration database file doesn't exist, we must be running in a state where an administrator user
                        // has never run Chocolatey GUI. In this case, use null, which will mean attempts to use the global database will be ignored.
                        globalDatabase = null;
                    }
                    else
                    {
                        // Since this is a non-administrator user, they should only have read permissions to this database
                        globalDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};readonly=true");
                    }
                }

                if (globalDatabase != null)
                {
                    builder.RegisterInstance(globalDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.GlobalConfigurationDatabaseName);
                }

                var configService = new ConfigService(globalDatabase, userDatabase);
                configService.SetEffectiveConfiguration();

                var iconService = new PackageIconService(userDatabase);

                builder.RegisterInstance(iconService).As <IPackageIconService>().SingleInstance();
                builder.RegisterInstance(configService).As <IConfigService>().SingleInstance();
                builder.RegisterInstance(new LiteDBFileStorageService(userDatabase)).As <IFileStorageService>().SingleInstance();

                // Since there are two instances of LiteDB, they are added as named instances, so that they can be retrieved when required
                builder.RegisterInstance(userDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.UserConfigurationDatabaseName);
            }
            catch (IOException ex)
            {
                Bootstrapper.Logger.Error(ex, Resources.Error_DatabaseAccessGui);
                throw;
            }

            builder.RegisterType <ImageService>().As <IImageService>().SingleInstance();
            builder.RegisterType <VersionService>().As <IVersionService>().SingleInstance();
            builder.RegisterType <SplashScreenService>().As <ISplashScreenService>().SingleInstance();
        }
Beispiel #3
0
        protected override void Load(ContainerBuilder builder)
        {
            // Register Providers
            builder.RegisterType <VersionNumberProvider>().As <IVersionNumberProvider>().SingleInstance();
            builder.RegisterType <ChocolateyConfigurationProvider>().As <IChocolateyConfigurationProvider>().SingleInstance();
            builder.RegisterType <DotNetFileSystem>().As <chocolatey.infrastructure.filesystem.IFileSystem>().SingleInstance();

            var choco = Lets.GetChocolatey();

            builder.RegisterInstance(choco.Container().GetInstance <IChocolateyConfigSettingsService>())
            .As <IChocolateyConfigSettingsService>().SingleInstance();
            builder.RegisterInstance(choco.Container().GetInstance <IXmlService>())
            .As <IXmlService>().SingleInstance();

            builder.RegisterType <ChocolateyGuiCacheService>().As <IChocolateyGuiCacheService>().SingleInstance();

            try
            {
                var userDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.LocalAppDataPath, "data.db")};upgrade=true");

                LiteDatabase globalDatabase;
                if (Hacks.IsElevated)
                {
                    globalDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};upgrade=true");
                }
                else
                {
                    if (!File.Exists(Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")))
                    {
                        // Since the global configuration database file doesn't exist, we must be running in a state where an administrator user
                        // has never run Chocolatey GUI. In this case, use null, which will mean attempts to use the global database will be ignored.
                        globalDatabase = null;
                    }
                    else
                    {
                        // Since this is a non-administrator user, they should only have read permissions to this database
                        globalDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};readonly=true");
                    }
                }

                if (globalDatabase != null)
                {
                    builder.RegisterInstance(globalDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.GlobalConfigurationDatabaseName);
                }

                var configService = new ConfigService(globalDatabase, userDatabase);
                configService.SetEffectiveConfiguration();

                builder.RegisterInstance(configService).As <IConfigService>().SingleInstance();
                builder.RegisterInstance(new LiteDBFileStorageService(userDatabase)).As <IFileStorageService>().SingleInstance();

                // Since there are two instances of LiteDB, they are added as named instances, so that they can be retrieved when required
                builder.RegisterInstance(userDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.UserConfigurationDatabaseName);
            }
            catch (IOException ex)
            {
                Bootstrapper.Logger.Error(ex, Resources.Error_DatabaseAccessCli);
                Environment.Exit(-1);
            }

            // Services
            builder.RegisterType <VersionService>().As <IVersionService>().SingleInstance();

            // Commands
            // These are using Named registrations to aid with the "finding" of these components
            // within the Container.  As suggested in this Stack Overflow question:
            // https://stackoverflow.com/questions/4999000/replace-registration-in-autofac
            builder.RegisterType <FeatureCommand>().As <ICommand>().SingleInstance().Named <ICommand>(FeatureCommandName);
            builder.RegisterType <ConfigCommand>().As <ICommand>().SingleInstance().Named <ICommand>(ConfigCommandName);
            builder.RegisterType <PurgeCommand>().As <ICommand>().SingleInstance().Named <ICommand>(PurgeCommandName);
        }
Beispiel #4
0
 public override void Because()
 {
     _chocolatey1 = Lets.GetChocolatey();
     _chocolatey2 = Lets.GetChocolatey();
 }