]> granicus.if.org Git - icinga2/commitdiff
Add preliminary support for 64-bit packages
authorGunnar Beutner <gunnar@beutner.name>
Wed, 30 Mar 2016 09:47:39 +0000 (11:47 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Wed, 20 Apr 2016 08:07:25 +0000 (10:07 +0200)
refs #11449

CMakeLists.txt
agent/windows-setup-agent/Program.cs
icinga-app/icinga.cpp

index e606188936ddcad37ad31e8c4ca20d3e84f79d83..7b629182c34edd05031d1e7eb1a1acaf20a633bb 100644 (file)
@@ -289,7 +289,7 @@ if(ICINGA2_WITH_TESTS)
   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")
@@ -321,6 +321,8 @@ set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCre
 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)
index e3e282eb4a9bad46203f8ec8b23303f8869d40ec..3dcd3de7518329de854c031fff74e7c89a4020dc 100644 (file)
@@ -2,22 +2,46 @@
 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 "";
                        }
                }
 
index 4234aa96cf43b3f067f7aad19d13b4d9addc0e33..d67df4690273a658a3602aab67b9f3da1ba76d39 100644 (file)
@@ -40,6 +40,8 @@
 #      include <sys/types.h>
 #      include <pwd.h>
 #      include <grp.h>
+#else /* _WIN32 */
+#      include <msi.h>
 #endif /* _WIN32 */
 
 using namespace icinga;
@@ -125,30 +127,38 @@ int Main(void)
 #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 */