public string GetQlikSenseArchivedFolderLocation(SenseApiSupport senseApiSupport)
        {
            dynamic json = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:4242/qrs/ServiceCluster/{_serviceClusterId}",
                null,
                null,
                HttpStatusCode.OK,
                JToken.Parse);
            string ret;

            try
            {
                ret = json?.settings?.sharedPersistenceProperties?.archivedLogsRootFolder?.Value ?? "";
            }
            catch (Exception ex) //We dont trust the API to not change case.
            {
                _logger.Add($"Failed parsing the ServiceCluster and get the archived folder path moving to case insensitive search {ex}");
                var settings = GetNode(json, "settings");
                var sharedPersistenceProperties = GetNode(settings?.Value, "sharedPersistenceProperties");
                ret = GetNode(sharedPersistenceProperties?.Value, "archivedLogsRootFolder")?.Value ?? "";
            }

            if (string.IsNullOrWhiteSpace(ret))
            {
                _logger.Add($"WARNING-Archived Logs conn string missing.");
                _logger.Add($"ServiceCluster=>{json?.ToString().Replace(Environment.NewLine, @"\r\n")}");
            }
            return(ret);
        }
        public IEnumerable <QlikSenseServiceInfo> GetQlikSenseServiceInfos(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            dynamic serviceStatusJson = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:4242/qrs/servicestatus/full",
                null,
                null,
                HttpStatusCode.OK,
                JArray.Parse);

            foreach (dynamic serviceStatusStruct in serviceStatusJson)
            {
                int serviceTypeId  = GetInt(serviceStatusStruct, "serviceType");
                int serviceStateId = GetInt(serviceStatusStruct, "serviceState");

                var qlikSenseServiceInfo = new QlikSenseServiceInfo
                {
                    ServiceType      = senseEnums.GetValue("ServiceTypeEnum", serviceTypeId, MISSING_VALUE),
                    HostName         = GetString(serviceStatusStruct, new [] { "serverNodeConfiguration", "hostName" }),
                    ServiceClusterId = GetGuid(serviceStatusStruct, new [] { "serverNodeConfiguration", "serviceCluster", "id" }),
                    ServiceState     = senseEnums.GetValue("ServiceStateEnum", serviceStateId, MISSING_VALUE),
                    ModifiedDate     = GetDate(serviceStatusStruct, "modifiedDate")
                };

                yield return(qlikSenseServiceInfo);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="senseApiSupport"></param>
        /// <param name="senseEnums"></param>
        /// <returns></returns>
        public IEnumerable <QlikSenseMachineInfo> GetQlikSenseMachineInfos(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            dynamic serverNodeConfigJson = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:4242/qrs/servernodeconfiguration/full",
                null,
                null,
                HttpStatusCode.OK,
                JToken.Parse);

            foreach (dynamic serverNodeStruct in serverNodeConfigJson)
            {
                var nodePurposeId = GetInt(serverNodeStruct, "nodePurpose");

                var qlikSenseMachineInfo = new QlikSenseMachineInfo
                {
                    HostName         = GetString(serverNodeStruct, "hostName"),
                    ServiceClusterId = GetGuid(serverNodeStruct, new [] { "serviceCluster", "id" }),
                    Name             = GetString(serverNodeStruct, "name"),
                    IsCentral        = GetBool(serverNodeStruct, "isCentral"),
                    NodePurpose      = senseEnums.GetValue("NodePurposeEnum", nodePurposeId, MISSING_VALUE),
                    ModifiedDate     = GetDate(serverNodeStruct, "modifiedDate")
                };
                _serviceClusterId = qlikSenseMachineInfo.ServiceClusterId;
                yield return(qlikSenseMachineInfo);
            }
        }
        private string GetGenericJsonToString(SenseApiSupport senseApiSupport, string url)
        {
            var json = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                url,
                null,
                null,
                HttpStatusCode.OK,
                p => p);

            if (string.IsNullOrWhiteSpace(json))
            {
                return("");
            }
            //we are only doing this so the end user can understand the text in the json files.
            try
            {
                dynamic parsedJson = JsonConvert.DeserializeObject(json);
                return(JsonConvert.SerializeObject(parsedJson, Formatting.Indented));
            }
            catch (Exception e)
            {
                Log.To.Main.AddException($"Failed prettifying the json string from {url}", e);
                return(json);
            }
        }
        public void Execute()
        {
            try
            {
                var host = Settings.GetSetting("SenseNodeStatusMonitor.HostName", "localhost");
                if ((_senseApiSupport == null) || (_senseApiSupport.Host != host))
                {
                    _senseApiSupport = Settings.GetBool("SenseNodeStatusMonitor.UseHttp", false) ?
                                       SenseApiSupport.CreateHttp(host) : SenseApiSupport.Create(host);
                }

                SenseEnums senseEnums = new SenseEnums(_senseApiSupport);

                var serviceStatuses = GetServiceStatusFull(senseEnums);
                foreach (ServiceStatusFullDto dto in serviceStatuses)
                {
                    var key = dto.ServerNodeHostName + "_" + dto.ServiceTypeId;
                    _groupedNotifyer.AddIfMissing(key, $"Node down {dto.ServiceTypeName} on {dto.ServerNodeHostName}", "");
                    _groupedNotifyer.Analyze(key, dto.ServiceStateId);
                }
                _groupedNotifyer.AnalyzeRoundFinished();
            }
            catch (Exception ex)
            {
                _senseApiSupport = null;
                Log.To.Main.AddException($"Failed executing {MonitorName}", ex);
            }
        }
        public List <QlikSenseAppListShort> GetQrsAppListShort(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            dynamic resp = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:4242/qrs/app/full",
                null,
                null,
                HttpStatusCode.OK,
                JToken.Parse);
            var ret = new List <QlikSenseAppListShort>();

            foreach (dynamic item in resp)
            {
                //var a = serverNodeConfigJson.nodeType;
                ret.Add(new QlikSenseAppListShort
                {
                    Id             = GetString(item, "id"),
                    CreatedDate    = GetString(item, "createdDate"),
                    ModifiedDate   = GetString(item, "modifiedDate"),
                    PublishTime    = GetString(item, "publishTime"),
                    Published      = GetString(item, "published"),
                    FileSize       = GetString(item, "fileSize"),
                    LastReloadTime = GetString(item, "lastReloadTime")
                });
            }

            return(ret);
        }
 private dynamic GetSenseResponse(string uriPart, SenseApiSupport senseApiSupport)
 {
     return(senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:{uriPart}",
                null,
                null,
                HttpStatusCode.OK,
                JToken.Parse));
 }
Esempio n. 8
0
        public JArray GetJArray(SenseApiSupport senseApiSupport, string url)
        {
            JArray dynamicJson = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:4242/{url}", //qrs/servicestatus/full",
                null,
                null,
                HttpStatusCode.OK,
                JArray.Parse);

            return(dynamicJson);
        }
        private bool IsCentralNode(SenseApiSupport senseApiSupport)
        {
            dynamic json = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:4242/qrs/servernodeconfiguration/local",
                null,
                null,
                HttpStatusCode.OK,
                JToken.Parse);

            return(json.isCentral);
        }
        public QlikSenseQrsAbout GetQrsAbout(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            var serverNodeConfigJson = GetSenseResponse("4242/qrs/about", senseApiSupport);
            var qlikSenseQrsAbout    = new QlikSenseQrsAbout
            {
                BuildVersion     = _jsonHelper.GetString(serverNodeConfigJson, "buildVersion"),
                BuildDate        = _jsonHelper.GetString(serverNodeConfigJson, "buildDate"),
                DatabaseProvider = _jsonHelper.GetString(serverNodeConfigJson, "databaseProvider"),
                NodeType         = _jsonHelper.GetInt(serverNodeConfigJson, "nodeType")
            };

            return(qlikSenseQrsAbout);
        }
        public IEnumerable <QlikSenseComponent> GetAboutComponents(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            var senseComponentsJson = GetSenseResponse("9032/v1/components", senseApiSupport);

            foreach (dynamic component in senseComponentsJson)
            {
                var senseComponent = new QlikSenseComponent
                {
                    Component = _jsonHelper.GetString(component, "component"),
                    Version   = _jsonHelper.GetString(component, "version")
                };

                yield return(senseComponent);
            }
        }
        public QlikSenseAboutSystemInfo GetAboutSystemInfo(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            var senseSystemInfoJson = GetSenseResponse("9032/v1/systeminfo", senseApiSupport);

            var senseSystemInfo = new QlikSenseAboutSystemInfo
            {
                SenseId            = _jsonHelper.GetString(senseSystemInfoJson, "senseId"),
                Version            = _jsonHelper.GetString(senseSystemInfoJson, "version"),
                DeploymentType     = _jsonHelper.GetString(senseSystemInfoJson, "deploymentType"),
                ReleaseLabel       = _jsonHelper.GetString(senseSystemInfoJson, "releaseLabel"),
                ProductName        = _jsonHelper.GetString(senseSystemInfoJson, "productName"),
                CopyrightYearRange = _jsonHelper.GetString(senseSystemInfoJson, "copyrightYearRange"),
            };

            return(senseSystemInfo);
        }
Esempio n. 13
0
        public void Execute()
        {
            try
            {
                var host = Settings.GetSetting($"{MonitorName}.HostName", "(undefined)");
                if (host.Equals("(undefined)", StringComparison.InvariantCultureIgnoreCase))
                {
                    host = (Dns.GetHostEntry(Dns.GetHostName()).HostName).ToLower();
                }
                var senseApi = SenseApiSupport.Create(host);
                var helper   = new SenseApiHelper();

                SenseEnums senseEnums = new SenseEnums(senseApi);
                var        data       = new StatisticsDto();
                try
                {
                    data.QLikSenseCalInfo = helper.ExecuteCalAgentWithOverview(senseApi, senseEnums);
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(ex);
                    try { data.QLikSenseCalInfo = helper.ExecuteCalAgent(senseApi, senseEnums); } catch (Exception e) { data.Exceptions.Add(e); }
                }

                try { data.QlikSenseLicenseAgent = helper.ExecuteLicenseAgent(senseApi, senseEnums); } catch (Exception e) { data.Exceptions.Add(e); }
                try { data.QlikSenseServiceInfo = helper.GetQlikSenseServiceInfos(senseApi, senseEnums).ToList(); } catch (Exception e) { data.Exceptions.Add(e); }
                if (_sentToday != DateTime.Now.Day)
                {
                    _sentToday = DateTime.Now.Day;

                    try { data.QlikSenseQrsAbout = helper.GetQrsAbout(senseApi, senseEnums); } catch (Exception e) { data.Exceptions.Add(e); }
                    try { data.QlikSenseAboutSystemInfo = helper.GetAboutSystemInfo(senseApi, senseEnums); } catch (Exception e) { data.Exceptions.Add(e); }
                    try { data.QlikSenseAppListShort = helper.GetQrsAppListShort(senseApi, senseEnums).ToList(); } catch (Exception e) { data.Exceptions.Add(e); }
                    try { data.QlikSenseMachineInfos = helper.GetQlikSenseMachineInfos(senseApi, senseEnums).ToList(); } catch (Exception e) { data.Exceptions.Add(e); }
                }

                data.InstallationId = $"{data.QlikSenseLicenseAgent?.LicenseSerialNo ?? "(unknown)"}_{data.QlikSenseServiceInfo?.FirstOrDefault()?.ServiceClusterId.ToString() ?? "(unknown)"} ";
                Notify($"{MonitorName} has analyzed the following system", new List <string> {
                    JsonConvert.SerializeObject(data, Formatting.Indented)
                }, "-1");
            }
            catch (Exception ex)
            {
                Log.To.Main.AddException($"Failed executing {MonitorName}", ex);
            }
        }
        public IEnumerable <QlikSenseComponent> GetAboutComponents(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            dynamic senseComponentsJson = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:9032/v1/components",
                null,
                null,
                HttpStatusCode.OK,
                JToken.Parse);

            foreach (dynamic component in senseComponentsJson)
            {
                var senseComponent = new QlikSenseComponent
                {
                    Component = GetString(component, "component"),
                    Version   = GetString(component, "version")
                };

                yield return(senseComponent);
            }
        }
        public IEnumerable <QlikSenseServiceInfo> GetQlikSenseServiceInfos(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            var serviceStatusJson = GetSenseResponse("4242/qrs/servicestatus/full", senseApiSupport);

            foreach (dynamic serviceStatusStruct in serviceStatusJson)
            {
                int serviceTypeId  = _jsonHelper.GetInt(serviceStatusStruct, "serviceType");
                int serviceStateId = _jsonHelper.GetInt(serviceStatusStruct, "serviceState");

                var qlikSenseServiceInfo = new QlikSenseServiceInfo
                {
                    ServiceType      = senseEnums.GetValue("ServiceTypeEnum", serviceTypeId, MISSING_VALUE),
                    HostName         = _jsonHelper.GetString(serviceStatusStruct, new[] { "serverNodeConfiguration", "hostName" }),
                    ServiceClusterId = _jsonHelper.GetGuid(serviceStatusStruct, new[] { "serverNodeConfiguration", "serviceCluster", "id" }),
                    ServiceState     = senseEnums.GetValue("ServiceStateEnum", serviceStateId, MISSING_VALUE),
                    ModifiedDate     = _jsonHelper.GetDate(serviceStatusStruct, "modifiedDate")
                };

                yield return(qlikSenseServiceInfo);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="senseApiSupport"></param>
        /// <param name="senseEnums"></param>
        /// <returns></returns>
        public IEnumerable <QlikSenseMachineInfo> GetQlikSenseMachineInfos(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            var serverNodeConfigJson = GetSenseResponse("4242/qrs/servernodeconfiguration/full", senseApiSupport);

            foreach (dynamic serverNodeStruct in serverNodeConfigJson)
            {
                var nodePurposeId = _jsonHelper.GetInt(serverNodeStruct, "nodePurpose");

                var qlikSenseMachineInfo = new QlikSenseMachineInfo
                {
                    HostName         = _jsonHelper.GetString(serverNodeStruct, "hostName"),
                    ServiceClusterId = _jsonHelper.GetGuid(serverNodeStruct, new[] { "serviceCluster", "id" }),
                    Name             = _jsonHelper.GetString(serverNodeStruct, "name"),
                    IsCentral        = _jsonHelper.GetBool(serverNodeStruct, "isCentral"),
                    NodePurpose      = senseEnums.GetValue("NodePurposeEnum", nodePurposeId, MISSING_VALUE),
                    ModifiedDate     = _jsonHelper.GetDate(serverNodeStruct, "modifiedDate")
                };
                _serviceClusterId = qlikSenseMachineInfo.ServiceClusterId;
                yield return(qlikSenseMachineInfo);
            }
        }
        public QlikSenseAboutSystemInfo GetAboutSystemInfo(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            dynamic senseSystemInfoJson = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:9032/v1/systeminfo",
                null,
                null,
                HttpStatusCode.OK,
                JToken.Parse);

            var senseSystemInfo = new QlikSenseAboutSystemInfo
            {
                SenseId            = GetString(senseSystemInfoJson, "senseId"),
                Version            = GetString(senseSystemInfoJson, "version"),
                DeploymentType     = GetString(senseSystemInfoJson, "deploymentType"),
                ReleaseLabel       = GetString(senseSystemInfoJson, "releaseLabel"),
                ProductName        = GetString(senseSystemInfoJson, "productName"),
                CopyrightYearRange = GetString(senseSystemInfoJson, "copyrightYearRange"),
            };

            return(senseSystemInfo);
        }
        public QlikSenseQrsAbout GetQrsAbout(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            dynamic serverNodeConfigJson = senseApiSupport.RequestWithResponse(
                ApiMethod.Get,
                $"https://{senseApiSupport.Host}:4242/qrs/about",
                null,
                null,
                HttpStatusCode.OK,
                JToken.Parse);

            //foreach (dynamic serverNodeStruct in serverNodeConfigJson)
            //{
            //var a = serverNodeConfigJson.nodeType;
            var qlikSenseQrsAbout = new QlikSenseQrsAbout
            {
                BuildVersion     = GetString(serverNodeConfigJson, "buildVersion"),
                BuildDate        = GetString(serverNodeConfigJson, "buildDate"),
                DatabaseProvider = GetString(serverNodeConfigJson, "databaseProvider"),
                NodeType         = GetInt(serverNodeConfigJson, "nodeType")
            };

            return(qlikSenseQrsAbout);
        }
        public List <QlikSenseAppListShort> GetQrsAppListShort(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            var resp = GetSenseResponse("4242/qrs/app/full", senseApiSupport);
            var ret  = new List <QlikSenseAppListShort>();
            Dictionary <String, QlikSenseAppObjectsShort> appObjs;

            try
            {
                appObjs = GetQlikSenseAppObjectInfos(senseApiSupport, senseEnums);
            }
            catch (Exception e)
            {
                Log.To.Main.AddException("Failed accessing the app objects in GetQrsAppListShort", e);
                appObjs = new Dictionary <string, QlikSenseAppObjectsShort>();
            }

            foreach (dynamic item in resp)
            {
                //var a = serverNodeConfigJson.nodeType;
                var id = _jsonHelper.GetString(item, "id");
                appObjs.TryGetValue(id, out QlikSenseAppObjectsShort appObj);
                ret.Add(new QlikSenseAppListShort
                {
                    Id             = id,
                    AppObjects     = appObj?.Objects ?? 0,
                    SheetObjects   = appObj?.Sheets ?? 0,
                    CreatedDate    = _jsonHelper.GetString(item, "createdDate"),
                    ModifiedDate   = _jsonHelper.GetString(item, "modifiedDate"),
                    PublishTime    = _jsonHelper.GetString(item, "publishTime"),
                    Published      = _jsonHelper.GetString(item, "published"),
                    FileSize       = _jsonHelper.GetString(item, "fileSize"),
                    LastReloadTime = _jsonHelper.GetString(item, "lastReloadTime")
                });
            }

            return(ret);
        }
Esempio n. 20
0
 public SenseConnectDto TryAccessSenseApi(SenseConnectDto dto)
 {
     try
     {
         _logger.Add($"Trying connecting to Sense Server on {dto.SenseHostName}.");
         dto.SenseApiSupport = SenseApiSupport.Create(dto.SenseHostName);
         dto.SenseServerLocationFinderStatus = SenseServerLocationFinderStatus.Success;
         return(dto);
     }
     catch (Exception ex)
     {
         if (ex is AggregateException agrEx)
         {
             dto.SenseServerLocationFinderStatus = SenseServerLocationFinderStatus.NotAccessable;
             foreach (var item in agrEx.InnerExceptions)
             {
                 if (item.Message.Contains("403"))
                 {
                     dto.SenseServerLocationFinderStatus = SenseServerLocationFinderStatus.Forbidden;
                 }
             }
         }
         else
         {
             dto.SenseServerLocationFinderStatus =
                 ex.Message.Contains("No valid Qlik Sense client certificate found.")
                     ? SenseServerLocationFinderStatus.NoSertificateFound
                     : SenseServerLocationFinderStatus.NotAccessable;
         }
         _logger.Add($"TryAccessSenseApi failed locating api on machine {dto.SenseHostName} with status {dto.SenseServerLocationFinderStatus} and exception {ex}");
         if (dto.SenseServerLocationFinderStatus == SenseServerLocationFinderStatus.Undefined)
         {
             dto.SenseServerLocationFinderStatus = SenseServerLocationFinderStatus.UnknownFailure;
         }
         return(dto);
     }
 }
        public string GetQlikSenseArchivedFolderLocation(SenseApiSupport senseApiSupport)
        {
            string ret;
            var    json = GetSenseResponse($"4242/qrs/ServiceCluster/{_serviceClusterId}", senseApiSupport);

            try
            {
                ret = json?.settings?.sharedPersistenceProperties?.archivedLogsRootFolder?.Value ?? "";
            }
            catch (Exception ex) //We dont trust the API to not change case.
            {
                Log.To.Main.Add($"Failed parsing the ServiceCluster and get the archived folder path moving to case insensitive search {ex}");
                var settings = GetNode(json, "settings");
                var sharedPersistenceProperties = GetNode(settings?.Value, "sharedPersistenceProperties");
                ret = GetNode(sharedPersistenceProperties?.Value, "archivedLogsRootFolder")?.Value ?? "";
            }

            if (string.IsNullOrWhiteSpace(ret))
            {
                Log.To.Main.Add($"WARNING-Archived Logs conn string missing.");
                Log.To.Main.Add($"ServiceCluster=>{json?.ToString().Replace(Environment.NewLine, @"\r\n")}");
            }
            return(ret);
        }
 public string GetQrsProxyService(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
 {
     return(GetGenericJsonToString(senseApiSupport, $"https://{senseApiSupport.Host}:4242/qrs/ProxyService/full"));
 }
 public string GetQrsAppList(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
 {
     return(GetGenericJsonToString(senseApiSupport, $"https://{senseApiSupport.Host}:4242/qrs/app/full"));
 }
 public string GetQrsServiceCluster(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
 {
     return(GetGenericJsonToString(senseApiSupport, $"https://{senseApiSupport.Host}:4242/qrs/ServiceCluster/{_serviceClusterId}"));
 }
        public QLikSenseCalInfo ExecuteCalAgent(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            try
            {
                if (!IsCentralNode(senseApiSupport))
                {
                    // The "/qrs/license/accesstypeinfo"-call can only be executed on the central node.
                    return(null);
                }

                var calJson = GetSenseResponse("4242/qrs/license/accesstypeinfo", senseApiSupport);
                Func <JObject, string, double> getDouble = (jObject, propertyName)
                                                           => jObject?.GetValue(propertyName).ToObject <double>() ?? 0;

                double totalTokens     = calJson.totalTokens;
                double availableTokens = calJson.availableTokens;

                JObject userAccessType        = calJson.userAccessType;
                double  userAllocatedTokens   = getDouble(userAccessType, "allocatedTokens");
                double  userUsedTokens        = getDouble(userAccessType, "usedTokens");
                double  userQuarantinedTokens = getDouble(userAccessType, "quarantinedTokens");

                JObject loginAccessType        = calJson.loginAccessType;
                double  loginAllocatedTokens   = getDouble(loginAccessType, "allocatedTokens");
                double  loginUsedTokens        = getDouble(loginAccessType, "usedTokens");
                double  loginUnavailableTokens = getDouble(loginAccessType, "unavailableTokens");

                JObject applicationAccessType        = calJson.applicationAccessType;
                double  applicationAllocatedTokens   = getDouble(applicationAccessType, "allocatedTokens");
                double  applicationUsedTokens        = getDouble(applicationAccessType, "usedTokens");
                double  applicationQuarantinedTokens = getDouble(applicationAccessType, "quarantinedTokens");

                JObject professionalAccessType        = calJson.professionalAccessType;
                double  professionalAllocatedTokens   = getDouble(professionalAccessType, "allocatedTokens");
                double  professionalUsedTokens        = getDouble(professionalAccessType, "usedTokens");
                double  professionalQuarantinedTokens = getDouble(professionalAccessType, "quarantinedTokens");

                JObject analyzerAccessType        = calJson.analyzerAccessType;
                double  analyzerAllocatedTokens   = getDouble(analyzerAccessType, "allocatedTokens");
                double  analyzerUsedTokens        = getDouble(analyzerAccessType, "usedTokens");
                double  analyzerQuarantinedTokens = getDouble(analyzerAccessType, "quarantinedTokens");

                var ret = new QLikSenseCalInfo
                {
                    TotalTokens                   = totalTokens,
                    AvailableTokens               = availableTokens,
                    UserAllocatedTokens           = userAllocatedTokens,
                    UserUsedTokens                = userUsedTokens,
                    UserQuarantinedTokens         = userQuarantinedTokens,
                    LoginAllocatedTokens          = loginAllocatedTokens,
                    LoginUsedTokens               = loginUsedTokens,
                    LoginUnavailableTokens        = loginUnavailableTokens,
                    ApplicationAllocatedTokens    = applicationAllocatedTokens,
                    ApplicationUsedTokens         = applicationUsedTokens,
                    ApplicationQuarantinedTokens  = applicationQuarantinedTokens,
                    ProfessionalAllocatedTokens   = professionalAllocatedTokens,
                    ProfessionalUsedTokens        = professionalUsedTokens,
                    ProfessionalQuarantinedTokens = professionalQuarantinedTokens,
                    AnalyzerAllocatedTokens       = analyzerAllocatedTokens,
                    AnalyzerUsedTokens            = analyzerUsedTokens,
                    AnalyzerQuarantinedTokens     = analyzerQuarantinedTokens
                };
                return(ret);
            }
            catch (WebException exception)
            {
                if ((senseApiSupport != null) &&
                    (exception.Status == WebExceptionStatus.ProtocolError) &&
                    (exception.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.Forbidden)
                {
                    // The certificate seems to have gone bad...
                    throw new Exception("Failed getting Cal info. Probably a certificate issue.");
                    // Exit silently and retry the next time.
                }
                throw;
            }
        }
 public string GetQrsDataconnections(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
 {
     return(GetGenericJsonToString(senseApiSupport, $"https://{senseApiSupport.Host}:4242/qrs/dataconnection/full"));
 }
        private bool IsCentralNode(SenseApiSupport senseApiSupport)
        {
            var json = GetSenseResponse("4242/qrs/servernodeconfiguration/local", senseApiSupport);

            return(json.isCentral);
        }
        public QlikSenseLicenseInfo ExecuteLicenseAgent(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            string lef;
            string serial;
            bool   isExpired;
            string expiredReason;
            bool   isBlacklisted;

            try
            {
                var licenseJson = GetSenseResponse("4242/qrs/license", senseApiSupport);
                lef           = licenseJson.lef;
                serial        = licenseJson.serial;
                isExpired     = licenseJson.isExpired;
                expiredReason = licenseJson.expiredReason;
                isBlacklisted = licenseJson.isBlacklisted;

                if (lef.Length > 0)
                {
                    Match prodlevelMatch = Regex.Match(lef, REGEX_PATTERN_PRODUCTLEVEL);
                    Match timelimitMatch = Regex.Match(lef, REGEX_PATTERN_TIMELIMIT);

                    if (!prodlevelMatch.Success && !timelimitMatch.Success)
                    {
                        return(null);
                    }

                    int lefDateFormatLength = DateTime.UtcNow.ToString(LEF_DATE_FORMAT).Length;

                    Func <Match, DateTime> parseLefDateTimeString = match =>
                    {
                        if (!match.Success)
                        {
                            return(DateTime.MaxValue);
                        }

                        DateTime dateTime;

                        string dateTimeString = match.Value.Substring(match.Value.Length - lefDateFormatLength, lefDateFormatLength);

                        if (!DateTime.TryParseExact(
                                dateTimeString,
                                LEF_DATE_FORMAT,
                                CultureInfo.InvariantCulture,
                                DateTimeStyles.AssumeLocal,
                                out dateTime))
                        {
                            dateTime = DateTime.MaxValue;
                        }

                        return(dateTime.Date);
                    };

                    DateTime prodlevelEndDate = parseLefDateTimeString(prodlevelMatch);
                    DateTime timelimitEndDate = parseLefDateTimeString(timelimitMatch);

                    // Get the closest date of the two
                    DateTime firstEndDate = prodlevelEndDate <= timelimitEndDate
                        ? prodlevelEndDate
                        : timelimitEndDate;

                    return(new QlikSenseLicenseInfo
                    {
                        ExpireDate = firstEndDate.AsDatapointString(),
                        LicenseSerialNo = serial,
                        IsExpired = isExpired ? 1 : 0,
                        ExpiredReason = expiredReason,
                        IsBlacklisted = isBlacklisted ? 1 : 0
                    });
                }
            }
            catch (WebException exception)
            {
                if ((senseApiSupport != null) &&
                    (exception.Status == WebExceptionStatus.ProtocolError) &&
                    (exception.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.Forbidden)
                {
                    // The certificate seems to have gone bad...
                    throw new Exception("Failed getting License info. Probably a sertificate issue.");
                }

                throw;
            }

            return(new QlikSenseLicenseInfo
            {
                ExpireDate = null,
                LicenseSerialNo = serial,
                IsExpired = isExpired ? 1 : 0,
                ExpiredReason = expiredReason,
                IsBlacklisted = isBlacklisted ? 1 : 0
            });
        }
        public Dictionary <string, QlikSenseAppObjectsShort> GetQlikSenseAppObjectInfos(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            var json     = GetSenseResponse("4242/qrs/app/object/full", senseApiSupport);
            var analyzer = new Dictionary <string, QlikSenseAppObjectsShort>();

            foreach (dynamic data in json)
            {
                var appid = _jsonHelper.GetString(data, new [] { "app", "id" });
                var type  = _jsonHelper.GetString(data, "objectType");

                if (!analyzer.TryGetValue(appid, out QlikSenseAppObjectsShort value))
                {
                    value = new QlikSenseAppObjectsShort {
                        AppId = appid
                    };
                    analyzer.Add(appid, value);
                }

                if (string.Equals(type, "sheet", StringComparison.InvariantCultureIgnoreCase))
                {
                    value.Sheets++;
                }
                else
                {
                    value.Objects++;
                }
            }

            return(analyzer);
        }
        public QLikSenseCalInfo ExecuteCalAgentWithOverview(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            try
            {
                var calJson = GetSenseResponse("4242/qrs/license/accesstypeoverview", senseApiSupport);
                Func <JObject, string, double> getDouble = (jObject, propertyName)
                                                           => jObject?.GetValue(propertyName).ToObject <double>() ?? 0;
                Func <JObject, string, bool> getBool = (jObject, propertyName)
                                                       => jObject?.GetValue(propertyName).ToObject <bool>() ?? false;


                double totalTokens     = calJson.totalTokens;
                double availableTokens = calJson.availableTokens;

                JObject userAccessType        = calJson.userAccess;
                double  userAllocatedTokens   = getDouble(userAccessType, "allocatedTokens");
                double  userUsedTokens        = getDouble(userAccessType, "usedTokens");
                double  userQuarantinedTokens = getDouble(userAccessType, "quarantinedTokens");

                JObject loginAccessType        = calJson.loginAccess;
                double  loginAllocatedTokens   = getDouble(loginAccessType, "allocatedTokens");
                double  loginUsedTokens        = getDouble(loginAccessType, "usedTokens");
                double  loginUnavailableTokens = getDouble(loginAccessType, "unavailableTokens");

                //JObject applicationAccessType = calJson.applicationAccess;
                //double applicationAllocatedTokens = getDouble(applicationAccessType, "allocatedTokens");
                //double applicationUsedTokens = getDouble(applicationAccessType, "usedTokens");
                //double applicationQuarantinedTokens = getDouble(applicationAccessType, "quarantinedTokens");

                JObject professionalAccessType        = calJson.professionalAccess;
                double  professionalAllocatedTokens   = getDouble(professionalAccessType, "allocated");
                double  professionalUsedTokens        = getDouble(professionalAccessType, "used");
                double  professionalQuarantinedTokens = getDouble(professionalAccessType, "quarantined");
                double  professionalTotalTokens       = getDouble(professionalAccessType, "total");

                JObject analyzerAccessType        = calJson.analyzerAccess;
                double  analyzerAllocatedTokens   = getDouble(analyzerAccessType, "allocated");
                double  analyzerUsedTokens        = getDouble(analyzerAccessType, "used");
                double  analyzerQuarantinedTokens = getDouble(analyzerAccessType, "quarantined");
                double  analyzerTotalTokens       = getDouble(analyzerAccessType, "total");

                JObject analyzerTimeAccessType = calJson.analyzerTimeAccess;
                var     timeAccessEnabled      = getBool(analyzerTimeAccessType, "enabled");

                double analyzerTimeAllocatedMinutes   = timeAccessEnabled ? getDouble(analyzerTimeAccessType, "allocatedMinutes") : 0;
                double analyzerTimeUsedMinutes        = timeAccessEnabled ? getDouble(analyzerTimeAccessType, "usedMinutes") : 0;
                double analyzerTimeUnavailableMinutes = timeAccessEnabled ? getDouble(analyzerTimeAccessType, "unavailableMinutes") : 0;


                var ret = new QLikSenseCalInfo
                {
                    TotalTokens                    = totalTokens,
                    AvailableTokens                = availableTokens,
                    UserAllocatedTokens            = userAllocatedTokens,
                    UserUsedTokens                 = userUsedTokens,
                    UserQuarantinedTokens          = userQuarantinedTokens,
                    LoginAllocatedTokens           = loginAllocatedTokens,
                    LoginUsedTokens                = loginUsedTokens,
                    LoginUnavailableTokens         = loginUnavailableTokens,
                    AnalyzerTimeAllocatedMinutes   = analyzerTimeAllocatedMinutes,
                    AnalyzerTimeUsedMinutes        = analyzerTimeUsedMinutes,
                    AnalyzerTimeUnavailableMinutes = analyzerTimeUnavailableMinutes,
                    ProfessionalAllocatedTokens    = professionalAllocatedTokens,
                    ProfessionalTotalTokens        = professionalTotalTokens,
                    ProfessionalUsedTokens         = professionalUsedTokens,
                    ProfessionalQuarantinedTokens  = professionalQuarantinedTokens,
                    AnalyzerAllocatedTokens        = analyzerAllocatedTokens,
                    AnalyzerUsedTokens             = analyzerUsedTokens,
                    AnalyzerQuarantinedTokens      = analyzerQuarantinedTokens,
                    AnalyzerTotalTokens            = analyzerTotalTokens,
                };
                return(ret);
            }
            catch (WebException exception)
            {
                if ((senseApiSupport != null) &&
                    (exception.Status == WebExceptionStatus.ProtocolError) &&
                    (exception.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.Forbidden)
                {
                    // The certificate seems to have gone bad...
                    throw new Exception("Failed getting Cal info. Probably a certificate issue.");
                }

                throw;
            }
        }