diff --git a/Emby.IsoMounting/IsoMounter/Configuration/PluginConfiguration.cs b/Emby.IsoMounting/IsoMounter/Configuration/PluginConfiguration.cs
index 4755e4e824..ca6f40cc4f 100644
--- a/Emby.IsoMounting/IsoMounter/Configuration/PluginConfiguration.cs
+++ b/Emby.IsoMounting/IsoMounter/Configuration/PluginConfiguration.cs
@@ -2,6 +2,9 @@ using MediaBrowser.Model.Plugins;
namespace IsoMounter.Configuration
{
+ ///
+ /// Class PluginConfiguration.
+ ///
public class PluginConfiguration : BasePluginConfiguration
{
}
diff --git a/Emby.IsoMounting/IsoMounter/IsoMounter.csproj b/Emby.IsoMounting/IsoMounter/IsoMounter.csproj
index 0778b987bc..4fa07fbf17 100644
--- a/Emby.IsoMounting/IsoMounter/IsoMounter.csproj
+++ b/Emby.IsoMounting/IsoMounter/IsoMounter.csproj
@@ -13,6 +13,18 @@
netstandard2.0
false
true
+ true
+
+
+
+
+
+
+
+
+
+
+ ../../jellyfin.ruleset
diff --git a/Emby.IsoMounting/IsoMounter/LinuxIsoManager.cs b/Emby.IsoMounting/IsoMounter/LinuxIsoManager.cs
index 2f0003be88..48cb2e1d53 100644
--- a/Emby.IsoMounting/IsoMounter/LinuxIsoManager.cs
+++ b/Emby.IsoMounting/IsoMounter/LinuxIsoManager.cs
@@ -1,9 +1,10 @@
using System;
+using System.Diagnostics;
+using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Model.Diagnostics;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.System;
using Microsoft.Extensions.Logging;
@@ -11,441 +12,274 @@ using OperatingSystem = MediaBrowser.Common.System.OperatingSystem;
namespace IsoMounter
{
+ ///
+ /// The ISO manager implementation for Linux.
+ ///
public class LinuxIsoManager : IIsoMounter
{
- [DllImport("libc", SetLastError = true)]
- static extern uint getuid();
+ private const string MountCommand = "mount";
+ private const string UnmountCommand = "umount";
+ private const string SudoCommand = "sudo";
- #region Private Fields
-
- private readonly bool ExecutablesAvailable;
private readonly ILogger _logger;
- private readonly string MountCommand;
- private readonly string MountPointRoot;
- private readonly IProcessFactory ProcessFactory;
- private readonly string SudoCommand;
- private readonly string UmountCommand;
-
- #endregion
+ private readonly string _mountPointRoot;
- #region Constructor(s)
-
- public LinuxIsoManager(ILogger logger, IProcessFactory processFactory)
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The logger.
+ public LinuxIsoManager(ILogger logger)
{
_logger = logger;
- ProcessFactory = processFactory;
- MountPointRoot = Path.DirectorySeparatorChar + "tmp" + Path.DirectorySeparatorChar + "Emby";
+ _mountPointRoot = Path.DirectorySeparatorChar + "tmp" + Path.DirectorySeparatorChar + "Emby";
_logger.LogDebug(
"[{0}] System PATH is currently set to [{1}].",
Name,
- Environment.GetEnvironmentVariable("PATH") ?? ""
- );
+ Environment.GetEnvironmentVariable("PATH") ?? string.Empty);
_logger.LogDebug(
"[{0}] System path separator is [{1}].",
Name,
- Path.PathSeparator
- );
+ Path.PathSeparator);
_logger.LogDebug(
"[{0}] Mount point root is [{1}].",
Name,
- MountPointRoot
- );
-
- //
- // Get the location of the executables we need to support mounting/unmounting ISO images.
- //
-
- SudoCommand = GetFullPathForExecutable("sudo");
-
- _logger.LogInformation(
- "[{0}] Using version of [sudo] located at [{1}].",
- Name,
- SudoCommand
- );
-
- MountCommand = GetFullPathForExecutable("mount");
-
- _logger.LogInformation(
- "[{0}] Using version of [mount] located at [{1}].",
- Name,
- MountCommand
- );
-
- UmountCommand = GetFullPathForExecutable("umount");
-
- _logger.LogInformation(
- "[{0}] Using version of [umount] located at [{1}].",
- Name,
- UmountCommand
- );
-
- if (!string.IsNullOrEmpty(SudoCommand) && !string.IsNullOrEmpty(MountCommand) && !string.IsNullOrEmpty(UmountCommand))
- {
- ExecutablesAvailable = true;
- }
- else
- {
- ExecutablesAvailable = false;
- }
-
+ _mountPointRoot);
}
- #endregion
-
- #region Interface Implementation for IIsoMounter
-
- public bool IsInstalled => true;
-
+ ///
public string Name => "LinuxMount";
- public bool RequiresInstallation => false;
+#pragma warning disable SA1300
+#pragma warning disable SA1400
+ [DllImport("libc", SetLastError = true)]
+ static extern uint getuid();
+
+#pragma warning restore SA1300
+#pragma warning restore SA1400
+ ///
public bool CanMount(string path)
{
-
if (OperatingSystem.Id != OperatingSystemId.Linux)
{
return false;
}
+
_logger.LogInformation(
- "[{0}] Checking we can attempt to mount [{1}], Extension = [{2}], Operating System = [{3}], Executables Available = [{4}].",
+ "[{0}] Checking we can attempt to mount [{1}], Extension = [{2}], Operating System = [{3}].",
Name,
path,
Path.GetExtension(path),
- OperatingSystem.Name,
- ExecutablesAvailable
- );
+ OperatingSystem.Name);
- if (ExecutablesAvailable)
- {
- return string.Equals(Path.GetExtension(path), ".iso", StringComparison.OrdinalIgnoreCase);
- }
- else
- {
- return false;
- }
- }
-
- public Task Install(CancellationToken cancellationToken)
- {
- return Task.FromResult(false);
+ return string.Equals(Path.GetExtension(path), ".iso", StringComparison.OrdinalIgnoreCase);
}
+ ///
public Task Mount(string isoPath, CancellationToken cancellationToken)
{
- if (MountISO(isoPath, out LinuxMount mountedISO))
- {
- return Task.FromResult(mountedISO);
- }
- else
+ string cmdArguments;
+ string cmdFilename;
+ string mountPoint = Path.Combine(_mountPointRoot, Guid.NewGuid().ToString());
+
+ if (string.IsNullOrEmpty(isoPath))
{
- throw new IOException(string.Format(
- "An error occurred trying to mount image [$0].",
- isoPath
- ));
+ throw new ArgumentNullException(nameof(isoPath));
}
- }
- #endregion
-
- #region Interface Implementation for IDisposable
-
- // Flag: Has Dispose already been called?
- private bool disposed = false;
-
- public void Dispose()
- {
-
- // Dispose of unmanaged resources.
- Dispose(true);
-
- // Suppress finalization.
- GC.SuppressFinalize(this);
+ _logger.LogInformation(
+ "[{Name}] Attempting to mount [{Path}].",
+ Name,
+ isoPath);
- }
+ _logger.LogDebug(
+ "[{Name}] ISO will be mounted at [{Path}].",
+ Name,
+ mountPoint);
- protected virtual void Dispose(bool disposing)
- {
+ try
+ {
+ Directory.CreateDirectory(mountPoint);
+ }
+ catch (UnauthorizedAccessException ex)
+ {
+ throw new IOException("Unable to create mount point(Permission denied) for " + isoPath, ex);
+ }
+ catch (Exception ex)
+ {
+ throw new IOException("Unable to create mount point for " + isoPath, ex);
+ }
- if (disposed)
+ if (GetUID() == 0)
+ {
+ cmdFilename = MountCommand;
+ cmdArguments = string.Format(
+ CultureInfo.InvariantCulture,
+ "\"{0}\" \"{1}\"",
+ isoPath,
+ mountPoint);
+ }
+ else
{
- return;
+ cmdFilename = SudoCommand;
+ cmdArguments = string.Format(
+ CultureInfo.InvariantCulture,
+ "\"{0}\" \"{1}\" \"{2}\"",
+ MountCommand,
+ isoPath,
+ mountPoint);
}
- _logger.LogInformation(
- "[{0}] Disposing [{1}].",
+ _logger.LogDebug(
+ "[{0}] Mount command [{1}], mount arguments [{2}].",
Name,
- disposing
- );
+ cmdFilename,
+ cmdArguments);
- if (disposing)
+ int exitcode = ExecuteCommand(cmdFilename, cmdArguments);
+ if (exitcode == 0)
{
+ _logger.LogInformation(
+ "[{0}] ISO mount completed successfully.",
+ Name);
- //
- // Free managed objects here.
- //
-
+ return Task.FromResult(new LinuxMount(this, isoPath, mountPoint));
}
- //
- // Free any unmanaged objects here.
- //
-
- disposed = true;
-
- }
-
- #endregion
-
- #region Private Methods
-
- private string GetFullPathForExecutable(string name)
- {
+ _logger.LogInformation(
+ "[{0}] ISO mount completed with errors.",
+ Name);
- foreach (string test in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(Path.PathSeparator))
+ try
{
- string path = test.Trim();
-
- if (!string.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, name)))
- {
- return Path.GetFullPath(path);
- }
+ Directory.Delete(mountPoint, false);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "[{Name}] Unhandled exception removing mount point.", Name);
+ throw;
}
- return string.Empty;
+ throw new ExternalException("Mount command failed", exitcode);
}
private uint GetUID()
{
-
var uid = getuid();
_logger.LogDebug(
"[{0}] GetUserId() returned [{2}].",
Name,
- uid
- );
+ uid);
return uid;
-
}
- private bool ExecuteCommand(string cmdFilename, string cmdArguments)
+ private int ExecuteCommand(string cmdFilename, string cmdArguments)
{
-
- bool processFailed = false;
-
- var process = ProcessFactory.Create(
- new ProcessOptions
- {
- CreateNoWindow = true,
- RedirectStandardOutput = true,
- RedirectStandardError = true,
- UseShellExecute = false,
- FileName = cmdFilename,
- Arguments = cmdArguments,
- IsHidden = true,
- ErrorDialog = false,
- EnableRaisingEvents = true
- }
- );
+ var startInfo = new ProcessStartInfo
+ {
+ FileName = cmdFilename,
+ Arguments = cmdArguments,
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ ErrorDialog = false,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true
+ };
+
+ var process = new Process()
+ {
+ StartInfo = startInfo
+ };
try
{
process.Start();
- //StreamReader outputReader = process.StandardOutput.;
- //StreamReader errorReader = process.StandardError;
-
_logger.LogDebug(
"[{Name}] Standard output from process is [{Error}].",
Name,
- process.StandardOutput.ReadToEnd()
- );
+ process.StandardOutput.ReadToEnd());
_logger.LogDebug(
"[{Name}] Standard error from process is [{Error}].",
Name,
- process.StandardError.ReadToEnd()
- );
+ process.StandardError.ReadToEnd());
+
+ return process.ExitCode;
}
catch (Exception ex)
{
- processFailed = true;
_logger.LogDebug(ex, "[{Name}] Unhandled exception executing command.", Name);
+ throw;
}
-
- if (!processFailed && process.ExitCode == 0)
+ finally
{
- return true;
+ process?.Dispose();
}
- else
- {
- return false;
- }
-
}
- private bool MountISO(string isoPath, out LinuxMount mountedISO)
+ ///
+ /// Unmounts the specified mount.
+ ///
+ /// The mount.
+ internal void OnUnmount(LinuxMount mount)
{
-
- string cmdArguments;
- string cmdFilename;
- string mountPoint = Path.Combine(MountPointRoot, Guid.NewGuid().ToString());
-
- if (!string.IsNullOrEmpty(isoPath))
- {
-
- _logger.LogInformation(
- "[{Name}] Attempting to mount [{Path}].",
- Name,
- isoPath
- );
-
- _logger.LogDebug(
- "[{Name}] ISO will be mounted at [{Path}].",
- Name,
- mountPoint
- );
-
- }
- else
+ if (mount == null)
{
-
- throw new ArgumentNullException(nameof(isoPath));
-
- }
-
- try
- {
- Directory.CreateDirectory(mountPoint);
- }
- catch (UnauthorizedAccessException)
- {
- throw new IOException("Unable to create mount point(Permission denied) for " + isoPath);
- }
- catch (Exception)
- {
- throw new IOException("Unable to create mount point for " + isoPath);
- }
-
- if (GetUID() == 0)
- {
- cmdFilename = MountCommand;
- cmdArguments = string.Format("\"{0}\" \"{1}\"", isoPath, mountPoint);
- }
- else
- {
- cmdFilename = SudoCommand;
- cmdArguments = string.Format("\"{0}\" \"{1}\" \"{2}\"", MountCommand, isoPath, mountPoint);
+ throw new ArgumentNullException(nameof(mount));
}
- _logger.LogDebug(
- "[{0}] Mount command [{1}], mount arguments [{2}].",
+ _logger.LogInformation(
+ "[{0}] Attempting to unmount ISO [{1}] mounted on [{2}].",
Name,
- cmdFilename,
- cmdArguments
- );
-
- if (ExecuteCommand(cmdFilename, cmdArguments))
- {
-
- _logger.LogInformation(
- "[{0}] ISO mount completed successfully.",
- Name
- );
-
- mountedISO = new LinuxMount(this, isoPath, mountPoint);
-
- }
- else
- {
-
- _logger.LogInformation(
- "[{0}] ISO mount completed with errors.",
- Name
- );
-
- try
- {
- Directory.Delete(mountPoint, false);
- }
- catch (Exception ex)
- {
- _logger.LogInformation(ex, "[{Name}] Unhandled exception removing mount point.", Name);
- }
-
- mountedISO = null;
-
- }
-
- return mountedISO != null;
-
- }
-
- private void UnmountISO(LinuxMount mount)
- {
+ mount.IsoPath,
+ mount.MountedPath);
string cmdArguments;
string cmdFilename;
- if (mount != null)
- {
-
- _logger.LogInformation(
- "[{0}] Attempting to unmount ISO [{1}] mounted on [{2}].",
- Name,
- mount.IsoPath,
- mount.MountedPath
- );
-
- }
- else
- {
-
- throw new ArgumentNullException(nameof(mount));
-
- }
-
if (GetUID() == 0)
{
- cmdFilename = UmountCommand;
- cmdArguments = string.Format("\"{0}\"", mount.MountedPath);
+ cmdFilename = UnmountCommand;
+ cmdArguments = string.Format(
+ CultureInfo.InvariantCulture,
+ "\"{0}\"",
+ mount.MountedPath);
}
else
{
cmdFilename = SudoCommand;
- cmdArguments = string.Format("\"{0}\" \"{1}\"", UmountCommand, mount.MountedPath);
+ cmdArguments = string.Format(
+ CultureInfo.InvariantCulture,
+ "\"{0}\" \"{1}\"",
+ UnmountCommand,
+ mount.MountedPath);
}
_logger.LogDebug(
"[{0}] Umount command [{1}], umount arguments [{2}].",
Name,
cmdFilename,
- cmdArguments
- );
+ cmdArguments);
- if (ExecuteCommand(cmdFilename, cmdArguments))
+ int exitcode = ExecuteCommand(cmdFilename, cmdArguments);
+ if (exitcode == 0)
{
-
_logger.LogInformation(
"[{0}] ISO unmount completed successfully.",
- Name
- );
-
+ Name);
}
else
{
-
_logger.LogInformation(
"[{0}] ISO unmount completed with errors.",
- Name
- );
-
+ Name);
}
try
@@ -454,24 +288,11 @@ namespace IsoMounter
}
catch (Exception ex)
{
- _logger.LogInformation(ex, "[{Name}] Unhandled exception removing mount point.", Name);
+ _logger.LogError(ex, "[{Name}] Unhandled exception removing mount point.", Name);
+ throw;
}
- }
-
- #endregion
-
- #region Internal Methods
-
- internal void OnUnmount(LinuxMount mount)
- {
-
- UnmountISO(mount);
+ throw new ExternalException("Mount command failed", exitcode);
}
-
- #endregion
-
}
-
}
-
diff --git a/Emby.IsoMounting/IsoMounter/LinuxMount.cs b/Emby.IsoMounting/IsoMounter/LinuxMount.cs
index b8636822b6..ccad8ce20e 100644
--- a/Emby.IsoMounting/IsoMounter/LinuxMount.cs
+++ b/Emby.IsoMounting/IsoMounter/LinuxMount.cs
@@ -3,81 +3,56 @@ using MediaBrowser.Model.IO;
namespace IsoMounter
{
+ ///
+ /// Class LinuxMount.
+ ///
internal class LinuxMount : IIsoMount
{
+ private readonly LinuxIsoManager _linuxIsoManager;
- #region Private Fields
-
- private readonly LinuxIsoManager linuxIsoManager;
-
- #endregion
-
- #region Constructor(s)
+ private bool _disposed = false;
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The ISO manager that mounted this ISO file.
+ /// The path to the ISO file.
+ /// The folder the ISO is mounted in.
internal LinuxMount(LinuxIsoManager isoManager, string isoPath, string mountFolder)
{
-
- linuxIsoManager = isoManager;
+ _linuxIsoManager = isoManager;
IsoPath = isoPath;
MountedPath = mountFolder;
-
}
- #endregion
-
- #region Interface Implementation for IDisposable
+ ///
+ public string IsoPath { get; }
- // Flag: Has Dispose already been called?
- private bool disposed = false;
+ ///
+ public string MountedPath { get; }
+ ///
public void Dispose()
{
-
- // Dispose of unmanaged resources.
Dispose(true);
-
- // Suppress finalization.
GC.SuppressFinalize(this);
-
}
+ ///
+ /// Releases the unmanaged resources and disposes of the managed resources used.
+ ///
+ /// Whether or not the managed resources should be disposed.
protected virtual void Dispose(bool disposing)
{
-
- if (disposed)
+ if (_disposed)
{
return;
}
- if (disposing)
- {
-
- //
- // Free managed objects here.
- //
-
- linuxIsoManager.OnUnmount(this);
-
- }
-
- //
- // Free any unmanaged objects here.
- //
-
- disposed = true;
+ _linuxIsoManager.OnUnmount(this);
+ _disposed = true;
}
-
- #endregion
-
- #region Interface Implementation for IIsoMount
-
- public string IsoPath { get; private set; }
- public string MountedPath { get; private set; }
-
- #endregion
-
}
-
}
diff --git a/Emby.IsoMounting/IsoMounter/Plugin.cs b/Emby.IsoMounting/IsoMounter/Plugin.cs
index f45b39d3e4..433294d745 100644
--- a/Emby.IsoMounting/IsoMounter/Plugin.cs
+++ b/Emby.IsoMounting/IsoMounter/Plugin.cs
@@ -6,25 +6,28 @@ using MediaBrowser.Model.Serialization;
namespace IsoMounter
{
+ ///
+ /// The LinuxMount plugin class.
+ ///
public class Plugin : BasePlugin
{
- public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer) : base(applicationPaths, xmlSerializer)
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The application paths.
+ /// The XML serializer.
+ public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer)
+ : base(applicationPaths, xmlSerializer)
{
}
- private Guid _id = new Guid("4682DD4C-A675-4F1B-8E7C-79ADF137A8F8");
- public override Guid Id => _id;
+ ///
+ public override Guid Id { get; } = new Guid("4682DD4C-A675-4F1B-8E7C-79ADF137A8F8");
- ///
- /// Gets the name of the plugin
- ///
- /// The name.
+ ///
public override string Name => "Iso Mounter";
- ///
- /// Gets the description.
- ///
- /// The description.
+ ///
public override string Description => "Mount and stream ISO contents";
}
}
diff --git a/Emby.Server.Implementations/IO/IsoManager.cs b/Emby.Server.Implementations/IO/IsoManager.cs
index f0a15097c9..94e92c2a6a 100644
--- a/Emby.Server.Implementations/IO/IsoManager.cs
+++ b/Emby.Server.Implementations/IO/IsoManager.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -8,12 +9,12 @@ using MediaBrowser.Model.IO;
namespace Emby.Server.Implementations.IO
{
///
- /// Class IsoManager
+ /// Class IsoManager.
///
public class IsoManager : IIsoManager
{
///
- /// The _mounters
+ /// The _mounters.
///
private readonly List _mounters = new List();
@@ -22,9 +23,7 @@ namespace Emby.Server.Implementations.IO
///
/// The iso path.
/// The cancellation token.
- /// IsoMount.
- /// isoPath
- ///
+ /// .
public Task Mount(string isoPath, CancellationToken cancellationToken)
{
if (string.IsNullOrEmpty(isoPath))
@@ -36,7 +35,11 @@ namespace Emby.Server.Implementations.IO
if (mounter == null)
{
- throw new ArgumentException(string.Format("No mounters are able to mount {0}", isoPath));
+ throw new ArgumentException(
+ string.Format(
+ CultureInfo.InvariantCulture,
+ "No mounters are able to mount {0}",
+ isoPath));
}
return mounter.Mount(isoPath, cancellationToken);
@@ -60,16 +63,5 @@ namespace Emby.Server.Implementations.IO
{
_mounters.AddRange(mounters);
}
-
- ///
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- ///
- public void Dispose()
- {
- foreach (var mounter in _mounters)
- {
- mounter.Dispose();
- }
- }
}
}
diff --git a/Emby.Server.Implementations/SocketSharp/WebSocketSharpListener.cs b/Emby.Server.Implementations/SocketSharp/WebSocketSharpListener.cs
index dd313b3363..e93bff1244 100644
--- a/Emby.Server.Implementations/SocketSharp/WebSocketSharpListener.cs
+++ b/Emby.Server.Implementations/SocketSharp/WebSocketSharpListener.cs
@@ -117,7 +117,7 @@ namespace Emby.Server.Implementations.SocketSharp
///
/// Releases the unmanaged resources and disposes of the managed resources used.
///
- /// Whether or not the managed resources should be disposed
+ /// Whether or not the managed resources should be disposed.
protected virtual void Dispose(bool disposing)
{
if (_disposed)
diff --git a/MediaBrowser.Model/IO/IIsoManager.cs b/MediaBrowser.Model/IO/IIsoManager.cs
index 24b6e5f054..eb0cb4bfbb 100644
--- a/MediaBrowser.Model/IO/IIsoManager.cs
+++ b/MediaBrowser.Model/IO/IIsoManager.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Model.IO
{
- public interface IIsoManager : IDisposable
+ public interface IIsoManager
{
///
/// Mounts the specified iso path.
diff --git a/MediaBrowser.Model/IO/IIsoMounter.cs b/MediaBrowser.Model/IO/IIsoMounter.cs
index f0153a9280..766a9e4e6c 100644
--- a/MediaBrowser.Model/IO/IIsoMounter.cs
+++ b/MediaBrowser.Model/IO/IIsoMounter.cs
@@ -5,7 +5,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Model.IO
{
- public interface IIsoMounter : IDisposable
+ public interface IIsoMounter
{
///
/// Mounts the specified iso path.
diff --git a/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs b/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs
index 39db22133e..ac540782cc 100644
--- a/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs
+++ b/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs
@@ -1,7 +1,7 @@
namespace MediaBrowser.Model.Plugins
{
///
- /// Class BasePluginConfiguration
+ /// Class BasePluginConfiguration.
///
public class BasePluginConfiguration
{