You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/Application/BasicServiceInstaller.cs

115 lines
4.2 KiB

6 years ago
using System;
using System.Collections;
using System.Configuration.Install;
using System.ServiceProcess;
namespace ZeroLevel.Services.Applications
{
internal static class BasicServiceInstaller
{
private class InstallOptions
{
public string ServiceName;
public string ServiceDisplayName;
public string ServiceDescription;
public ServiceStartMode ServiceStartType = ServiceStartMode.Automatic;
public ServiceAccount ServiceAccountType = ServiceAccount.LocalSystem;
public string ServiceUserName;
public string ServiceUserPassword;
}
private static InstallOptions ReadOptions(IConfiguration configuration)
{
if (configuration == null)
{
configuration = Configuration.Default;
}
var options = new InstallOptions();
if (configuration.Contains("ServiceDescription"))
{
options.ServiceDescription = configuration.First("ServiceDescription");
}
if (configuration.Contains("ServiceName"))
{
options.ServiceName = configuration.First("ServiceName");
}
if (configuration.Contains("ServiceDisplayName"))
{
options.ServiceDisplayName = configuration.First("ServiceDisplayName");
}
else
{
options.ServiceDisplayName = options.ServiceName;
}
if (configuration.Contains("ServiceUserName"))
{
options.ServiceUserName = configuration.First("ServiceUserName");
}
if (configuration.Contains("ServiceUserPassword"))
{
options.ServiceUserPassword = configuration.First("ServiceUserPassword");
}
if (configuration.Contains("ServiceStartType"))
{
var startType = configuration.First("ServiceStartType");
ServiceStartMode mode;
if (Enum.TryParse(startType, out mode))
{
options.ServiceStartType = mode;
}
else
{
options.ServiceStartType = ServiceStartMode.Automatic;
}
}
if (configuration.Contains("ServiceAccountType"))
{
var accountType = configuration.First("ServiceAccountType");
ServiceAccount type;
if (Enum.TryParse(accountType, out type))
{
options.ServiceAccountType = type;
}
else
{
options.ServiceAccountType = ServiceAccount.LocalService;
}
}
return options;
}
public static void Install(IConfiguration configuration)
{
CreateInstaller(ReadOptions(configuration)).Install(new Hashtable());
}
public static void Uninstall(IConfiguration configuration)
{
CreateInstaller(ReadOptions(configuration)).Uninstall(null);
}
private static Installer CreateInstaller(InstallOptions options)
{
var installer = new TransactedInstaller();
installer.Installers.Add(new ServiceInstaller()
{
ServiceName = options.ServiceName,
DisplayName = options.ServiceDisplayName,
StartType = options.ServiceStartType,
Description = options.ServiceDescription
});
installer.Installers.Add(new ServiceProcessInstaller
{
Account = options.ServiceAccountType,
Username = (options.ServiceAccountType == ServiceAccount.User) ? options.ServiceUserName : null,
Password = (options.ServiceAccountType == ServiceAccount.User) ? options.ServiceUserPassword : null
});
var installContext = new InstallContext(options.ServiceName + ".install.log", null);
installContext.Parameters["assemblypath"] = Configuration.AppLocation;
installer.Context = installContext;
return installer;
}
}
}

Powered by TurnKey Linux.