add_subdirectory(test)
endif()
-set(CPACK_PACKAGE_NAME "Icinga2")
+set(CPACK_PACKAGE_NAME "Icinga 2")
set(CPACK_PACKAGE_VENDOR "Icinga Development Team")
set(CPACK_PACKAGE_VERSION ${ICINGA2_VERSION})
set(CPACK_NSIS_DISPLAY_NAME "Icinga 2")
set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsExec::Exec '\\\"$INSTDIR\\\\sbin\\\\icinga2\\\" --scm-install daemon'")
set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsExec::Exec 'net start icinga2'")
set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "nsExec::Exec '\\\"$INSTDIR\\\\sbin\\\\icinga2\\\" --scm-uninstall'")
+set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico")
+set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A")
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
include(InstallRequiredSystemLibraries)
using System.IO;
using System.Windows.Forms;
using Microsoft.Win32;
+using System.Runtime.InteropServices;
+using System.Text;
namespace Icinga
{
static class Program
{
+ [DllImport("msi.dll", SetLastError = true)]
+ static extern int MsiEnumProducts(int iProductIndex, StringBuilder lpProductBuf);
- public static string Icinga2InstallDir
+ [DllImport("msi.dll", CharSet = CharSet.Unicode)]
+ static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len);
+
+ public static string Icinga2InstallDir
{
get
{
- RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Icinga Development Team\\ICINGA2");
+ StringBuilder szProduct;
+
+ for (int index = 0; ; index++) {
+ szProduct = new StringBuilder(39);
+ if (MsiEnumProducts(index, szProduct) != 0)
+ break;
+
+ int cbName = 128;
+ StringBuilder szName = new StringBuilder(cbName);
+
+ if (MsiGetProductInfo(szProduct.ToString(), "ProductName", szName, ref cbName) != 0)
+ continue;
+
+ if (szName.ToString() != "Icinga 2")
+ continue;
- if (rk == null)
- return "";
+ int cbLocation = 1024;
+ StringBuilder szLocation = new StringBuilder(cbLocation);
+ if (MsiGetProductInfo(szProduct.ToString(), "InstallLocation", szLocation, ref cbLocation) == 0)
+ return szLocation.ToString();
+ }
- return (string)rk.GetValue("");
+ return "";
}
}
# include <sys/types.h>
# include <pwd.h>
# include <grp.h>
+#else /* _WIN32 */
+# include <msi.h>
#endif /* _WIN32 */
using namespace icinga;
#ifdef _WIN32
bool builtinPaths = true;
- HKEY hKey;
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Icinga Development Team\\ICINGA2", 0,
- KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
- BYTE pvData[MAX_PATH];
- DWORD cbData = sizeof(pvData)-1;
- DWORD lType;
- if (RegQueryValueEx(hKey, NULL, NULL, &lType, pvData, &cbData) == ERROR_SUCCESS && lType == REG_SZ) {
- pvData[cbData] = '\0';
-
- String prefix = (char *)pvData;
- Application::DeclarePrefixDir(prefix);
- Application::DeclareSysconfDir(prefix + "\\etc");
- Application::DeclareRunDir(prefix + "\\var\\run");
- Application::DeclareLocalStateDir(prefix + "\\var");
- Application::DeclarePkgDataDir(prefix + "\\share\\icinga2");
- Application::DeclareIncludeConfDir(prefix + "\\share\\icinga2\\include");
+ String prefix;
+ char szProduct[39];
+ bool foundMsi = false;
+
+ for (int i = 0; MsiEnumProducts(i, szProduct) == ERROR_SUCCESS; i++) {
+ char szName[128];
+ DWORD cbName = sizeof(szName);
+ if (MsiGetProductInfo(szProduct, INSTALLPROPERTY_INSTALLEDPRODUCTNAME, szName, &cbName) != ERROR_SUCCESS)
+ continue;
+
+ if (strcmp(szName, "Icinga 2") != 0)
+ continue;
+
+ char szLocation[1024];
+ DWORD cbLocation = sizeof(szLocation);
+ if (MsiGetProductInfo(szProduct, INSTALLPROPERTY_INSTALLLOCATION, szLocation, &cbLocation) == ERROR_SUCCESS) {
builtinPaths = false;
+ prefix = szLocation;
+ foundMsi = true;
+ break;
}
-
- RegCloseKey(hKey);
}
- if (builtinPaths) {
+ if (!builtinPaths) {
+ Application::DeclarePrefixDir(prefix);
+ Application::DeclareSysconfDir(prefix + "\\etc");
+ Application::DeclareRunDir(prefix + "\\var\\run");
+ Application::DeclareLocalStateDir(prefix + "\\var");
+ Application::DeclarePkgDataDir(prefix + "\\share\\icinga2");
+ Application::DeclareIncludeConfDir(prefix + "\\share\\icinga2\\include");
+ } else {
Log(LogWarning, "icinga-app", "Registry key could not be read. Falling back to built-in paths.");
#endif /* _WIN32 */