protected virtual void Install(bool silent, Dictionary<string, string> args)
{
Utils.Trace(Utils.TraceMasks.Information, "Installing application.");
// check the configuration.
string filePath = Utils.GetAbsoluteFilePath(InstallConfig.ConfigurationFile, true, false, false);
if (filePath == null)
{
Utils.Trace("WARNING: Could not load config file specified in the installation configuration: {0}", InstallConfig.ConfigurationFile);
filePath = ApplicationConfiguration.GetFilePathFromAppConfig(ConfigSectionName);
InstallConfig.ConfigurationFile = filePath;
}
ApplicationConfiguration configuration = LoadAppConfig(silent, filePath, Opc.Ua.Security.SecuredApplication.FromApplicationType(InstallConfig.ApplicationType), ConfigurationType, false);
if (configuration == null)
{
return;
}
// update the configuration.
UpdateAppConfigWithInstallConfig(configuration);
ApplicationConfiguration = configuration;
// update configuration with information form the install config.
// check the certificate.
X509Certificate2 certificate = configuration.SecurityConfiguration.ApplicationCertificate.Find(true);
if (certificate != null)
{
if (!silent)
{
if (!CheckApplicationInstanceCertificate(configuration, certificate, silent, InstallConfig.MinimumKeySize))
{
certificate = null;
}
}
}
// create a new certificate.
if (certificate == null)
{
certificate = CreateApplicationInstanceCertificate(configuration, InstallConfig.MinimumKeySize, InstallConfig.LifeTimeInMonths);
}
// ensure the certificate is trusted.
AddToTrustedStore(configuration, certificate);
// add to discovery server.
if (configuration.ApplicationType == ApplicationType.Server || configuration.ApplicationType == ApplicationType.ClientAndServer)
{
try
{
AddToDiscoveryServerTrustList(certificate, null, null, configuration.SecurityConfiguration.TrustedPeerCertificates);
}
catch (Exception e)
{
Utils.Trace(e, "Could not add certificate to LDS trust list.");
}
}
// configure the firewall.
if (InstallConfig.ConfigureFirewall)
{
ConfigureFirewall(configuration, silent, false);
}
// configure HTTP access.
ConfigureHttpAccess(configuration, false);
// configure access to the executable, the configuration file and the private key.
ConfigureFileAccess(configuration);
// update configuration file.
ConfigUtils.UpdateConfigurationLocation(InstallConfig.ExecutableFile, InstallConfig.ConfigurationFile);
try
{
// ensure the RawData does not get serialized.
certificate = configuration.SecurityConfiguration.ApplicationCertificate.Certificate;
configuration.SecurityConfiguration.ApplicationCertificate.Certificate = null;
configuration.SecurityConfiguration.ApplicationCertificate.SubjectName = certificate.Subject;
configuration.SecurityConfiguration.ApplicationCertificate.Thumbprint = certificate.Thumbprint;
configuration.SaveToFile(configuration.SourceFilePath);
// restore the configuration.
configuration.SecurityConfiguration.ApplicationCertificate.Certificate = certificate;
}
catch (Exception e)
{
Utils.Trace(e, "Could not save configuration file. FilePath={0}", configuration.SourceFilePath);
}
if (!NoGdsAgentAdmin)
{
try
{
// install the GDS agent configuration file
string agentPath = Utils.GetAbsoluteDirectoryPath("%CommonApplicationData%\\OPC Foundation\\GDS\\Applications", false, false, true);
if (agentPath != null)
{
Opc.Ua.Security.SecuredApplication export = new Opc.Ua.Security.SecurityConfigurationManager().ReadConfiguration(configuration.SourceFilePath);
export.ExecutableFile = InstallConfig.ExecutableFile;
DataContractSerializer serializer = new DataContractSerializer(typeof(Opc.Ua.Security.SecuredApplication));
using (FileStream ostrm = File.Open(agentPath + "\\" + configuration.ApplicationName + ".xml", FileMode.Create))
{
serializer.WriteObject(ostrm, export);
Utils.Trace(Utils.TraceMasks.Information, "Created GDS agent configuration file.");
}
}
}
catch (Exception e)
{
Utils.Trace(Utils.TraceMasks.Error, "Could not create GDS agent configuration file: {0}", e.Message);
}
}
// install the service.
if (InstallConfig.InstallAsService)
{
Utils.Trace(Utils.TraceMasks.Information, "Installing service '{0}'.", InstallConfig.ApplicationName);
OnBeforeInstallService();
bool start = true;
bool result = Opc.Ua.Configuration.ServiceInstaller.InstallService(
Application.ExecutablePath,
InstallConfig.ApplicationName,
configuration.ApplicationName,
InstallConfig.ServiceDescription,
InstallConfig.ServiceStartMode,
InstallConfig.ServiceUserName,
InstallConfig.ServicePassword,
ref start);
if (!result)
{
throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "Could not install service.");
}
Utils.Trace(Utils.TraceMasks.Information, "Service '{0}' installed as {1}.", InstallConfig.ApplicationName, InstallConfig.ServiceStartMode);
}
}