Esempio n. 1
0
        /// <summary>
        /// Loads controllers and razor pages from a plugin assembly.
        /// <para>
        /// This creates a loader with <see cref="PluginConfig.PreferSharedTypes" /> set to <c>true</c>.
        /// If you need more control over shared types, use <see cref="AddPluginLoader" /> instead.
        /// </para>
        /// </summary>
        /// <param name="mvcBuilder">The MVC builder</param>
        /// <param name="assemblyFile">Full path the main .dll file for the plugin.</param>
        /// <returns>The builder</returns>
        public static IMvcBuilder AddPluginFromAssemblyFile(this IMvcBuilder mvcBuilder, string assemblyFile)
        {
            var plugin = PluginLoader.CreateFromAssemblyFile(
                assemblyFile, // create a plugin from for the .dll file
                config =>
                // this ensures that the version of MVC is shared between this app and the plugin
                config.PreferSharedTypes = true);

            return(mvcBuilder.AddPluginLoader(plugin));
        }
Esempio n. 2
0
        public static IMvcBuilder AddPlugins(this IMvcBuilder mvcBuilder, IServiceCollection serviceCollection,
                                             IConfiguration config, ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger(typeof(PluginManager));
            var pluginsFolder = config.GetPluginDir(DefaultConfiguration.GetNetworkType(config));
            var plugins       = new List <IBTCPayServerPlugin>();

            _logger.LogInformation($"Loading plugins from {pluginsFolder}");
            Directory.CreateDirectory(pluginsFolder);
            ExecuteCommands(pluginsFolder);
            List <(PluginLoader, Assembly, IFileProvider)> loadedPlugins = new List <(PluginLoader, Assembly, IFileProvider)>();
            var systemExtensions = GetDefaultLoadedPluginAssemblies();

            plugins.AddRange(systemExtensions.SelectMany(assembly =>
                                                         GetAllPluginTypesFromAssembly(assembly).Select(GetPluginInstanceFromType)));
            foreach (IBTCPayServerPlugin btcPayServerExtension in plugins)
            {
                btcPayServerExtension.SystemPlugin = true;
            }
            foreach (var dir in Directory.GetDirectories(pluginsFolder))
            {
                var pluginName = Path.GetFileName(dir);

                var plugin = PluginLoader.CreateFromAssemblyFile(
                    Path.Combine(dir, pluginName + ".dll"), // create a plugin from for the .dll file
                    config =>
                    // this ensures that the version of MVC is shared between this app and the plugin
                    config.PreferSharedTypes = true);

                mvcBuilder.AddPluginLoader(plugin);
                var pluginAssembly = plugin.LoadDefaultAssembly();
                _pluginAssemblies.Add(pluginAssembly);
                var fileProvider = CreateEmbeddedFileProviderForAssembly(pluginAssembly);
                loadedPlugins.Add((plugin, pluginAssembly, fileProvider));
                plugins.AddRange(GetAllPluginTypesFromAssembly(pluginAssembly)
                                 .Select(GetPluginInstanceFromType));
            }

            foreach (var plugin in plugins)
            {
                try
                {
                    _logger.LogInformation(
                        $"Adding and executing plugin {plugin.Identifier} - {plugin.Version}");
                    plugin.Execute(serviceCollection);
                    serviceCollection.AddSingleton(plugin);
                }
                catch (Exception e)
                {
                    _logger.LogError($"Error when loading plugin {plugin.Identifier} - {plugin.Version}{Environment.NewLine}{e.Message}");
                }
            }

            return(mvcBuilder);
        }
Esempio n. 3
0
        public static void AddExtensions(this IServiceCollection serviceCollection, string extensionsFolder,
                                         IMvcBuilder mvcBuilder)
        {
            var providers  = new List <IFileProvider>();
            var extensions = new List <BtcTransmuterExtension>();

            var loadedPluginAssemblies = GetDefaultLoadedPluginAssemblies();

            // providers.AddRange(loadedPluginAssemblies.Select(CreateEmbeddedFileProviderForAssembly));
            extensions.AddRange(loadedPluginAssemblies.SelectMany(assembly =>
                                                                  GetAllExtensionTypesFromAssembly(assembly).Select(GetExtensionInstanceFromType)));

            Console.WriteLine($"Loading extensions from {extensionsFolder}");
            Directory.CreateDirectory(extensionsFolder);

            foreach (var dir in Directory.GetDirectories(extensionsFolder))
            {
                var pluginName = Path.GetFileName(dir);

                var plugin = PluginLoader.CreateFromAssemblyFile(
                    Path.Combine(dir, pluginName + ".dll"), // create a plugin from for the .dll file
                    config =>
                    // this ensures that the version of MVC is shared between this app and the plugin
                    config.PreferSharedTypes = true);

                mvcBuilder.AddPluginLoader(plugin);

                var pluginAssembly = plugin.LoadDefaultAssembly();
                // providers.Add(CreateEmbeddedFileProviderForAssembly(pluginAssembly));
                extensions.AddRange(GetAllExtensionTypesFromAssembly(pluginAssembly)
                                    .Select(GetExtensionInstanceFromType));
            }

            serviceCollection.Configure <MvcRazorRuntimeCompilationOptions>(options =>
            {
                foreach (var embeddedFileProvider in providers)
                {
                    options.FileProviders.Add(embeddedFileProvider);
                }
            });

            foreach (var btcTransmuterExtension in extensions)
            {
                btcTransmuterExtension.Execute(serviceCollection);
            }
        }
Esempio n. 4
0
        public static IMvcBuilder AddExtensions(this IMvcBuilder mvcBuilder, IServiceCollection serviceCollection,
                                                IConfiguration config, ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger(typeof(ExtensionManager));
            var extensionsFolder = config.GetExtensionDir(DefaultConfiguration.GetNetworkType(config));
            var extensions       = new List <IBTCPayServerExtension>();

            _logger.LogInformation($"Loading extensions from {extensionsFolder}");
            Directory.CreateDirectory(extensionsFolder);
            ExecuteCommands(extensionsFolder);
            List <(PluginLoader, Assembly, IFileProvider)> plugins = new List <(PluginLoader, Assembly, IFileProvider)>();

            foreach (var dir in Directory.GetDirectories(extensionsFolder))
            {
                var pluginName = Path.GetFileName(dir);

                var plugin = PluginLoader.CreateFromAssemblyFile(
                    Path.Combine(dir, pluginName + ".dll"), // create a plugin from for the .dll file
                    config =>
                    // this ensures that the version of MVC is shared between this app and the plugin
                    config.PreferSharedTypes = true);

                mvcBuilder.AddPluginLoader(plugin);
                var pluginAssembly = plugin.LoadDefaultAssembly();
                _pluginAssemblies.Add(pluginAssembly);
                var fileProvider = CreateEmbeddedFileProviderForAssembly(pluginAssembly);
                plugins.Add((plugin, pluginAssembly, fileProvider));
                extensions.AddRange(GetAllExtensionTypesFromAssembly(pluginAssembly)
                                    .Select(GetExtensionInstanceFromType));
            }

            foreach (var extension in extensions)
            {
                _logger.LogInformation($"Adding and executing extension {extension.Identifier} - {extension.Version}");
                serviceCollection.AddSingleton(extension);
                extension.Execute(serviceCollection);
            }

            return(mvcBuilder);
        }
Esempio n. 5
0
        public static IMvcBuilder AddPlugins(this IMvcBuilder mvcBuilder, IServiceCollection serviceCollection,
                                             IConfiguration config, ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger(typeof(PluginManager));
            var pluginsFolder = new DataDirectories().Configure(config).PluginDir;
            var plugins       = new List <IBTCPayServerPlugin>();

            serviceCollection.Configure <KestrelServerOptions>(options =>
            {
                options.Limits.MaxRequestBodySize = int.MaxValue; // if don't set default value is: 30 MB
            });
            _logger.LogInformation($"Loading plugins from {pluginsFolder}");
            Directory.CreateDirectory(pluginsFolder);
            ExecuteCommands(pluginsFolder);
            List <(PluginLoader, Assembly, IFileProvider)> loadedPlugins =
                new List <(PluginLoader, Assembly, IFileProvider)>();
            var systemExtensions = GetDefaultLoadedPluginAssemblies();

            plugins.AddRange(systemExtensions.SelectMany(assembly =>
                                                         GetAllPluginTypesFromAssembly(assembly).Select(GetPluginInstanceFromType)));
            foreach (IBTCPayServerPlugin btcPayServerExtension in plugins)
            {
                btcPayServerExtension.SystemPlugin = true;
            }

            var orderFilePath = Path.Combine(pluginsFolder, "order");

            var availableDirs = Directory.GetDirectories(pluginsFolder);
            var orderedDirs   = new List <string>();

            if (File.Exists(orderFilePath))
            {
                var order = File.ReadLines(orderFilePath);
                foreach (var s in order)
                {
                    if (availableDirs.Contains(s))
                    {
                        orderedDirs.Add(s);
                    }
                }

                orderedDirs.AddRange(availableDirs.Where(s => !orderedDirs.Contains(s)));
            }
            else
            {
                orderedDirs = availableDirs.ToList();
            }

            var disabledPlugins = GetDisabledPlugins(pluginsFolder);



            foreach (var dir in orderedDirs)
            {
                var pluginName = Path.GetFileName(dir);
                if (disabledPlugins.Contains(pluginName))
                {
                    continue;
                }

                var plugin = PluginLoader.CreateFromAssemblyFile(
                    Path.Combine(dir, pluginName + ".dll"), // create a plugin from for the .dll file
                    config =>
                {
                    // this ensures that the version of MVC is shared between this app and the plugin
                    config.PreferSharedTypes = true;
                    config.IsUnloadable      = true;
                });

                mvcBuilder.AddPluginLoader(plugin);
                var pluginAssembly = plugin.LoadDefaultAssembly();
                _pluginAssemblies.Add(pluginAssembly);
                _plugins.Add(plugin);
                var fileProvider = CreateEmbeddedFileProviderForAssembly(pluginAssembly);
                loadedPlugins.Add((plugin, pluginAssembly, fileProvider));
                plugins.AddRange(GetAllPluginTypesFromAssembly(pluginAssembly)
                                 .Select(GetPluginInstanceFromType));
            }

            foreach (var plugin in plugins)
            {
                try
                {
                    _logger.LogInformation(
                        $"Adding and executing plugin {plugin.Identifier} - {plugin.Version}");
                    plugin.Execute(serviceCollection);
                    serviceCollection.AddSingleton(plugin);
                }
                catch (Exception e)
                {
                    _logger.LogError(
                        $"Error when loading plugin {plugin.Identifier} - {plugin.Version}{Environment.NewLine}{e.Message}");
                }
            }

            return(mvcBuilder);
        }