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 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);
        }
Beispiel #3
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);
            }
        }
        private List <ServiceStatusFullDto> GetServiceStatusFull(SenseEnums senseEnums)
        {
            var dynamicJson = new QmsHelper().GetJArray(_senseApiSupport, "qrs/servicestatus/full");
            var ret         = new  List <ServiceStatusFullDto>();

            foreach (dynamic serviceStatusStruct in dynamicJson)
            {
                ret.Add(new ServiceStatusFullDto
                {
                    ServiceTypeId      = serviceStatusStruct.serviceType,
                    ServiceStateId     = serviceStatusStruct.serviceState,
                    Timestamp          = serviceStatusStruct.timestamp,
                    ServerNodeName     = serviceStatusStruct.serverNodeConfiguration.name,
                    ServerNodeHostName = serviceStatusStruct.serverNodeConfiguration.hostName,
                    ServiceTypeName    = senseEnums.GetValue("ServiceTypeEnum", (int)serviceStatusStruct.serviceType, string.Format(Constants.SENSE_API_MISSING_VALUE, serviceStatusStruct.serviceType)),
                    ServiceStateName   = senseEnums.GetValue("ServiceStateEnum", (int)serviceStatusStruct.serviceState, string.Format(Constants.SENSE_API_MISSING_VALUE, serviceStatusStruct.serviceState)),
                });
            }
            return(ret);
        }
        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 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);
        }
        /// <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 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 string GetQrsDataconnections(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
 {
     return(GetGenericJsonToString(senseApiSupport, $"https://{senseApiSupport.Host}:4242/qrs/dataconnection/full"));
 }
        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 string GetQrsProxyService(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
 {
     return(GetGenericJsonToString(senseApiSupport, $"https://{senseApiSupport.Host}:4242/qrs/ProxyService/full"));
 }
        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);
            }
        }
        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 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 void Execute()
        {
            try
            {
                var host = Settings.GetSetting($"{MonitorName}.HostName", "localhost");
                if ((_senseApiSupport == null) || (_senseApiSupport.Host != host))
                {
                    _senseApiSupport = SenseApiSupport.Create(host);
                }

                SenseEnums senseEnums     = new SenseEnums(_senseApiSupport);
                var        taskHelper     = new TaskHelper();
                var        tasks          = taskHelper.GetAllTasksFullDto(_senseApiSupport, senseEnums);
                var        filter         = new Regex(Settings.GetSetting($"{MonitorName}.Filter").Trim(), RegexOptions.IgnoreCase);
                var        negativeFilter = new Regex(Settings.GetSetting($"{MonitorName}.NegativeFilter").Trim(), RegexOptions.IgnoreCase);

                foreach (var dto in tasks)
                {
                    if (filter.ToString() == string.Empty || filter.IsMatch(dto.Name) || filter.IsMatch(dto.Taskid.ToString()))
                    {
                        if (negativeFilter.ToString() != string.Empty && (negativeFilter.IsMatch(dto.Name) || negativeFilter.IsMatch(dto.Taskid.ToString())))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        continue;
                    }
                    var key = dto.Taskid.ToString();
                    if (dto.Enabled.GetValueOrDefault(false))
                    {
                        //what bucket
                        var      bucket       = GetScheduledTimeBucket(dto);
                        TimeSpan?ruleDuration = null;
                        switch (bucket)
                        {
                        case IncrementOptionEnum.Hourly:
                            ruleDuration = TimeSpan.FromSeconds(Settings.GetInt32($"{MonitorName}.HourlyDurationInSeconds", 0));
                            break;

                        case IncrementOptionEnum.Daily:
                            ruleDuration = TimeSpan.FromSeconds(Settings.GetInt32($"{MonitorName}.DailyDurationInSeconds", 0));
                            break;

                        case IncrementOptionEnum.Weekly:
                            ruleDuration = TimeSpan.FromSeconds(Settings.GetInt32($"{MonitorName}.WeeklyDurationInSeconds", 0));
                            break;

                        case IncrementOptionEnum.Monthly:
                            ruleDuration = TimeSpan.FromSeconds(Settings.GetInt32($"{MonitorName}.MonthlyDurationInSeconds", 0));
                            break;
                        }

                        if (ruleDuration.GetValueOrDefault(TimeSpan.FromSeconds(0)) < TimeSpan.FromSeconds(1))
                        {
                            continue; // ignore buckets with no defined minimum execution duration
                        }
                        _groupedNotifyer.AddIfMissing(key, dto.Name);

                        //check if the schedule has changed bucket.
                        if (_groupedNotifyer.GetSettings(key).Duration != ruleDuration)
                        {
                            _groupedNotifyer.GetSettings(key).Duration = ruleDuration.GetValueOrDefault(TimeSpan.FromSeconds(0));
                            continue; // don't analyze this time around. Material change rule duration.
                        }
                        _groupedNotifyer.Analyze(key, dto.Operational?.LastExecutionResult?.Status ?? -1);
                    }
                }
                _groupedNotifyer.AnalyzeRoundFinished();
            }
            catch (Exception ex)
            {
                _senseApiSupport = null;
                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)
        {
            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);
            }
        }
        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);
        }
        public void Execute()
        {
            try
            {
                var logFileDirector = new LogFileDirector(FileSystem.Singleton);
                var logMinerData    = new FileMinerDto();
                var data            = new StatisticsDto {
                    LogFileMinerData = logMinerData, CollectionDateUtc = logMinerData.CollectionDateUtc
                };
                string archivedLogsLocation;

                //default we ask sense for the settings needed.
                if (String.IsNullOrWhiteSpace(Settings.GetSetting($"{MonitorName}.OverideLogFilePath", "")) &&
                    String.IsNullOrWhiteSpace(Settings.GetSetting($"{MonitorName}.LicenseSerialNo", "")) &&
                    String.IsNullOrWhiteSpace(Settings.GetSetting($"{MonitorName}.ServiceClusterId", "")))
                {
                    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);

                    try { data.QlikSenseMachineInfos = helper.GetQlikSenseMachineInfos(senseApi, senseEnums).ToList(); } 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); }

                    archivedLogsLocation = helper.GetQlikSenseArchivedFolderLocation(senseApi);
                    _installationId      = $"{data.QlikSenseLicenseAgent?.LicenseSerialNo ?? "(unknown)"}_{data.QlikSenseServiceInfo?.FirstOrDefault()?.ServiceClusterId.ToString() ?? "(unknown)"} ";
                    _licenseSerialNr     = data.QlikSenseLicenseAgent?.LicenseSerialNo ?? "(unknown)";

                    data.QlikSenseLicenseAgent = null;
                    data.QlikSenseServiceInfo  = null;
                    data.QlikSenseMachineInfos = null;
                }
                else // pull from settings
                {
                    _licenseSerialNr     = Settings.GetSetting($"{MonitorName}.LicenseSerialNo", "");
                    _installationId      = $"{_licenseSerialNr}_{Settings.GetSetting($"{MonitorName}.ServiceClusterId", "")}";
                    archivedLogsLocation = Settings.GetSetting($"{MonitorName}.OverideLogFilePath", "");
                }

                data.InstallationId = _installationId;
                data.LogFileMinerData.LicenseSerialNo = _licenseSerialNr;
                //string archivedLogsLocation = @"C:\temp\ArchivedLogs";//@"D:\SFDCData\files\01471384\SenseCollector_e8e2d1bc-3c1e-41d7-9a9c-0cac78c7539d\SenseCollector_e8e2d1bc-3c1e-41d7-9a9c-0cac78c7539d";
                //get yesterday +1
                var settings = new LogFileDirectorSettings
                {
                    StartDateForLogs = DateTime.Now.AddDays(-2).Date,
                    StopDateForLogs  = DateTime.Now.AddDays(-1).Date.AddMilliseconds(-1),
                };
                //settings.StartDateForLogs = DateTime.Parse("2018-08-27 00:00:00");
                //settings.StopDateForLogs = DateTime.Parse("2018-08-27 23:59:59");
                settings.StartDateForLogs = DateTime.Parse("2019-03-09 00:00:00").AddDays(FAKERUNCOUNT);
                settings.StopDateForLogs  = DateTime.Parse("2019-03-09 23:59:59").AddDays(FAKERUNCOUNT);

                logFileDirector.LoadAndRead(new[] { new DirectorySetting(archivedLogsLocation) }, settings, logMinerData);
                //persisting current days apps and users for more analysis.
                var db = new GjallarhornDb(FileSystem.Singleton);

                CheckMontlySending(settings.StartDateForLogs.Month);

                db.AddToMontlyStats(logMinerData.TotalUniqueActiveAppsList, settings.StartDateForLogs.Year, settings.StartDateForLogs.Month, MontlyStatsType.Apps);
                db.AddToMontlyStats(logMinerData.TotalUniqueActiveUsersList, settings.StartDateForLogs.Year, settings.StartDateForLogs.Month, MontlyStatsType.Users);
                Trace.WriteLine($"{settings.StartDateForLogs.ToString("yyyy-MM-dd")} sessionCount=>{data.LogFileMinerData.TotalNrOfSessions} on FakeRun:{FAKERUNCOUNT}");
                Notify($"{MonitorName} has analyzed the following system", new List <string> {
                    JsonConvert.SerializeObject(data, Formatting.Indented)
                }, "-1");
                FAKERUNCOUNT++;
            }
            catch (Exception ex)
            {
                Log.To.Main.AddException($"Failed executing {MonitorName}", ex);
            }
        }
        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;
            }
        }
Beispiel #22
0
        private async Task <List <Task> > GetTasksForFullRun(SenseConnectDto dto)
        {
            var senseApi = new SenseApiCollector(_logger);
            var taskList = new List <Task>();

            _logger.Add("Sense api connected");
            SenseEnums statusEnums = null;

            QlikSenseMachineInfo[] qlikSenseMachineInfos = null;

            await Task.Run(() => { statusEnums = new SenseEnums(dto.SenseApiSupport); }).ConfigureAwait(false);

            _logger.Add("Sense Machine infos collected");

            var archivedLogsLocation = string.Empty;

            if (statusEnums == null)
            {
                throw new Exception("Failed accessing sense");
            }
            await Task.Run(() => qlikSenseMachineInfos = GetQlikSenseMachineInfos(senseApi, dto.SenseApiSupport, statusEnums)).ConfigureAwait(false);

            try
            {
                archivedLogsLocation = senseApi.GetQlikSenseArchivedFolderLocation(dto.SenseApiSupport);
                _logger.Add($"Accessing archived logs at {archivedLogsLocation}.");
                if (!_filesystem.DirectoryExists(archivedLogsLocation))
                {
                    archivedLogsLocation = PathToArchivedLogsDlg.Invoke(archivedLogsLocation);
                }
            }
            catch (Exception ex)
            {
                _logger.Add("Failed retreiving Archived folder location from API " + ex);
            }

            taskList.Add(Task.Run(async() =>
            {
                if (ServiceVariables.AllowSenseInfo)
                {
                    try
                    {
                        var nodeCount = qlikSenseMachineInfos?.Length ?? 0;
                        _notify($"Collecting Information from {nodeCount} Qlik Sense {(nodeCount > 1 ? "nodes" : "node")}.", MessageLevels.Animate, "SenseInfo");
                        _logger.Add($"Running CommandLineRemoteTasks.");
                        await RunCommandLineRemoteTasks(qlikSenseMachineInfos).ConfigureAwait(false);
                        _logger.Add($"Running GettingAllSettingsFiles.");
                        await RunGettingAllSettingsFiles(qlikSenseMachineInfos).ConfigureAwait(false);

                        _notify("Collecting Qlik Sense Information.", MessageLevels.Animate, "SenseInfo");
                        _logger.Add($"Running Get all api info.");
                        _collectorHelper.WriteContentToFile(qlikSenseMachineInfos, "qlikSenseMachineInfo");
                        _collectorHelper.RunAction(() => senseApi.GetQlikSenseServiceInfos(dto.SenseApiSupport, statusEnums).ToArray(), "qlikSenseServiceInfo");
                        _collectorHelper.RunAction(() => senseApi.GetQrsAbout(dto.SenseApiSupport, statusEnums), "QrsAbout");
                        _collectorHelper.RunAction(() => senseApi.ExecuteCalAgent(dto.SenseApiSupport, statusEnums), "CalInfo");
                        _collectorHelper.RunAction(() => senseApi.ExecuteLicenseAgent(dto.SenseApiSupport, statusEnums), "LicenseAgent");
                        _collectorHelper.RunAction(() => senseApi.GetAboutSystemInfo(dto.SenseApiSupport, statusEnums), "AboutSystemInfo");
                        _collectorHelper.RunAction(() => senseApi.GetAboutComponents(dto.SenseApiSupport, statusEnums), "AboutComponents");
                        _collectorHelper.RunAction(() => senseApi.GetQrsDataconnections(dto.SenseApiSupport, statusEnums), "DataConnections");
                        _collectorHelper.RunAction(() => senseApi.GetQrsServiceCluster(dto.SenseApiSupport, statusEnums), "ServiceCluster");
                        _collectorHelper.RunAction(() => senseApi.GetQrsProxyService(dto.SenseApiSupport, statusEnums), "ProxyService");
                        _collectorHelper.RunAction(() => senseApi.GetQrsAppList(dto.SenseApiSupport, statusEnums), "AppList");
                        _collectorHelper.RunAction(() => senseApi.GetQrsDataConnections(dto.SenseApiSupport, statusEnums), "dataconnectionList");

                        _logger.Add($"Finished senseInfo");
                        _notify("Collected Qlik Sense Information.", MessageLevels.Ok, "SenseInfo");
                    }
                    catch (Exception e)
                    {
                        _logger.Add("Failed getting sense info", e);
                        _notify("Failed collecting Qlik Sense Information.", MessageLevels.Error, "SenseInfo");
                    }
                }
            }));
            var readerTaskHelper = new SenseLogReaderTasks(_logger, LogDirectorDone, _notify);

            if (ServiceVariables.AllowRemoteLogs)
            {
                taskList.Add(readerTaskHelper.ReadRemoteLogs(qlikSenseMachineInfos, ServiceVariables));
            }

            if (ServiceVariables.AllowArchivedLogs)
            {
                taskList.Add(readerTaskHelper.ReadArchivedLogs(archivedLogsLocation, ServiceVariables));
            }

            return(taskList);
        }
 public string GetQrsServiceCluster(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
 {
     return(GetGenericJsonToString(senseApiSupport, $"https://{senseApiSupport.Host}:4242/qrs/ServiceCluster/{_serviceClusterId}"));
 }
Beispiel #24
0
 private QlikSenseMachineInfo[] GetQlikSenseMachineInfos(SenseApiCollector senseApi, SenseApiSupport senseApiSupport, SenseEnums statusEnums)
 {
     try
     {
         return(senseApi.GetQlikSenseMachineInfos(senseApiSupport, statusEnums).ToArray());
     }
     catch (Exception e)
     {
         _logger.Add("Failed accessing Sense machine Infos", e);
         throw;
     }
 }
 public string GetQrsAppList(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
 {
     return(GetGenericJsonToString(senseApiSupport, $"https://{senseApiSupport.Host}:4242/qrs/app/full"));
 }
        public List <TaskDto> GetAllTasksFullDto(SenseApiSupport senseApiSupport, SenseEnums senseEnums)
        {
            var dynamicJson = new QmsHelper().GetJArray(senseApiSupport, "qrs/task/full");
            var ret         = new List <TaskDto>();

            foreach (dynamic serviceStatusStruct in dynamicJson)
            {
                try
                {
                    var task = new TaskDto
                    {
                        Taskid              = serviceStatusStruct.id,
                        Createddate         = serviceStatusStruct.createdDate,
                        Modifieddate        = serviceStatusStruct.modifiedDate,
                        Modifiedbyusername  = serviceStatusStruct.modifiedByUserName,
                        Ismanuallytriggered = serviceStatusStruct.isManuallyTriggered,
                        Name                 = serviceStatusStruct.name,
                        Tasktype             = serviceStatusStruct.taskType,
                        Enabled              = serviceStatusStruct.enabled,
                        Tasksessiontimeout   = serviceStatusStruct.taskSessionTimeout,
                        Maxretries           = serviceStatusStruct.maxRetries,
                        Impactsecurityaccess = serviceStatusStruct.impactSecurityAccess,
                        Schemapath           = serviceStatusStruct.schemaPath,
                    };
                    if (serviceStatusStruct.app != null)
                    {
                        task.App = new AppDto
                        {
                            AppId                 = serviceStatusStruct.app.id,
                            Name                  = serviceStatusStruct.app.name,
                            Publishtime           = serviceStatusStruct.app.publishTime,
                            Published             = serviceStatusStruct.app.published,
                            Savedinproductversion = serviceStatusStruct.app.savedInProductVersion,
                            Migrationhash         = serviceStatusStruct.app.migrationHash,
                            Availabilitystatus    = serviceStatusStruct.app.availabilityStatus
                        };
                        if (serviceStatusStruct.app.stream != null)
                        {
                            task.App.Stream = new StreamDto
                            {
                                Name     = serviceStatusStruct.app.stream.name,
                                StreamId = serviceStatusStruct.app.stream.id
                            };
                        }
                    }
                    if (serviceStatusStruct.operational != null)
                    {
                        task.Operational = new TaskOperationalDto
                        {
                            NextExecution = serviceStatusStruct.operational.nextExecution,
                            OperationalId = serviceStatusStruct.operational.id,
                            //ExecutionResult = new TaskLastExecutionResultDto
                        };
                        if (serviceStatusStruct.operational.lastExecutionResult != null)
                        {
                            task.Operational.LastExecutionResult = new TaskLastExecutionResultDto
                            {
                                LastexecutionresultId = serviceStatusStruct.operational.lastExecutionResult.id,
                                Executingnodename     = serviceStatusStruct.operational.lastExecutionResult.executingNodeName,
                                Status             = serviceStatusStruct.operational.lastExecutionResult.status,
                                StatusName         = senseEnums.GetValue("StatusEnum", (int)serviceStatusStruct.operational.lastExecutionResult.status, string.Format(Constants.SENSE_API_MISSING_VALUE, serviceStatusStruct.operational.lastExecutionResult.status)),
                                Starttime          = serviceStatusStruct.operational.lastExecutionResult.startTime,
                                Stoptime           = serviceStatusStruct.operational.lastExecutionResult.stopTime,
                                Duration           = serviceStatusStruct.operational.lastExecutionResult.duration,
                                Filereferenceid    = serviceStatusStruct.operational.lastExecutionResult.fileReferenceID,
                                Scriptlogavailable = serviceStatusStruct.operational.lastExecutionResult.scriptLogAvailable
                            };
                            if (serviceStatusStruct.operational.lastExecutionResult.details != null)
                            {
                                task.Operational.LastExecutionResult.LastExecutionResultDetails = new List <TaskLastExecutionResultDetailsDto>();
                                foreach (dynamic details in serviceStatusStruct.operational.lastExecutionResult.details)
                                {
                                    task.Operational.LastExecutionResult.LastExecutionResultDetails.Add(new TaskLastExecutionResultDetailsDto
                                    {
                                        Detailcreateddate = details.detailCreatedDate,
                                        DetailsId         = details.id,
                                        Detailstype       = details.detailsType,
                                        Message           = details.message
                                    });
                                }
                            }
                        }
                    }

                    ret.Add(task);
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e);
                }
            }
            return(ret);
        }
        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);
        }
        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);
        }