websitepanel/WebsitePanel.Installer/Sources/WebsitePanel.Installer.Core/Common/Utils.cs

412 lines
12 KiB
C#

// Copyright (c) 2012, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.Security.Principal;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.Threading;
using WebsitePanel.Installer.Core;
using WebsitePanel.Installer.Configuration;
using System.Xml;
using System.Data;
namespace WebsitePanel.Installer.Common
{
public class UserDecisionEventArgs : EventArgs
{
public bool Accepted { get; set; }
public string UserMessage { get; set; }
}
public static class Utils
{
public static void FixConfigurationSectionDefinition()
{
var appConfigPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, String.Concat(AppConfigManager.AppConfigFileNameWithoutExtension, ".config"));
//
try
{
var configXmlDoc = new XmlDocument();
//
configXmlDoc.Load(appConfigPath);
//
var sectionDef = configXmlDoc.SelectSingleNode("//configSections/section[@name='installer']");
//
if (sectionDef == null)
{
return;
}
//
var typeDefString = sectionDef.Attributes["type"].Value;
//
if (typeDefString.EndsWith("WebsitePanel.Installer.Core") == false)
{
sectionDef.Attributes["type"].Value = "WebsitePanel.Installer.Configuration.InstallerSection, WebsitePanel.Installer.Core";
//
configXmlDoc.Save(appConfigPath);
}
}
catch (Exception ex)
{
Trace.TraceError("Failed to fix configuration section definition. Exception: {0}", ex);
}
}
#region DB
/// <summary>
/// Converts db value to string
/// </summary>
/// <param name="val">Value</param>
/// <returns>string</returns>
public static string GetDbString(object val)
{
string ret = string.Empty;
if ((val != null) && (val != DBNull.Value))
ret = (string)val;
return ret;
}
/// <summary>
/// Converts db value to short
/// </summary>
/// <param name="val">Value</param>
/// <returns>short</returns>
public static short GetDbShort(object val)
{
short ret = 0;
if ((val != null) && (val != DBNull.Value))
ret = (short)val;
return ret;
}
/// <summary>
/// Converts db value to int
/// </summary>
/// <param name="val">Value</param>
/// <returns>int</returns>
public static int GetDbInt32(object val)
{
int ret = 0;
if ((val != null) && (val != DBNull.Value))
ret = (int)val;
return ret;
}
/// <summary>
/// Converts db value to bool
/// </summary>
/// <param name="val">Value</param>
/// <returns>bool</returns>
public static bool GetDbBool(object val)
{
bool ret = false;
if ((val != null) && (val != DBNull.Value))
ret = Convert.ToBoolean(val);
return ret;
}
/// <summary>
/// Converts db value to decimal
/// </summary>
/// <param name="val">Value</param>
/// <returns>decimal</returns>
public static decimal GetDbDecimal(object val)
{
decimal ret = 0;
if ((val != null) && (val != DBNull.Value))
ret = (decimal)val;
return ret;
}
/// <summary>
/// Converts db value to datetime
/// </summary>
/// <param name="val">Value</param>
/// <returns>DateTime</returns>
public static DateTime GetDbDateTime(object val)
{
DateTime ret = DateTime.MinValue;
if ((val != null) && (val != DBNull.Value))
ret = (DateTime)val;
return ret;
}
#endregion
public static void ShowConsoleErrorMessage(string format, params object[] args)
{
Console.WriteLine(String.Format(format, args));
}
public static bool CheckForInstalledComponent(string componentCode)
{
bool ret = false;
List<string> installedComponents = new List<string>();
foreach (ComponentConfigElement componentConfig in AppConfigManager.AppConfiguration.Components)
{
string code = componentConfig.Settings[Global.Parameters.ComponentCode].Value;
installedComponents.Add(code);
if (code == componentCode)
{
ret = true;
break;
}
}
//
if (componentCode == "standalone")
{
if (installedComponents.Contains("server") ||
installedComponents.Contains("enterprise server") ||
installedComponents.Contains("portal"))
ret = true;
}
//
return ret;
}
public static bool IsThreadAbortException(Exception ex)
{
Exception innerException = ex;
while (innerException != null)
{
if (innerException is System.Threading.ThreadAbortException)
return true;
innerException = innerException.InnerException;
}
string str = ex.ToString();
return str.Contains("System.Threading.ThreadAbortException");
}
public static bool IsSecurityException(Exception ex)
{
if (ex is System.Security.SecurityException)
return true;
Exception innerException = ex;
while (innerException != null)
{
if (innerException is System.Security.SecurityException)
return true;
innerException = innerException.InnerException;
}
string str = ex.ToString();
return str.Contains("System.Security.SecurityException");
}
public static bool IsWin64()
{
return (IntPtr.Size == 8);
}
public static void SetObjectProperty(DirectoryEntry oDE, string name, object value)
{
if (value != null)
{
if (oDE.Properties.Contains(name))
{
oDE.Properties[name][0] = value;
}
else
{
oDE.Properties[name].Add(value);
}
}
}
public static object GetObjectProperty(DirectoryEntry entry, string name)
{
if (entry.Properties.Contains(name))
return entry.Properties[name][0];
else
return null;
}
public static bool IIS32Enabled()
{
bool enabled = false;
DirectoryEntry obj = new DirectoryEntry("IIS://LocalHost/W3SVC/AppPools");
object objProperty = GetObjectProperty(obj, "Enable32bitAppOnWin64");
if (objProperty != null)
{
enabled = (bool)objProperty;
}
return enabled;
}
public static void CheckWin64(EventHandler<UserDecisionEventArgs> callback)
{
if (IsWin64())
{
Log.WriteInfo("x64 detected");
string check = AppConfigManager.AppConfiguration.GetStringSetting(ConfigKeys.Settings_IIS64);
if (check == "False")
return;
//ignore win64 check on IIS7
if (Global.IISVersion.Major == 7)
return;
if (!IIS32Enabled())
{
Log.WriteInfo("IIS 32-bit mode disabled");
var args = new UserDecisionEventArgs
{
UserMessage = "WebsitePanel Installer has detected that Microsoft Internet Information Services (IIS) " +
"are running in 64-bit mode. It is recommended to switch IIS to 32-bit mode to " +
"enable compatibility with 32-bit applications. " +
"Please note that 64-bit web applications will not work in 32-bit mode.\n" +
"Do you want WebsitePanel Installer to switch IIS to 32-bit mode?"
};
if (callback != null)
{
callback(null, args);
}
if (AppConfigManager.AppConfiguration.Settings[ConfigKeys.Settings_IIS64] != null)
AppConfigManager.AppConfiguration.Settings[ConfigKeys.Settings_IIS64].Value = "False";
else
AppConfigManager.AppConfiguration.Settings.Add(ConfigKeys.Settings_IIS64, "False");
//
AppConfigManager.SaveConfiguration(false);
if (args.Accepted)
{
EnableIIS32();
}
}
else
{
Log.WriteInfo("IIS 32-bit mode enabled");
}
}
else
{
Log.WriteInfo("x86 detected");
}
}
private static void EnableIIS32()
{
Log.WriteStart("Enabling IIS 32-bit mode");
DirectoryEntry obj = new DirectoryEntry("IIS://LocalHost/W3SVC/AppPools");
SetObjectProperty(obj, "Enable32bitAppOnWin64", true);
obj.CommitChanges();
Log.WriteEnd("Enabled IIS 32-bit mode");
Log.WriteStart("Starting aspnet_regiis -i");
string path = Path.Combine(OS.GetWindowsDirectory(), @"Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe");
ProcessStartInfo info = new ProcessStartInfo(path, "-i");
//info.WindowStyle = ProcessWindowStyle.Minimized;
Process process = Process.Start(info);
process.WaitForExit();
Log.WriteEnd("Finished aspnet_regiis -i");
Log.WriteStart("Enabling Web Service Extension");
DirectoryEntry iis = new DirectoryEntry("IIS://LocalHost/W3SVC");
iis.Invoke("EnableWebServiceExtension", "ASP.NET v2.0.50727 (32-bit)");
iis.CommitChanges();
Log.WriteEnd("Enabled Web Service Extension");
}
/// <summary>
/// Check security permissions
/// </summary>
public static bool CheckSecurity()
{
try
{
PermissionSet set = new PermissionSet(PermissionState.Unrestricted);
set.Demand();
}
catch
{
return false;
}
return true;
}
public static bool IsAdministrator()
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
private static Mutex mutex = null;
public static void SaveMutex()
{
GC.KeepAlive(mutex);
}
public static bool IsNewInstance()
{
//check only one instance
bool createdNew = true;
mutex = new Mutex(true, "WebsitePanel Installer", out createdNew);
return createdNew;
}
public static string GetDistributiveLocationInfo(string ccode, string cversion)
{
var service = ServiceProviderProxy.GetInstallerWebService();
//
DataSet ds = service.GetReleaseFileInfo(ccode, cversion);
//
if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
{
Log.WriteInfo("Component code: {0}; Component version: {1};", ccode, cversion);
//
throw new ServiceComponentNotFoundException("Seems that the Service has no idea about the component requested.");
}
//
DataRow row = ds.Tables[0].Rows[0];
//
return row["FullFilePath"].ToString();
}
}
}