Пример #1
0
        private async Task <List <NotificationTrigger> > GetNotificationTriggersInternalAsync(Either <IPrtgObject, int> objectOrId, CancellationToken token)
        {
            var xmlResponse = await ObjectEngine.GetObjectsXmlAsync(new NotificationTriggerParameters(objectOrId), token : token).ConfigureAwait(false);

            var typed = ResponseParser.ParseNotificationTriggerResponse(objectOrId, xmlResponse);

            if (!IsEnglish)
            {
                var helper = new NotificationTriggerTranslator(typed, objectOrId.GetId());

                NotificationTriggerDataTrigger[] raw = null;

                int parentId;

                while (helper.TranslateTriggers(raw, out parentId))
                {
                    raw = (await GetNotificationTriggerDataAsync(parentId, token).ConfigureAwait(false)).Triggers;
                }
            }

            var updateTriggerChannels = UpdateTriggerChannelsAsync(objectOrId, typed, token);
            var updateTriggerActions  = UpdateTriggerActionsAsync(typed, token);

            await Task.WhenAll(updateTriggerChannels, updateTriggerActions).ConfigureAwait(false);

            return(typed);
        }
Пример #2
0
        private List <NotificationTrigger> GetNotificationTriggersInternal(Either <IPrtgObject, int> objectOrId, CancellationToken token)
        {
            var xmlResponse = ObjectEngine.GetObjectsXml(new NotificationTriggerParameters(objectOrId), token: token);

            var typed = ResponseParser.ParseNotificationTriggerResponse(objectOrId, xmlResponse);

            if (!IsEnglish)
            {
                var helper = new NotificationTriggerTranslator(typed, objectOrId.GetId());

                NotificationTriggerDataTrigger[] raw = null;

                int parentId;

                while (helper.TranslateTriggers(raw, out parentId))
                {
                    raw = GetNotificationTriggerData(parentId, token).Triggers;
                }
            }

            UpdateTriggerChannels(objectOrId, typed, token);
            UpdateTriggerActions(typed, token);

            return(typed);
        }
Пример #3
0
        internal PrtgClient(string server, string username, string password, AuthMode authMode, IWebClient client,
                            IXmlSerializer xmlSerializer = null)
        {
            if (xmlSerializer == null)
            {
                xmlSerializer = new XmlExpressionSerializer();
            }

            if (server == null)
            {
                throw new ArgumentNullException(nameof(server));
            }

            if (username == null)
            {
                throw new ArgumentNullException(nameof(username));
            }

            if (password == null)
            {
                throw new ArgumentNullException(nameof(password));
            }

            RequestEngine = new RequestEngine(this, client);

            ConnectionDetails = new ConnectionDetails(server, username, password);
            Targets           = new PrtgTargetHelper(this);

            if (authMode == AuthMode.Password)
            {
                ConnectionDetails.PassHash = GetPassHash(password);
            }

            ObjectEngine = new ObjectEngine(this, RequestEngine, xmlSerializer);
        }
Пример #4
0
        internal Tuple <List <SensorHistoryData>, int> GetSensorHistoryInternal(SensorHistoryParameters parameters)
        {
            var raw = ObjectEngine.GetObjectsRaw <SensorHistoryData>(parameters, ResponseParser.ValidateSensorHistoryResponse);

            var data = ResponseParser.ParseSensorHistoryResponse(raw.Items, parameters.SensorId);

            return(Tuple.Create(data, raw.TotalCount));
        }
Пример #5
0
        internal Tuple <List <SensorHistoryData>, int> GetSensorHistoryInternal(SensorHistoryParameters parameters)
        {
            var raw = ObjectEngine.GetObjectsRaw <SensorHistoryData>(parameters, responseParser: m => ResponseParser.GetSensorHistoryResponse(m, LogLevel, RequestEngine.IsDirty));

            var data = ResponseParser.ParseSensorHistoryResponse(raw.Items, parameters.SensorId);

            return(Tuple.Create(data, raw.TotalCount));
        }
Пример #6
0
        private async Task UpdateTriggerActionsAsync(List <NotificationTrigger> triggers, CancellationToken token)
        {
            var actions = ResponseParser.GroupTriggerActions(triggers);

            var parameters = new NotificationActionParameters(actions.Select(a => a.Key).ToArray());

            var tasks  = actions.Select(g => GetNotificationActionPropertiesAsync(g.Key, token));
            var normal = await ObjectEngine.GetObjectsXmlAsync(parameters, token : token).ConfigureAwait(false);

            //All the properties of all desired notifications
            var results = await Task.WhenAll(tasks).ConfigureAwait(false);

            //For each different notification action
            for (int i = 0; i < actions.Count; i++)
            {
                var xDoc = RequestParser.ExtractActionXml(normal, results[i], actions[i].Key);

                //Foreach notification action with the same ID
                foreach (var action in actions[i])
                {
                    action.LazyXml = new Lazy <XDocument>(() => xDoc);
                }
            }

            var list = ResponseParser.GroupActionSchedules(actions.SelectMany(g => g).ToList()).ToList();

            List <Schedule> schedules = new List <Schedule>();

            if (list.Count > 0)
            {
                schedules = await GetSchedulesAsync(Property.Id, list.Select(l => l.Key).ToArray(), token).ConfigureAwait(false);
            }

            foreach (var group in actions)
            {
                foreach (var action in group)
                {
                    if (action.lazyScheduleStr != null)
                    {
                        var id = PrtgObject.GetId(action.lazyScheduleStr);

                        if (id != -1)
                        {
                            action.schedule = new Lazy <Schedule>(() => schedules.First(s => s.Id == id));
                        }
                        else
                        {
                            action.schedule = new Lazy <Schedule>(() => new Schedule(action.lazyScheduleStr));
                        }
                    }
                    else
                    {
                        action.schedule = new Lazy <Schedule>(() => new Schedule(action.lazyScheduleStr));
                    }
                }
            }
        }
Пример #7
0
 private IEnumerable <SensorHistoryData> StreamSensorHistoryInternal(SensorHistoryParameters parameters, bool serial)
 {
     return(ObjectEngine.StreamObjects(
                parameters,
                serial,
                () => GetSensorHistoryTotals(parameters),
                p => GetSensorHistoryInternalAsync(p, CancellationToken.None),
                GetSensorHistoryInternal
                ));
 }
Пример #8
0
        internal int GetSensorHistoryTotals(SensorHistoryParameters parameters)
        {
            parameters.Count = 0;

            var data = ObjectEngine.GetObjectsRaw <SensorHistoryData>(parameters, ResponseParser.ValidateSensorHistoryResponse);

            parameters.GetParameters().Remove(Parameter.Count);

            return(Convert.ToInt32(data.TotalCount));
        }
Пример #9
0
        internal int GetSensorHistoryTotals(SensorHistoryParameters parameters)
        {
            parameters.Count = 0;

            var data = ObjectEngine.GetObjectsRaw <SensorHistoryData>(parameters, responseParser: m => ResponseParser.GetSensorHistoryResponse(m, LogLevel, RequestEngine.IsDirty));

            parameters.GetParameters().Remove(Parameter.Count);

            return(Convert.ToInt32(data.TotalCount));
        }
Пример #10
0
        private List <NotificationTrigger> GetNotificationTriggersInternal(int objectId, CancellationToken token)
        {
            var xmlResponse = ObjectEngine.GetObjectsXml(new NotificationTriggerParameters(objectId), token: token);

            var parsed = ResponseParser.ParseNotificationTriggerResponse(objectId, xmlResponse);

            UpdateTriggerChannels(parsed, token);
            UpdateTriggerActions(parsed, token);

            return(parsed);
        }
Пример #11
0
        internal async Task <List <Schedule> > GetSchedulesInternalAsync(ScheduleParameters parameters)
        {
            var schedules = await ObjectEngine.GetObjectsAsync <Schedule>(parameters).ConfigureAwait(false);

            await Task.WhenAll(schedules.Select(async schedule =>
            {
                var response = await GetObjectPropertiesRawInternalAsync(schedule.Id, ObjectType.Schedule).ConfigureAwait(false);
                ResponseParser.LoadTimeTable(schedule, response);
            })).ConfigureAwait(false);

            return(schedules);
        }
Пример #12
0
        //######################################
        // GetSchedulesInternal
        //######################################

        internal List <Schedule> GetSchedulesInternal(ScheduleParameters parameters)
        {
            var schedules = ObjectEngine.GetObjects <Schedule>(parameters);

            foreach (var schedule in schedules)
            {
                var response = GetObjectPropertiesRawInternal(schedule.Id, ObjectType.Schedule);
                ResponseParser.LoadTimeTable(schedule, response);
            }

            return(schedules);
        }
Пример #13
0
        private string GetObjectPropertyRawInternal(GetObjectPropertyRawParameters parameters, string property)
        {
            var response = ObjectEngine.GetObjectsXml(
                parameters,
                responseParser: m => ResponseParser.ParseGetObjectPropertyResponse(
                    m.Content.ReadAsStringAsync().Result,
                    property
                    )
                );

            return(ResponseParser.ValidateRawObjectProperty(response, parameters));
        }
Пример #14
0
        private async Task <string> GetObjectPropertyRawInternalAsync(GetObjectPropertyRawParameters parameters, string property, CancellationToken token)
        {
            var response = await ObjectEngine.GetObjectsXmlAsync(
                parameters,
                responseParser : async m => ResponseParser.ParseGetObjectPropertyResponse(
                    await m.Content.ReadAsStringAsync().ConfigureAwait(false),
                    property
                    ),
                token : token
                ).ConfigureAwait(false);

            return(ResponseParser.ValidateRawObjectProperty(response, parameters));
        }
Пример #15
0
        private async Task <List <NotificationTrigger> > GetNotificationTriggersInternalAsync(int objectId, CancellationToken token)
        {
            var xmlResponse = await ObjectEngine.GetObjectsXmlAsync(new NotificationTriggerParameters(objectId), token : token).ConfigureAwait(false);

            var parsed = ResponseParser.ParseNotificationTriggerResponse(objectId, xmlResponse);

            var updateTriggerChannels = UpdateTriggerChannelsAsync(parsed, token);
            var updateTriggerActions  = UpdateTriggerActionsAsync(parsed, token);

            await Task.WhenAll(updateTriggerChannels, updateTriggerActions).ConfigureAwait(false);

            return(parsed);
        }
Пример #16
0
        private async Task <string> WaitForSensorTargetResolutionAsync(int deviceId, int tmpId, Func <int, bool> progressCallback)
        {
            var parameters = new SensorTargetProgressParameters(deviceId, tmpId);

            SensorTargetProgress p;
            bool continueQuery = true;

            var stopwatch = new Stopwatch();
            var timeout   = TimeSpan.FromSeconds(60);

            stopwatch.Start();

            do
            {
                p = await ObjectEngine.GetObjectAsync <SensorTargetProgress>(parameters).ConfigureAwait(false);

                if (progressCallback != null)
                {
                    continueQuery = progressCallback(p.Percent);
                }

                if (p.Percent < 100)
                {
                    if (!continueQuery)
                    {
                        break;
                    }

                    if (stopwatch.Elapsed > timeout)
                    {
                        throw new TimeoutException("Failed to retrieve sensor information within a reasonable period of time. Check target device is accessible and that valid credentials have been supplied");
                    }

#if !DEBUG
                    await Task.Delay(1000).ConfigureAwait(false);
#endif
                }
            } while (p.Percent < 100);

            if (!continueQuery)
            {
                return(null);
            }

            ResponseParser.ValidateSensorTargetProgressResult(p);

            var page = await RequestEngine.ExecuteRequestAsync(new SensorTargetCompletedParameters(deviceId, tmpId)).ConfigureAwait(false);

            return(page);
        }
Пример #17
0
        private void UpdateTriggerActions(List <NotificationTrigger> triggers, CancellationToken token)
        {
            //Group all actions from all triggers together based on their object ID
            var actions = ResponseParser.GroupTriggerActions(triggers);

            //Retrieve the XML required to construct "proper" notification actions for all unique actions
            //specified in the triggers
            var actionParameters = new NotificationActionParameters(actions.Select(a => a.Key).ToArray());
            var normalActions    = new Lazy <XDocument>(() => ObjectEngine.GetObjectsXml(actionParameters, token: token), LazyThreadSafetyMode.PublicationOnly);

            foreach (var group in actions)
            {
                //As soon as a notification with a specified ID is accessed on any one of the triggers, retrieve
                //the "supported" properties of ALL of the notification actions, and then retrieve the "unsupported"
                //properties of JUST the notification action object ID that was accessed.
                var lazyAction = new Lazy <XDocument>(
                    () => RequestParser.ExtractActionXml(normalActions.Value, GetNotificationActionProperties(group.Key, token), @group.Key),
                    LazyThreadSafetyMode.PublicationOnly
                    );

                Logger.Log("Setting lazy action to retrieve notification actions");

                foreach (var action in group)
                {
                    action.LazyXml = lazyAction;

                    Logger.Log("Setting lazy action to retrieve notification schedule");

                    action.schedule = new Lazy <Schedule>(
                        () =>
                    {
                        if (action.lazyScheduleStr != null && PrtgObject.GetId(action.lazyScheduleStr) != -1)
                        {
                            Logger.Log($"Resolving schedule {action.lazyScheduleStr} to schedule");

                            return(GetSchedule(new Schedule(action.lazyScheduleStr).Id, token));
                        }

                        return(action.lazyScheduleStr == null ? null : new Schedule(action.lazyScheduleStr));
                    }, LazyThreadSafetyMode.PublicationOnly);
                }
            }
        }
Пример #18
0
 private NotificationTriggerData GetNotificationTriggerData(Either <IPrtgObject, int> objectOrId, CancellationToken token) =>
 ObjectEngine.GetObject <NotificationTriggerData>(
     new NotificationTriggerDataParameters(objectOrId),
     ParseNotificationTriggerTypes,
     token
     );
Пример #19
0
        internal async Task <List <SensorHistoryData> > GetSensorHistoryInternalAsync(SensorHistoryParameters parameters, CancellationToken token)
        {
            var items = await ObjectEngine.GetObjectsAsync <SensorHistoryData>(parameters, responseParser : m => ResponseParser.GetSensorHistoryResponseAsync(m, LogLevel, RequestEngine.IsDirty), token : token).ConfigureAwait(false);

            return(ResponseParser.ParseSensorHistoryResponse(items, parameters.SensorId));
        }
Пример #20
0
        internal async Task <List <SensorHistoryData> > GetSensorHistoryInternalAsync(SensorHistoryParameters parameters, CancellationToken token)
        {
            var items = await ObjectEngine.GetObjectsAsync <SensorHistoryData>(parameters, ResponseParser.ValidateSensorHistoryResponse, token : token).ConfigureAwait(false);

            return(ResponseParser.ParseSensorHistoryResponse(items, parameters.SensorId));
        }
Пример #21
0
 private async Task <NotificationTriggerData> GetNotificationTriggerDataAsync(int objectId, CancellationToken token) =>
 await ObjectEngine.GetObjectAsync <NotificationTriggerData>(
     new NotificationTriggerDataParameters(objectId),
     ParseNotificationTriggerTypesAsync,
     token
     ).ConfigureAwait(false);
Пример #22
0
 private NotificationTriggerData GetNotificationTriggerData(int objectId, CancellationToken token) =>
 ObjectEngine.GetObject <NotificationTriggerData>(
     new NotificationTriggerDataParameters(objectId),
     ParseNotificationTriggerTypes,
     token
     );
Пример #23
0
        //todo: check all arguments we can in this file and make sure we validate input. when theres a chain of methods, validate on the inner most one except if we pass a parameter object, in which case validate both

        /// <summary>
        /// Resolves an address to its latitudinal and longitudinal coordinates. May spuriously return no results.
        /// </summary>
        /// <param name="address">The address to resolve.</param>
        /// <returns></returns>
        internal List <Location> ResolveAddress(string address) =>
        ObjectEngine.GetObject <GeoResult>(new ResolveAddressParameters(address), ResponseParser.ResolveParser).Results.ToList();
Пример #24
0
        /* void InitEngines()
         * Init other engines.
         */
        private void InitEngines()
        {
            try
            {

                this._objEngine = new ObjectEngine();
                this._subEngine = new SubEngine();
                this._actEngine = new ActionEngine();
                this._vpEngine = new VPEngine();
                this._logEngine = new LogEngine();
                this._exEngine = new ExceptionEngine();

                this._isHighlight = this._autoConfig.IsHighlight;

            }
            catch (TestException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new TestFrameworkException("Fatal Error: Can not load engines: " + ex.ToString());
            }
        }
Пример #25
0
 /// <summary>
 /// Asynchronously resolves an address to its latitudinal and longitudinal coordinates. May spuriously return no results.
 /// </summary>
 /// <param name="address">The address to resolve.</param>
 /// <param name="token">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
 /// <returns></returns>
 internal async Task <List <Location> > ResolveAddressAsync(string address, CancellationToken token) =>
 (await ObjectEngine.GetObjectAsync <GeoResult>(new ResolveAddressParameters(address), m => Task.FromResult(ResponseParser.ResolveParser(m)), token).ConfigureAwait(false)).Results.ToList();