From 4b1f79e4d329b0094f8ea689c56065b7fe06dcbb Mon Sep 17 00:00:00 2001 From: frank Date: Sun, 8 Jun 2025 10:55:20 +0200 Subject: [PATCH] initial --- Dockerfile | 58 + lombok.config | 2 + pom.xml | 370 + .../control/AccessConfigController.java | 44 + .../control/AccessConfigConverter.java | 114 + .../control/AccessConfigProvider.java | 275 + .../control/AccessDbConfigParser.java | 104 + .../domain/AccessCodeEntry.java | 28 + .../configworkitem/domain/AccessConfig.java | 23 + .../domain/AccessConfigWorkItemResult.java | 19 + .../AccessConfigWorkItemStatusWrapper.java | 11 + .../domain/AccessPinConfig.java | 4 + .../configworkitem/domain/AccessUserRole.java | 15 + .../configworkitem/dto/AccessCardCodeDTO.java | 17 + .../configworkitem/dto/AccessConfigDTO.java | 15 + .../dto/AccessConfigWorkItemDTO.java | 17 + .../dto/AccessConfigWorkItemStatus.java | 5 + .../dto/AccessConfigWorkItemUpdateDTO.java | 14 + .../configworkitem/dto/AccessDbDTO.java | 15 + .../configworkitem/dto/CardCodeType.java | 5 + .../access/configworkitem/dto/HandleDTO.java | 13 + .../configworkitem/dto/HandleDbDTO.java | 17 + .../access/configworkitem/dto/KeypadDTO.java | 13 + .../configworkitem/dto/KeypadDbDTO.java | 14 + .../configworkitem/dto/OptionDbDTO.java | 14 + .../access/configworkitem/dto/OptionsDTO.java | 13 + .../handler/AccessConfigJobHandler.java | 95 + .../access/configworkitem/utils/Bcd.java | 44 + .../domain/ConnectionWorkItemResult.java | 19 + .../dto/ConnectionWorkItemDTO.java | 21 + .../dto/ConnectionWorkItemStatus.java | 9 + .../dto/ConnectionWorkItemUpdateDTO.java | 10 + .../dto/ConnectionWorkItemValueDTO.java | 16 + .../handler/CheckConnectionJobHandler.java | 95 + .../logworkitem/control/AccessLogParser.java | 225 + .../domain/AccessLogWorkItemResult.java | 19 + .../AccessLogWorkItemStatusWrapper.java | 11 + .../access/logworkitem/dto/AccessLogDTO.java | 15 + .../logworkitem/dto/AccessLogItemDTO.java | 19 + .../logworkitem/dto/LogWorkItemDTO.java | 18 + .../logworkitem/dto/LogWorkItemStatus.java | 10 + .../logworkitem/dto/LogWorkItemUpdateDTO.java | 12 + .../handler/AccessLogJobHandler.java | 120 + .../connector/access/utils/ParserHelper.java | 38 + .../raw/connector/base/entity/BaseEntity.java | 41 + .../base/entity/SimpleBaseEntity.java | 19 + .../SimpleBaseEntityWithPredefinedId.java | 17 + .../base/entity/SubscribableEntity.java | 25 + .../control/CommunicationService.java | 205 + .../CommunicationServiceController.java | 356 + ...mmunicationServiceRequestErrorHandler.java | 24 + .../CommunicationServiceException.java | 24 + ...icationServiceResponseExceptionMapper.java | 50 + .../exception/FailureType.java | 10 + .../exception/ModelType.java | 8 + .../control/ComponentModeController.java | 70 + .../control/ComponentModeHandler.java | 39 + .../dto/ChangeModeRequestDTO.java | 14 + .../componentmode/dto/ComponentMode.java | 14 + .../connector/config/control/AppConfig.java | 15 + .../control/ConnectorConfigController.java | 49 + .../config/control/PropertyFileHandler.java | 26 + .../VariableBulkValueSendingConfig.java | 11 + .../config/entity/ConnectorConfig.java | 18 + .../connector/config/entity/SnmpConfig.java | 50 + .../entity/SnmpConnectionTypesConfig.java | 18 + .../control/ConnectorController.java | 95 + .../connector/control/ConnectorUtils.java | 22 + .../connector/dto/ConnectorRequestDTO.java | 27 + .../connector/dto/ConnectorResponseDTO.java | 19 + .../connector/connector/dto/DataTypeEnum.java | 7 + .../connector/dto/RepresentationEnum.java | 10 + .../device/control/DeviceController.java | 598 + .../device/control/DeviceRepository.java | 136 + .../control/DeviceStructureService.java | 153 + .../device/control/ExternalDeviceBuilder.java | 112 + .../device/control/RittalDeviceBuilder.java | 354 + .../device/domain/DeviceMapping.java | 40 + .../device/domain/DeviceOidValueMap.java | 103 + .../raw/connector/device/dto/DeviceDTO.java | 59 + .../device/dto/DevicePropertyResponseDTO.java | 15 + .../device/dto/DeviceResponseDTO.java | 20 + .../device/dto/VariableResponseDTO.java | 17 + .../device/entity/AccessTypeEnum.java | 31 + .../connector/device/entity/DataTypeEnum.java | 31 + .../raw/connector/device/entity/Device.java | 52 + .../device/enums/AccessDeviceTypeEnum.java | 8 + .../device/enums/ExternalDeviceConstants.java | 15 + .../enums/ExternalDevicePropertyEnum.java | 21 + .../device/enums/FunctionTypeEnum.java | 12 + .../device/enums/PropertyClassType.java | 5 + .../device/enums/RittalDeviceConstants.java | 98 + .../enums/RittalDevicePropertyNameEnum.java | 47 + .../device/enums/VariableFieldName.java | 36 + .../projection/DeviceParentIdProjection.java | 16 + .../projection/DeviceURLProjection.java | 13 + .../control/DevicePropertyCachedService.java | 55 + .../control/DevicePropertyController.java | 152 + .../control/DevicePropertyExtractor.java | 8 + .../control/DevicePropertyHandler.java | 66 + .../control/DevicePropertyMapper.java | 30 + .../control/DevicePropertyRepository.java | 41 + .../control/DevicePropertyTaskScheduler.java | 45 + .../control/DevicePropertyValueProvider.java | 69 + .../control/DeviceTypeProvider.java | 56 + .../domain/DevicePropertyScheduledTask.java | 47 + .../DevicePropertySnmpMessageTaskData.java | 12 + .../deviceproperty/dto/DevicePropertyDTO.java | 51 + .../dto/PropertyValueRequestDTO.java | 18 + .../deviceproperty/entity/DevBusEnum.java | 38 + .../deviceproperty/entity/DevStatusEnum.java | 56 + .../deviceproperty/entity/DevTypeEnum.java | 165 + .../deviceproperty/entity/DeviceProperty.java | 74 + .../entity/DevicePropertyMapping.java | 35 + .../DevicePropertyNotFoundException.java | 10 + .../DevicePropertyNameProjection.java | 12 + .../DeviceDiscoveryProtocolService.java | 55 + .../control/DeviceDriverService.java | 54 + .../control/DiscoveryController.java | 276 + .../discovery/control/DiscoveryMapper.java | 63 + .../control/DiscoveryWorkItemRepository.java | 23 + .../control/SnmpDiscoveryAsyncRunner.java | 137 + .../control/SnmpDiscoveryThreadPool.java | 53 + .../domain/DeviceDiscoveryProtocolData.java | 6 + .../domain/DiscoveryWorkItemResult.java | 19 + .../DiscoveryWorkItemStatusWrapper.java | 11 + .../discovery/dto/DiscoveryValueDTO.java | 20 + .../discovery/dto/DiscoveryWorkItemDTO.java | 28 + .../dto/DiscoveryWorkItemStatus.java | 9 + .../dto/DiscoveryWorkItemUpdateDTO.java | 14 + .../discovery/entity/DiscoveryValue.java | 42 + .../discovery/entity/DiscoveryWorkItem.java | 39 + .../discovery/entity/SnmpDiscoveryData.java | 16 + .../handler/DiscoveryJobHandler.java | 108 + .../control/DeviceDriverController.java | 439 + .../control/DeviceDriverServiceClient.java | 28 + .../control/DriverHeaderRepository.java | 21 + .../control/DriverVariableRepository.java | 18 + .../ValueMappingContainerRepository.java | 19 + .../control/ValueMappingRepository.java | 11 + .../driver/control/ValueMappingService.java | 39 + .../driver/domain/DeviceDriverDTO.java | 22 + .../driver/domain/DriverHeaderDTO.java | 49 + .../driver/domain/DriverVariableDTO.java | 49 + .../driver/domain/DriverWorkItemResult.java | 19 + .../domain/ValueMappingContainerDTO.java | 25 + .../driver/domain/ValueMappingDTO.java | 21 + .../driver/dto/DriverWorkItemDTO.java | 14 + .../driver/dto/DriverWorkItemStatus.java | 8 + .../driver/dto/DriverWorkItemUpdateDTO.java | 10 + .../connector/driver/entity/DriverHeader.java | 61 + .../driver/entity/DriverVariable.java | 91 + .../connector/driver/entity/ValueMapping.java | 38 + .../driver/entity/ValueMappingContainer.java | 62 + .../AbstractDriverWorkItemJobHandler.java | 92 + .../CreateDriverWorkItemJobHandler.java | 20 + .../DeleteDriverWorkItemJobHandler.java | 20 + .../SynchronizeDriverWorkItemJobHandler.java | 29 + .../UpdateDriverWorkItemJobHandler.java | 20 + .../connector/driver/mapper/DataMapper.java | 51 + .../driver/mapper/DataMapperDefinitions.java | 23 + .../projection/DriverHeaderIdProjection.java | 10 + .../ValueMappingContainerIdProjection.java | 10 + .../entity/CacheUpdateException.java | 8 + .../entity/DriverNotFoundException.java | 8 + .../entity/KeyNotFoundException.java | 9 + .../exception/entity/SftpException.java | 9 + .../entity/SnmpInitializationException.java | 8 + .../control/FirmwareDownloadController.java | 141 + .../control/FirmwareFileConfigProvider.java | 33 + .../control/FirmwareFileUploader.java | 68 + .../control/FirmwareStorageController.java | 67 + .../FirmwareUpdateStatusController.java | 53 + .../FirmwareUpdateVerificationController.java | 116 + .../control/FirmwareUploadController.java | 50 + .../control/StatusFileContentProvider.java | 80 + .../firmware/control/TempFileProvider.java | 13 + .../domain/FirmwareDownloadException.java | 11 + .../domain/FirmwareFileNotFoundException.java | 8 + .../firmware/domain/FirmwareUpdateStatus.java | 7 + .../domain/FirmwareUpdateStatusResult.java | 15 + .../FirmwareUpdateVerificationException.java | 11 + ...areUpdateVerificationTimeoutException.java | 7 + .../domain/FirmwareUploadException.java | 7 + .../domain/FirmwareWorkItemResult.java | 19 + .../domain/FirmwareWorkItemStatusWrapper.java | 11 + .../domain/TooManyFirmwareFilesException.java | 8 + .../firmware/dto/FirmwareFileMetadataDTO.java | 14 + .../firmware/dto/FirmwareWorkItemDTO.java | 17 + .../firmware/dto/FirmwareWorkItemStatus.java | 19 + .../dto/FirmwareWorkItemUpdateRequestDTO.java | 11 + .../handler/AbstractFirmwareJobHandler.java | 48 + .../handler/FirmwareDownloadJobHandler.java | 73 + .../FirmwareUpdateVerificationJobHandler.java | 79 + .../handler/FirmwareUploadJobHandler.java | 72 + .../ConnectorFlywayMaintenanceCallback.java | 14 + .../flyway/FlywayCheckSumReplacement.java | 4 + .../flyway/FlywayMaintenanceCallback.java | 159 + .../connector/ftp/boundary/FtpResource.java | 27 + .../connector/ftp/control/FtpController.java | 261 + .../ftp/control/SSHClientProvider.java | 23 + .../ftp/control/SftpDataProvider.java | 51 + .../ftp/control/SftpDirectoryCleaner.java | 33 + .../connector/ftp/control/SftpDownloader.java | 35 + .../connector/ftp/control/SftpUploader.java | 54 + .../raw/connector/ftp/domain/FileItem.java | 4 + .../raw/connector/ftp/domain/SftpData.java | 11 + .../boundary/CommSvcServiceHealthCheck.java | 23 + .../health/boundary/DeviceSvcHealthCheck.java | 23 + .../connector/job/control/JobController.java | 63 + .../job/control/JobExecutorProvider.java | 40 + .../raw/connector/job/control/JobMapper.java | 15 + .../connector/job/control/JobsExecutor.java | 78 + .../connector/job/domain/FinishJobAction.java | 6 + .../connector/job/domain/JobHandlerGroup.java | 16 + .../raw/connector/job/domain/JobResult.java | 5 + .../raw/connector/job/domain/JobWrapper.java | 51 + .../domain/ProcessingCanceledException.java | 4 + .../domain/ProcessingCancellationChecker.java | 6 + .../raw/connector/job/domain/WorkItem.java | 4 + .../connector/job/domain/WorkItemResult.java | 10 + .../connector/job/domain/WorkItemWrapper.java | 6 + .../gec/raw/connector/job/dto/JobAction.java | 16 + .../io/gec/raw/connector/job/dto/JobDTO.java | 20 + .../raw/connector/job/dto/JobStateDTO.java | 14 + .../gec/raw/connector/job/dto/JobStatus.java | 11 + .../io/gec/raw/connector/job/dto/JobType.java | 13 + .../raw/connector/job/handler/JobHandler.java | 104 + .../job/handler/WorkItemHandler.java | 67 + .../mappers/control/EntityMapper.java | 41 + .../domain/PauseWorkItemResult.java | 19 + .../pauseworkitem/dto/PauseWorkItemDTO.java | 17 + .../dto/PauseWorkItemStatus.java | 8 + .../dto/PauseWorkItemUpdateDTO.java | 10 + .../handler/PauseWorkItemJobHandler.java | 103 + .../protocol/control/PropertyRepository.java | 26 + .../control/PropertyValueRepository.java | 17 + .../protocol/control/ProtocolMapper.java | 320 + .../protocol/control/ProtocolRepository.java | 26 + .../protocol/control/ProtocolService.java | 171 + .../domain/AuthenticationProtocolEnum.java | 33 + .../domain/CommunicationPropertyNameEnum.java | 25 + .../domain/CommunicationProtocolEnum.java | 33 + .../protocol/domain/DescribableEnum.java | 10 + .../domain/DiscoveryPropertyNameEnum.java | 35 + .../protocol/domain/PrivacyAlgorithmEnum.java | 32 + .../protocol/domain/SecurityLevelEnum.java | 30 + .../protocol/domain/SnmpVersionEnum.java | 34 + .../connector/protocol/dto/PropertyDTO.java | 36 + .../protocol/dto/PropertyValueDTO.java | 19 + .../connector/protocol/dto/ProtocolDTO.java | 25 + .../connector/protocol/entity/Property.java | 131 + .../protocol/entity/PropertyValue.java | 94 + .../connector/protocol/entity/Protocol.java | 136 + .../control/RegistrationService.java | 43 + .../control/RegistrationState.java | 23 + .../rittal/domain/RittalMibVariable.java | 38 + .../connector/rittal/enums/IRittalEnum.java | 8 + .../rittal/enums/PduSequenceMode.java | 19 + .../UPSControllerStateBatteryStatus.java | 20 + .../enums/UPSControllerStateOutputSource.java | 21 + .../enums/UPSControllerStateTestResult.java | 22 + .../rittal/enums/ValuesRfidTagCom.java | 20 + .../enums/ValuesSnmpChillerModeState.java | 18 + .../rittal/enums/ValuesSnmpCommand.java | 29 + .../rittal/enums/ValuesSnmpConfig.java | 21 + .../rittal/enums/ValuesSnmpCtrlCommand.java | 21 + .../ValuesSnmpDcmMagnetMotorConnected.java | 18 + .../rittal/enums/ValuesSnmpDevStatus.java | 23 + .../rittal/enums/ValuesSnmpDeviceStatus.java | 21 + .../rittal/enums/ValuesSnmpFuseType.java | 23 + .../rittal/enums/ValuesSnmpGsmStatus.java | 32 + .../rittal/enums/ValuesSnmpLogic.java | 20 + .../enums/ValuesSnmpMathControllerResult.java | 18 + .../rittal/enums/ValuesSnmpMibCondition.java | 20 + .../rittal/enums/ValuesSnmpMibECondition.java | 20 + .../enums/ValuesSnmpMountingPosition.java | 23 + .../rittal/enums/ValuesSnmpNumberOfPoles.java | 20 + .../rittal/enums/ValuesSnmpOutput.java | 21 + .../enums/ValuesSnmpOverallDevStatus.java | 23 + .../enums/ValuesSnmpOverallMsgStatus.java | 19 + .../rittal/enums/ValuesSnmpQuit.java | 19 + .../rittal/enums/ValuesSnmpQuitUnit.java | 18 + .../rittal/enums/ValuesSnmpRackComand.java | 21 + .../rittal/enums/ValuesSnmpRcmCommand.java | 19 + .../rittal/enums/ValuesSnmpRcmPosition.java | 35 + .../enums/ValuesSnmpResetAktivState.java | 18 + .../rittal/enums/ValuesSnmpSocketType.java | 29 + .../enums/ValuesSnmpTemperatureUnit.java | 17 + .../rittal/enums/ValuesSnmpTrapEnable.java | 18 + .../enums/ValuesSnmpTrapReceiverStatus.java | 21 + .../enums/ValuesSnmpUksAktivAlarmState.java | 18 + .../rittal/enums/ValuesSnmpUksAktivState.java | 18 + .../enums/ValuesSnmpUksDisabledState.java | 18 + .../enums/ValuesSnmpUksEmergencyState.java | 18 + .../enums/ValuesSnmpUksEnabledState.java | 18 + .../enums/ValuesSnmpUksFailureState.java | 18 + .../enums/ValuesSnmpUksInaktivState.java | 18 + .../enums/ValuesSnmpUksMaintenanceState.java | 18 + .../rittal/enums/ValuesSnmpUksOnOfState.java | 18 + .../enums/ValuesSnmpUksResetAktivState.java | 18 + .../enums/ValuesSnmpUksStandbyState.java | 18 + .../rittal/enums/ValuesSnmpUksState.java | 18 + .../rittal/enums/ValuesSnmpUnitStatus.java | 24 + .../enums/ValuesSnmpUnitStatusError.java | 24 + .../enums/ValuesSnmpUnitStatusMPSM.java | 24 + .../rittal/enums/ValuesSnmpValuesStatus.java | 20 + .../rittal/enums/ValuesSnmpVarCommandBep.java | 18 + .../enums/ValuesSnmpVarCommandControl.java | 18 + .../enums/ValuesSnmpVarCommandSignal.java | 30 + .../enums/ValuesSnmpVarCtrlCommandDp.java | 18 + .../enums/ValuesSnmpVarCtrlCommandWdt.java | 17 + .../rittal/enums/ValuesSnmpVarFanAffect.java | 21 + .../rittal/enums/ValuesSnmpVarLedMode.java | 23 + .../rittal/enums/ValuesSnmpVarOpModeBep.java | 19 + .../rittal/enums/ValuesSnmpVarStatus.java | 60 + .../enums/ValuesSnmpVarStatusRfidTag.java | 24 + .../rittal/enums/ValuesSnmpVarWtrAffect.java | 22 + .../connector/rittal/enums/VarAlarmOk.java | 18 + .../enums/VarAvailableNotAvailable.java | 18 + .../rittal/enums/VarBackDoorStatus.java | 18 + .../connector/rittal/enums/VarCompressor.java | 18 + .../rittal/enums/VarCompressorStatus.java | 18 + .../connector/rittal/enums/VarFanStatus.java | 18 + .../connector/rittal/enums/VarFansGroup.java | 18 + .../rittal/enums/VarFlowSwitchStatus.java | 18 + .../enums/VarHighPresureCirciutStatus.java | 18 + .../rittal/enums/VarMsgStatusAccessUnit.java | 39 + .../enums/VarMsgStatusAccessUnitDoorLock.java | 28 + .../VarMsgStatusAccessUnitLastAccess.java | 30 + .../rittal/enums/VarMsgStatusAnalogWL.java | 33 + .../raw/connector/rittal/enums/VarOnOff.java | 18 + .../enums/VarOutputStatusPSMOutputOnOff.java | 18 + .../VarOutputValueDigitalValueOnOff.java | 18 + .../rittal/enums/VarPhaseRotationStatus.java | 18 + .../enums/VarStatusActuatorDoorOpening.java | 20 + .../VarStatusActuatorOutputDigitalOnOff.java | 20 + .../rittal/enums/VarStatusActuatorType.java | 18 + .../VarStatusActuatorVoltageOutputSet.java | 18 + .../VarStatusActuatorVoltageTimeout.java | 19 + .../enums/VarStatusAnalogController.java | 24 + .../rittal/enums/VarStatusAnalogSensors.java | 19 + .../enums/VarStatusAnalogSensorsWOtoLow.java | 22 + .../VarStatusAnalogSensorsWOwarning.java | 22 + .../rittal/enums/VarStatusAnalogValue.java | 21 + .../enums/VarStatusCUOutputDigitalOnOff.java | 21 + .../connector/rittal/enums/VarStatusDRC.java | 26 + .../rittal/enums/VarStatusDigitalSensors.java | 24 + .../enums/VarStatusDigitalSensorsAlarm.java | 20 + .../enums/VarStatusDigitalSensorsDoor.java | 21 + .../rittal/enums/VarStatusFASType.java | 22 + ...VarStatusLCPDXCompressorDeltaPressure.java | 18 + ...StatusLCPDXCompressorDischargeMaxTemp.java | 18 + ...tatusLCPDXCompressorLubricationStatus.java | 18 + .../VarStatusLCPDXCompressorOperating.java | 18 + .../VarStatusLCPDXCompressorOverload.java | 18 + .../VarStatusLCPDXCompressorStartUpRetry.java | 18 + ...VarStatusLCPDXCompressorStartUpStatus.java | 18 + .../VarStatusLCPDXHighPressureSwitch.java | 18 + ...robeCompressorDischargePressureBroken.java | 18 + ...PDXProbeCompressorDischargeTempBroken.java | 18 + ...XProbeCompressorSuctionPressureBroken.java | 18 + ...LCPDXProbeCompressorSuctionTempBroken.java | 18 + .../VarStatusLCPDXProbeTempInBotBroken.java | 18 + .../VarStatusLCPDXProbeTempInMidBroken.java | 18 + .../VarStatusLCPDXProbeTempInTopBroken.java | 18 + .../VarStatusLCPDXProbeTempOutBotBroken.java | 18 + .../VarStatusLCPDXProbeTempOutMidBroken.java | 18 + .../VarStatusLCPDXProbeTempOutTopBroken.java | 18 + .../enums/VarStatusLCPDXRemoteControl.java | 18 + .../enums/VarStatusLCPDXSetpointLCP.java | 16 + .../rittal/enums/VarStatusLCPDXStandby.java | 18 + .../enums/VarStatusLCPDXStatusCompressor.java | 18 + .../rittal/enums/VarStatusOKALARM.java | 18 + .../rittal/enums/VarStatusOKWarning.java | 18 + .../rittal/enums/VarStatusSensorType.java | 43 + .../enums/VarStatusVandalismSensors.java | 22 + .../VarStatusunitxOutputTypeDoorOpening.java | 18 + ...VarStatusunitxOutputTypeOutputDigital.java | 18 + .../enums/VarUnitxSensorStatusOkAlarm.java | 18 + .../enums/VarUnitxSensorStatusOkWarning.java | 18 + .../enums/VarValueDigitalOutputSetDoor.java | 19 + .../enums/VarValueDigitalSensorsAlarm.java | 18 + .../enums/VarValueDigitalSensorsDoor.java | 18 + .../rittal/enums/VarValueDigitalSwitch.java | 18 + .../rittal/enums/VarValuePosition.java | 18 + .../VarWaterStaticPresureStatusAlarm.java | 18 + .../VarWaterStaticPresureStatusWarning.java | 18 + .../enums/VarcmcTcUnitxMsgStatusWLAlarm.java | 22 + .../rittal/helper/RittalEnumHelper.java | 42 + .../control/MaintenanceGroupController.java | 76 + .../control/MaintenanceGroupMapper.java | 306 + .../dto/MaintenanceGroupEnum.java | 5 + .../controller/SnmpSetController.java | 107 + .../setworkitem/domain/SetWorkItemData.java | 19 + .../setworkitem/domain/SetWorkItemResult.java | 20 + .../connector/setworkitem/dto/ActionEnum.java | 5 + .../setworkitem/dto/SetStatusEnum.java | 5 + .../setworkitem/dto/SetWorkItemDTO.java | 22 + .../setworkitem/dto/SetWorkItemUpdateDTO.java | 11 + .../handler/AbstractSetJobHandler.java | 67 + .../handler/SetPropertyJobHandler.java | 68 + .../handler/SetVariableJobHandler.java | 92 + .../control/DiscoveryDataToSnmpMapper.java | 151 + ...iscoveryWorkItemToDiscoveryDataMapper.java | 169 + .../common/control/PDUResponseMapper.java | 74 + .../snmp/common/control/SnmpHelper.java | 64 + .../common/control/SnmpMessageSender.java | 170 + .../snmp/common/control/SnmpProvider.java | 114 + .../snmp/common/control/SnmpService.java | 144 + .../snmp/common/control/SnmpTimeouts.java | 37 + .../snmp/common/control/SnmpWalk.java | 213 + .../common/domain/SnmpConnectionType.java | 16 + .../snmp/common/domain/SnmpGetJob.java | 14 + .../snmp/common/domain/SnmpGetJobData.java | 16 + .../snmp/common/domain/SnmpMessageData.java | 24 + .../snmp/common/domain/SnmpProtocolData.java | 27 + .../snmp/common/domain/SnmpRequestData.java | 23 + .../snmp/common/domain/SnmpTimeoutData.java | 13 + .../snmp/common/domain/SnmpV3Data.java | 30 + .../traps/control/PropertyTrapProcessor.java | 32 + .../traps/control/TrapContentHandler.java | 108 + .../snmp/traps/control/TrapContentMapper.java | 92 + .../snmp/traps/control/TrapReceiver.java | 117 + .../traps/control/VariableBindingParser.java | 38 + .../control/VariableStatusValueCache.java | 32 + .../traps/control/VariableTrapProcessor.java | 99 + .../traps/domain/PropertyTrapContent.java | 27 + .../connector/snmp/traps/domain/TrapType.java | 31 + .../traps/domain/VariableTrapContent.java | 30 + .../snmp/traps/domain/VariableTrapData.java | 14 + .../control/VariableDynamicTableService.java | 361 + .../VariableDynamicTableRequestHolder.java | 25 + .../vardyntable/domain/VariableTypeEnum.java | 7 + .../control/StatisticCategoryMapper.java | 17 + .../control/StatisticCollectorController.java | 94 + .../statistic/domain/StatisticCategory.java | 27 + .../statistic/domain/StatisticInterval.java | 46 + .../control/DeviceStatusController.java | 56 + .../status/control/StatusController.java | 21 + .../control/AbstractTaskScheduler.java | 47 + .../control/ScheduledTaskService.java | 157 + .../control/SubscriptionController.java | 76 + .../domain/ScheduledActiveTask.java | 8 + .../subscription/domain/ScheduledTask.java | 34 + .../subscription/domain/TaskAction.java | 6 + .../subscription/domain/TaskData.java | 12 + .../subscription/domain/TaskDataFactory.java | 10 + .../utils/control/ChecksumController.java | 60 + .../utils/control/IPAddressHelper.java | 98 + .../connector/utils/control/Measurement.java | 80 + .../control/RittalVariableConfigList.java | 100 + .../connector/utils/control/ValueHelper.java | 14 + .../utils/control/ValueScalingHelper.java | 77 + .../utils/domain/MeasurementItem.java | 16 + .../control/VariableConstraintParser.java | 78 + .../variable/control/VariableController.java | 190 + .../variable/control/VariableHandler.java | 98 + .../variable/control/VariableMapper.java | 115 + .../variable/control/VariableRepository.java | 56 + .../control/VariableValueBulkSender.java | 148 + .../control/VariableValueCacheHandler.java | 81 + .../control/VariableValueProvider.java | 132 + .../control/VariableValueTaskScheduler.java | 45 + .../domain/VariableSnmpMessageTaskData.java | 12 + .../variable/domain/VariableValueData.java | 6 + .../domain/VariableValueScheduledTask.java | 47 + .../connector/variable/dto/QualityType.java | 18 + .../dto/UpdateVariableRequestDTO.java | 21 + .../connector/variable/dto/VarQuality.java | 31 + .../connector/variable/dto/VariableDTO.java | 43 + .../dto/VariableEnumConstraintDTO.java | 11 + .../variable/entity/VarTypeEnum.java | 132 + .../connector/variable/entity/Variable.java | 117 + .../VariableDriverVariableIdProjection.java | 14 + .../projection/VariableNameProjection.java | 12 + .../resources/META-INF/resources/index.html | 286 + src/main/resources/application-dev.yml | 21 + .../resources/application-local.yml.template | 7 + src/main/resources/application-prod.yml | 9 + src/main/resources/application-test.yml | 17 + src/main/resources/application.yml | 127 + .../resources/db/migration/V0_000__Init.sql | 173 + .../migration/V0_001__addValueStatusMap.sql | 18 + .../V0_002__addDeprecatedColumnToProtocol.sql | 1 + ..._addSnmpSetVarDataTypeColumnToVariable.sql | 4 + .../V0_004__addFunctionTypeEnumToVariable.sql | 1 + .../V0_005__addDriverHeaderIdToDevice.sql | 2 + .../V0_006__addDriverVariableIdToVariable.sql | 2 + .../V0_007__addBaseOidToDriverVariable.sql | 1 + .../V0_008__addUsageColumnToProtocolTable.sql | 2 + ...0_009__addDeviceIndexColumnToDeviceTbl.sql | 2 + ...eateVariableValueMappingContainerTable.sql | 45 + .../db/migration/V0_011__discoveryCleanup.sql | 19 + .../migration/V0_012__pauseWorkItem_mode.sql | 31 + .../V0_013__variable_initialValueFetched.sql | 3 + .../V0_014__addConstraintsToVariable.sql | 3 + ...ditionAndFlagFromVariableAndProperties.sql | 17 + ...16__removevalueAsStringOidFromProperty.sql | 2 + ...17__deviceProperty_initialValueFetched.sql | 3 + .../V0_018__renameDatabaseSchema.sql | 22 + .../migration/V1.0.0_0001__init_structure.sql | 231 + ..._align_schema_after_validation_enabled.sql | 35 + ...e_constraints_for_firmware_update_mode.sql | 32 + ...gn_schema_after_panache_entity_removal.sql | 39 + ...iou_mode_to_variable_device_properties.sql | 27 + ....0.0_0006__fix_restore_mode_constraint.sql | 23 + ...__migrate_variable_description_to_text.sql | 5 + ...e_constraints_for_firmware_update_mode.sql | 32 + .../migration/V1.0.0_0009__addOfflineMode.sql | 35 + .../resources/db/migration/beforeMigrate.sql | 10 + src/main/resources/version.properties | 1 + .../control/AccessConfigControllerTest.java | 133 + .../control/AccessConfigProviderTest.java | 607 + .../control/AccessDbConfigParserTest.java | 99 + .../handler/AccessConfigJobHandlerTest.java | 216 + .../CheckConnectionJobHandlerTest.java | 252 + .../control/AccessLogParserTest.java | 227 + .../handler/AccessLogJobHandlerTest.java | 297 + .../CommunicationServiceControllerTest.java | 124 + ...icationServiceRequestErrorHandlerTest.java | 44 + ...ionServiceResponseExceptionMapperTest.java | 104 + .../control/ComponentModeControllerTest.java | 363 + .../control/ComponentModeHandlerTest.java | 76 + .../ConnectorConfigControllerTest.java | 87 + .../control/PropertyFileHandlerTest.java | 23 + .../control/ConnectorControllerTest.java | 256 + .../device/control/DeviceControllerTest.java | 482 + .../control/DeviceStructureServiceTest.java | 128 + .../control/ExternalDeviceBuilderTest.java | 149 + .../control/RittalDeviceBuilderTest.java | 1618 +++ .../control/ValueScalingHelperTest.java | 249 + .../DevicePropertyCachedServiceTest.java | 96 + .../control/DevicePropertyControllerTest.java | 136 + .../control/DevicePropertyHandlerTest.java | 81 + .../DevicePropertyTaskSchedulerIT.java | 116 + .../DevicePropertyTaskSchedulerTest.java | 161 + .../control/DeviceTypeProviderTest.java | 110 + .../entity/DevTypeEnumTest.java | 10 + .../control/CheckDriverHeaderTest.java | 189 + .../DeviceDiscoveryProtocolServiceTest.java | 114 + .../control/DiscoveryControllerTest.java | 114 + .../control/SnmpDiscoveryAsyncRunnerTest.java | 150 + .../control/SnmpDiscoveryThreadPoolTest.java | 49 + .../handler/DiscoveryJobHandlerTest.java | 221 + .../control/DeviceDriverControllerIT.java | 1102 ++ .../control/DeviceDriverControllerTest.java | 185 + .../CreateDriverWorkItemJobHandlerTest.java | 196 + .../FirmwareDownloadControllerTest.java | 217 + .../FirmwareFileConfigProviderTest.java | 60 + .../control/FirmwareFileUploaderTest.java | 165 + .../FirmwareStorageControllerTest.java | 98 + .../FirmwareUpdateStatusControllerTest.java | 109 + .../control/FirmwareUploadControllerTest.java | 118 + .../StatusFileContentProviderTest.java | 278 + .../control/TempFileProviderTest.java | 59 + .../FirmwareDownloadJobHandlerTest.java | 255 + ...mwareUpdateVerificationJobHandlerTest.java | 278 + .../handler/FirmwareUploadJobHandlerTest.java | 247 + .../ftp/control/FtpControllerTest.java | 154 + .../ftp/control/SftpDataProviderTest.java | 67 + .../ftp/control/SftpDirectoryCleanerTest.java | 138 + .../job/control/JobControllerTest.java | 156 + .../job/control/JobExecutorProviderTest.java | 85 + .../connector/job/control/JobMapperTest.java | 37 + .../job/control/JobsExecutorTest.java | 131 + .../handler/PauseWorkItemJobHandlerTest.java | 324 + .../protocol/control/ProtocolMapperTest.java | 85 + .../protocol/control/ProtocolServiceTest.java | 143 + .../protocol/entity/PropertyTest.java | 212 + .../protocol/entity/PropertyValueTest.java | 105 + .../protocol/entity/ProtocolTest.java | 215 + .../rittal/helper/RittalEnumHelperTest.java | 33 + .../MaintenanceGroupControllerTest.java | 316 + .../control/MaintenanceGroupMapperTest.java | 309 + .../controller/SnmpSetControllerTest.java | 137 + .../handler/SetPropertyJobHandlerTest.java | 279 + .../handler/SetVariableJobHandlerTest.java | 294 + .../common/control/DeviceOidValueMapTest.java | 43 + .../common/control/PDUResponseMapperTest.java | 69 + .../snmp/common/control/SnmpHelperTest.java | 57 + .../common/control/SnmpMessageSenderTest.java | 132 + .../snmp/common/control/SnmpWalkTest.java | 229 + .../domain/DiscoveryDataToSnmpMapperTest.java | 266 + ...veryWorkItemToDiscoveryDataMapperTest.java | 246 + .../control/PropertyTrapProcessorTest.java | 58 + .../snmp/traps/control/TrapReceiverTest.java | 93 + .../control/VariableBindingParserTest.java | 91 + .../control/VariableStatusValueCacheTest.java | 73 + ...VariableTrapContentContentHandlerTest.java | 116 + .../VariableTrapContentMapperTest.java | 119 + .../control/VariableTrapProcessorTest.java | 148 + .../VariableDynamicTableServiceTest.java | 279 + .../StatisticCollectorControllerTest.java | 26 + .../control/ScheduledTaskServiceTest.java | 269 + .../control/SubscriptionControllerTest.java | 131 + .../utils/DeviceOidValueMapProvider.java | 55 + .../connector/utils/IPAddressHelperTest.java | 150 + .../utils/IntegrationTestHelper.java | 234 + .../raw/connector/utils/TestClassUtil.java | 16 + .../raw/connector/utils/TestDTOFactory.java | 447 + .../connector/utils/TestEntityFactory.java | 173 + .../utils/control/ChecksumControllerTest.java | 75 + .../control/VariableConstraintParserTest.java | 287 + .../control/VariableControllerTest.java | 177 + .../variable/control/VariableHandlerTest.java | 155 + .../variable/control/VariableMapperTest.java | 261 + .../control/VariableValueBulkSenderTest.java | 216 + .../control/VariableValueCachedServiceIT.java | 180 + .../control/VariableValueTaskSchedulerIT.java | 137 + .../VariableValueTaskSchedulerTest.java | 165 + src/test/resources/Logging.cmc3 | 3487 ++++++ src/test/resources/Logging_v2.cmc3 | 602 + src/test/resources/access.db | 19 + src/test/resources/access1.db | 11 + src/test/resources/access2.db | 3 + .../resources/discovery/rittal_pdu.snmprec | 9874 +++++++++++++++++ src/test/resources/discovery/synology.snmprec | 3445 ++++++ .../example.tar | Bin 0 -> 10240 bytes .../.gitkeep | 0 .../example1.tar | Bin 0 -> 10240 bytes .../example2.tar | Bin 0 -> 10240 bytes .../org.mockito.plugins.MockMaker | 1 + src/test/resources/syslog.cmc | 2754 +++++ version.txt | 1 + 625 files changed, 61204 insertions(+) create mode 100755 Dockerfile create mode 100755 lombok.config create mode 100755 pom.xml create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigController.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigConverter.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigProvider.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessDbConfigParser.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessCodeEntry.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfig.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfigWorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfigWorkItemStatusWrapper.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessPinConfig.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessUserRole.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessCardCodeDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemStatus.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemUpdateDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessDbDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/CardCodeType.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/HandleDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/HandleDbDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/KeypadDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/KeypadDbDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/OptionDbDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/dto/OptionsDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/handler/AccessConfigJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/access/configworkitem/utils/Bcd.java create mode 100755 src/main/java/io/gec/raw/connector/access/connectionworkitem/domain/ConnectionWorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemStatus.java create mode 100755 src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemUpdateDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemValueDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/connectionworkitem/handler/CheckConnectionJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/control/AccessLogParser.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/domain/AccessLogWorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/domain/AccessLogWorkItemStatusWrapper.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/dto/AccessLogDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/dto/AccessLogItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemStatus.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemUpdateDTO.java create mode 100755 src/main/java/io/gec/raw/connector/access/logworkitem/handler/AccessLogJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/access/utils/ParserHelper.java create mode 100755 src/main/java/io/gec/raw/connector/base/entity/BaseEntity.java create mode 100755 src/main/java/io/gec/raw/connector/base/entity/SimpleBaseEntity.java create mode 100755 src/main/java/io/gec/raw/connector/base/entity/SimpleBaseEntityWithPredefinedId.java create mode 100755 src/main/java/io/gec/raw/connector/base/entity/SubscribableEntity.java create mode 100755 src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationService.java create mode 100755 src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceController.java create mode 100755 src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceRequestErrorHandler.java create mode 100755 src/main/java/io/gec/raw/connector/communicationservice/exception/CommunicationServiceException.java create mode 100755 src/main/java/io/gec/raw/connector/communicationservice/exception/CommunicationServiceResponseExceptionMapper.java create mode 100755 src/main/java/io/gec/raw/connector/communicationservice/exception/FailureType.java create mode 100755 src/main/java/io/gec/raw/connector/communicationservice/exception/ModelType.java create mode 100755 src/main/java/io/gec/raw/connector/componentmode/control/ComponentModeController.java create mode 100755 src/main/java/io/gec/raw/connector/componentmode/control/ComponentModeHandler.java create mode 100755 src/main/java/io/gec/raw/connector/componentmode/dto/ChangeModeRequestDTO.java create mode 100755 src/main/java/io/gec/raw/connector/componentmode/dto/ComponentMode.java create mode 100755 src/main/java/io/gec/raw/connector/config/control/AppConfig.java create mode 100755 src/main/java/io/gec/raw/connector/config/control/ConnectorConfigController.java create mode 100755 src/main/java/io/gec/raw/connector/config/control/PropertyFileHandler.java create mode 100755 src/main/java/io/gec/raw/connector/config/control/VariableBulkValueSendingConfig.java create mode 100755 src/main/java/io/gec/raw/connector/config/entity/ConnectorConfig.java create mode 100755 src/main/java/io/gec/raw/connector/config/entity/SnmpConfig.java create mode 100755 src/main/java/io/gec/raw/connector/config/entity/SnmpConnectionTypesConfig.java create mode 100755 src/main/java/io/gec/raw/connector/connector/control/ConnectorController.java create mode 100755 src/main/java/io/gec/raw/connector/connector/control/ConnectorUtils.java create mode 100755 src/main/java/io/gec/raw/connector/connector/dto/ConnectorRequestDTO.java create mode 100755 src/main/java/io/gec/raw/connector/connector/dto/ConnectorResponseDTO.java create mode 100755 src/main/java/io/gec/raw/connector/connector/dto/DataTypeEnum.java create mode 100755 src/main/java/io/gec/raw/connector/connector/dto/RepresentationEnum.java create mode 100755 src/main/java/io/gec/raw/connector/device/control/DeviceController.java create mode 100755 src/main/java/io/gec/raw/connector/device/control/DeviceRepository.java create mode 100755 src/main/java/io/gec/raw/connector/device/control/DeviceStructureService.java create mode 100755 src/main/java/io/gec/raw/connector/device/control/ExternalDeviceBuilder.java create mode 100755 src/main/java/io/gec/raw/connector/device/control/RittalDeviceBuilder.java create mode 100755 src/main/java/io/gec/raw/connector/device/domain/DeviceMapping.java create mode 100755 src/main/java/io/gec/raw/connector/device/domain/DeviceOidValueMap.java create mode 100755 src/main/java/io/gec/raw/connector/device/dto/DeviceDTO.java create mode 100755 src/main/java/io/gec/raw/connector/device/dto/DevicePropertyResponseDTO.java create mode 100755 src/main/java/io/gec/raw/connector/device/dto/DeviceResponseDTO.java create mode 100755 src/main/java/io/gec/raw/connector/device/dto/VariableResponseDTO.java create mode 100755 src/main/java/io/gec/raw/connector/device/entity/AccessTypeEnum.java create mode 100755 src/main/java/io/gec/raw/connector/device/entity/DataTypeEnum.java create mode 100755 src/main/java/io/gec/raw/connector/device/entity/Device.java create mode 100755 src/main/java/io/gec/raw/connector/device/enums/AccessDeviceTypeEnum.java create mode 100755 src/main/java/io/gec/raw/connector/device/enums/ExternalDeviceConstants.java create mode 100755 src/main/java/io/gec/raw/connector/device/enums/ExternalDevicePropertyEnum.java create mode 100755 src/main/java/io/gec/raw/connector/device/enums/FunctionTypeEnum.java create mode 100755 src/main/java/io/gec/raw/connector/device/enums/PropertyClassType.java create mode 100755 src/main/java/io/gec/raw/connector/device/enums/RittalDeviceConstants.java create mode 100755 src/main/java/io/gec/raw/connector/device/enums/RittalDevicePropertyNameEnum.java create mode 100755 src/main/java/io/gec/raw/connector/device/enums/VariableFieldName.java create mode 100755 src/main/java/io/gec/raw/connector/device/projection/DeviceParentIdProjection.java create mode 100755 src/main/java/io/gec/raw/connector/device/projection/DeviceURLProjection.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyCachedService.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyController.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyExtractor.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyHandler.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyMapper.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyRepository.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskScheduler.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyValueProvider.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/control/DeviceTypeProvider.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/domain/DevicePropertyScheduledTask.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/domain/DevicePropertySnmpMessageTaskData.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/dto/DevicePropertyDTO.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/dto/PropertyValueRequestDTO.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/entity/DevBusEnum.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/entity/DevStatusEnum.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/entity/DevTypeEnum.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/entity/DeviceProperty.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/entity/DevicePropertyMapping.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/exception/DevicePropertyNotFoundException.java create mode 100755 src/main/java/io/gec/raw/connector/deviceproperty/projection/DevicePropertyNameProjection.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/control/DeviceDiscoveryProtocolService.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/control/DeviceDriverService.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/control/DiscoveryController.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/control/DiscoveryMapper.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/control/DiscoveryWorkItemRepository.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryAsyncRunner.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryThreadPool.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/domain/DeviceDiscoveryProtocolData.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/domain/DiscoveryWorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/domain/DiscoveryWorkItemStatusWrapper.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryValueDTO.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemStatus.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemUpdateDTO.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/entity/DiscoveryValue.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/entity/DiscoveryWorkItem.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/entity/SnmpDiscoveryData.java create mode 100755 src/main/java/io/gec/raw/connector/discovery/handler/DiscoveryJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/driver/control/DeviceDriverController.java create mode 100755 src/main/java/io/gec/raw/connector/driver/control/DeviceDriverServiceClient.java create mode 100755 src/main/java/io/gec/raw/connector/driver/control/DriverHeaderRepository.java create mode 100755 src/main/java/io/gec/raw/connector/driver/control/DriverVariableRepository.java create mode 100755 src/main/java/io/gec/raw/connector/driver/control/ValueMappingContainerRepository.java create mode 100755 src/main/java/io/gec/raw/connector/driver/control/ValueMappingRepository.java create mode 100755 src/main/java/io/gec/raw/connector/driver/control/ValueMappingService.java create mode 100755 src/main/java/io/gec/raw/connector/driver/domain/DeviceDriverDTO.java create mode 100755 src/main/java/io/gec/raw/connector/driver/domain/DriverHeaderDTO.java create mode 100755 src/main/java/io/gec/raw/connector/driver/domain/DriverVariableDTO.java create mode 100755 src/main/java/io/gec/raw/connector/driver/domain/DriverWorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/driver/domain/ValueMappingContainerDTO.java create mode 100755 src/main/java/io/gec/raw/connector/driver/domain/ValueMappingDTO.java create mode 100755 src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemStatus.java create mode 100755 src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemUpdateDTO.java create mode 100755 src/main/java/io/gec/raw/connector/driver/entity/DriverHeader.java create mode 100755 src/main/java/io/gec/raw/connector/driver/entity/DriverVariable.java create mode 100755 src/main/java/io/gec/raw/connector/driver/entity/ValueMapping.java create mode 100755 src/main/java/io/gec/raw/connector/driver/entity/ValueMappingContainer.java create mode 100755 src/main/java/io/gec/raw/connector/driver/handler/AbstractDriverWorkItemJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/driver/handler/CreateDriverWorkItemJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/driver/handler/DeleteDriverWorkItemJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/driver/handler/SynchronizeDriverWorkItemJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/driver/handler/UpdateDriverWorkItemJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/driver/mapper/DataMapper.java create mode 100755 src/main/java/io/gec/raw/connector/driver/mapper/DataMapperDefinitions.java create mode 100755 src/main/java/io/gec/raw/connector/driver/projection/DriverHeaderIdProjection.java create mode 100755 src/main/java/io/gec/raw/connector/driver/projection/ValueMappingContainerIdProjection.java create mode 100755 src/main/java/io/gec/raw/connector/exception/entity/CacheUpdateException.java create mode 100755 src/main/java/io/gec/raw/connector/exception/entity/DriverNotFoundException.java create mode 100755 src/main/java/io/gec/raw/connector/exception/entity/KeyNotFoundException.java create mode 100755 src/main/java/io/gec/raw/connector/exception/entity/SftpException.java create mode 100755 src/main/java/io/gec/raw/connector/exception/entity/SnmpInitializationException.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/FirmwareDownloadController.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/FirmwareFileConfigProvider.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/FirmwareFileUploader.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/FirmwareStorageController.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/FirmwareUpdateStatusController.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/FirmwareUpdateVerificationController.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/FirmwareUploadController.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/StatusFileContentProvider.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/control/TempFileProvider.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareDownloadException.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareFileNotFoundException.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateStatus.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateStatusResult.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateVerificationException.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateVerificationTimeoutException.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUploadException.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareWorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/FirmwareWorkItemStatusWrapper.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/domain/TooManyFirmwareFilesException.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/dto/FirmwareFileMetadataDTO.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemStatus.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemUpdateRequestDTO.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/handler/AbstractFirmwareJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/handler/FirmwareDownloadJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/handler/FirmwareUpdateVerificationJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/firmware/handler/FirmwareUploadJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/flyway/ConnectorFlywayMaintenanceCallback.java create mode 100755 src/main/java/io/gec/raw/connector/flyway/FlywayCheckSumReplacement.java create mode 100755 src/main/java/io/gec/raw/connector/flyway/FlywayMaintenanceCallback.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/boundary/FtpResource.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/control/FtpController.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/control/SSHClientProvider.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/control/SftpDataProvider.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/control/SftpDirectoryCleaner.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/control/SftpDownloader.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/control/SftpUploader.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/domain/FileItem.java create mode 100755 src/main/java/io/gec/raw/connector/ftp/domain/SftpData.java create mode 100755 src/main/java/io/gec/raw/connector/health/boundary/CommSvcServiceHealthCheck.java create mode 100755 src/main/java/io/gec/raw/connector/health/boundary/DeviceSvcHealthCheck.java create mode 100755 src/main/java/io/gec/raw/connector/job/control/JobController.java create mode 100755 src/main/java/io/gec/raw/connector/job/control/JobExecutorProvider.java create mode 100755 src/main/java/io/gec/raw/connector/job/control/JobMapper.java create mode 100755 src/main/java/io/gec/raw/connector/job/control/JobsExecutor.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/FinishJobAction.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/JobHandlerGroup.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/JobResult.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/JobWrapper.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/ProcessingCanceledException.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/ProcessingCancellationChecker.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/WorkItem.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/WorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/job/domain/WorkItemWrapper.java create mode 100755 src/main/java/io/gec/raw/connector/job/dto/JobAction.java create mode 100755 src/main/java/io/gec/raw/connector/job/dto/JobDTO.java create mode 100755 src/main/java/io/gec/raw/connector/job/dto/JobStateDTO.java create mode 100755 src/main/java/io/gec/raw/connector/job/dto/JobStatus.java create mode 100755 src/main/java/io/gec/raw/connector/job/dto/JobType.java create mode 100755 src/main/java/io/gec/raw/connector/job/handler/JobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/job/handler/WorkItemHandler.java create mode 100755 src/main/java/io/gec/raw/connector/mappers/control/EntityMapper.java create mode 100755 src/main/java/io/gec/raw/connector/pauseworkitem/domain/PauseWorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemStatus.java create mode 100755 src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemUpdateDTO.java create mode 100755 src/main/java/io/gec/raw/connector/pauseworkitem/handler/PauseWorkItemJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/control/PropertyRepository.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/control/PropertyValueRepository.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/control/ProtocolMapper.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/control/ProtocolRepository.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/control/ProtocolService.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/domain/AuthenticationProtocolEnum.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/domain/CommunicationPropertyNameEnum.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/domain/CommunicationProtocolEnum.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/domain/DescribableEnum.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/domain/DiscoveryPropertyNameEnum.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/domain/PrivacyAlgorithmEnum.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/domain/SecurityLevelEnum.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/domain/SnmpVersionEnum.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/dto/PropertyDTO.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/dto/PropertyValueDTO.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/dto/ProtocolDTO.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/entity/Property.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/entity/PropertyValue.java create mode 100755 src/main/java/io/gec/raw/connector/protocol/entity/Protocol.java create mode 100755 src/main/java/io/gec/raw/connector/registration/control/RegistrationService.java create mode 100755 src/main/java/io/gec/raw/connector/registration/control/RegistrationState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/domain/RittalMibVariable.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/IRittalEnum.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/PduSequenceMode.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateBatteryStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateOutputSource.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateTestResult.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesRfidTagCom.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpChillerModeState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpCommand.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpConfig.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpCtrlCommand.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDcmMagnetMotorConnected.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDevStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDeviceStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpFuseType.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpGsmStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpLogic.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMathControllerResult.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMibCondition.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMibECondition.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMountingPosition.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpNumberOfPoles.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOutput.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOverallDevStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOverallMsgStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpQuit.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpQuitUnit.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRackComand.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRcmCommand.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRcmPosition.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpResetAktivState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpSocketType.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTemperatureUnit.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTrapEnable.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTrapReceiverStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksAktivAlarmState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksAktivState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksDisabledState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksEmergencyState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksEnabledState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksFailureState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksInaktivState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksMaintenanceState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksOnOfState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksResetAktivState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksStandbyState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksState.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatusError.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatusMPSM.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpValuesStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandBep.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandControl.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandSignal.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCtrlCommandDp.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCtrlCommandWdt.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarFanAffect.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarLedMode.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarOpModeBep.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarStatusRfidTag.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarWtrAffect.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarAlarmOk.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarAvailableNotAvailable.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarBackDoorStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarCompressor.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarCompressorStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarFanStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarFansGroup.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarFlowSwitchStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarHighPresureCirciutStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnit.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnitDoorLock.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnitLastAccess.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAnalogWL.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarOnOff.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarOutputStatusPSMOutputOnOff.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarOutputValueDigitalValueOnOff.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarPhaseRotationStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorDoorOpening.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorOutputDigitalOnOff.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorType.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorVoltageOutputSet.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorVoltageTimeout.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogController.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensors.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensorsWOtoLow.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensorsWOwarning.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogValue.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusCUOutputDigitalOnOff.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDRC.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensors.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensorsAlarm.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensorsDoor.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusFASType.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorDeltaPressure.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorDischargeMaxTemp.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorLubricationStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorOperating.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorOverload.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorStartUpRetry.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorStartUpStatus.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXHighPressureSwitch.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorDischargePressureBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorDischargeTempBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorSuctionPressureBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorSuctionTempBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInBotBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInMidBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInTopBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutBotBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutMidBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutTopBroken.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXRemoteControl.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXSetpointLCP.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXStandby.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXStatusCompressor.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusOKALARM.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusOKWarning.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusSensorType.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusVandalismSensors.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusunitxOutputTypeDoorOpening.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarStatusunitxOutputTypeOutputDigital.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarUnitxSensorStatusOkAlarm.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarUnitxSensorStatusOkWarning.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalOutputSetDoor.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSensorsAlarm.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSensorsDoor.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSwitch.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarValuePosition.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarWaterStaticPresureStatusAlarm.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarWaterStaticPresureStatusWarning.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/enums/VarcmcTcUnitxMsgStatusWLAlarm.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/helper/RittalEnumHelper.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupController.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupMapper.java create mode 100755 src/main/java/io/gec/raw/connector/rittal/maintenancegroup/dto/MaintenanceGroupEnum.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/controller/SnmpSetController.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/domain/SetWorkItemData.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/domain/SetWorkItemResult.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/dto/ActionEnum.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/dto/SetStatusEnum.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/dto/SetWorkItemDTO.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/dto/SetWorkItemUpdateDTO.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/handler/AbstractSetJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/handler/SetPropertyJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/setworkitem/handler/SetVariableJobHandler.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/DiscoveryDataToSnmpMapper.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/DiscoveryWorkItemToDiscoveryDataMapper.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/PDUResponseMapper.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/SnmpHelper.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/SnmpMessageSender.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/SnmpProvider.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/SnmpService.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/SnmpTimeouts.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/control/SnmpWalk.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpConnectionType.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpGetJob.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpGetJobData.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpMessageData.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpProtocolData.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpRequestData.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpTimeoutData.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpV3Data.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/control/PropertyTrapProcessor.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/control/TrapContentHandler.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/control/TrapContentMapper.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/control/TrapReceiver.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/control/VariableBindingParser.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/control/VariableStatusValueCache.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/control/VariableTrapProcessor.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/domain/PropertyTrapContent.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/domain/TrapType.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/domain/VariableTrapContent.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/traps/domain/VariableTrapData.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/vardyntable/control/VariableDynamicTableService.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/vardyntable/domain/VariableDynamicTableRequestHolder.java create mode 100755 src/main/java/io/gec/raw/connector/snmp/vardyntable/domain/VariableTypeEnum.java create mode 100755 src/main/java/io/gec/raw/connector/statistic/control/StatisticCategoryMapper.java create mode 100755 src/main/java/io/gec/raw/connector/statistic/control/StatisticCollectorController.java create mode 100755 src/main/java/io/gec/raw/connector/statistic/domain/StatisticCategory.java create mode 100755 src/main/java/io/gec/raw/connector/statistic/domain/StatisticInterval.java create mode 100755 src/main/java/io/gec/raw/connector/status/control/DeviceStatusController.java create mode 100755 src/main/java/io/gec/raw/connector/status/control/StatusController.java create mode 100755 src/main/java/io/gec/raw/connector/subscription/control/AbstractTaskScheduler.java create mode 100755 src/main/java/io/gec/raw/connector/subscription/control/ScheduledTaskService.java create mode 100755 src/main/java/io/gec/raw/connector/subscription/control/SubscriptionController.java create mode 100755 src/main/java/io/gec/raw/connector/subscription/domain/ScheduledActiveTask.java create mode 100755 src/main/java/io/gec/raw/connector/subscription/domain/ScheduledTask.java create mode 100755 src/main/java/io/gec/raw/connector/subscription/domain/TaskAction.java create mode 100755 src/main/java/io/gec/raw/connector/subscription/domain/TaskData.java create mode 100755 src/main/java/io/gec/raw/connector/subscription/domain/TaskDataFactory.java create mode 100755 src/main/java/io/gec/raw/connector/utils/control/ChecksumController.java create mode 100755 src/main/java/io/gec/raw/connector/utils/control/IPAddressHelper.java create mode 100755 src/main/java/io/gec/raw/connector/utils/control/Measurement.java create mode 100755 src/main/java/io/gec/raw/connector/utils/control/RittalVariableConfigList.java create mode 100755 src/main/java/io/gec/raw/connector/utils/control/ValueHelper.java create mode 100755 src/main/java/io/gec/raw/connector/utils/control/ValueScalingHelper.java create mode 100755 src/main/java/io/gec/raw/connector/utils/domain/MeasurementItem.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableConstraintParser.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableController.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableHandler.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableMapper.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableRepository.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableValueBulkSender.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableValueCacheHandler.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableValueProvider.java create mode 100755 src/main/java/io/gec/raw/connector/variable/control/VariableValueTaskScheduler.java create mode 100755 src/main/java/io/gec/raw/connector/variable/domain/VariableSnmpMessageTaskData.java create mode 100755 src/main/java/io/gec/raw/connector/variable/domain/VariableValueData.java create mode 100755 src/main/java/io/gec/raw/connector/variable/domain/VariableValueScheduledTask.java create mode 100755 src/main/java/io/gec/raw/connector/variable/dto/QualityType.java create mode 100755 src/main/java/io/gec/raw/connector/variable/dto/UpdateVariableRequestDTO.java create mode 100755 src/main/java/io/gec/raw/connector/variable/dto/VarQuality.java create mode 100755 src/main/java/io/gec/raw/connector/variable/dto/VariableDTO.java create mode 100755 src/main/java/io/gec/raw/connector/variable/dto/VariableEnumConstraintDTO.java create mode 100755 src/main/java/io/gec/raw/connector/variable/entity/VarTypeEnum.java create mode 100755 src/main/java/io/gec/raw/connector/variable/entity/Variable.java create mode 100755 src/main/java/io/gec/raw/connector/variable/projection/VariableDriverVariableIdProjection.java create mode 100755 src/main/java/io/gec/raw/connector/variable/projection/VariableNameProjection.java create mode 100755 src/main/resources/META-INF/resources/index.html create mode 100755 src/main/resources/application-dev.yml create mode 100755 src/main/resources/application-local.yml.template create mode 100755 src/main/resources/application-prod.yml create mode 100755 src/main/resources/application-test.yml create mode 100755 src/main/resources/application.yml create mode 100755 src/main/resources/db/migration/V0_000__Init.sql create mode 100755 src/main/resources/db/migration/V0_001__addValueStatusMap.sql create mode 100755 src/main/resources/db/migration/V0_002__addDeprecatedColumnToProtocol.sql create mode 100755 src/main/resources/db/migration/V0_003__addSnmpSetVarDataTypeColumnToVariable.sql create mode 100755 src/main/resources/db/migration/V0_004__addFunctionTypeEnumToVariable.sql create mode 100755 src/main/resources/db/migration/V0_005__addDriverHeaderIdToDevice.sql create mode 100755 src/main/resources/db/migration/V0_006__addDriverVariableIdToVariable.sql create mode 100755 src/main/resources/db/migration/V0_007__addBaseOidToDriverVariable.sql create mode 100755 src/main/resources/db/migration/V0_008__addUsageColumnToProtocolTable.sql create mode 100755 src/main/resources/db/migration/V0_009__addDeviceIndexColumnToDeviceTbl.sql create mode 100755 src/main/resources/db/migration/V0_010__createVariableValueMappingContainerTable.sql create mode 100755 src/main/resources/db/migration/V0_011__discoveryCleanup.sql create mode 100755 src/main/resources/db/migration/V0_012__pauseWorkItem_mode.sql create mode 100755 src/main/resources/db/migration/V0_013__variable_initialValueFetched.sql create mode 100755 src/main/resources/db/migration/V0_014__addConstraintsToVariable.sql create mode 100755 src/main/resources/db/migration/V0_015__removeConditionAndFlagFromVariableAndProperties.sql create mode 100755 src/main/resources/db/migration/V0_016__removevalueAsStringOidFromProperty.sql create mode 100755 src/main/resources/db/migration/V0_017__deviceProperty_initialValueFetched.sql create mode 100755 src/main/resources/db/migration/V0_018__renameDatabaseSchema.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0001__init_structure.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0002__align_schema_after_validation_enabled.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0003__update_mode_constraints_for_firmware_update_mode.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0004__align_schema_after_panache_entity_removal.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0005__add_previou_mode_to_variable_device_properties.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0006__fix_restore_mode_constraint.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0007__migrate_variable_description_to_text.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0008__update_mode_constraints_for_firmware_update_mode.sql create mode 100755 src/main/resources/db/migration/V1.0.0_0009__addOfflineMode.sql create mode 100755 src/main/resources/db/migration/beforeMigrate.sql create mode 100755 src/main/resources/version.properties create mode 100755 src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigProviderTest.java create mode 100755 src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessDbConfigParserTest.java create mode 100755 src/test/java/io/gec/raw/connector/access/configworkitem/handler/AccessConfigJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/access/connectionworkitem/handler/CheckConnectionJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/access/logworkitem/control/AccessLogParserTest.java create mode 100755 src/test/java/io/gec/raw/connector/access/logworkitem/handler/AccessLogJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceRequestErrorHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceResponseExceptionMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/componentmode/control/ComponentModeControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/componentmode/control/ComponentModeHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/config/control/ConnectorConfigControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/config/control/PropertyFileHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/connector/control/ConnectorControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/device/control/DeviceControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/device/control/DeviceStructureServiceTest.java create mode 100755 src/test/java/io/gec/raw/connector/device/control/ExternalDeviceBuilderTest.java create mode 100755 src/test/java/io/gec/raw/connector/device/control/RittalDeviceBuilderTest.java create mode 100755 src/test/java/io/gec/raw/connector/device/control/ValueScalingHelperTest.java create mode 100755 src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyCachedServiceTest.java create mode 100755 src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskSchedulerIT.java create mode 100755 src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskSchedulerTest.java create mode 100755 src/test/java/io/gec/raw/connector/deviceproperty/control/DeviceTypeProviderTest.java create mode 100755 src/test/java/io/gec/raw/connector/deviceproperty/entity/DevTypeEnumTest.java create mode 100755 src/test/java/io/gec/raw/connector/discovery/control/CheckDriverHeaderTest.java create mode 100755 src/test/java/io/gec/raw/connector/discovery/control/DeviceDiscoveryProtocolServiceTest.java create mode 100755 src/test/java/io/gec/raw/connector/discovery/control/DiscoveryControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryAsyncRunnerTest.java create mode 100755 src/test/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryThreadPoolTest.java create mode 100755 src/test/java/io/gec/raw/connector/discovery/handler/DiscoveryJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/driver/control/DeviceDriverControllerIT.java create mode 100755 src/test/java/io/gec/raw/connector/driver/control/DeviceDriverControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/driver/handler/CreateDriverWorkItemJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/control/FirmwareDownloadControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/control/FirmwareFileConfigProviderTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/control/FirmwareFileUploaderTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/control/FirmwareStorageControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/control/FirmwareUpdateStatusControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/control/FirmwareUploadControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/control/StatusFileContentProviderTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/control/TempFileProviderTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/handler/FirmwareDownloadJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/handler/FirmwareUpdateVerificationJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/firmware/handler/FirmwareUploadJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/ftp/control/FtpControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/ftp/control/SftpDataProviderTest.java create mode 100755 src/test/java/io/gec/raw/connector/ftp/control/SftpDirectoryCleanerTest.java create mode 100755 src/test/java/io/gec/raw/connector/job/control/JobControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/job/control/JobExecutorProviderTest.java create mode 100755 src/test/java/io/gec/raw/connector/job/control/JobMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/job/control/JobsExecutorTest.java create mode 100755 src/test/java/io/gec/raw/connector/pauseworkitem/handler/PauseWorkItemJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/protocol/control/ProtocolMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/protocol/control/ProtocolServiceTest.java create mode 100755 src/test/java/io/gec/raw/connector/protocol/entity/PropertyTest.java create mode 100755 src/test/java/io/gec/raw/connector/protocol/entity/PropertyValueTest.java create mode 100755 src/test/java/io/gec/raw/connector/protocol/entity/ProtocolTest.java create mode 100755 src/test/java/io/gec/raw/connector/rittal/helper/RittalEnumHelperTest.java create mode 100755 src/test/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/setworkitem/controller/SnmpSetControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/setworkitem/handler/SetPropertyJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/setworkitem/handler/SetVariableJobHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/common/control/DeviceOidValueMapTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/common/control/PDUResponseMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/common/control/SnmpHelperTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/common/control/SnmpMessageSenderTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/common/control/SnmpWalkTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/common/domain/DiscoveryDataToSnmpMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/common/domain/DiscoveryWorkItemToDiscoveryDataMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/traps/control/PropertyTrapProcessorTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/traps/control/TrapReceiverTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/traps/control/VariableBindingParserTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/traps/control/VariableStatusValueCacheTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapContentContentHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapContentMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapProcessorTest.java create mode 100755 src/test/java/io/gec/raw/connector/snmp/vardyntable/control/VariableDynamicTableServiceTest.java create mode 100755 src/test/java/io/gec/raw/connector/statistic/control/StatisticCollectorControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/subscription/control/ScheduledTaskServiceTest.java create mode 100755 src/test/java/io/gec/raw/connector/subscription/control/SubscriptionControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/utils/DeviceOidValueMapProvider.java create mode 100755 src/test/java/io/gec/raw/connector/utils/IPAddressHelperTest.java create mode 100755 src/test/java/io/gec/raw/connector/utils/IntegrationTestHelper.java create mode 100755 src/test/java/io/gec/raw/connector/utils/TestClassUtil.java create mode 100755 src/test/java/io/gec/raw/connector/utils/TestDTOFactory.java create mode 100755 src/test/java/io/gec/raw/connector/utils/TestEntityFactory.java create mode 100755 src/test/java/io/gec/raw/connector/utils/control/ChecksumControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/variable/control/VariableConstraintParserTest.java create mode 100755 src/test/java/io/gec/raw/connector/variable/control/VariableControllerTest.java create mode 100755 src/test/java/io/gec/raw/connector/variable/control/VariableHandlerTest.java create mode 100755 src/test/java/io/gec/raw/connector/variable/control/VariableMapperTest.java create mode 100755 src/test/java/io/gec/raw/connector/variable/control/VariableValueBulkSenderTest.java create mode 100755 src/test/java/io/gec/raw/connector/variable/control/VariableValueCachedServiceIT.java create mode 100755 src/test/java/io/gec/raw/connector/variable/control/VariableValueTaskSchedulerIT.java create mode 100755 src/test/java/io/gec/raw/connector/variable/control/VariableValueTaskSchedulerTest.java create mode 100755 src/test/resources/Logging.cmc3 create mode 100755 src/test/resources/Logging_v2.cmc3 create mode 100755 src/test/resources/access.db create mode 100755 src/test/resources/access1.db create mode 100755 src/test/resources/access2.db create mode 100755 src/test/resources/discovery/rittal_pdu.snmprec create mode 100755 src/test/resources/discovery/synology.snmprec create mode 100755 src/test/resources/firmware/11111111-3534-46ff-8a63-44a8dcfa3f57/example.tar create mode 100755 src/test/resources/firmware/22222222-3534-46ff-8a63-44a8dcfa3f57/.gitkeep create mode 100755 src/test/resources/firmware/33333333-3534-46ff-8a63-44a8dcfa3f57/example1.tar create mode 100755 src/test/resources/firmware/33333333-3534-46ff-8a63-44a8dcfa3f57/example2.tar create mode 100755 src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100755 src/test/resources/syslog.cmc create mode 100755 version.txt diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..e172280 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,58 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# mvn package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/rest-client-quickstart-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/rest-client-quickstart-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5050 +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 -p 5005:5005 -e JAVA_ENABLE_DEBUG="true" quarkus/rest-client-quickstart-jvm +# +### +#FROM artifactory.intern.gec.io/docker/eclipse-temurin:17-alpine +FROM nexus.alm.oncite.io/docker/ubi9/openjdk-21:1.20 +#ARG RUN_JAVA_VERSION=1.3.8 + +ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' + +# Install java and the run-java script +# Also set up permissions for user `1001` +#RUN apk add --no-cache curl ca-certificates \ +# && mkdir /deployments \ +# && chown 1001 /deployments \ +# && chmod "g+rwX" /deployments \ +# && chown 1001:root /deployments \ +# && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \ +# && chown 1001 /deployments/run-java.sh \ +# && chmod 540 /deployments/run-java.sh \ +# && echo "securerandom.source=file:/dev/urandom" >> $JAVA_HOME/lib/security/java.security + +# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size. +#ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" + +COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 target/quarkus-app/*.jar /deployments/ +COPY --chown=185 target/quarkus-app/app/ /deployments/app/ +COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ + +#EXPOSE 8080 5005 +#USER 1001 + +#ENTRYPOINT [ "/deployments/run-java.sh" ] + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" diff --git a/lombok.config b/lombok.config new file mode 100755 index 0000000..df71bb6 --- /dev/null +++ b/lombok.config @@ -0,0 +1,2 @@ +config.stopBubbling = true +lombok.addLombokGeneratedAnnotation = true diff --git a/pom.xml b/pom.xml new file mode 100755 index 0000000..eb7b597 --- /dev/null +++ b/pom.xml @@ -0,0 +1,370 @@ + + + 4.0.0 + io.gec.raw + connector + raw.connector + 2.0.0-SNAPSHOT + + 3.13.0 + true + 21 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.14.4 + 3.5.1 + ${maven.build.timestamp} + yyyyMMddHHmm + 1.18.34 + 3.3.1 + 5.14.1 + ${project.build.directory}/jacoco.exec + ${project.build.directory}/site/jacoco/jacoco.xml + **/entity/**/*,**/dto/**/*,**/domain/**/*,**/flyway/**/* + 1.6.2 + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + + com.google.protobuf + protobuf-java + 3.25.5 + + + + + + io.quarkus + quarkus-micrometer-registry-prometheus + + + io.quarkus + quarkus-hibernate-orm-panache + + + io.quarkus + quarkus-hibernate-orm + + + io.quarkus + quarkus-jdbc-postgresql + + + io.quarkus + quarkus-vertx + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-flyway + + + io.quarkus + quarkus-rest + + + io.quarkus + quarkus-rest-jackson + + + io.quarkus + quarkus-rest-client + + + io.quarkus + quarkus-rest-client-jackson + + + io.quarkus + quarkus-config-yaml + + + io.quarkus + quarkus-cache + + + io.quarkus + quarkus-smallrye-health + + + io.quarkus + quarkus-scheduler + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + + org.flywaydb + flyway-database-postgresql + + + org.projectlombok + lombok + ${lombok.version} + provided + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + provided + + + + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-junit5-mockito + test + + + commons-codec + commons-codec + + + io.quarkus + quarkus-test-security + test + + + io.quarkus + quarkus-jacoco + test + + + io.rest-assured + rest-assured + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + org.mockito + mockito-inline + 5.2.0 + test + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + + + + + org.snmp4j + snmp4j + 3.8.2 + + + org.snmp4j + snmp4j-agent + 3.8.1 + + + commons-net + commons-net + 3.11.1 + + + jakarta.validation + jakarta.validation-api + + + com.hierynomus + sshj + 0.39.0 + + + org.slf4j + org.slf4j.impl.MavenSimpleLoggerFactory + + + + + io.quarkus + quarkus-opentelemetry + + + io.opentelemetry.instrumentation + opentelemetry-jdbc + + + + + + src/main/resources + true + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.12 + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + org.projectlombok + lombok + ${lombok.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + org.jacoco + jacoco-maven-plugin + + + **/entity/**/* + **/dto/* + **/domain/* + + + + + pre-unit-test + + prepare-agent + + + ${skip.tests} + true + *QuarkusClassLoader + ${sonar.jacoco.reportFile} + + + + pre-integration-test + + prepare-agent-integration + + + ${skip.it} + true + *QuarkusClassLoader + ${sonar.jacoco.reportFile} + + + + coverage-report + post-integration-test + + report + + + ${sonar.jacoco.reportFile} + + + + + + + + + native + + + native + + + + false + true + false + + + + diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigController.java b/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigController.java new file mode 100755 index 0000000..de48b09 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigController.java @@ -0,0 +1,44 @@ +package io.gec.raw.connector.access.configworkitem.control; + +import io.gec.raw.connector.access.configworkitem.domain.AccessConfig; +import io.gec.raw.connector.access.configworkitem.domain.AccessPinConfig; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.control.FtpController; +import io.gec.raw.connector.ftp.domain.SftpData; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class AccessConfigController { + @Inject + FtpController ftpController; + @Inject + DeviceController deviceController; + @Inject + AccessConfigProvider accessConfigProvider; + + public void sendAccessConfig(AccessConfigDTO accessConfigDTO, + UUID commSvcDeviceId, + List accessWorkItemValues) throws SftpException { + Device rootDevice = deviceController.getDeviceByCommSvcId(commSvcDeviceId); + SftpData sftpData = ftpController.createSftpData(accessWorkItemValues, rootDevice.getDeviceURL()); + + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, rootDevice.getDescription()); + + for (AccessPinConfig accessPinConfig : accessConfig.getEmergencyPinConfigs()) { + ftpController.putEmergencyPinFile(sftpData, accessPinConfig); + } + for (AccessPinConfig accessPinConfig : accessConfig.getOneTimePinConfigs()) { + ftpController.putOneTimePinFile(sftpData, accessPinConfig); + } + + ftpController.putAccessConfigFile(sftpData, accessConfig.getContent()); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigConverter.java b/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigConverter.java new file mode 100755 index 0000000..3bb4cd1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigConverter.java @@ -0,0 +1,114 @@ +package io.gec.raw.connector.access.configworkitem.control; + +import io.gec.raw.connector.access.configworkitem.domain.AccessCodeEntry; +import io.gec.raw.connector.access.configworkitem.domain.AccessUserRole; +import io.gec.raw.connector.access.configworkitem.dto.AccessCardCodeDTO; +import io.gec.raw.connector.access.configworkitem.dto.CardCodeType; +import io.gec.raw.connector.access.configworkitem.dto.HandleDTO; +import io.gec.raw.connector.access.configworkitem.dto.KeypadDTO; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.*; + +@ApplicationScoped +public class AccessConfigConverter { + + public List convertToAccessCodeEntries(List keypads) { + if (keypads == null) { + return Collections.emptyList(); + } + + Map> accessCardCodesMap = new LinkedHashMap<>(); + for (KeypadDTO keypadDTO : keypads) { + addToAccessCardCodesMap(keypadDTO.getHandles(), accessCardCodesMap); + } + + Map> accessConfigData = new LinkedHashMap<>(); + processAccessCardCodes(accessCardCodesMap, accessConfigData); + + return accessConfigData.values().stream() + .flatMap(accessCodeEntryMap -> accessCodeEntryMap.values().stream()) + .toList(); + } + + private void addToAccessCardCodesMap(List handles, Map> accessCardCodesMap) { + if (handles == null) { + return; + } + + for (HandleDTO handleDTO : handles) { + List accessCardCodes = accessCardCodesMap.computeIfAbsent( + handleDTO.getAccessDeviceSerialNr(), + handleSerialNumber -> new ArrayList<>()); + accessCardCodes.addAll(handleDTO.getAccessCardCodes()); + } + } + + private void processAccessCardCodes(Map> accessCardCodesMap, + Map> accessConfigData) { + for (Map.Entry> cardCodeEntry : accessCardCodesMap.entrySet()) { + String handleSerialNumber = cardCodeEntry.getKey(); + List accessCardCodes = cardCodeEntry.getValue(); + + processAccessCardCodes(accessCardCodes, handleSerialNumber, accessConfigData); + } + } + + private void processAccessCardCodes(List accessCardCodes, + String handleSerialNumber, + Map> accessConfigData) { + boolean isEmergencyPinCodeEntryCreated = false; + boolean isOneTimePinCodeEntryCreated = false; + + for (AccessCardCodeDTO accessCardCodeDTO : accessCardCodes) { + CardCodeType type = accessCardCodeDTO.getType(); + + // Additional protection - one handle can have a maximum of one emergency PIN and a maximum of one one-time PIN + // If such protection is not applied before the connector receives this access configuration + // then only the first cardCode (PIN) from the list will be used. + if (!canCreateAccessCodeEntry(type, isEmergencyPinCodeEntryCreated, isOneTimePinCodeEntryCreated)) { + continue; + } + + isEmergencyPinCodeEntryCreated |= type == CardCodeType.EMERGENCY_PIN; + isOneTimePinCodeEntryCreated |= type == CardCodeType.ONE_TIME_PIN; + + String value = accessCardCodeDTO.getValue(); + + Map accessCodeEntries = accessConfigData.computeIfAbsent(type, cardCodeType -> new LinkedHashMap<>()); + AccessCodeEntry accessCodeEntry = accessCodeEntries.computeIfAbsent(value, cardCodeValue -> createAccessCodeEntry(accessCardCodeDTO)); + + accessCodeEntry.addHandleSerialNumber(handleSerialNumber); + } + } + + private boolean canCreateAccessCodeEntry(CardCodeType type, boolean isEmergencyPinCodeEntryCreated, boolean isOneTimePinCodeEntryCreated) { + if (type == CardCodeType.EMERGENCY_PIN && isEmergencyPinCodeEntryCreated) { + return false; + } + if (type == CardCodeType.ONE_TIME_PIN && isOneTimePinCodeEntryCreated) { + return false; + } + + return true; + } + + private AccessCodeEntry createAccessCodeEntry(AccessCardCodeDTO accessCardCodeDTO) { + AccessCodeEntry accessCodeEntry = new AccessCodeEntry(); + accessCodeEntry.setType(accessCardCodeDTO.getType()); + accessCodeEntry.setValue(accessCardCodeDTO.getValue()); + accessCodeEntry.setUserName(accessCardCodeDTO.getUserName()); + accessCodeEntry.setAccessUserRole(getAccessUserRole(accessCardCodeDTO.getUserRole())); + accessCodeEntry.setValidationPeriod(accessCardCodeDTO.getValidationPeriod()); + accessCodeEntry.setFromDatetime(accessCardCodeDTO.getFromDatetime()); + + return accessCodeEntry; + } + + private AccessUserRole getAccessUserRole(String userRole) { + if (AccessUserRole.ACCESS_ACKNOWLEDGE.getRoleName().equals(userRole)) { + return AccessUserRole.ACCESS_ACKNOWLEDGE; + } + return AccessUserRole.ACCESS_USER; + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigProvider.java b/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigProvider.java new file mode 100755 index 0000000..c272e8b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigProvider.java @@ -0,0 +1,275 @@ +package io.gec.raw.connector.access.configworkitem.control; + +import io.gec.raw.connector.access.configworkitem.domain.AccessCodeEntry; +import io.gec.raw.connector.access.configworkitem.domain.AccessConfig; +import io.gec.raw.connector.access.configworkitem.domain.AccessUserRole; +import io.gec.raw.connector.access.configworkitem.dto.*; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.apache.commons.codec.digest.Sha2Crypt; +import org.apache.commons.lang3.StringUtils; +import org.jboss.logging.Logger; + +import java.time.Clock; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@ApplicationScoped +public class AccessConfigProvider { + @Inject + AccessConfigConverter accessConfigConverter; + @Inject + Clock clock; + @Inject + Logger logger; + + private static final String ACCESS_FILE_HEADER = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + """; + private static final String TYPE_CODE_CONTENT_PATTERN = "Key:%s; User:%s; Information:%s; Handle:%s"; + private static final String TYPE_CARD_CONTENT_PATTERN = "Crd:%s; User:%s; Information:%s; Handle:%s"; + private static final String TYPE_EMERGENCY_PIN_CONTENT_PATTERN = "Key:emgy%s; User:%s; Information:%s; Handle:%s"; + private static final String TYPE_ONE_TIME_PIN_CONTENT_PATTERN = "Key:code%s; User:%s; Information:%s; Handle:%s"; + private static final String DEVICE_DESCRIPTION = "V3.17.30_5"; + + // AccessConfigDTO contains Access configuration, deviceDescription is used for switching between different CMC/PDU Firmware versions + public AccessConfig generateAccessConfig(AccessConfigDTO accessConfigDTO, String deviceDescription) { + AccessConfig accessConfig = new AccessConfig(); + + List accessCodeEntries = accessConfigConverter.convertToAccessCodeEntries(accessConfigDTO.getKeypads()); + String accessFileContent = prepareAccessConfigFileContent(accessConfigDTO, accessConfig, accessCodeEntries, deviceDescription); + + accessConfig.setContent(accessFileContent); + + logger.infof("Access config generated for Mgmt Device (ID:'%s')", accessConfigDTO.getMgmtDeviceComponentId()); + + return accessConfig; + } + + private String prepareAccessConfigFileContent(AccessConfigDTO accessConfigDTO, + AccessConfig accessConfig, + List accessCodeEntries, + String deviceDescription) { + /*return new StringBuilder() + .append(ACCESS_FILE_HEADER) + .append(generateOptions(accessConfigDTO.getOptions(), deviceDescription)) + .append(generateAccessCodeEntries(accessCodeEntries, accessConfig)) + .append(generateKeypads(accessConfigDTO.getKeypads())).toString();*/ + + return new StringBuilder() + .append(ACCESS_FILE_HEADER) + .append(generateOptions(accessConfigDTO.getOptions(), deviceDescription)) + .append(generateAccessCodeEntries(accessCodeEntries, accessConfig)).toString(); + } + + private String generateOptions(OptionsDTO options, String deviceDescription) { + if (options == null) { + return StringUtils.EMPTY; + } + + StringBuilder optionsContent = new StringBuilder(); + if (deviceDescription.contains(DEVICE_DESCRIPTION)) { + if (options.isFourEyes()) { + optionsContent.append(String.format("4-Eyes:1,%s", options.getFourEyesTimeout())).append("\n"); + } + if (options.isTwoFactor()) { + optionsContent.append(String.format("2-Factor:1,%s", options.getTwoFactorTimeout())).append("\n"); + } + } else { + if (options.isFourEyes()) { + optionsContent.append(String.format("4-Eyes:%s", options.getFourEyesTimeout())).append("\n"); + } + if (options.isTwoFactor()) { + optionsContent.append(String.format("2-Factor:%s", options.getTwoFactorTimeout())).append("\n"); + } + } + + return optionsContent.toString(); + } + + private String generateAccessCodeEntries(List accessCodeEntries, AccessConfig accessConfig) { + if (accessCodeEntries.isEmpty()) { + return StringUtils.EMPTY; + } + + StringBuilder accessCodesContent = new StringBuilder(); + + for (AccessCodeEntry accessCodeEntry : accessCodeEntries) { + + switch (accessCodeEntry.getType()) { + case CODE -> addAccessCodeEntryForCodeType(accessCodesContent, accessCodeEntry); + case CARD -> addAccessCodeEntryForCardType(accessCodesContent, accessCodeEntry); + case EMERGENCY_PIN -> addAccessCodeEntryForEmergencyPinType(accessCodesContent, accessCodeEntry, accessConfig); + case ONE_TIME_PIN -> addAccessCodeEntryForOneTimePinType(accessCodesContent, accessCodeEntry, accessConfig); + } + } + + return accessCodesContent.toString(); + } + + private void addAccessCodeEntryForCodeType(StringBuilder accessCodesContent, AccessCodeEntry accessCodeEntry) { + addAccessCodeEntry( + accessCodesContent, + TYPE_CODE_CONTENT_PATTERN, + accessCodeEntry.getValue(), + accessCodeEntry.getAccessUserRole(), + accessCodeEntry.getUserName(), + accessCodeEntry.getHandleSerialNumbers()); + } + + private void addAccessCodeEntryForCardType(StringBuilder accessCodesContent, AccessCodeEntry accessCodeEntry) { + // cardCode format in CMC and PDU is 8 digits + 8 leading zeros + final String cardCode = accessCodeEntry.getValue(); + String cardCodeValue = cardCode.length() == 8 + ? "00000000" + cardCode + : cardCode; + + addAccessCodeEntry( + accessCodesContent, + TYPE_CARD_CONTENT_PATTERN, + cardCodeValue, + accessCodeEntry.getAccessUserRole(), + accessCodeEntry.getUserName(), + accessCodeEntry.getHandleSerialNumbers()); + } + + private void addAccessCodeEntryForEmergencyPinType(StringBuilder accessCodesContent, AccessCodeEntry accessCodeEntry, AccessConfig accessConfig) { + for (String handleSerialNumber : accessCodeEntry.getHandleSerialNumbers()) { + final String pinFileContent = generatePinFileContent(accessCodeEntry.getValue()); + accessConfig.addEmergencyPinConfig(handleSerialNumber, pinFileContent); + + /*addAccessCodeEntry( + accessCodesContent, + TYPE_EMERGENCY_PIN_CONTENT_PATTERN, + handleSerialNumber, + AccessUserRole.ACCESS_USER, + accessCodeEntry.getUserName(), + Set.of(handleSerialNumber));*/ + + addAccessCodeEntry( + accessCodesContent, + TYPE_EMERGENCY_PIN_CONTENT_PATTERN, + handleSerialNumber, + AccessUserRole.ACCESS_USER, + accessCodeEntry.getUserName(), + accessCodeEntry.getHandleSerialNumbers()); + } + } + + private void addAccessCodeEntryForOneTimePinType(StringBuilder accessCodesContent, AccessCodeEntry accessCodeEntry, AccessConfig accessConfig) { + for (String handleSerialNumber : accessCodeEntry.getHandleSerialNumbers()) { + OffsetDateTime startDateTime = Optional.ofNullable(accessCodeEntry.getFromDatetime()).orElseGet(() -> OffsetDateTime.now(clock)); + long expirationTime = getExpirationTime(accessCodeEntry.getValidationPeriod(), startDateTime); + + if (isTimeExpired(expirationTime)) { + continue; + } + + final String pinFileContent = generatePinFileContent( + accessCodeEntry.getValue(), + startDateTime.toInstant().toEpochMilli(), + expirationTime); + accessConfig.addOneTimePinConfig(handleSerialNumber, pinFileContent); + + /*addAccessCodeEntry( + accessCodesContent, + TYPE_ONE_TIME_PIN_CONTENT_PATTERN, + handleSerialNumber, + AccessUserRole.ACCESS_USER, + accessCodeEntry.getUserName(), + Set.of(handleSerialNumber));*/ + + addAccessCodeEntry( + accessCodesContent, + TYPE_ONE_TIME_PIN_CONTENT_PATTERN, + handleSerialNumber, + AccessUserRole.ACCESS_USER, + accessCodeEntry.getUserName(), + accessCodeEntry.getHandleSerialNumbers()); + } + } + + private void addAccessCodeEntry(StringBuilder accessCodesContent, + String contentPattern, + String cardCodeValue, + AccessUserRole accessUserRole, + String userName, + Set handleSerialNumbers) { + if (StringUtils.isNotEmpty(contentPattern) && StringUtils.isNotEmpty(cardCodeValue)) { + String handles = String.join(",", handleSerialNumbers); + + accessCodesContent.append(contentPattern.formatted( + cardCodeValue, + accessUserRole.getRoleName(), + userName, + handles + )).append("\n"); + } + } + + private String generateKeypads(List keypads) { + if (keypads == null) { + return StringUtils.EMPTY; + } + + StringBuilder keypadsContent = new StringBuilder(); + + for (KeypadDTO keypadDTO : keypads) { + List handles = keypadDTO.getHandles(); + + String handleSerialNumbersValue = Optional.ofNullable(handles).stream() + .flatMap(Collection::stream) + .map(HandleDTO::getAccessDeviceSerialNr) + .collect(Collectors.joining(",")); + + if (!handleSerialNumbersValue.isEmpty()) { + keypadsContent.append(String.format("Keypad:%s; Handle:%s", + keypadDTO.getAccessDeviceSerialNr(), + handleSerialNumbersValue)).append("\n"); + } + } + + return keypadsContent.toString().trim(); + } + + private String generatePinFileContent(String accessCardCodeValue) { + return generatePinFileContent(accessCardCodeValue, 0L, -1L); + } + + private String generatePinFileContent(String accessCardCodeValue, long startDateTime, long expirationTime) { + long startDateTimeInSeconds = TimeUnit.MILLISECONDS.toSeconds(startDateTime); + long expirationTimeInSeconds = expirationTime >= 0 + ? TimeUnit.MILLISECONDS.toSeconds(expirationTime) + : -1L; // forever + + return Sha2Crypt.sha256Crypt(accessCardCodeValue.getBytes()) + "\t%d\t%d".formatted(startDateTimeInSeconds, expirationTimeInSeconds); + } + + private long getExpirationTime(Integer validationPeriod, OffsetDateTime startDateTime) { + if (validationPeriod == null) { + return 0L; // one-time + } + if (validationPeriod == 0) { + return 0L; // one-time + } + if (validationPeriod < 0) { + return -1L; // forever + } + + return startDateTime + .plusSeconds(TimeUnit.HOURS.toSeconds(validationPeriod)) + .toInstant() + .toEpochMilli(); + } + + private boolean isTimeExpired(long expirationTime) { + return expirationTime > 0 && Instant.now(clock).toEpochMilli() > expirationTime; + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessDbConfigParser.java b/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessDbConfigParser.java new file mode 100755 index 0000000..a0b8c28 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/control/AccessDbConfigParser.java @@ -0,0 +1,104 @@ +package io.gec.raw.connector.access.configworkitem.control; + +import io.gec.raw.connector.access.configworkitem.dto.AccessDbDTO; +import io.gec.raw.connector.access.configworkitem.dto.HandleDbDTO; +import io.gec.raw.connector.access.configworkitem.dto.KeypadDbDTO; +import io.gec.raw.connector.access.configworkitem.dto.OptionDbDTO; +import io.gec.raw.connector.access.utils.ParserHelper; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.MatchResult; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +@ApplicationScoped +public class AccessDbConfigParser { + private static final String REGEX = "'(.*?)'"; + private static final String NOT_SUPPORTED_ELEMENT_WITH_INDEX = "Not supported element with index: "; + + private final Pattern pattern = Pattern.compile(REGEX, Pattern.MULTILINE); + + @Inject + ParserHelper parserHelper; + + public AccessDbDTO parseFileContent(Path filePath) throws IOException { + List handleList = new ArrayList<>(); + List keypadList = new ArrayList<>(); + OptionDbDTO optionDTO = null; + + try (BufferedReader br = new BufferedReader(new FileReader(filePath.toFile()))) { + String line; + while ((line = br.readLine()) != null) { + Matcher matcher = pattern.matcher(line); + if (line.contains("INSERT INTO Handles")) { + handleList.add(createHandleDTO(matcher.results())); + } else if (line.contains("INSERT INTO Keypads")) { + keypadList.add(createKeypadDTO(matcher.results())); + } else if (line.contains("INSERT INTO Options")) { + optionDTO = createOptionDTO(matcher.results()); + } + } + } + + AccessDbDTO accessDbDTO = new AccessDbDTO(); + accessDbDTO.setHandles(handleList); + accessDbDTO.setKeypads(keypadList); + accessDbDTO.setOptions(optionDTO); + return accessDbDTO; + + } + + private OptionDbDTO createOptionDTO(Stream results) { + OptionDbDTO optionDTO = new OptionDbDTO(); + List matchResultList = results.toList(); + for (int i = 0; i < matchResultList.size(); i++) { + switch (i) { + case 0 -> optionDTO.setEyes4(parserHelper.toBoolean(matchResultList.get(i).group(1))); + case 1 -> optionDTO.setWay2(parserHelper.toBoolean(matchResultList.get(i).group(1))); + case 2 -> optionDTO.setTimeout1(Integer.parseInt(matchResultList.get(i).group(1))); + case 3 -> optionDTO.setTimeout2(Integer.parseInt(matchResultList.get(i).group(1))); + default -> throw new IllegalArgumentException(NOT_SUPPORTED_ELEMENT_WITH_INDEX + i + " in Options data"); + } + } + return optionDTO; + } + + private KeypadDbDTO createKeypadDTO(Stream results) { + KeypadDbDTO keypadDTO = new KeypadDbDTO(); + List matchResultList = results.toList(); + for (int i = 0; i < matchResultList.size(); i++) { + switch (i) { + case 0 -> keypadDTO.setKeypad(matchResultList.get(i).group(1)); + case 1 -> keypadDTO.setHandleList(Arrays.asList(matchResultList.get(i).group(1).split(","))); + default -> throw new IllegalArgumentException(NOT_SUPPORTED_ELEMENT_WITH_INDEX + i + " in Keypads data"); + } + } + return keypadDTO; + } + + private HandleDbDTO createHandleDTO(Stream results) { + HandleDbDTO handleDTO = new HandleDbDTO(); + List matchResultList = results.toList(); + for (int i = 0; i < matchResultList.size(); i++) { + switch (i) { + case 0 -> handleDTO.setType(matchResultList.get(i).group(1)); + case 1 -> handleDTO.setCode(matchResultList.get(i).group(1)); + case 2 -> handleDTO.setUser(matchResultList.get(i).group(1)); + case 3 -> handleDTO.setInformation(matchResultList.get(i).group(1)); + case 4 -> handleDTO.setHandleList(Arrays.asList(matchResultList.get(i).group(1).split(","))); + default -> throw new IllegalArgumentException(NOT_SUPPORTED_ELEMENT_WITH_INDEX + i + " in Handles data"); + } + } + return handleDTO; + } + +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessCodeEntry.java b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessCodeEntry.java new file mode 100755 index 0000000..e1aec0f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessCodeEntry.java @@ -0,0 +1,28 @@ +package io.gec.raw.connector.access.configworkitem.domain; + +import io.gec.raw.connector.access.configworkitem.dto.CardCodeType; +import lombok.Getter; +import lombok.Setter; + +import java.time.OffsetDateTime; +import java.util.LinkedHashSet; +import java.util.Set; + +@Getter +@Setter +public class AccessCodeEntry { + private CardCodeType type; + private String value; + private String userName; + private AccessUserRole accessUserRole; + private Integer validationPeriod; + private OffsetDateTime fromDatetime; + private Set handleSerialNumbers; + + public void addHandleSerialNumber(String handleSerialNumber) { + if (handleSerialNumbers == null) { + handleSerialNumbers = new LinkedHashSet<>(); + } + handleSerialNumbers.add(handleSerialNumber); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfig.java b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfig.java new file mode 100755 index 0000000..c150e63 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfig.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.access.configworkitem.domain; + +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class AccessConfig { + @Setter + private String content; + private final List emergencyPinConfigs = new ArrayList<>(); + private final List oneTimePinConfigs = new ArrayList<>(); + + public void addEmergencyPinConfig(String pinIdentifier, String content) { + emergencyPinConfigs.add(new AccessPinConfig(pinIdentifier, content)); + } + + public void addOneTimePinConfig(String pinIdentifier, String content) { + oneTimePinConfigs.add(new AccessPinConfig(pinIdentifier, content)); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfigWorkItemResult.java b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfigWorkItemResult.java new file mode 100755 index 0000000..5f14558 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfigWorkItemResult.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.access.configworkitem.domain; + +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemStatus; +import io.gec.raw.connector.job.domain.WorkItemResult; +import lombok.Getter; + +@Getter +public class AccessConfigWorkItemResult extends WorkItemResult { + private final AccessConfigWorkItemStatus status; + + public AccessConfigWorkItemResult(AccessConfigWorkItemStatus status, String message) { + super(message); + this.status = status; + } + + public AccessConfigWorkItemResult(AccessConfigWorkItemStatus status) { + this(status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfigWorkItemStatusWrapper.java b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfigWorkItemStatusWrapper.java new file mode 100755 index 0000000..429da7f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessConfigWorkItemStatusWrapper.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.access.configworkitem.domain; + +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemStatus; + +import java.util.UUID; + +public record AccessConfigWorkItemStatusWrapper(UUID workItemId, AccessConfigWorkItemStatus status, String message) { + public AccessConfigWorkItemStatusWrapper(UUID workItemId, AccessConfigWorkItemStatus status) { + this(workItemId, status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessPinConfig.java b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessPinConfig.java new file mode 100755 index 0000000..a8d83b0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessPinConfig.java @@ -0,0 +1,4 @@ +package io.gec.raw.connector.access.configworkitem.domain; + +public record AccessPinConfig(String pinIdentifier, String content) { +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessUserRole.java b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessUserRole.java new file mode 100755 index 0000000..a539384 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/domain/AccessUserRole.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.access.configworkitem.domain; + +import lombok.Getter; + +@Getter +public enum AccessUserRole { + ACCESS_USER("AccessUser"), + ACCESS_ACKNOWLEDGE("AccessAck"); + + private final String roleName; + + AccessUserRole(String roleName) { + this.roleName = roleName; + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessCardCodeDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessCardCodeDTO.java new file mode 100755 index 0000000..98d48f1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessCardCodeDTO.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import java.time.OffsetDateTime; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AccessCardCodeDTO { + private CardCodeType type; + private String value; + private String userName; + private Integer validationPeriod; + private String userRole; + private OffsetDateTime fromDatetime; +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigDTO.java new file mode 100755 index 0000000..db64d4e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigDTO.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +public class AccessConfigDTO { + private UUID mgmtDeviceComponentId; + private OptionsDTO options; + private List keypads; +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemDTO.java new file mode 100755 index 0000000..bcd01e2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemDTO.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemDTO; +import io.gec.raw.connector.job.domain.WorkItem; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class AccessConfigWorkItemDTO extends WorkItem { + private UUID id; + private AccessConfigWorkItemStatus status; + private AccessConfigDTO config; + private ConnectionWorkItemDTO connectionWorkItem; +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemStatus.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemStatus.java new file mode 100755 index 0000000..fde5821 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemStatus.java @@ -0,0 +1,5 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +public enum AccessConfigWorkItemStatus { + CREATED, IN_PROGRESS, QUEUED, SUCCESS, DEVICE_CONFIG_FAILURE +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemUpdateDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemUpdateDTO.java new file mode 100755 index 0000000..f5c37be --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessConfigWorkItemUpdateDTO.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class AccessConfigWorkItemUpdateDTO { + + private AccessConfigWorkItemStatus status; + private String message; +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessDbDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessDbDTO.java new file mode 100755 index 0000000..61cea4a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/AccessDbDTO.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class AccessDbDTO { + List handles; + List keypads; + OptionDbDTO options; + +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/CardCodeType.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/CardCodeType.java new file mode 100755 index 0000000..e18c49e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/CardCodeType.java @@ -0,0 +1,5 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +public enum CardCodeType { + CARD, CODE, ONE_TIME_PIN, EMERGENCY_PIN +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/HandleDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/HandleDTO.java new file mode 100755 index 0000000..871c692 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/HandleDTO.java @@ -0,0 +1,13 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class HandleDTO { + private String accessDeviceSerialNr; + private List accessCardCodes; +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/HandleDbDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/HandleDbDTO.java new file mode 100755 index 0000000..0344f9b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/HandleDbDTO.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class HandleDbDTO { + private String type; + private String code; + private String user; + private String information; + private List handleList; + +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/KeypadDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/KeypadDTO.java new file mode 100755 index 0000000..da81165 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/KeypadDTO.java @@ -0,0 +1,13 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class KeypadDTO { + private String accessDeviceSerialNr; + private List handles; +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/KeypadDbDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/KeypadDbDTO.java new file mode 100755 index 0000000..691b21c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/KeypadDbDTO.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class KeypadDbDTO { + private String keypad; + private List handleList; + +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/OptionDbDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/OptionDbDTO.java new file mode 100755 index 0000000..79d80f2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/OptionDbDTO.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class OptionDbDTO { + private boolean eyes4; + private boolean way2; + private int timeout1; + private int timeout2; + +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/dto/OptionsDTO.java b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/OptionsDTO.java new file mode 100755 index 0000000..912b2c6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/dto/OptionsDTO.java @@ -0,0 +1,13 @@ +package io.gec.raw.connector.access.configworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class OptionsDTO { + private boolean fourEyes; + private boolean twoFactor; + private int fourEyesTimeout; + private int twoFactorTimeout; +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/handler/AccessConfigJobHandler.java b/src/main/java/io/gec/raw/connector/access/configworkitem/handler/AccessConfigJobHandler.java new file mode 100755 index 0000000..69be962 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/handler/AccessConfigJobHandler.java @@ -0,0 +1,95 @@ +package io.gec.raw.connector.access.configworkitem.handler; + +import io.gec.raw.connector.access.configworkitem.control.AccessConfigController; +import io.gec.raw.connector.access.configworkitem.domain.AccessConfigWorkItemResult; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemDTO; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemStatus; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemUpdateDTO; +import io.gec.raw.connector.access.configworkitem.domain.AccessConfigWorkItemStatusWrapper; +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.WorkItemHandler; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class AccessConfigJobHandler extends WorkItemHandler { + @Inject + AccessConfigController accessConfigController; + + @Override + protected Optional getWorkItem(UUID workItemId) { + return communicationServiceController.fetchAccessConfigWorkItem(workItemId); + } + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + var accessConfigWorkItemStatus = new AccessConfigWorkItemStatusWrapper(workItemWrapper.workItemId(), AccessConfigWorkItemStatus.IN_PROGRESS); + updateAccessConfigWorkItemStatus(accessConfigWorkItemStatus); + } + + @ActivateRequestContext + @Override + protected AccessConfigWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + try { + logger.infof("Processing AccessConfigWorkItem (ID:'%s') ...", workItemWrapper.workItemId()); + AccessConfigWorkItemDTO workItem = workItemWrapper.workItem(); + accessConfigController.sendAccessConfig( + workItem.getConfig(), + workItem.getConnectionWorkItem().getDeviceId(), + workItem.getConnectionWorkItem().getConnectionPropertyValues()); + + return new AccessConfigWorkItemResult(AccessConfigWorkItemStatus.SUCCESS); + } catch (Exception e) { + logger.errorf(e, "Processing AccessConfigWorkItem (ID:'%s') - FAILED", workItemWrapper.workItemId()); + return new AccessConfigWorkItemResult(AccessConfigWorkItemStatus.DEVICE_CONFIG_FAILURE, e.getMessage()); + } + } + + @Override + protected void finishProcessing(WorkItemWrapper workItemWrapper, AccessConfigWorkItemResult workItemResult) { + var accessConfigWorkItemStatus = new AccessConfigWorkItemStatusWrapper( + workItemWrapper.workItemId(), + workItemResult.getStatus(), + workItemResult.getMessage()); + updateAccessConfigWorkItemStatus(accessConfigWorkItemStatus); + } + + @Override + protected JobResult mapToJobResult(AccessConfigWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case SUCCESS -> JobStatus.DONE; + case DEVICE_CONFIG_FAILURE -> JobStatus.FAILED; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + public JobType getJobType() { + return JobType.ACCESS_CONFIG; + } + + @Override + public JobAction getJobAction() { + return JobAction.SET; + } + + private void updateAccessConfigWorkItemStatus(AccessConfigWorkItemStatusWrapper accessConfigWorkItemStatus) { + var accessConfigWorkItemUpdateDTO = new AccessConfigWorkItemUpdateDTO(); + accessConfigWorkItemUpdateDTO.setStatus(accessConfigWorkItemStatus.status()); + accessConfigWorkItemUpdateDTO.setMessage(accessConfigWorkItemStatus.message()); + + communicationServiceController.updateAccessConfigWorkItem(accessConfigWorkItemStatus.workItemId(), accessConfigWorkItemUpdateDTO); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/configworkitem/utils/Bcd.java b/src/main/java/io/gec/raw/connector/access/configworkitem/utils/Bcd.java new file mode 100755 index 0000000..91d0821 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/configworkitem/utils/Bcd.java @@ -0,0 +1,44 @@ +package io.gec.raw.connector.access.configworkitem.utils; + +public class Bcd { + + public String decimalToBcd(long num) { + if (num < 0) throw new IllegalArgumentException( + "The method decimalToBcd doesn't support negative numbers." + + " Invalid argument: " + num); + + int digits = 0; + + long temp = num; + while (temp != 0) { + digits++; + temp /= 10; + } + + int byteLen = digits % 2 == 0 ? digits / 2 : (digits + 1) / 2; + + byte[] bcd = new byte[byteLen]; + + for (int i = 0; i < digits; i++) { + byte tmp = (byte) (num % 10); + + if (i % 2 == 0) { + bcd[i / 2] = tmp; + } else { + bcd[i / 2] |= (byte) (tmp << 4); + } + + num /= 10; + } + + for (int i = 0; i < byteLen / 2; i++) { + byte tmp = bcd[i]; + bcd[i] = bcd[byteLen - i - 1]; + bcd[byteLen - i - 1] = tmp; + } + + return new String(bcd); + } + + +} diff --git a/src/main/java/io/gec/raw/connector/access/connectionworkitem/domain/ConnectionWorkItemResult.java b/src/main/java/io/gec/raw/connector/access/connectionworkitem/domain/ConnectionWorkItemResult.java new file mode 100755 index 0000000..6a67cfb --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/connectionworkitem/domain/ConnectionWorkItemResult.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.access.connectionworkitem.domain; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemStatus; +import io.gec.raw.connector.job.domain.WorkItemResult; +import lombok.Getter; + +@Getter +public class ConnectionWorkItemResult extends WorkItemResult { + private final ConnectionWorkItemStatus status; + + public ConnectionWorkItemResult(ConnectionWorkItemStatus status, String message) { + super(message); + this.status = status; + } + + public ConnectionWorkItemResult(ConnectionWorkItemStatus status) { + this(status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemDTO.java b/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemDTO.java new file mode 100755 index 0000000..726c80c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemDTO.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.access.connectionworkitem.dto; + +import io.gec.raw.connector.job.domain.WorkItem; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +public class ConnectionWorkItemDTO extends WorkItem { + + private UUID protocolId; + + private UUID deviceId; + + private ConnectionWorkItemStatus status; + + private List connectionPropertyValues; +} diff --git a/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemStatus.java b/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemStatus.java new file mode 100755 index 0000000..ad38639 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemStatus.java @@ -0,0 +1,9 @@ +package io.gec.raw.connector.access.connectionworkitem.dto; + +public enum ConnectionWorkItemStatus { + CREATED, + IN_PROGRESS, + QUEUED, + SUCCESS, + DEVICE_CONNECTION_FAILURE +} diff --git a/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemUpdateDTO.java b/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemUpdateDTO.java new file mode 100755 index 0000000..c9c7785 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemUpdateDTO.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.access.connectionworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ConnectionWorkItemUpdateDTO { + private ConnectionWorkItemStatus status; +} diff --git a/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemValueDTO.java b/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemValueDTO.java new file mode 100755 index 0000000..03e1186 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/connectionworkitem/dto/ConnectionWorkItemValueDTO.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.access.connectionworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class ConnectionWorkItemValueDTO { + + private UUID protocolPropertyId; + + private String protocolPropertyValue; + +} diff --git a/src/main/java/io/gec/raw/connector/access/connectionworkitem/handler/CheckConnectionJobHandler.java b/src/main/java/io/gec/raw/connector/access/connectionworkitem/handler/CheckConnectionJobHandler.java new file mode 100755 index 0000000..63483dd --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/connectionworkitem/handler/CheckConnectionJobHandler.java @@ -0,0 +1,95 @@ +package io.gec.raw.connector.access.connectionworkitem.handler; + +import io.gec.raw.connector.access.connectionworkitem.domain.ConnectionWorkItemResult; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemStatus; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemUpdateDTO; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.control.FtpController; +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.WorkItemHandler; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class CheckConnectionJobHandler extends WorkItemHandler { + @Inject + FtpController ftpController; + @Inject + DeviceController deviceController; + + @Override + protected Optional getWorkItem(UUID workItemId) { + return communicationServiceController.fetchAccessConnectionWorkItem(workItemId); + } + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + updateAccessWorkItemStatus(workItemWrapper.workItemId(), ConnectionWorkItemStatus.IN_PROGRESS); + } + + @ActivateRequestContext + @Override + protected ConnectionWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + logger.infof("Processing ConnectionWorkItem (ID:'%s') ...", workItemWrapper.workItemId()); + ConnectionWorkItemStatus accessWorkItemStatus; + ConnectionWorkItemDTO workItem = workItemWrapper.workItem(); + try { + Device rootDevice = deviceController.getDeviceByCommSvcId(workItem.getDeviceId()); + + accessWorkItemStatus = ftpController.checkSftpConnection(workItem.getConnectionPropertyValues(), rootDevice.getDeviceURL()) + ? ConnectionWorkItemStatus.SUCCESS + : ConnectionWorkItemStatus.DEVICE_CONNECTION_FAILURE; + } catch (SftpException e) { + accessWorkItemStatus = ConnectionWorkItemStatus.DEVICE_CONNECTION_FAILURE; + logger.errorf(e, "Processing ConnectionWorkItem (ID:'%s') - FAILED", workItemWrapper.workItemId()); + } + + return new ConnectionWorkItemResult(accessWorkItemStatus); + } + + @Override + protected void finishProcessing(WorkItemWrapper workItemWrapper, ConnectionWorkItemResult workItemResult) { + updateAccessWorkItemStatus(workItemWrapper.workItemId(), workItemResult.getStatus()); + } + + @Override + protected JobResult mapToJobResult(ConnectionWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case SUCCESS -> JobStatus.DONE; + case DEVICE_CONNECTION_FAILURE -> JobStatus.FAILED; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + public JobType getJobType() { + return JobType.ACCESS_CONNECTION; + } + + @Override + public JobAction getJobAction() { + return JobAction.EXECUTE; + } + + private void updateAccessWorkItemStatus(UUID workItemId, ConnectionWorkItemStatus accessWorkItemStatus) { + var accessWorkItemUpdateDTO = new ConnectionWorkItemUpdateDTO(); + accessWorkItemUpdateDTO.setStatus(accessWorkItemStatus); + + communicationServiceController.updateAccessConnectionWorkItem(workItemId, accessWorkItemUpdateDTO); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/control/AccessLogParser.java b/src/main/java/io/gec/raw/connector/access/logworkitem/control/AccessLogParser.java new file mode 100755 index 0000000..f517544 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/control/AccessLogParser.java @@ -0,0 +1,225 @@ +package io.gec.raw.connector.access.logworkitem.control; + +import io.gec.raw.connector.access.logworkitem.dto.AccessLogDTO; +import io.gec.raw.connector.access.logworkitem.dto.AccessLogItemDTO; +import io.gec.raw.connector.access.utils.ParserHelper; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Path; +import java.time.OffsetDateTime; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@ApplicationScoped +public class AccessLogParser { + private static final String REGEX_CMC = + "(((\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d)*\\+(\\d{2}):(\\d{2}))(.*))((Device (\\d+))\\s\\(([^\\(]*)\\)[:|\\s](.*))"; + private static final String REGEX_CMC_ACCESS_CONFIG_MESSAGE = + "(((\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d)*\\+(\\d{2}):(\\d{2}))(.*))(Access\\sConfiguration(.*))"; + + private static final String REGEX_CMC3_V1 = "((\\d{4})-(\\d{2})-(\\d{2})/(\\d{2}):(\\d{2}):(\\d{2}))(.*)((Device (\\d+))\\s\\(([^\\(]*)\\)[:|\\s](.*))"; + private static final String REGEX_CMC3_V2 = "((\\d{2})\\.(\\d{2})\\.(\\d{4})/(\\d{2}):(\\d{2}):(\\d{2}))(.*)((Device (\\d+))\\s\\(([^\\(]*)\\)[:|\\s](.*))"; + private static final String REGEX_CMC3_ACCESS_CONFIG_MESSAGE_V1 = "((\\d{4})-(\\d{2})-(\\d{2})/(\\d{2}):(\\d{2}):(\\d{2}))(.*)(Configuration(.*))"; + private static final String REGEX_CMC3_ACCESS_CONFIG_MESSAGE_V2 = "((\\d{2})\\.(\\d{2})\\.(\\d{4})/(\\d{2}):(\\d{2}):(\\d{2}))(.*)(Configuration(.*))"; + + private static final int CMC_DATE_TIME_INDEX = 2; + private static final int CMC_DEVICE_NAME_INDEX = 14; + private static final int CMC_DEVICE_NUMBER_INDEX = 15; + private static final int CMC_DEVICE_DESCRIPTION_INDEX = 16; + private static final int CMC_MESSAGE_INDEX = 17; + private static final int CMC_CONFIG_MESSAGE_INDEX = 13; + + private static final int CMC3_DATE_TIME_INDEX = 1; + private static final int CMC3_DEVICE_NAME_INDEX = 10; + private static final int CMC3_DEVICE_NUMBER_INDEX = 11; + private static final int CMC3_DEVICE_DESCRIPTION_INDEX = 12; + private static final int CMC3_MESSAGE_INDEX = 13; + private static final int CMC3_CONFIG_MESSAGE_INDEX = 9; + + private final Pattern patternCmc = Pattern.compile(REGEX_CMC, Pattern.MULTILINE); + private final Pattern patternAccessConfigCmcMessage = Pattern.compile(REGEX_CMC_ACCESS_CONFIG_MESSAGE, Pattern.MULTILINE); + + private final Pattern patternCmc3V1 = Pattern.compile(REGEX_CMC3_V1, Pattern.MULTILINE); + private final Pattern patternCmc3V2 = Pattern.compile(REGEX_CMC3_V2, Pattern.MULTILINE); + private final Pattern patternAccessConfigCmc3MessageV1 = Pattern.compile(REGEX_CMC3_ACCESS_CONFIG_MESSAGE_V1, Pattern.MULTILINE); + private final Pattern patternAccessConfigCmc3MessageV2 = Pattern.compile(REGEX_CMC3_ACCESS_CONFIG_MESSAGE_V2, Pattern.MULTILINE); + + @Inject + ParserHelper parserHelper; + + @Inject + DeviceController deviceController; + + public AccessLogDTO parseCmcFileContent(Path filePath, + OffsetDateTime fromDateTime, + UUID rootDeviceId, + List deviceNumberList) throws IOException { + List accessLogItems = new ArrayList<>(); + HashMap devicesMap = new HashMap<>(); + + try (BufferedReader br = new BufferedReader(new FileReader(filePath.toFile()))) { + String line; + while ((line = br.readLine()) != null) { + Matcher matcher = patternCmc.matcher(line); + if (matcher.find()) { + OffsetDateTime dateTime = parserHelper.getOffsetDateTimeFromString(matcher.group(CMC_DATE_TIME_INDEX)); + + if (!dateTime.isBefore(fromDateTime) + && deviceNumberList.contains(Integer.parseInt(matcher.group(CMC_DEVICE_NUMBER_INDEX)))) { + accessLogItems.add(createAccessLogItemDTO(matcher, false, dateTime, rootDeviceId, devicesMap)); + } + } else { + Matcher matcherAccessConfigMessage = patternAccessConfigCmcMessage.matcher(line); + if (matcherAccessConfigMessage.find()) { + OffsetDateTime dateTime = parserHelper.getOffsetDateTimeFromString(matcherAccessConfigMessage.group(CMC_DATE_TIME_INDEX)); + + if (!dateTime.isBefore(fromDateTime)) { + accessLogItems.add(createAccessLogItemDTOForConfigMessage(matcherAccessConfigMessage, false, dateTime)); + } + } + } + } + } + + AccessLogDTO accessLogDTO = new AccessLogDTO(); + accessLogDTO.setAccessLogItems(accessLogItems); + + return accessLogDTO; + } + + public AccessLogDTO parseCmc3FileContent(Path filePath, + OffsetDateTime fromDateTime, + UUID rootDeviceId, + List deviceNumberList) throws IOException { + List accessLogItems = new ArrayList<>(); + HashMap devicesMap = new HashMap<>(); + String dateTimeFormat = null; + + try (BufferedReader br = new BufferedReader(new FileReader(filePath.toFile()))) { + String line; + while ((line = br.readLine()) != null) { + boolean accessLogEntry = false; + Optional matcherOptional = findMatcher(line, patternCmc3V1, patternCmc3V2); + + if (matcherOptional.isPresent()) { + accessLogEntry = true; + } else { + matcherOptional = findMatcher(line, patternAccessConfigCmc3MessageV1, patternAccessConfigCmc3MessageV2); + } + + if (matcherOptional.isEmpty()) { + continue; + } + + Matcher matcher = matcherOptional.get(); + + dateTimeFormat = dateTimeFormat != null ? dateTimeFormat : getDateTimeFormat(matcher.pattern()); + OffsetDateTime dateTime = parserHelper.parseDateTime(matcher.group(CMC3_DATE_TIME_INDEX), dateTimeFormat); + + if (accessLogEntry) { + tryToAddAccessLogCmc3(matcher, fromDateTime, dateTime, rootDeviceId, deviceNumberList, devicesMap, accessLogItems); + } else { + tryToAddAccessConfigLogCmc3(matcher, fromDateTime, dateTime, accessLogItems); + } + } + } + + AccessLogDTO accessLogDTO = new AccessLogDTO(); + accessLogDTO.setAccessLogItems(accessLogItems); + + return accessLogDTO; + } + + private Optional findMatcher(String line, Pattern... patterns) { + if (patterns == null) { + return Optional.empty(); + } + + for (Pattern pattern : patterns) { + Matcher matcher = pattern.matcher(line); + if (matcher.matches()) { + return Optional.of(matcher); + } + } + + return Optional.empty(); + } + + private String getDateTimeFormat(Pattern pattern) { + if (patternCmc3V2.equals(pattern) || patternAccessConfigCmc3MessageV2.equals(pattern)) { + return ParserHelper.DATETIME_DAY_MONTH_YEAR_WITH_DOTS; + } + + return ParserHelper.DATETIME_YEAR_MONTH_DAY_WITH_HYPHENS; + } + + private void tryToAddAccessLogCmc3(Matcher matcher, + OffsetDateTime fromDateTime, + OffsetDateTime currentDateTime, + UUID rootDeviceId, + List deviceNumberList, + HashMap devicesMap, + List accessLogItems) { + if (currentDateTime.isBefore(fromDateTime)) { + return; + } + + if (!deviceNumberList.contains(Integer.parseInt(matcher.group(CMC3_DEVICE_NUMBER_INDEX)))) { + return; + } + + accessLogItems.add(createAccessLogItemDTO(matcher, true, currentDateTime, rootDeviceId, devicesMap)); + } + + private void tryToAddAccessConfigLogCmc3(Matcher matcher, + OffsetDateTime fromDateTime, + OffsetDateTime currentDateTime, + List accessLogItems) { + if (currentDateTime.isBefore(fromDateTime)) { + return; + } + + accessLogItems.add(createAccessLogItemDTOForConfigMessage(matcher, true, currentDateTime)); + } + + private AccessLogItemDTO createAccessLogItemDTOForConfigMessage(Matcher matcher, boolean isCmc3, OffsetDateTime currentDateTime) { + AccessLogItemDTO accessLogItemDTO = new AccessLogItemDTO(); + accessLogItemDTO.setDateTime(currentDateTime); + accessLogItemDTO.setMessage(matcher.group(isCmc3 ? CMC3_CONFIG_MESSAGE_INDEX : CMC_CONFIG_MESSAGE_INDEX)); + return accessLogItemDTO; + } + + private AccessLogItemDTO createAccessLogItemDTO(Matcher matcher, + boolean isCmc3, + OffsetDateTime currentDateTime, + UUID rootDeviceId, + HashMap devicesMap) { + AccessLogItemDTO accessLogItemDTO = new AccessLogItemDTO(); + accessLogItemDTO.setDateTime(currentDateTime); + accessLogItemDTO.setDeviceName(matcher.group(isCmc3 ? CMC3_DEVICE_NAME_INDEX : CMC_DEVICE_NAME_INDEX)); + int deviceNumber = Integer.parseInt(matcher.group(isCmc3 ? CMC3_DEVICE_NUMBER_INDEX : CMC_DEVICE_NUMBER_INDEX)); + accessLogItemDTO.setDeviceNumber(deviceNumber); + accessLogItemDTO.setDeviceDescription( + matcher.group(isCmc3 ? CMC3_DEVICE_DESCRIPTION_INDEX : CMC_DEVICE_DESCRIPTION_INDEX)); + accessLogItemDTO.setMessage(matcher.group(isCmc3 ? CMC3_MESSAGE_INDEX : CMC_MESSAGE_INDEX)); + Device device; + if (devicesMap.containsKey(deviceNumber)) { + device = devicesMap.get(deviceNumber); + } else { + device = deviceController.getDeviceByDeviceIndex(rootDeviceId, deviceNumber); + devicesMap.put(deviceNumber, device); + } + if (device != null) { + accessLogItemDTO.setDeviceId(device.getCommServiceId()); + } + + return accessLogItemDTO; + } +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/domain/AccessLogWorkItemResult.java b/src/main/java/io/gec/raw/connector/access/logworkitem/domain/AccessLogWorkItemResult.java new file mode 100755 index 0000000..6df87d1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/domain/AccessLogWorkItemResult.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.access.logworkitem.domain; + +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemStatus; +import io.gec.raw.connector.job.domain.WorkItemResult; +import lombok.Getter; + +@Getter +public class AccessLogWorkItemResult extends WorkItemResult { + private final LogWorkItemStatus status; + + public AccessLogWorkItemResult(LogWorkItemStatus status, String message) { + super(message); + this.status = status; + } + + public AccessLogWorkItemResult(LogWorkItemStatus status) { + this(status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/domain/AccessLogWorkItemStatusWrapper.java b/src/main/java/io/gec/raw/connector/access/logworkitem/domain/AccessLogWorkItemStatusWrapper.java new file mode 100755 index 0000000..ab44a95 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/domain/AccessLogWorkItemStatusWrapper.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.access.logworkitem.domain; + +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemStatus; + +import java.util.UUID; + +public record AccessLogWorkItemStatusWrapper(UUID workItemId, LogWorkItemStatus status, String message) { + public AccessLogWorkItemStatusWrapper(UUID workItemId, LogWorkItemStatus status) { + this(workItemId, status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/dto/AccessLogDTO.java b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/AccessLogDTO.java new file mode 100755 index 0000000..0d1ff35 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/AccessLogDTO.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.access.logworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +public class AccessLogDTO { + UUID workItemId; + List accessLogItems; + +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/dto/AccessLogItemDTO.java b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/AccessLogItemDTO.java new file mode 100755 index 0000000..4750cdd --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/AccessLogItemDTO.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.access.logworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Getter +@Setter +public class AccessLogItemDTO { + private OffsetDateTime dateTime; + private UUID deviceId; + private String deviceName; + private int deviceNumber; + private String deviceDescription; + private String message; + +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemDTO.java b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemDTO.java new file mode 100755 index 0000000..e7efec2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemDTO.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.access.logworkitem.dto; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemDTO; +import io.gec.raw.connector.job.domain.WorkItem; +import lombok.Getter; +import lombok.Setter; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Getter +@Setter +public class LogWorkItemDTO extends WorkItem { + private UUID id; + private ConnectionWorkItemDTO connectionWorkItem; + private LogWorkItemStatus status; + private OffsetDateTime dateFrom; +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemStatus.java b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemStatus.java new file mode 100755 index 0000000..ae0bb5b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemStatus.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.access.logworkitem.dto; + +public enum LogWorkItemStatus { + CREATED, + IN_PROGRESS, + DONE, + DEVICE_ACCESS_FAILURE, + LOG_FETCH_FAILURE, + LOG_PARSE_FAILURE +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemUpdateDTO.java b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemUpdateDTO.java new file mode 100755 index 0000000..e183413 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/dto/LogWorkItemUpdateDTO.java @@ -0,0 +1,12 @@ +package io.gec.raw.connector.access.logworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LogWorkItemUpdateDTO { + + private LogWorkItemStatus status; + private String message; +} diff --git a/src/main/java/io/gec/raw/connector/access/logworkitem/handler/AccessLogJobHandler.java b/src/main/java/io/gec/raw/connector/access/logworkitem/handler/AccessLogJobHandler.java new file mode 100755 index 0000000..da67944 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/logworkitem/handler/AccessLogJobHandler.java @@ -0,0 +1,120 @@ +package io.gec.raw.connector.access.logworkitem.handler; + +import io.gec.raw.connector.access.logworkitem.domain.AccessLogWorkItemResult; +import io.gec.raw.connector.access.logworkitem.domain.AccessLogWorkItemStatusWrapper; +import io.gec.raw.connector.access.logworkitem.dto.AccessLogDTO; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemDTO; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemStatus; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemUpdateDTO; +import io.gec.raw.connector.communicationservice.exception.CommunicationServiceException; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.control.FtpController; +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.WorkItemHandler; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; + +import java.io.IOException; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class AccessLogJobHandler extends WorkItemHandler { + @Inject + FtpController ftpController; + @Inject + DeviceController deviceController; + + @Override + protected Optional getWorkItem(UUID workItemId) { + return communicationServiceController.fetchAccessLogWorkItem(workItemId); + } + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + var accessLogWorkItemStatus = new AccessLogWorkItemStatusWrapper(workItemWrapper.workItemId(), LogWorkItemStatus.IN_PROGRESS); + updateLogWorkItemStatus(accessLogWorkItemStatus); + } + + @ActivateRequestContext + @Override + protected AccessLogWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + logger.infof("Processing AccessLogWorkItem (ID:'%s') ...", workItemWrapper.workItemId()); + UUID workItemId = workItemWrapper.workItemId(); + LogWorkItemDTO workItem = workItemWrapper.workItem(); + + try { + Device rootDevice = deviceController.getDeviceByCommSvcId(workItem.getConnectionWorkItem().getDeviceId()); + List deviceNumbers = deviceController.getAccessDeviceIndexesByRootDeviceId(rootDevice.getId()); + + var sftpData = ftpController.createSftpData(workItem.getConnectionWorkItem().getConnectionPropertyValues(), rootDevice.getDeviceURL()); + AccessLogDTO accessLogDTO = ftpController.getLoggingFile(sftpData, workItem.getDateFrom(), rootDevice.getId(), deviceNumbers); + accessLogDTO.setWorkItemId(workItemId); + communicationServiceController.createAccessLogNotifications(accessLogDTO); + + return new AccessLogWorkItemResult(LogWorkItemStatus.DONE, getAccessLogResultMessage(accessLogDTO)); + } catch (IllegalArgumentException | SftpException e) { + logger.errorf(e, "Processing AccessLogWorkItem (ID:'%s') - FAILED", workItemId); + return new AccessLogWorkItemResult(LogWorkItemStatus.LOG_FETCH_FAILURE, e.getMessage()); + } catch (CommunicationServiceException | IOException e) { + logger.errorf(e, "Processing AccessLogWorkItem (ID:'%s') - FAILED", workItemId); + return new AccessLogWorkItemResult(LogWorkItemStatus.LOG_PARSE_FAILURE, e.getMessage()); + } catch (Exception e) { + logger.errorf(e, "Processing AccessLogWorkItem (ID:'%s') - FAILED", workItemId); + return new AccessLogWorkItemResult(LogWorkItemStatus.DEVICE_ACCESS_FAILURE, e.getMessage()); + } + } + + private String getAccessLogResultMessage(AccessLogDTO accessLogDTO) { + //INFO: DO NOT CHANGE the format of message! It is used by frontend and this must be agreed upon before changing it. + return String.format("Access log items found: '%s'", accessLogDTO.getAccessLogItems().size()); + } + + @Override + protected void finishProcessing(WorkItemWrapper workItemWrapper, AccessLogWorkItemResult workItemResult) { + var accessLogWorkItemStatus = new AccessLogWorkItemStatusWrapper( + workItemWrapper.workItemId(), + workItemResult.getStatus(), + workItemResult.getMessage()); + updateLogWorkItemStatus(accessLogWorkItemStatus); + } + + @Override + protected JobResult mapToJobResult(AccessLogWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case DONE -> JobStatus.DONE; + case LOG_PARSE_FAILURE, LOG_FETCH_FAILURE, DEVICE_ACCESS_FAILURE -> JobStatus.FAILED; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + public JobType getJobType() { + return JobType.ACCESS_LOG; + } + + @Override + public JobAction getJobAction() { + return JobAction.GET; + } + + private void updateLogWorkItemStatus(AccessLogWorkItemStatusWrapper logWorkItemStatus) { + var logWorkItemUpdateDTO = new LogWorkItemUpdateDTO(); + logWorkItemUpdateDTO.setStatus(logWorkItemStatus.status()); + logWorkItemUpdateDTO.setMessage(logWorkItemStatus.message()); + + communicationServiceController.updateAccessLogWorkItem(logWorkItemStatus.workItemId(), logWorkItemUpdateDTO); + } +} diff --git a/src/main/java/io/gec/raw/connector/access/utils/ParserHelper.java b/src/main/java/io/gec/raw/connector/access/utils/ParserHelper.java new file mode 100755 index 0000000..bbf2e0c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/access/utils/ParserHelper.java @@ -0,0 +1,38 @@ +package io.gec.raw.connector.access.utils; + +import jakarta.enterprise.context.ApplicationScoped; + +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; + +@ApplicationScoped +public class ParserHelper { + + public static final String DATETIME_YEAR_MONTH_DAY_WITH_HYPHENS = "yyyy-MM-dd/HH:mm:ss"; + public static final String DATETIME_DAY_MONTH_YEAR_WITH_DOTS = "dd.MM.yyyy/HH:mm:ss"; + + public boolean toBoolean(String str) { + if (str == null) { + return false; + } else if (str.equalsIgnoreCase("true") || str.equals("1")) { + return true; + } else if (str.equalsIgnoreCase("false") || str.equals("0")) { + return false; + } else { + throw new IllegalArgumentException("The String did not match either specified value"); + } + } + + public OffsetDateTime getOffsetDateTimeFromString(String dateTime) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + return OffsetDateTime.parse(dateTime, dateTimeFormatter); + } + + public OffsetDateTime parseDateTime(String dateTime, String dateTimeFormat) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateTimeFormat); + LocalDateTime localDateTime = LocalDateTime.parse(dateTime, dateTimeFormatter); + return localDateTime.atOffset(ZoneOffset.UTC); + } +} diff --git a/src/main/java/io/gec/raw/connector/base/entity/BaseEntity.java b/src/main/java/io/gec/raw/connector/base/entity/BaseEntity.java new file mode 100755 index 0000000..512cb91 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/base/entity/BaseEntity.java @@ -0,0 +1,41 @@ +package io.gec.raw.connector.base.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.time.OffsetDateTime; + +@Setter +@Getter +@MappedSuperclass +public abstract class BaseEntity implements Serializable { + + @Column( + nullable = false, + updatable = false + ) + protected OffsetDateTime created; + @Column( + nullable = false + ) + protected OffsetDateTime stamp; + + protected BaseEntity() { + } + + @PrePersist + protected void onCreate() { + this.created = OffsetDateTime.now(); + this.stamp = OffsetDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + this.stamp = OffsetDateTime.now(); + } +} diff --git a/src/main/java/io/gec/raw/connector/base/entity/SimpleBaseEntity.java b/src/main/java/io/gec/raw/connector/base/entity/SimpleBaseEntity.java new file mode 100755 index 0000000..38b64cb --- /dev/null +++ b/src/main/java/io/gec/raw/connector/base/entity/SimpleBaseEntity.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.base.entity; + +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.UuidGenerator; + +import java.util.UUID; + +@Setter +@Getter +@MappedSuperclass +public abstract class SimpleBaseEntity extends BaseEntity { + + @Id + @UuidGenerator + protected UUID id; +} diff --git a/src/main/java/io/gec/raw/connector/base/entity/SimpleBaseEntityWithPredefinedId.java b/src/main/java/io/gec/raw/connector/base/entity/SimpleBaseEntityWithPredefinedId.java new file mode 100755 index 0000000..6bb3485 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/base/entity/SimpleBaseEntityWithPredefinedId.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.base.entity; + +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Setter +@Getter +@MappedSuperclass +public abstract class SimpleBaseEntityWithPredefinedId extends BaseEntity { + + @Id + protected UUID id; +} diff --git a/src/main/java/io/gec/raw/connector/base/entity/SubscribableEntity.java b/src/main/java/io/gec/raw/connector/base/entity/SubscribableEntity.java new file mode 100755 index 0000000..702d799 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/base/entity/SubscribableEntity.java @@ -0,0 +1,25 @@ +package io.gec.raw.connector.base.entity; + + +import io.gec.raw.connector.componentmode.dto.ComponentMode; + +import java.util.UUID; + +public interface SubscribableEntity { + + UUID getId(); + + int getSubscriptionInterval(); + + ComponentMode getMode(); + + boolean isInitialValueFetched(); + + default boolean isNotInitialValueFetched() { + return !isInitialValueFetched(); + } + + default boolean isSubscribed() { + return ComponentMode.OPERATION.equals(getMode()) && getSubscriptionInterval() > 0; + } +} diff --git a/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationService.java b/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationService.java new file mode 100755 index 0000000..2852fa3 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationService.java @@ -0,0 +1,205 @@ +package io.gec.raw.connector.communicationservice.control; + +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemDTO; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemUpdateDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemUpdateDTO; +import io.gec.raw.connector.access.logworkitem.dto.AccessLogDTO; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemDTO; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemUpdateDTO; +import io.gec.raw.connector.communicationservice.exception.CommunicationServiceResponseExceptionMapper; +import io.gec.raw.connector.componentmode.dto.ChangeModeRequestDTO; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.connector.dto.ConnectorRequestDTO; +import io.gec.raw.connector.connector.dto.ConnectorResponseDTO; +import io.gec.raw.connector.device.dto.DeviceDTO; +import io.gec.raw.connector.device.dto.DeviceResponseDTO; +import io.gec.raw.connector.deviceproperty.dto.PropertyValueRequestDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemUpdateDTO; +import io.gec.raw.connector.driver.dto.DriverWorkItemDTO; +import io.gec.raw.connector.driver.dto.DriverWorkItemUpdateDTO; +import io.gec.raw.connector.firmware.dto.FirmwareFileMetadataDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemUpdateRequestDTO; +import io.gec.raw.connector.job.dto.JobDTO; +import io.gec.raw.connector.job.dto.JobStateDTO; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemDTO; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemUpdateDTO; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemDTO; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemUpdateDTO; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.PATCH; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.rest.client.annotation.RegisterProvider; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +@RegisterRestClient(configKey = "communication-service") +@RegisterProvider(CommunicationServiceResponseExceptionMapper.class) +public interface CommunicationService { + + @GET + @Path("/api/resources/jobs") + List getJobs( + @QueryParam("connectorId") UUID connectorId, + @QueryParam("sinceDateTime") String sinceDateTime + ); + + @GET + @Path("api/resources/discoveryWorkItems/{discoveryWorkItemId}") + DiscoveryWorkItemDTO getDiscoveryWorkItemById(@PathParam("discoveryWorkItemId") UUID discoveryWorkItemId); + + @PUT + @Path("/api/resources/discoveryWorkItems/{id}") + DiscoveryWorkItemDTO updateDiscoveryWorkItem( + @PathParam("id") UUID discoveryWorkItemId, + DiscoveryWorkItemUpdateDTO discoveryWorkItemUpdateDTO + ); + + @PUT + @Path("/api/resources/discoveryWorkItems/deviceDiscovery/{id}") + Boolean addLatestDeviceDiscoveryAndArchiveOldDeviceDiscovery( + @PathParam("id") UUID discoveryWorkItemId, + UUID deviceId + ); + + @PUT + @Path("/api/resources/variables/values") + Boolean updateSubscribedVariable( + UpdateVariableRequestDTO updateVariableRequestDTO + ); + + @POST + @Path("/api/resources/variables/values/collection") + Boolean updateSubscribedVariables( + List updateVariableRequestDTOs + ); + + @PUT + @Path("/api/resources/deviceProperties/values") + Boolean updateDeviceProperty( + PropertyValueRequestDTO propertyValueRequestDTO + ); + + @POST + @Path("api/resources/connectors/{connectorId}/status") + Boolean updateConnectorStatus( + @PathParam("connectorId") UUID connectorId + ); + + @POST + @Path("api/resources/devices") + DeviceResponseDTO createOrUpdateDevicesWithSubDevices(DeviceDTO deviceDTO); + + @POST + @Path("/api/resources/connectors") + ConnectorResponseDTO registerConnector(ConnectorRequestDTO dto); + + @POST + @Path("api/resources/accessLogs") + void createAccessLogNotifications(AccessLogDTO accessLogDTO); + + @GET + @Path("api/resources/connectionWorkItems/{id}") + ConnectionWorkItemDTO getAccessConnectionWorkItem(@PathParam("id") UUID connectionWorkItemId); + + @PATCH + @Path("api/resources/connectionWorkItems/{id}") + ConnectionWorkItemDTO updateAccessConnectionWorkItem(@PathParam("id") UUID connectionWorkItemId, + ConnectionWorkItemUpdateDTO connectionWorkItemUpdateDTO); + + @PATCH + @Path("api/resources/logWorkItems/{id}") + LogWorkItemDTO updateAccessLogWorkItem(@PathParam("id") UUID logWorkItemId, + LogWorkItemUpdateDTO logWorkItemUpdateDTO); + + @GET + @Path("/api/resources/logWorkItems/{id}") + LogWorkItemDTO getAccessLogWorkItem(@PathParam("id") UUID logWorkItemId); + + @GET + @Path("/api/resources/accessConfigWorkItems/{id}") + AccessConfigWorkItemDTO getAccessConfigWorkItem(@PathParam("id") UUID accessConfigWorkItemId); + + @PATCH + @Path("api/resources/accessConfigWorkItems/{id}") + AccessConfigWorkItemDTO updateAccessConfigWorkItem(@PathParam("id") UUID accessConfigWorkItemId, + AccessConfigWorkItemUpdateDTO accessConfigWorkItemUpdateDTO); + + @PATCH + @Path("api/resources/pauseWorkItems/{id}") + PauseWorkItemDTO updatePauseWorkItem(@PathParam("id") UUID pauseWorkItemId, + PauseWorkItemUpdateDTO pauseWorkItemUpdateDTO); + + @GET + @Path("/api/resources/pauseWorkItems/{id}") + PauseWorkItemDTO getPauseWorkItem( + @PathParam("id") UUID pauseWorkItemId + ); + + @GET + @Path("/api/resources/driverWorkItems/{id}") + DriverWorkItemDTO getDriverWorkItem( + @PathParam("id") UUID driverWorkItemId + ); + + @PATCH + @Path("api/resources/driverWorkItems/{id}") + DriverWorkItemDTO updateDriverWorkItem(@PathParam("id") UUID driverWorkItemId, + DriverWorkItemUpdateDTO driverWorkItemUpdateDTO); + + @POST + @Path("api/resources/jobs/{jobId}/states") + JobStateDTO createJobState(@PathParam("jobId") UUID jobId, + JobStateDTO jobStateDTO); + + @GET + @Path("/api/resources/setWorkItems/{id}") + SetWorkItemDTO getSetWorkItem(@PathParam("id") UUID setWorkItemId); + + @PATCH + @Path("api/resources/setWorkItems/{id}") + void updateSetWorkItem(@PathParam("id") UUID setWorkItemId, + SetWorkItemUpdateDTO setWorkItemUpdateDTO); + + @GET + @Path("api/resources/firmwareWorkItems/{id}") + FirmwareWorkItemDTO getFirmwareWorkItem(@PathParam("id") UUID firmwareWorkItemId); + + @PATCH + @Path("api/resources/firmwareWorkItems/{id}") + void updateFirmwareWorkItem(@PathParam("id") UUID firmwareWorkItemId, + FirmwareWorkItemUpdateRequestDTO firmwareWorkItemUpdateRequestDTO); + + @GET + @Path("api/resources/firmwareWorkItems/{workItemId}/files/{firmwareId}/metadata") + FirmwareFileMetadataDTO getFirmwareFileMetadata(@PathParam("firmwareId") UUID firmwareId, + @PathParam("workItemId") UUID workItemId); + + @GET + @Path("api/resources/firmwareWorkItems/{workItemId}/files/{firmwareId}") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + Response getFirmwareFileStream(@PathParam("firmwareId") UUID firmwareId, + @PathParam("workItemId") UUID workItemId); + + @PUT + @Path("api/resources/componentModes/") + void changeComponentMode(ChangeModeRequestDTO changeModeRequestDTO); + + @PUT + @Path("api/resources/componentModes/{id}") + JobStateDTO changeComponentModeForDeviceTree(@PathParam("id") UUID deviceId, ComponentMode componentMode); +} diff --git a/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceController.java b/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceController.java new file mode 100755 index 0000000..3750af2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceController.java @@ -0,0 +1,356 @@ +package io.gec.raw.connector.communicationservice.control; + +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemDTO; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemUpdateDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemUpdateDTO; +import io.gec.raw.connector.access.logworkitem.dto.AccessLogDTO; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemDTO; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemUpdateDTO; +import io.gec.raw.connector.communicationservice.exception.CommunicationServiceException; +import io.gec.raw.connector.componentmode.dto.ChangeModeRequestDTO; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.config.entity.ConnectorConfig; +import io.gec.raw.connector.connector.dto.ConnectorRequestDTO; +import io.gec.raw.connector.connector.dto.ConnectorResponseDTO; +import io.gec.raw.connector.deviceproperty.dto.PropertyValueRequestDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemUpdateDTO; +import io.gec.raw.connector.driver.dto.DriverWorkItemDTO; +import io.gec.raw.connector.driver.dto.DriverWorkItemUpdateDTO; +import io.gec.raw.connector.firmware.dto.FirmwareFileMetadataDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemUpdateRequestDTO; +import io.gec.raw.connector.job.dto.JobDTO; +import io.gec.raw.connector.job.dto.JobStateDTO; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemDTO; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemUpdateDTO; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemDTO; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemUpdateDTO; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.jboss.logging.Logger; + +import java.io.InputStream; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class CommunicationServiceController { + + @Inject + Logger logger; + @Inject + ConnectorConfig connectorConfig; + @Inject + CommunicationServiceRequestErrorHandler communicationServiceRequestErrorHandler; + + @Inject + @RestClient + CommunicationService communicationService; + + public Optional registerConnector(ConnectorRequestDTO dto) { + try { + ConnectorResponseDTO result = communicationService.registerConnector(dto); + logger.infof("Comm.Svc. - Connector registered"); + + return Optional.of(result); + } catch (Exception ex) { + logger.errorf(ex, "Comm.Svc. - register Connector (ID:'%s') - FAILED", connectorConfig.getConnectorId()); + } + return Optional.empty(); + } + + public void updateConnectorStatus() { + try { + communicationService.updateConnectorStatus(connectorConfig.getConnectorId()); + logger.infof("Comm.Svc. - Connector status updated"); + } catch (Exception ex) { + logger.errorf(ex, "Comm.Svc. - update Connector status - FAILED"); + } + } + + public List fetchJobs(String sinceDateTime) { + try { + //INFO: log concerning fetched jobs done in JobController + return communicationService.getJobs(connectorConfig.getConnectorId(), sinceDateTime); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch Jobs since '%s' - FAILED", sinceDateTime); + } + + return Collections.emptyList(); + } + + + public void createJobState(UUID jobId, JobStateDTO jobStateDTO) { + try { + communicationService.createJobState(jobId, jobStateDTO); + logger.infof("Comm.Svc. - Job (ID:'%s') status updated to: '%s'", jobId, jobStateDTO.getStatus()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - update Job (ID:'%s') status to: '%s' - FAILED", jobId, jobStateDTO.getStatus()); + } + } + + public Optional fetchAccessConnectionWorkItem(UUID connectionWorkItemId) { + try { + ConnectionWorkItemDTO result = communicationService.getAccessConnectionWorkItem(connectionWorkItemId); + logger.infof("Comm.Svc. - ConnectionWorkItem (ID:'%s') fetched", connectionWorkItemId); + + return Optional.of(result); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch ConnectionWorkItem (ID:'%s') - FAILED", connectionWorkItemId); + } + + return Optional.empty(); + } + + public Optional fetchAccessLogWorkItem(UUID logWorkItemId) { + try { + LogWorkItemDTO result = communicationService.getAccessLogWorkItem(logWorkItemId); + logger.infof("Comm.Svc. - LogWorkItem (ID:'%s') fetched", logWorkItemId); + + return Optional.of(result); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch LogWorkItem (ID:'%s') - FAILED", logWorkItemId); + } + + return Optional.empty(); + } + + public Optional fetchAccessConfigWorkItem(UUID accessConfigWorkItemId) { + try { + AccessConfigWorkItemDTO result = communicationService.getAccessConfigWorkItem(accessConfigWorkItemId); + logger.infof("Comm.Svc. - AccessConfigWorkItem (ID:'%s') fetched", accessConfigWorkItemId); + + return Optional.of(result); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch AccessConfigWorkItem (ID:'%s') - FAILED", accessConfigWorkItemId); + } + + return Optional.empty(); + } + + public Optional fetchPauseWorkItem(UUID pauseWorkItemId) { + try { + PauseWorkItemDTO result = communicationService.getPauseWorkItem(pauseWorkItemId); + logger.infof("Comm.Svc. - PauseWorkItem (ID:'%s') fetched", pauseWorkItemId); + + return Optional.of(result); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch PauseWorkItem (ID:'%s') - FAILED", pauseWorkItemId); + } + + return Optional.empty(); + } + + public Optional fetchDiscoveryWorkItem(UUID id) { + try { + DiscoveryWorkItemDTO result = communicationService.getDiscoveryWorkItemById(id); + logger.infof("Comm.Svc. - DiscoveryWorkItem (ID:'%s') fetched", id); + + return Optional.of(result); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch DiscoveryWorkItem (ID:'%s') - FAILED", id); + } + return Optional.empty(); + } + + public Optional fetchDriverWorkItem(UUID id) { + try { + DriverWorkItemDTO result = communicationService.getDriverWorkItem(id); + logger.infof("Comm.Svc. - DriverWorkItem (ID:'%s') fetched", id); + + return Optional.of(result); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch DriverWorkItem (ID:'%s') - FAILED", id); + } + return Optional.empty(); + } + + public Optional fetchFirmwareWorkItem(UUID id) { + try { + FirmwareWorkItemDTO result = communicationService.getFirmwareWorkItem(id); + logger.infof("Comm.Svc. - FirmwareWorkItem (ID:'%s') fetched", id); + + return Optional.of(result); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch FirmwareWorkItem (ID:'%s') - FAILED", id); + } + return Optional.empty(); + } + + public FirmwareFileMetadataDTO fetchFirmwareFileMetadata(UUID firmwareId, UUID workItemId) { + try { + FirmwareFileMetadataDTO result = communicationService.getFirmwareFileMetadata(firmwareId, workItemId); + logger.infof("Comm.Svc. - FirmwareFileMetadata (ID:'%s') fetched", firmwareId); + + return result; + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch FirmwareFileMetadata (ID:'%s') - FAILED", firmwareId); + throw ex; + } + } + + public InputStream fetchFirmwareFileStream(UUID firmwareId, UUID workItemId) { + try { + Response response = communicationService.getFirmwareFileStream(firmwareId, workItemId); + InputStream inputStream = response.readEntity(InputStream.class); + logger.infof("Comm.Svc. - firmware file input stream (ID:'%s') fetched", firmwareId); + + return inputStream; + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - fetch firmware file input stream (ID:'%s') - FAILED", firmwareId); + throw ex; + } + } + + public void updateAccessConnectionWorkItem(UUID connectionWorkItemId, ConnectionWorkItemUpdateDTO connectionWorkItemUpdateDTO) { + try { + communicationService.updateAccessConnectionWorkItem(connectionWorkItemId, connectionWorkItemUpdateDTO); + logger.infof("Comm.Svc. - ConnectionWorkItem (ID:'%s') updated to status: '%s'", connectionWorkItemId, connectionWorkItemUpdateDTO.getStatus()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - update ConnectionWorkItem (ID:'%s') status to '%s' - FAILED", connectionWorkItemId, connectionWorkItemUpdateDTO.getStatus()); + } + } + + public void updateAccessLogWorkItem(UUID logWorkItemId, LogWorkItemUpdateDTO logWorkItemUpdateDTO) { + try { + communicationService.updateAccessLogWorkItem(logWorkItemId, logWorkItemUpdateDTO); + logger.infof("Comm.Svc. - LogWorkItem (ID:'%s') updated to status: '%s'", logWorkItemId, logWorkItemUpdateDTO.getStatus()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - update LogWorkItem (ID:'%s') status to '%s' - FAILED", logWorkItemId, logWorkItemUpdateDTO.getStatus()); + } + } + + public void updateAccessConfigWorkItem(UUID accessConfigWorkItemId, AccessConfigWorkItemUpdateDTO accessConfigWorkItemUpdateDTO) { + try { + communicationService.updateAccessConfigWorkItem(accessConfigWorkItemId, accessConfigWorkItemUpdateDTO); + logger.infof("Comm.Svc. - AccessConfigWorkItem (ID:'%s') updated to status: '%s'", accessConfigWorkItemId, accessConfigWorkItemUpdateDTO.getStatus()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - update AccessConfigWorkItem (ID:'%s') status to '%s' - FAILED", accessConfigWorkItemId, accessConfigWorkItemUpdateDTO.getStatus()); + } + } + + public void updatePauseWorkItem(UUID pauseWorkItemId, PauseWorkItemUpdateDTO pauseWorkItemUpdateDTO) { + try { + communicationService.updatePauseWorkItem(pauseWorkItemId, pauseWorkItemUpdateDTO); + logger.infof("Comm.Svc. - PauseWorkItem (ID:'%s') updated to status: '%s'", pauseWorkItemId, pauseWorkItemUpdateDTO.getStatus()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - update PauseWorkItem (ID:'%s') status to '%s' - FAILED", pauseWorkItemId, pauseWorkItemUpdateDTO.getStatus()); + } + } + + public void updateDiscoveryWorkItem(UUID discoveryWorkItemId, DiscoveryWorkItemUpdateDTO discoveryWorkItemUpdateDTO) { + try { + communicationService.updateDiscoveryWorkItem(discoveryWorkItemId, discoveryWorkItemUpdateDTO); + logger.infof("Comm.Svc. - DiscoveryWorkItem (ID:'%s') updated to status: '%s'", discoveryWorkItemId, discoveryWorkItemUpdateDTO.getDiscoveryStatusEnum()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - update DiscoveryWorkItem (ID:'%s') status to '%s' - FAILED", discoveryWorkItemId, discoveryWorkItemUpdateDTO.getDiscoveryStatusEnum()); + } + } + + public void updateDriverWorkItem(UUID driverWorkItemId, DriverWorkItemUpdateDTO driverWorkItemUpdateDTO) { + try { + communicationService.updateDriverWorkItem(driverWorkItemId, driverWorkItemUpdateDTO); + logger.infof("Comm.Svc. - DriverWorkItem (ID:'%s') updated to status: '%s'", driverWorkItemId, driverWorkItemUpdateDTO.getStatus()); + } catch (Exception ex) { + logger.errorf(ex, "Comm.Svc. - update DriverWorkItem (ID:'%s') to status '%s' - FAILED", driverWorkItemId, driverWorkItemUpdateDTO.getStatus()); + } + } + + public void updateFirmwareWorkItem(UUID firmwareWorkItemId, FirmwareWorkItemUpdateRequestDTO firmwareWorkItemUpdateRequestDTO) { + try { + communicationService.updateFirmwareWorkItem(firmwareWorkItemId, firmwareWorkItemUpdateRequestDTO); + logger.infof("Comm.Svc. - FirmwareWorkItem (ID:'%s') updated to status: '%s'", firmwareWorkItemId, firmwareWorkItemUpdateRequestDTO.getStatus()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - update FirmwareWorkItem (ID:'%s') to status '%s' - FAILED", firmwareWorkItemId, firmwareWorkItemUpdateRequestDTO.getStatus()); + } + } + + public void createAccessLogNotifications(AccessLogDTO accessLogDTO) throws CommunicationServiceException { + try { + communicationService.createAccessLogNotifications(accessLogDTO); + logger.infof("Comm.Svc. - AccessLog entries for AccessLogWorkItem (ID:'%s') sent (total: %d)", accessLogDTO.getWorkItemId(), accessLogDTO.getAccessLogItems().size()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - sending AccessLog entries (total: %d) for AccessLogWorkItem (ID:'%s') - FAILED", accessLogDTO.getAccessLogItems().size(), + accessLogDTO.getWorkItemId()); + throw ex; + } + } + + public void updateVariableValue(UpdateVariableRequestDTO updateVariableRequestDTO) { + try { + communicationService.updateSubscribedVariable(updateVariableRequestDTO); + logger.debugf("Comm.Svc. - VariableValue (ID:'%s') updated to:'%s', quality:'%s'", updateVariableRequestDTO.getVariableId(), updateVariableRequestDTO.getValue(), + updateVariableRequestDTO.getQualityType()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - Update VariableValue (ID:'%s') to:'%s', quality:'%s' - FAILED", updateVariableRequestDTO.getVariableId(), + updateVariableRequestDTO.getValue(), updateVariableRequestDTO.getQualityType()); + } + } + + public void updateVariableValues(List variableValuesDTOs) { + try { + logger.debugf("Comm.Svc. - Sending Variable Values: %s)", variableValuesDTOs); + communicationService.updateSubscribedVariables(variableValuesDTOs); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - Sending Variable Values - FAILED"); + logger.errorf("Values sent in failed request: %s", variableValuesDTOs); + communicationServiceRequestErrorHandler.handleErrorOfUpdateSubscribedVariables(variableValuesDTOs); + } + } + + public void updateDeviceProperty(PropertyValueRequestDTO propertyValueRequestDTO) { + try { + communicationService.updateDeviceProperty(propertyValueRequestDTO); + logger.debugf("Comm.Svc. - PropertyValue (ID:'%s') updated to:'%s'", propertyValueRequestDTO.getPropertyId(), propertyValueRequestDTO.getValueAsString()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - Update PropertyValue (ID:'%s') to:'%s' - FAILED", propertyValueRequestDTO.getPropertyId(), + propertyValueRequestDTO.getValueAsString()); + } + } + + public Optional fetchSetWorkItem(UUID setWorkItemId) { + try { + SetWorkItemDTO result = communicationService.getSetWorkItem(setWorkItemId); + logger.infof("Comm.Svc. - SetWorkItem (ID:'%s') fetched", setWorkItemId); + + return Optional.of(result); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - Fetch SetWorkItem (ID:'%s') - FAILED", setWorkItemId); + } + return Optional.empty(); + } + + public void updateSetWorkItem(UUID setWorkItemId, SetWorkItemUpdateDTO setWorkItemUpdateDTO) { + try { + communicationService.updateSetWorkItem(setWorkItemId, setWorkItemUpdateDTO); + logger.infof("Comm.Svc. - SetWorkItem (ID:'%s') updated to status: '%s'", setWorkItemId, setWorkItemUpdateDTO.getStatus()); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - Update SetWorkItem (ID:'%s') to status: '%s' - FAILED", setWorkItemId, setWorkItemUpdateDTO.getStatus()); + } + } + + public void changeComponentMode(ChangeModeRequestDTO changeModeRequestDTO) { + try { + communicationService.changeComponentMode(changeModeRequestDTO); + logger.infof("Comm.Svc. - Updating ComponentMode"); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - Update ComponentMode - FAILED"); + } + } + + public void changeComponentModeForDeviceTree(UUID deviceId, ComponentMode mode) { + try { + communicationService.changeComponentModeForDeviceTree(deviceId, mode); + logger.infof("Comm.Svc. - Updating ComponentMode for device (ID: '%s') to: '%s')", deviceId, mode); + } catch (CommunicationServiceException ex) { + logger.errorf(ex, "Comm.Svc. - Update ComponentMode for device (ID: '%s') to: '%s - FAILED')", deviceId, mode); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceRequestErrorHandler.java b/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceRequestErrorHandler.java new file mode 100755 index 0000000..8ed60a2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceRequestErrorHandler.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.communicationservice.control; + +import io.gec.raw.connector.variable.control.VariableValueCacheHandler; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class CommunicationServiceRequestErrorHandler { + @Inject + Logger logger; + @Inject + VariableValueCacheHandler variableValueCacheHandler; + + public void handleErrorOfUpdateSubscribedVariables(List variableValuesDTOs) { + List variableIds = variableValuesDTOs.stream().map(UpdateVariableRequestDTO::getVariableId).toList(); + logger.infof("Removing from Cache Variable Values which were sent in failed request IDs: %s", variableIds); + variableValueCacheHandler.removeFromCache(variableIds); + } +} diff --git a/src/main/java/io/gec/raw/connector/communicationservice/exception/CommunicationServiceException.java b/src/main/java/io/gec/raw/connector/communicationservice/exception/CommunicationServiceException.java new file mode 100755 index 0000000..9eb1342 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/communicationservice/exception/CommunicationServiceException.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.communicationservice.exception; + +public class CommunicationServiceException extends RuntimeException { + + private final ModelType model; + private final FailureType failure; + + public CommunicationServiceException(ModelType modelType, FailureType failureType, String message) { + super(message); + model = modelType; + failure = failureType; + } + + public CommunicationServiceException(FailureType failureType, String message) { + super(message); + model = new ModelType("unknown"); + failure = failureType; + } + + @Override + public String toString() { + return "CommunicationServiceException{model=%s, failure=%s, msg:%s}".formatted(model, failure, getMessage()); + } +} diff --git a/src/main/java/io/gec/raw/connector/communicationservice/exception/CommunicationServiceResponseExceptionMapper.java b/src/main/java/io/gec/raw/connector/communicationservice/exception/CommunicationServiceResponseExceptionMapper.java new file mode 100755 index 0000000..0c6e340 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/communicationservice/exception/CommunicationServiceResponseExceptionMapper.java @@ -0,0 +1,50 @@ +package io.gec.raw.connector.communicationservice.exception; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.inject.Inject; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper; +import org.jboss.logging.Logger; + +import java.io.IOException; +import java.util.Map; + +public class CommunicationServiceResponseExceptionMapper implements ResponseExceptionMapper { + + @Inject + Logger logger; + + @Override + public CommunicationServiceException toThrowable(Response response) { + return extractCommSvcExceptionFromResponse(response); + } + + private CommunicationServiceException extractCommSvcExceptionFromResponse(Response response) { + try { + Map body = readResponseBody(response); + var model = body.get("object"); + var failure = body.get("failure"); + var message = body.get("message"); + if (message == null) { + message = body.toString(); + } + + var modelType = new ModelType(model); + var failureType = new FailureType(response.getStatusInfo().toEnum(), failure); + + return new CommunicationServiceException(modelType, failureType, message); + } catch (Exception ex) { + var message = "Unable to extract CommunicationService response body as CommunicationServiceException"; + logger.warn(message, ex); + return new CommunicationServiceException(new FailureType(response.getStatusInfo().toEnum(), "unknown"), + message); + } + } + + private Map readResponseBody(Response response) throws IOException { + String json = response.readEntity(String.class); + return new ObjectMapper().readValue(json, new TypeReference<>() { + }); + } +} diff --git a/src/main/java/io/gec/raw/connector/communicationservice/exception/FailureType.java b/src/main/java/io/gec/raw/connector/communicationservice/exception/FailureType.java new file mode 100755 index 0000000..15bc2ab --- /dev/null +++ b/src/main/java/io/gec/raw/connector/communicationservice/exception/FailureType.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.communicationservice.exception; + +import jakarta.ws.rs.core.Response; + +public record FailureType(Response.Status status, String name) { + @Override + public String toString() { + return "FailureType{status=%s, name=%s}".formatted(status, name); + } +} diff --git a/src/main/java/io/gec/raw/connector/communicationservice/exception/ModelType.java b/src/main/java/io/gec/raw/connector/communicationservice/exception/ModelType.java new file mode 100755 index 0000000..db3bd85 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/communicationservice/exception/ModelType.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.communicationservice.exception; + +public record ModelType(String name) { + @Override + public String toString() { + return "ModelType{name=%s}".formatted(name); + } +} diff --git a/src/main/java/io/gec/raw/connector/componentmode/control/ComponentModeController.java b/src/main/java/io/gec/raw/connector/componentmode/control/ComponentModeController.java new file mode 100755 index 0000000..f61a51c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/componentmode/control/ComponentModeController.java @@ -0,0 +1,70 @@ +package io.gec.raw.connector.componentmode.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.componentmode.dto.ChangeModeRequestDTO; +import io.gec.raw.connector.variable.control.VariableController; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.Map; +import java.util.Objects; +import java.util.UUID; + +@ApplicationScoped +public class ComponentModeController { + + @Inject + DeviceController deviceController; + @Inject + VariableController variableController; + @Inject + DevicePropertyController devicePropertyController; + @Inject + Logger logger; + + public ChangeModeRequestDTO createChangeModeRequestDTO(UUID commDeviceId) { + ChangeModeRequestDTO changeModeRequestDTO = new ChangeModeRequestDTO(); + + Device rootDevice = deviceController.getDeviceByCommSvcId(commDeviceId); + + logger.infof("Creating ChangeModeRequestDTO for Device ID: '%s'", rootDevice.getId()); + createDeviceModeMap(rootDevice, changeModeRequestDTO); + + return changeModeRequestDTO; + } + + void createDeviceModeMap(Device device, ChangeModeRequestDTO changeModeRequestDTO) { + Objects.requireNonNull(device, "Device is null, cannot create DeviceModeMap."); + + logger.debugf("Processing Device (ID:'%s')", device.getId()); + + createVariableModeMap(device.getId(), changeModeRequestDTO.getVariableModes()); + createPropertyModeMap(device.getId(), changeModeRequestDTO.getPropertyModes()); + + changeModeRequestDTO.getDeviceModes().put(device.getCommServiceId(), device.getMode()); + + deviceController.getSubDevices(device.getId()).forEach(subDevice -> createDeviceModeMap(subDevice, changeModeRequestDTO)); + } + + void createVariableModeMap(UUID deviceId, Map variableModesMap) { + var variables = variableController.getVariablesByDeviceId(deviceId); + + variables.forEach(variable -> { + variableModesMap.put(variable.getCommServiceId(), variable.getMode()); + logger.debugf("Added Variable (ID:'%s') with mode '%s' to VariableModeMap for Device ID: '%s'", variable.getCommServiceId(), variable.getMode(), deviceId); + }); + } + + private void createPropertyModeMap(UUID deviceId, Map propertyModesMap) { + var properties = devicePropertyController.findByDeviceId(deviceId); + + properties.forEach(property -> { + propertyModesMap.put(property.getCommServiceId(), property.getMode()); + logger.debugf("Added Property (ID:'%s') with mode '%s' to PropertyModeMap for Device ID: '%s'", property.getCommServiceId(), property.getMode(), deviceId); + }); + } +} diff --git a/src/main/java/io/gec/raw/connector/componentmode/control/ComponentModeHandler.java b/src/main/java/io/gec/raw/connector/componentmode/control/ComponentModeHandler.java new file mode 100755 index 0000000..a181423 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/componentmode/control/ComponentModeHandler.java @@ -0,0 +1,39 @@ +package io.gec.raw.connector.componentmode.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.componentmode.dto.ChangeModeRequestDTO; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.control.DeviceController; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.UUID; + +@ApplicationScoped +public class ComponentModeHandler { + @Inject + ComponentModeController componentModeController; + @Inject + DeviceController deviceController; + @Inject + CommunicationServiceController communicationServiceController; + + public void changeComponentModeForDeviceTree(UUID commDeviceId, ComponentMode componentMode) { + deviceController.updateModeByCommSvcId(commDeviceId, componentMode); + communicationServiceController.changeComponentModeForDeviceTree(commDeviceId, componentMode); + } + + public void changeComponentMode(UUID commDeviceId, ComponentMode componentMode) { + deviceController.updateModeByCommSvcId(commDeviceId, componentMode); + + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(commDeviceId); + communicationServiceController.changeComponentMode(changeModeRequestDTO); + } + + public void restoreComponentMode(UUID commDeviceId) { + deviceController.restoreModeByCommSvcId(commDeviceId); + + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(commDeviceId); + communicationServiceController.changeComponentMode(changeModeRequestDTO); + } +} diff --git a/src/main/java/io/gec/raw/connector/componentmode/dto/ChangeModeRequestDTO.java b/src/main/java/io/gec/raw/connector/componentmode/dto/ChangeModeRequestDTO.java new file mode 100755 index 0000000..49ed4a3 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/componentmode/dto/ChangeModeRequestDTO.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.componentmode.dto; + +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@Getter +public class ChangeModeRequestDTO { + private Map deviceModes = new HashMap<>(); + private Map variableModes = new HashMap<>(); + private Map propertyModes = new HashMap<>(); +} diff --git a/src/main/java/io/gec/raw/connector/componentmode/dto/ComponentMode.java b/src/main/java/io/gec/raw/connector/componentmode/dto/ComponentMode.java new file mode 100755 index 0000000..36a6421 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/componentmode/dto/ComponentMode.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.componentmode.dto; + +public enum ComponentMode { + + OPERATION, + PAUSE, + SERVICE, + FIRMWARE_UPDATE, + OFFLINE; + + public boolean isRestorable() { + return this.equals(OPERATION) || this.equals(PAUSE); + } +} diff --git a/src/main/java/io/gec/raw/connector/config/control/AppConfig.java b/src/main/java/io/gec/raw/connector/config/control/AppConfig.java new file mode 100755 index 0000000..98a3a92 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/config/control/AppConfig.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.config.control; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.ws.rs.Produces; + +import java.time.Clock; + +@ApplicationScoped +public class AppConfig { + @Produces + @ApplicationScoped + public Clock createClockBean() { + return Clock.systemUTC(); + } +} diff --git a/src/main/java/io/gec/raw/connector/config/control/ConnectorConfigController.java b/src/main/java/io/gec/raw/connector/config/control/ConnectorConfigController.java new file mode 100755 index 0000000..0a35258 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/config/control/ConnectorConfigController.java @@ -0,0 +1,49 @@ +package io.gec.raw.connector.config.control; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.jboss.logging.Logger; + +import java.text.MessageFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +@ApplicationScoped +public class ConnectorConfigController { + + private static final String VERSION_PROPERTY = "version"; + private static final String VERSION_PROPERTY_FORMAT = "yyyyMMddHHmm"; + private static final String TIMESTAMP_FORMAT = "{0,date,dd.MM.yyyy} {0,time,HH:mm}"; + + @ConfigProperty(name = "quarkus.application.version") + String version; + @Inject + Logger logger; + @Inject + PropertyFileHandler propertyFileHandler; + + public String getConnectorVersion() { + return String.format("%s (%s)", version, getTimestamp()); + } + + String getTimestamp() throws RuntimeException { + return propertyFileHandler.getProperty(VERSION_PROPERTY) + .filter(property -> !property.isBlank()) + .map(this::formatTimestamp) + .orElseThrow(() -> new RuntimeException("Version property in version.properties file does not exist or is empty")); + } + + private String formatTimestamp(String timestamp) { + try { + SimpleDateFormat inputFormat = new SimpleDateFormat(VERSION_PROPERTY_FORMAT); + inputFormat.setLenient(false); + Date date = inputFormat.parse(timestamp); + return MessageFormat.format(TIMESTAMP_FORMAT, date); + } catch (ParseException e) { + logger.error("There was an error while parsing version from version.properties file, raw version property will be used"); + return timestamp; + } + } +} diff --git a/src/main/java/io/gec/raw/connector/config/control/PropertyFileHandler.java b/src/main/java/io/gec/raw/connector/config/control/PropertyFileHandler.java new file mode 100755 index 0000000..95031d1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/config/control/PropertyFileHandler.java @@ -0,0 +1,26 @@ +package io.gec.raw.connector.config.control; + +import jakarta.enterprise.context.ApplicationScoped; + +import java.io.InputStream; +import java.util.Optional; +import java.util.Properties; + +@ApplicationScoped +public class PropertyFileHandler { + + public static final String PROPERTY_FILE_NAME = "version.properties"; + private final Properties properties = new Properties(); + + public PropertyFileHandler() { + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(PROPERTY_FILE_NAME)) { + properties.load(inputStream); + } catch (Exception ex) { + throw new RuntimeException("There was a problem while loading property file", ex); + } + } + + public Optional getProperty(String name) { + return Optional.ofNullable(properties.getProperty(name)); + } +} diff --git a/src/main/java/io/gec/raw/connector/config/control/VariableBulkValueSendingConfig.java b/src/main/java/io/gec/raw/connector/config/control/VariableBulkValueSendingConfig.java new file mode 100755 index 0000000..555182b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/config/control/VariableBulkValueSendingConfig.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.config.control; + +import io.smallrye.config.ConfigMapping; +import java.time.Duration; + +@ConfigMapping(prefix = "connector.variable.bulk-value-sending") +public interface VariableBulkValueSendingConfig { + int maxQueueSize(); + Duration maxDelayForFirstValue(); + Duration maxWaitTimeForNextValue(); +} diff --git a/src/main/java/io/gec/raw/connector/config/entity/ConnectorConfig.java b/src/main/java/io/gec/raw/connector/config/entity/ConnectorConfig.java new file mode 100755 index 0000000..61f92ba --- /dev/null +++ b/src/main/java/io/gec/raw/connector/config/entity/ConnectorConfig.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.config.entity; + +import jakarta.enterprise.context.ApplicationScoped; +import lombok.Getter; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +import java.util.UUID; + +@ApplicationScoped +@Getter +public class ConnectorConfig { + @ConfigProperty(name = "connector.id") + UUID connectorId; + @ConfigProperty(name = "connector.name") + String connectorName; + @ConfigProperty(name = "connector.description") + String connectorDescription; +} diff --git a/src/main/java/io/gec/raw/connector/config/entity/SnmpConfig.java b/src/main/java/io/gec/raw/connector/config/entity/SnmpConfig.java new file mode 100755 index 0000000..f87e5a9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/config/entity/SnmpConfig.java @@ -0,0 +1,50 @@ +package io.gec.raw.connector.config.entity; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import lombok.Getter; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +import java.util.List; +import java.util.Optional; + +@ApplicationScoped +@Getter +public class SnmpConfig { + @Inject + SnmpConnectionTypesConfig snmpConnectionTypesConfig; + + @ConfigProperty(name = "snmp.message-dispatcher-pool-size") + int messageDispatcherPoolSize; + + @ConfigProperty(name = "snmp.scheduled-tasks.pool-size") + int scheduledTasksPoolSize; + + @ConfigProperty(name = "snmp.dynamic-table.pool-size") + int dynamicTablePoolSize; + @ConfigProperty(name = "snmp.dynamic-table.default-pooling-interval") + int dynamicTableDefaultPoolingInterval; + + @ConfigProperty(name = "snmp.discovery.deprecated-protocols") + Optional> discoveryDeprecatedProtocols; + @ConfigProperty(name = "snmp.discovery.root-oid") + String discoveryRootOid; + @ConfigProperty(name = "snmp.discovery.pool-size") + int discoveryPoolSize; + @ConfigProperty(name = "snmp.discovery.initial-get-retries") + int discoveryInitialGetRetries; + @ConfigProperty(name = "snmp.discovery.initial-get-timeout") + Long discoveryInitialGetTimeout; + @ConfigProperty(name = "snmp.discovery.bulk-get-retries") + int discoveryBulkGetRetries; + @ConfigProperty(name = "snmp.discovery.bulk-get-timeout") + Long discoveryBulkGetTimeout; + @ConfigProperty(name = "snmp.discovery.get-retries") + int discoveryGetRetries; + @ConfigProperty(name = "snmp.discovery.get-timeout") + Long discoveryGetTimeout; + @ConfigProperty(name = "snmp.discovery.set-retries") + int discoverySetRetries; + @ConfigProperty(name = "snmp.discovery.set-timeout") + Long discoverySetTimeout; +} diff --git a/src/main/java/io/gec/raw/connector/config/entity/SnmpConnectionTypesConfig.java b/src/main/java/io/gec/raw/connector/config/entity/SnmpConnectionTypesConfig.java new file mode 100755 index 0000000..8d2e89d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/config/entity/SnmpConnectionTypesConfig.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.config.entity; + +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithParentName; + +import java.util.Map; + +@ConfigMapping(prefix = "snmp.connection-types") +public interface SnmpConnectionTypesConfig { + @WithParentName + Map connectionTypes(); + + interface Connection { + int port(); + String protocol(); + String hostname(); + } +} diff --git a/src/main/java/io/gec/raw/connector/connector/control/ConnectorController.java b/src/main/java/io/gec/raw/connector/connector/control/ConnectorController.java new file mode 100755 index 0000000..6c08048 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/connector/control/ConnectorController.java @@ -0,0 +1,95 @@ +package io.gec.raw.connector.connector.control; + +import io.gec.raw.connector.driver.control.DeviceDriverController; +import io.gec.raw.connector.protocol.domain.CommunicationProtocolEnum; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.config.control.ConnectorConfigController; +import io.gec.raw.connector.config.entity.ConnectorConfig; +import io.gec.raw.connector.connector.dto.ConnectorRequestDTO; +import io.gec.raw.connector.connector.dto.ConnectorRequestDTO.ConnectorRequestDTOBuilder; +import io.gec.raw.connector.connector.dto.ConnectorResponseDTO; +import io.gec.raw.connector.protocol.control.ProtocolMapper; +import io.gec.raw.connector.protocol.control.ProtocolService; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.Logger; + +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class ConnectorController { + private final ConnectorConfig connectorConfig; + private final ConnectorConfigController connectorConfigController; + private final CommunicationServiceController communicationServiceController; + private final DeviceDriverController deviceDriverController; + private final ProtocolService protocolService; + private final ConnectorUtils connectorUtils; + private final ProtocolMapper protocolMapper; + private final Logger logger; + + public ConnectorController(ConnectorConfig connectorConfig, + ConnectorConfigController connectorConfigController, + CommunicationServiceController communicationServiceController, + DeviceDriverController deviceDriverController, + ProtocolService protocolService, + ConnectorUtils connectorUtils, + ProtocolMapper protocolMapper, + Logger logger) { + this.connectorConfig = connectorConfig; + this.connectorConfigController = connectorConfigController; + this.communicationServiceController = communicationServiceController; + this.deviceDriverController = deviceDriverController; + this.protocolService = protocolService; + this.connectorUtils = connectorUtils; + this.protocolMapper = protocolMapper; + this.logger = logger; + } + + public Optional registerOnServer() { + ConnectorRequestDTO connectorRequestDTO = buildConnector(); + + var connectorRegisterResult = communicationServiceController.registerConnector(connectorRequestDTO); + if (connectorRegisterResult.isPresent()) { + protocolService.createOrUpdateProtocols(connectorRegisterResult.get().getProtocols()); + deviceDriverController.synchronizeDrivers(); + return connectorRegisterResult; + } + + return Optional.empty(); + } + + ConnectorRequestDTO buildConnector() { + ConnectorRequestDTOBuilder connectorRequestDTOBuilder = ConnectorRequestDTO.builder(); + String version = connectorConfigController.getConnectorVersion(); + + try { + connectorRequestDTOBuilder + .id(connectorConfig.getConnectorId()) + .name(getConnectorName()) + .description(connectorConfig.getConnectorDescription()) + .ipAddress(InetAddress.getLocalHost().getHostAddress()) + .userId(UUID.randomUUID()) + .version(version) + .connectorProtocols(protocolMapper.getProtocols(List.of( + SnmpVersionEnum.SNMP_V1, + SnmpVersionEnum.SNMP_V2C, + SnmpVersionEnum.SNMP_V3, + CommunicationProtocolEnum.SFTP))); + } catch (Exception ex) { + logger.error("Error building the connector: " + ex.getMessage()); + } + + return connectorRequestDTOBuilder.build(); + } + + private String getConnectorName() throws SocketException, UnknownHostException { + return connectorConfig.getConnectorName().isEmpty() + ? connectorUtils.getMacAddress() + : connectorConfig.getConnectorName(); + } +} diff --git a/src/main/java/io/gec/raw/connector/connector/control/ConnectorUtils.java b/src/main/java/io/gec/raw/connector/connector/control/ConnectorUtils.java new file mode 100755 index 0000000..0433f9f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/connector/control/ConnectorUtils.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.connector.control; + +import jakarta.enterprise.context.ApplicationScoped; + +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; + +@ApplicationScoped +public class ConnectorUtils { + + public String getMacAddress() throws SocketException, UnknownHostException { + NetworkInterface network = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()); + byte[] mac = network.getHardwareAddress(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < mac.length; i++) { + sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); + } + return sb.toString(); + } +} diff --git a/src/main/java/io/gec/raw/connector/connector/dto/ConnectorRequestDTO.java b/src/main/java/io/gec/raw/connector/connector/dto/ConnectorRequestDTO.java new file mode 100755 index 0000000..705af6b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/connector/dto/ConnectorRequestDTO.java @@ -0,0 +1,27 @@ +/* + * (c) 2023 German Edge Cloud GmbH & Co. KG + */ +package io.gec.raw.connector.connector.dto; + +import io.gec.raw.connector.protocol.dto.ProtocolDTO; +import lombok.Builder; +import lombok.Value; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Value +@Builder +public class ConnectorRequestDTO { + + UUID id; + String name; + String description; + String ipAddress; + UUID userId; + String version; + + @Builder.Default + List connectorProtocols = new ArrayList<>(); +} diff --git a/src/main/java/io/gec/raw/connector/connector/dto/ConnectorResponseDTO.java b/src/main/java/io/gec/raw/connector/connector/dto/ConnectorResponseDTO.java new file mode 100755 index 0000000..4e8b1c8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/connector/dto/ConnectorResponseDTO.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.connector.dto; + +import io.gec.raw.connector.protocol.dto.ProtocolDTO; +import lombok.Builder; +import lombok.Value; + +import java.util.List; +import java.util.UUID; + +@Builder +@Value +public class ConnectorResponseDTO { + + UUID id; + String name; + String description; + String ipAddress; + List protocols; +} diff --git a/src/main/java/io/gec/raw/connector/connector/dto/DataTypeEnum.java b/src/main/java/io/gec/raw/connector/connector/dto/DataTypeEnum.java new file mode 100755 index 0000000..3cfee7c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/connector/dto/DataTypeEnum.java @@ -0,0 +1,7 @@ +package io.gec.raw.connector.connector.dto; + +public enum DataTypeEnum { + + STRING, + INTEGER; +} diff --git a/src/main/java/io/gec/raw/connector/connector/dto/RepresentationEnum.java b/src/main/java/io/gec/raw/connector/connector/dto/RepresentationEnum.java new file mode 100755 index 0000000..9233508 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/connector/dto/RepresentationEnum.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.connector.dto; + +public enum RepresentationEnum { + + TEXT, + PASSWORD, + DATE, + NUMBER, + IPV4; +} diff --git a/src/main/java/io/gec/raw/connector/device/control/DeviceController.java b/src/main/java/io/gec/raw/connector/device/control/DeviceController.java new file mode 100755 index 0000000..9d98355 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/control/DeviceController.java @@ -0,0 +1,598 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationService; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.device.dto.DeviceDTO; +import io.gec.raw.connector.device.dto.DeviceResponseDTO; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.device.enums.RittalDevicePropertyNameEnum; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyExtractor; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyRepository; +import io.gec.raw.connector.deviceproperty.dto.DevicePropertyDTO; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.control.VariableMapper; +import io.gec.raw.connector.variable.dto.VariableDTO; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityNotFoundException; +import jakarta.transaction.Transactional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.jboss.logging.Logger; + +import java.util.*; +import java.util.stream.Collectors; + +@ApplicationScoped +public class DeviceController { + + @Inject + EntityManager em; + @Inject + VariableMapper variableMapper; + @Inject + VariableController variableController; + @Inject + DevicePropertyController devicePropertyController; + @Inject + Logger logger; + @Inject + DevicePropertyRepository devicePropertyRepository; + @Inject + @RestClient + CommunicationService communicationService; + @Inject + DeviceRepository deviceRepository; + + @Transactional + public Device storeDevice(DeviceMapping deviceMapping, UUID plantId, UUID parentId) throws Exception { + assert deviceMapping != null : "Device mapping is null"; + assert plantId != null : "PlantId is null"; + + logger.infof("Processing Device (index:'%s', name:'%s', description:'%s') for DiscoveryWorkItem (ID:'%s') ...", deviceMapping.getDeviceIndex(), deviceMapping.getName(), + deviceMapping.getDescription(), deviceMapping.getDiscoveryWorkItemId()); + + Device device; + Optional deviceSerialNumber = findPropertyValueByName(deviceMapping.getProperties(), + RittalDevicePropertyNameEnum.SERIAL_NUMBER.getLabel()); + + if (deviceSerialNumber.isPresent()) { + device = handleDeviceWithSerialNumber(deviceMapping, plantId, parentId, deviceSerialNumber.get()); + } else { + device = handleDeviceWithoutSerialNumber(deviceMapping, plantId, parentId); + } + + processSubDevices(deviceMapping, plantId, device.getId()); + + return device; + } + + private void processSubDevices(DeviceMapping device, UUID plantId, UUID parentId) throws Exception { + logger.infof("Processing sub-devices for Device (ID:'%s') - total: %d ", device.getId(), device.getSubDevices().size()); + for (DeviceMapping subDevice : device.getSubDevices()) { + storeDevice(subDevice, plantId, parentId); + } + } + + public Device getDeviceByCommSvcId(UUID commSvcId) { + return deviceRepository.getDeviceByCommSvcId(commSvcId); + } + + public List getAccessDeviceIndexesByRootDeviceId(UUID rootDeviceId) { + return deviceRepository.getAccessDeviceIndexes(rootDeviceId); + } + + private Device handleDeviceWithSerialNumber(DeviceMapping deviceMapping, + UUID plantId, + UUID parentId, + String serialNumber) { + var optionalDevice = findUniqueDeviceBySerialNumber(serialNumber, deviceMapping.isRoot(), plantId); + + return optionalDevice.map(device -> updateDeviceFromDiscovery(device, deviceMapping)) + .orElseGet(() -> createDeviceFromDiscovery(deviceMapping, plantId, parentId)); + } + + Device handleDeviceWithoutSerialNumber(DeviceMapping deviceData, + UUID plantId, + UUID parentId) { + assert parentId != null : "Parent ID is null but expected for devices without serial number."; + logger.infof("Processing device without Serial Number (name:'%s')", deviceData.getName()); + + Device parentDevice = getDeviceById(parentId); + assert parentDevice != null : "Parent device not found for device without serial number. parentId: " + parentId; + + List subDevices = getDevicesByParentId(parentDevice.getId()); + + return subDevices.stream() + .filter(device -> device.getDescription().equals(deviceData.getDescription())) + .findFirst() + .filter(device -> device.getPlantId().equals(plantId)) + .map(device -> updateDeviceFromDiscovery(device, deviceData)) + .orElseGet(() -> createDeviceFromDiscovery(deviceData, plantId, parentDevice.getId())); + } + + private Device createDeviceFromDiscovery(DeviceMapping deviceMapping, UUID plantId, UUID parentId) { + assert deviceMapping != null : "Device is null"; + assert plantId != null : "PlantId is null"; + + Device device = toDevice(deviceMapping, plantId, parentId); + em.persist(device); + logger.debugf("Device (ID:'%s', name: '%s') created", device.getId(), deviceMapping.getName()); + + variableController.createVariables(deviceMapping.getVariables(), device.getId()); + devicePropertyController.createProperties(deviceMapping.getProperties(), device.getId()); + + return device; + } + + private Optional findPropertyValueByName(List properties, String propertyName) { + if (properties == null || properties.isEmpty()) { + return Optional.empty(); + } + + return properties.stream() + .filter(property -> propertyName.equals(property.getName())) + .findFirst() + .map(DevicePropertyExtractor::getValue); + } + + private Device updateDeviceFromDiscovery(Device device, DeviceMapping deviceData) { + assert device != null : "Device is null"; + assert deviceData != null : "DeviceData is null"; + + device = updateDeviceData(device, deviceData); + + communicationService.addLatestDeviceDiscoveryAndArchiveOldDeviceDiscovery( + deviceData.getDiscoveryWorkItemId(), device.getId()); + logger.debugf("Updated discovery work item ID for device: %s", device.getId()); + + return device; + } + + private Device updateDeviceData(Device device, DeviceMapping deviceData) { + assert device != null : "Device is null"; + assert deviceData != null : "DeviceData is null"; + + logger.debugf("Device (ID:'%s', name:'%s') updated", device.getId(), device.getName()); + + device.setDiscoveryWorkItemId(deviceData.getDiscoveryWorkItemId()); + device.setName(deviceData.getName()); + device.setDescription(deviceData.getDescription()); + device.setDeviceURL(deviceData.getDeviceURL()); + device.setType(deviceData.getType()); + device.setDeviceIndex(deviceData.getDeviceIndex()); + device.setMode(deviceData.getMode()); + + variableController.createVariablesIfNotExistByName(deviceData.getVariables(), device.getId()); + devicePropertyController.createPropertiesIfNotExistByName(deviceData.getProperties(), device.getId()); + + return em.merge(device); + } + + Optional findUniqueDeviceBySerialNumber(String serialNumber, boolean isRootDevice, UUID plantId) { + var devicesWithSerialNumber = deviceRepository.findBySerialNumber(serialNumber, isRootDevice, plantId); + + if (devicesWithSerialNumber.size() > 1) { + throw new IllegalStateException( + String.format("More than one device found for Serial Number:'%s', isRootDevice:'%s'", serialNumber, isRootDevice)); + } + + return devicesWithSerialNumber.stream().findFirst(); + } + + + public Device toDevice(DeviceMapping deviceMapping, UUID plantId, UUID parentId) { + assert deviceMapping != null : "DeviceMapping is null"; + assert plantId != null : "PlantId is null"; + Device device = new Device(); + device.setName(deviceMapping.getName()); + device.setDescription(deviceMapping.getDescription() != null ? deviceMapping.getDescription() : ""); + device.setDiscoveryWorkItemId(deviceMapping.getDiscoveryWorkItemId()); + device.setConnectorId(deviceMapping.getConnectorId()); + device.setPlantId(plantId); + device.setDeviceURL(deviceMapping.getDeviceURL()); + device.setType(deviceMapping.getType()); + device.setParentId(parentId); + device.setMode(ComponentMode.PAUSE); + device.setRestoreMode(ComponentMode.PAUSE); + device.setDriverHeaderId(deviceMapping.getDriverHeaderId()); + device.setDeviceIndex(deviceMapping.getDeviceIndex()); + return device; + } + + public Optional findDeviceIdByDeviceUrl(String deviceURL) { + return deviceRepository.findDeviceIdByDeviceUrl(deviceURL); + } + + /** + * Retrieves a {@link Device} object from the database based on its unique identifier. + *

+ * This method fetches the device details corresponding to the provided {@code deviceId}. It performs a null check on the input parameter and logs appropriate messages based on + * whether the device is found or not. + * + * @param deviceId The unique identifier of the device to be retrieved. It must not be null. + * @return The {@link Device} object associated with the given {@code deviceId}, or {@code null} if no such device is found or if {@code deviceId} is null. + */ + public Device getDeviceById(UUID deviceId) { + + if (deviceId == null) { + logger.error("Device ID is null."); + return null; + } + + logger.debug("Start getting Device by ID: " + deviceId); + + Optional device = deviceRepository.findByIdOptional(deviceId); + + if (device.isEmpty()) { + logger.debug("No device found for ID: " + deviceId); + return null; + } + + logger.debug("Device found for ID: " + deviceId); + return device.get(); + } + + /** + * Retrieves the root device in the hierarchy starting from the specified device. + *

+ * This method iteratively traverses up the device hierarchy starting from the given device until it finds the root device. A root device is identified as a device that does + * not have a parent. If the input device or its ID is {@code null}, an {@link IllegalArgumentException} is thrown. + *

+ * Note: This method operates recursively and may perform multiple database queries to find the root device. + * + * @param device The starting device from which to find the root device. Must not be {@code null}. + * @return The root {@link Device} of the provided device hierarchy. + * @throws IllegalArgumentException if the provided device or its ID is {@code null}. + */ + public Device getRootDevice(Device device) { + if (device == null || device.getId() == null) { + logger.error("#getRootDevice device is empty or Null: "); + throw new IllegalArgumentException("device is empty or Null"); + } + + logger.debug("1/2 #getRootDevice Start getting root Device for IP ofDevice with Id: " + device.getId()); + while (device.getParentId() != null) { + device = deviceRepository.findById(device.getParentId()); + } + + logger.debug("2/2 #getRootDevice Finished getting root Device for IP ofDevice with Id: " + device.getId() + "Root Device Id: " + device.getId()); + return device; + } + + + /** + * Constructs a device tree for a communication service starting from a specified device ID. + *

+ * This method retrieves a device from the database using the given {@code deviceId} and then recursively builds a tree structure of all its sub-devices. Each device in the + * tree is converted to a {@code Device} object suitable for communication services. The tree includes the root device and all its hierarchical sub-devices. + * + * @param deviceId The unique identifier of the root device from which to start building the tree. Must not be {@code null}. + * @return A {@code Device} object representing the root of the device tree, including all its sub-devices. + * @throws IllegalArgumentException if the {@code deviceId} is {@code null} or if no device is found with the given ID. + */ + public DeviceDTO getDeviceTreeForCommSvc(UUID deviceId) { + if (deviceId == null) { + throw new IllegalArgumentException("Device ID is required but null was provided"); + } + + Device deviceFromDB = em.find(Device.class, deviceId); + if (deviceFromDB == null) { + throw new IllegalArgumentException("Device (ID:'%s') not found".formatted(deviceId)); + } + + List subDevices = deviceRepository.getSubDevices(deviceFromDB.getId()); + + DeviceDTO tempDeviceDTO = createCommSvcDeviceDTO(deviceFromDB.getId()); + + ArrayList subDeviceDTOs = subDevices.stream() + .map(subDevice -> getDeviceTreeForCommSvc(subDevice.getId())) + .collect(Collectors.toCollection(ArrayList::new)); + + tempDeviceDTO.setSubDevices(subDeviceDTOs); + return tempDeviceDTO; + } + + + /** + * Creates a {@link DeviceDTO} object for communication services based on a specified root device ID. + *

+ * This method retrieves an {@link Device} from the database using the provided {@code rootDeviceId} and converts it into a {@link DeviceDTO} object. It also fetches and sets + * the associated variables and properties for the device. Additionally, it retrieves and sets all direct sub-devices of the root device, along with their own sub-devices, + * effectively building a partial device tree. + * + * @param rootDeviceId The unique identifier of the root device to be converted. Must not be {@code null}. + * @return A {@link DeviceDTO} object representing the root device with its variables, properties, and sub-devices. + * @throws IllegalArgumentException if the {@code rootDeviceId} is {@code null} or if no device is found with the given ID. + */ + public DeviceDTO createCommSvcDeviceDTO(UUID rootDeviceId) { + if (rootDeviceId == null) { + throw new IllegalArgumentException("Root device ID must not be null"); + } + + Device rootDevice = em.find(Device.class, rootDeviceId); + if (rootDevice == null) { + throw new IllegalArgumentException("Root Device (ID:'%s') not found".formatted(rootDeviceId)); + } + + DeviceDTO rootDeviceDTO = DeviceDTO.from(rootDevice); + + List variables = variableController.getVariablesByDeviceId(rootDeviceId); + List deviceProperties = devicePropertyRepository.findByDeviceId(rootDeviceId); + + List variableDTOs = variableMapper.toVariableDTOs(variables); + List devicePropertyDTOs = toDevicePropertyDTOs(deviceProperties); + + rootDeviceDTO.setVariables(variableDTOs); + rootDeviceDTO.setProperties(devicePropertyDTOs); + + List subDeviceDTOs = getCommSvcDevicesByParentId(rootDeviceId); + rootDeviceDTO.setSubDevices(subDeviceDTOs); + + setCommSvcParentIdAndSubDevices(rootDeviceDTO.getSubDevices(), rootDeviceDTO.getId()); // Recursive call for sub-devices + + return rootDeviceDTO; + } + + public Device getDeviceByDeviceIndex(UUID rootDeviceId, Integer deviceIndex) { + if (deviceIndex == null) { + throw new IllegalArgumentException("Device index required but null was provided"); + } + + Optional rootDevice = deviceRepository.findByIdOptional(rootDeviceId); + return rootDevice.map(device -> traverseDeviceTree(device, deviceIndex)) + .orElse(null); + + } + + private Device traverseDeviceTree(Device device, Integer deviceIndex) { + List subDevices = deviceRepository.getSubDevices(device.getId()); + + for (Device subDevice : subDevices) { + if (deviceIndex.equals(subDevice.getDeviceIndex())) { + return subDevice; + } + + Device result = traverseDeviceTree(subDevice, deviceIndex); + if (Objects.nonNull(result)) { + return result; + } + } + + return null; + } + + private void setCommSvcParentIdAndSubDevices(List subDeviceDTOs, UUID commSvcParentId) { + for (DeviceDTO subDeviceDTO : subDeviceDTOs) { + subDeviceDTO.setParentId(commSvcParentId); + + List subSubDeviceDTOs = getCommSvcDevicesByParentId(subDeviceDTO.getConnectorDeviceId()); + subDeviceDTO.setSubDevices(subSubDeviceDTOs); + + setCommSvcParentIdAndSubDevices(subDeviceDTO.getSubDevices(), subDeviceDTO.getId()); + } + } + + @Transactional + public void updateModeByCommSvcId(UUID commSvcId, ComponentMode mode) { + var device = deviceRepository.getDeviceByCommSvcId(commSvcId); + if (device == null) { + throw new EntityNotFoundException("Device (CommSvcID:'%s') not found.".formatted(commSvcId)); + } + updateMode(device, mode); + logger.infof("Device (CommSvcID:'%s') mode set to:'%s'", commSvcId, mode); + } + + @Transactional + public void updateMode(Device device, ComponentMode mode) { + if (device.getMode().isRestorable()) { + device.setRestoreMode(device.getMode()); + } + device.setMode(mode); + em.merge(device); + switch (mode) { + case PAUSE -> { + unsubscribeDeviceProperties(device.getId()); + unsubscribeVariables(device.getId()); + } + case OPERATION -> { + subscribeDeviceProperties(device.getId()); + subscribeVariables(device.getId()); + } + case FIRMWARE_UPDATE, OFFLINE -> { + updateModeRecursive(device, mode); + } + } + } + + @Transactional + public void restoreModeByCommSvcId(UUID commSvcId) { + var device = deviceRepository.getDeviceByCommSvcId(commSvcId); + + restoreModeRecursive(device); + } + + private void restoreModeRecursive(Device device) { + restoreMode(device); + + deviceRepository.getSubDevices(device.getId()) + .forEach(this::restoreModeRecursive); + } + + private void updateModeRecursive(Device device, ComponentMode mode) { + updatePropertyMode(device.getId(), mode); + updateVariableMode(device.getId(), mode); + + deviceRepository.getSubDevices(device.getId()) + .forEach(subDevice -> updateMode(subDevice, mode)); + } + + public List getSubDevices(UUID deviceId) { + if (deviceId == null) { + throw new IllegalArgumentException("Device id required but null was provided"); + } + return deviceRepository.getSubDevices(deviceId); + } + + @Transactional + public void restoreMode(Device device) { + Objects.requireNonNull(device, "Device required to restore mode"); + restoreDeviceMode(device); + restoreVariableMode(device.getId()); + restorePropertyMode(device.getId()); + } + + @Transactional + public void restoreDeviceMode(Device device) { + Objects.requireNonNull(device, "Device required to restore mode"); + updateModeWithRestoreMode(device); + + logger.debugf("Device (ID:'%s') mode restored to:'%s'", device.getId(), device.getMode()); + } + + private void updateModeWithRestoreMode(Device device) { + if (device != null) { + ComponentMode restoreMode = device.getRestoreMode(); + device.setMode(restoreMode); + } + } + + private void restoreVariableMode(UUID deviceId) { + for (Variable variable : variableController.getVariablesByDeviceId(deviceId)) { + variableController.restoreMode(variable); + } + } + + private void restorePropertyMode(UUID deviceId) { + for (DeviceProperty property : devicePropertyController.findByDeviceId(deviceId)) { + devicePropertyController.restoreMode(property); + } + } + + private void unsubscribeVariables(UUID deviceId) { + for (Variable variable : variableController.getVariablesByDeviceId(deviceId)) { + variableController.updateMode(variable, ComponentMode.PAUSE); + } + } + + private void unsubscribeDeviceProperties(UUID deviceId) { + for (DeviceProperty property : devicePropertyController.findByDeviceId(deviceId)) { + devicePropertyController.updateMode(property, ComponentMode.PAUSE); + } + } + + private void updateVariableMode(UUID deviceId, ComponentMode mode) { + for (Variable variable : variableController.getVariablesByDeviceId(deviceId)) { + variableController.updateMode(variable, mode); + } + } + + private void updatePropertyMode(UUID deviceId, ComponentMode mode) { + for (DeviceProperty property : devicePropertyController.findByDeviceId(deviceId)) { + devicePropertyController.updateMode(property, mode); + } + } + + private void subscribeVariables(UUID deviceId) { + for (Variable variable : variableController.getVariablesByDeviceId(deviceId)) { + variableController.updateMode(variable, ComponentMode.OPERATION); + } + } + + private void subscribeDeviceProperties(UUID deviceId) { + for (DeviceProperty property : devicePropertyController.findByDeviceId(deviceId)) { + devicePropertyController.updateMode(property, ComponentMode.OPERATION); + } + } + + private List toDevicePropertyDTOs(List properties) { + return properties.stream() + .map(DevicePropertyDTO::from) + .toList(); + } + + private List getDevicesByParentId(UUID parentId) { + if (parentId == null) { + return new ArrayList<>(); + } + + return deviceRepository.findByParentId(parentId); + } + + /** + * Retrieves a list of {@link DeviceDTO} objects that are direct sub-devices of a specified parent device. + *

+ * This method fetches all {@link Device} entities that have the specified {@code parentId} from the database. Each of these Device entities is then converted into a Device + * object. Additionally, for each Device object, associated variables and properties are fetched and set. The method effectively maps a list of Device entities to a list of + * Device objects, ready for use in various services or business logic. + * + * @param parentId The unique identifier of the parent device whose sub-devices are to be retrieved. Can be {@code null}, in which case an empty list is returned. + * @return A list of {@link DeviceDTO} objects, each representing a sub-device of the specified parent. Returns an empty list if no sub-devices are found or if the + * {@code parentId} is {@code null}. + */ + private List getCommSvcDevicesByParentId(UUID parentId) { + List subDevices = getDevicesByParentId(parentId); + + ArrayList mappedSubdevices = new ArrayList<>(); + subDevices.forEach(deviceEntity -> { + DeviceDTO deviceDTO = DeviceDTO.from(deviceEntity); + + List variables = variableController.getVariablesByDeviceId(deviceEntity.getId()); + List properties = devicePropertyRepository.findByDeviceId(deviceEntity.getId()); + + List variableDTOs = variableMapper.toVariableDTOs(variables); + List devicePropertyDTOs = toDevicePropertyDTOs(properties); + + deviceDTO.setVariables(variableDTOs); + deviceDTO.setProperties(devicePropertyDTOs); + mappedSubdevices.add(deviceDTO); + }); + + return mappedSubdevices; + } + + + @Transactional + public void updateCommSvcId(DeviceResponseDTO deviceResponseDTO) { + updateCommSvcIdHelper(deviceResponseDTO); + deviceResponseDTO.getSubdevices().forEach(this::updateCommSvcId); + } + + /** + * Updates the communication service ID of a device and associated variables and properties based on the provided device response. + *

+ * This method updates the 'commServiceId' field of a device in the database using the ID provided in the {@link DeviceResponseDTO}. It also updates the communication service + * IDs for the device's variables and properties. If no device is updated in the database (indicating no matching device was found), a warning is logged. The method delegates + * the updating of variables and properties to their respective controllers. + * + * @param deviceResponseDTO The {@link DeviceResponseDTO} containing the new communication service ID and identifiers for the device and its variables and properties. + */ + private void updateCommSvcIdHelper(DeviceResponseDTO deviceResponseDTO) { + if (deviceResponseDTO == null) { + logger.error("DeviceResponseDTO is null."); + return; + } + + int result = em.createQuery("UPDATE device SET commServiceId = :CommSvcId WHERE id = :ConnectorDeviceId") + .setParameter("CommSvcId", deviceResponseDTO.getId()) + .setParameter("ConnectorDeviceId", deviceResponseDTO.getConnectorDeviceId()) + .executeUpdate(); + + if (result == 0) { + logger.warn( + "Update of Device (ID:'%s') to set CommSvcId:'%s' - without success, no row updated".formatted(deviceResponseDTO.getConnectorDeviceId(), + deviceResponseDTO.getId())); + } + + variableController.updateCommSvcId(deviceResponseDTO.getVariables()); + devicePropertyController.updateCommSvcId(deviceResponseDTO.getProperties()); + } + + public List findAllRootDevices() { + return deviceRepository.findAllRootDevices(); + } +} diff --git a/src/main/java/io/gec/raw/connector/device/control/DeviceRepository.java b/src/main/java/io/gec/raw/connector/device/control/DeviceRepository.java new file mode 100755 index 0000000..cae1455 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/control/DeviceRepository.java @@ -0,0 +1,136 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.device.enums.RittalDeviceConstants; +import io.gec.raw.connector.device.enums.RittalDevicePropertyNameEnum; +import io.gec.raw.connector.device.projection.DeviceParentIdProjection; +import io.gec.raw.connector.device.projection.DeviceURLProjection; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class DeviceRepository implements PanacheRepositoryBase { + + private static final String DEVICE_ID = "deviceId"; + @Inject + EntityManager em; + @Inject + IPAddressHelper ipAddressHelper; + + @Transactional + public Optional findDeviceURLProjection(UUID id) { + return find("id", id) + .project(DeviceURLProjection.class) + .firstResultOptional(); + } + + @Transactional + public Optional findDeviceParentIdProjection(UUID id) { + return find("id", id) + .project(DeviceParentIdProjection.class) + .firstResultOptional(); + } + + @Transactional + public List findDeviceIdsByParentId(UUID parentId) { + return Optional.ofNullable(parentId).map(id -> stream("parentId", id) + .map(Device::getId) + .toList()) + .orElse(List.of()); + } + + @Transactional + public Optional findDeviceIdByDeviceUrl(String deviceUrl) { + return this.findByDeviceUrl(deviceUrl) + .map(Device::getId); + } + + + public void subscribe(UUID id) { + setSubscribed(id, true); + } + + + public void unsubscribe(UUID id) { + setSubscribed(id, false); + } + + public void setSubscribed(UUID id, boolean subscribed) { + update("subscribed = ?1 where id = ?2", subscribed, id); + } + + @Transactional + public List getAccessDeviceIndexes(UUID deviceId) { + return em.createQuery("SELECT d.deviceIndex FROM device d WHERE d.parentId =: deviceId AND d.type =:accessDevOid", Integer.class) + .setParameter("deviceId", deviceId) + .setParameter("accessDevOid", RittalDeviceConstants.ACCESS_DEVICE_TYPE_OID) + .getResultList(); + } + + @Transactional + public Device getDeviceByCommSvcId(UUID commDeviceId) { + return em.createQuery("SELECT d FROM device d WHERE d.commServiceId =: commDeviceId", Device.class) + .setParameter("commDeviceId", commDeviceId) + .getSingleResult(); + } + + @Transactional + public Optional findByDeviceUrl(String deviceUrl) { + return Optional.ofNullable(deviceUrl).flatMap(url -> stream("deviceURL is not null") + .filter(device -> ipAddressHelper.removeHttpFromIpAddress(device.getDeviceURL()).equals(url)) + .findFirst()); + } + + @Transactional + public List getSubDevices(UUID parentDeviceId) { + return em.createQuery("FROM device WHERE parentId = :deviceId", Device.class) + .setParameter(DEVICE_ID, parentDeviceId) + .getResultList(); + } + + public List findBySerialNumber(String serialNumber, boolean isRootDevice, UUID plantId) { + String queryString = """ + SELECT d FROM device d + JOIN deviceproperty property ON property.deviceId = d.id + WHERE + property.name = :propertyName AND + property.valueAsString = :propertyStringValue AND + d.plantId = :plantId + """; + + if (isRootDevice) { + queryString += " AND d.parentId IS NULL"; + } else { + queryString += " AND d.parentId IS NOT NULL"; + } + + return em.createQuery(queryString, Device.class) + .setParameter("propertyName", RittalDevicePropertyNameEnum.SERIAL_NUMBER.getLabel()) + .setParameter("propertyStringValue", serialNumber) + .setParameter("plantId", plantId) + .getResultList(); + } + + public void updateMode(UUID id, ComponentMode mode) { + update("mode = ?1 where id = ?2", mode, id); + } + + public List findAllRootDevices() { + return stream("parentId is null") + .toList(); + } + + public List findByParentId(UUID parentId) { + return find("parentId", parentId) + .list(); + } +} diff --git a/src/main/java/io/gec/raw/connector/device/control/DeviceStructureService.java b/src/main/java/io/gec/raw/connector/device/control/DeviceStructureService.java new file mode 100755 index 0000000..003d4c3 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/control/DeviceStructureService.java @@ -0,0 +1,153 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.device.enums.AccessDeviceTypeEnum; +import io.gec.raw.connector.device.enums.RittalDeviceConstants; +import io.gec.raw.connector.device.enums.RittalDevicePropertyNameEnum; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static io.gec.raw.connector.device.enums.AccessDeviceTypeEnum.ACCESS_HANDLE; +import static io.gec.raw.connector.device.enums.AccessDeviceTypeEnum.ACCESS_KEYPAD; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.partitioningBy; + +@ApplicationScoped +public class DeviceStructureService { + + private static final String VARIABLE_DOT_SEPARATOR = "."; + private static final Map DESCRIPTION_TO_TYPE_MAP = Map.of( + RittalDeviceConstants.ACCESS_HANDLE_DEVICE_NAME, ACCESS_HANDLE, + RittalDeviceConstants.ACCESS_KEYPAD_DEVICE_NAME, ACCESS_KEYPAD + ); + + @Inject + ExternalDeviceBuilder externalDeviceBuilder; + @Inject + RittalDeviceBuilder rittalDeviceBuilder; + + public DeviceMapping createRittalDeviceStructure(DeviceOidValueMap oidValueMap, + UUID connectorId, + UUID discoveryWorkItemId, + String hostname) throws NumberFormatException { + DeviceMapping rootDeviceTree = rittalDeviceBuilder.buildDeviceTree(oidValueMap, connectorId, discoveryWorkItemId, hostname); + + rootDeviceTree.getSubDevices().forEach(rootSubDevice -> { + List subDevices = rootSubDevice.getSubDevices(); + + var variablesPartitionedByDot = rootSubDevice.getVariables().stream() + .collect(partitioningBy(this::variableNameContainsDot)); + + var variablesWithDotInName = variablesPartitionedByDot.get(true); + + Map> variablesByDeviceName = groupByDeviceName(variablesWithDotInName); + List deviceNames = List.copyOf(variablesByDeviceName.keySet()); + + variablesByDeviceName.forEach((deviceName, variables) -> { + int devicePosition = deviceNames.indexOf(deviceName) + 1; + DeviceMapping deviceMapping = createDeviceMappingFromVariables(deviceName, devicePosition, variables, rootSubDevice, oidValueMap); + subDevices.add(deviceMapping); + }); + + var variablesWithoutDotInName = variablesPartitionedByDot.get(false); + rootSubDevice.setVariables(variablesWithoutDotInName); + }); + + return rootDeviceTree; + } + + public DeviceMapping createExternalDeviceStructure(DeviceOidValueMap oidValueMap, + UUID connectorId, + UUID dwiId, + UUID driverHeaderId, + String key) throws NumberFormatException { + return externalDeviceBuilder.buildDeviceTree(oidValueMap, connectorId, dwiId, driverHeaderId, key); + } + + private boolean variableNameContainsDot(Variable variable) { + return variable.getName().contains(VARIABLE_DOT_SEPARATOR); + } + + private LinkedHashMap> groupByDeviceName(List variablesWithDotInName) { + return variablesWithDotInName.stream() + .collect(groupingBy(this::getVariableNamePartBeforeDot, LinkedHashMap::new, Collectors.toList())); + } + + private String getVariableNamePartBeforeDot(Variable variable) { + return variable.getName().substring(0, variable.getName().indexOf(VARIABLE_DOT_SEPARATOR)); + } + + private DeviceMapping createDeviceMappingFromVariables(String deviceName, int devicePosition, + List variables, + DeviceMapping rootSubDevice, + DeviceOidValueMap oidValueMap) { + List devicePropertyMappings = createSubDeviceProperties(deviceName, devicePosition, variables, rootSubDevice, oidValueMap); + String deviceAlias = toDeviceAlias(devicePropertyMappings, deviceName); + + return DeviceMapping.builder() + .name(deviceAlias) + .description(deviceName) + .connectorId(rootSubDevice.getConnectorId()) + .discoveryWorkItemId(rootSubDevice.getDiscoveryWorkItemId()) + .variables(variables) + .properties(devicePropertyMappings) + .isRoot(false) + .deviceIndex(rootSubDevice.getDeviceIndex()) // INFO: HAVE TO BE SAME AS FOR PARENT DEVICE - used in access log area + .mode(rootSubDevice.getMode()) + .build(); + } + + private List createSubDeviceProperties(String deviceName, int devicePosition, + List variables, + DeviceMapping rootSubDevice, + DeviceOidValueMap oidValueMap) { + Optional sensorDeviceAlias = rittalDeviceBuilder.getDeviceAliasPropertyByVariables(variables, oidValueMap); + Optional accessDeviceType = Optional.ofNullable(toAccessDeviceTypeProperty(deviceName, rootSubDevice, oidValueMap)); + Optional bus = findPropertyMapping(rootSubDevice.getProperties(), RittalDevicePropertyNameEnum.BUS); + Optional position = createPositionProperty(devicePosition); + + return Stream.of(sensorDeviceAlias, accessDeviceType, bus, position) + .flatMap(Optional::stream) + .toList(); + } + + private DevicePropertyMapping toAccessDeviceTypeProperty(String deviceName, DeviceMapping rootSubDevice, DeviceOidValueMap oidValueMap) { + if (rootSubDevice != null + && RittalDeviceConstants.ACCESS_DEVICE_TYPE_OID.equals(rootSubDevice.getType()) + && DESCRIPTION_TO_TYPE_MAP.containsKey(deviceName)) { + return rittalDeviceBuilder.createAccessDeviceTypeProperty(oidValueMap, DESCRIPTION_TO_TYPE_MAP.get(deviceName)); + } + + return null; + } + + Optional findPropertyMapping(List devicePropertyMappings, RittalDevicePropertyNameEnum name) { + return devicePropertyMappings.stream() + .filter(propertyMapping -> name.getLabel().equals(propertyMapping.getName())) + .findFirst(); + } + + private Optional createPositionProperty(int devicePosition) { + return Optional.of(DevicePropertyMapping.builder() + .name(RittalDevicePropertyNameEnum.POSITION.getLabel()) + .value(String.valueOf(devicePosition)) + .valueDatatype(RittalDevicePropertyNameEnum.POSITION.getDataType().name()) + .readOnly(true) + .mode(ComponentMode.PAUSE) + .build()); + } + + private String toDeviceAlias(List devicePropertyMappings, String deviceName) { + return findPropertyMapping(devicePropertyMappings, RittalDevicePropertyNameEnum.DEVICE_ALIAS) + .map(DevicePropertyMapping::getValue) + .orElse(deviceName); + } +} diff --git a/src/main/java/io/gec/raw/connector/device/control/ExternalDeviceBuilder.java b/src/main/java/io/gec/raw/connector/device/control/ExternalDeviceBuilder.java new file mode 100755 index 0000000..984cc72 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/control/ExternalDeviceBuilder.java @@ -0,0 +1,112 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.gec.raw.connector.driver.control.DriverVariableRepository; +import io.gec.raw.connector.variable.entity.Variable; +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.device.enums.ExternalDevicePropertyEnum; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.UUID; + +import static io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping.createPropertyMapping; + +@ApplicationScoped +public class ExternalDeviceBuilder { + + public static final String NO_QUALITY_OID = "NO_QUALITY_OID"; + private static final String HTTPS_PREFIX = "https://"; + @Inject + DriverVariableRepository driverVariableRepository; + + public DeviceMapping buildDeviceTree(DeviceOidValueMap oidValueMap, UUID connectorId, UUID discoveryWorkItemId, UUID driverHeaderId, String key) + throws NumberFormatException { + return DeviceMapping.builder() + .name(oidValueMap.getSysName()) + .description(oidValueMap.getSysDescr()) + .connectorId(connectorId) + .deviceURL(HTTPS_PREFIX + key) + .discoveryWorkItemId(discoveryWorkItemId) + .variables(createVariables(driverHeaderId)) + .properties(createProperties(oidValueMap)) + .driverHeaderId(driverHeaderId) + .build(); + } + + private List createVariables(UUID driverHeaderId) { + List driverVariableList = driverVariableRepository.findByDriverHeaderId(driverHeaderId); + + return driverVariableList.stream() + .map(this::toVariable) + .toList(); + } + + private List createProperties(DeviceOidValueMap oidValueMap) { + return List.of( + createPropertyMapping(ExternalDevicePropertyEnum.DESCRIPTION, oidValueMap.getSysDescr()), + createPropertyMapping(ExternalDevicePropertyEnum.NAME, oidValueMap.getSysName()), + createPropertyMapping(ExternalDevicePropertyEnum.LOCATION, oidValueMap.getSysLocation()), + createPropertyMapping(ExternalDevicePropertyEnum.CONTACT, oidValueMap.getSysContact()), + createPropertyMapping(ExternalDevicePropertyEnum.SERIAL_NUMBER, oidValueMap.getSysDescr()) + //TODO add hardcoded properties + ); + } + + private Variable toVariable(DriverVariable driverVariable) { + return Variable.builder() + .name(driverVariable.getName()) + .description(driverVariable.getDescription()) + .min(Integer.valueOf(driverVariable.getMin())) + .max(Integer.valueOf(driverVariable.getMax())) + .varType(VarTypeEnum.VALUE) + .varDataType(driverVariable.getDataType()) + .snmpSetVarDataType(driverVariable.getDataType()) + .scale(Integer.parseInt(driverVariable.getScale())) + .step(Integer.parseInt(driverVariable.getStep())) + .varAccessType(toVarAccessType(driverVariable)) + .varQualityOid(NO_QUALITY_OID) + .valueAsIntegerOid(toValueAsIntegerOid(driverVariable)) + .valueAsStringOid(toValueAsStringOid(driverVariable)) + .subscriptionInterval(Integer.parseInt(driverVariable.getIntervalFactor())) + .driverVariableId(driverVariable.getId()) + .functionType(driverVariable.getFunctionType()) + .build(); + } + + private AccessTypeEnum toVarAccessType(DriverVariable driverVariable) { + return driverVariable.getIsReadOnly() + ? AccessTypeEnum.READONLY + : AccessTypeEnum.READWRITE; + } + + private String toValueAsIntegerOid(DriverVariable driverVariable) { + if (isRepresentedByNumber(driverVariable)) { + return driverVariable.getOid(); + } + + return ""; + } + + private String toValueAsStringOid(DriverVariable driverVariable) { + if (!isRepresentedByNumber(driverVariable)) { + return driverVariable.getOid(); + } + + return ""; + } + + private boolean isRepresentedByNumber(DriverVariable driverVariable) { + return driverVariable.getDataType().equals(DataTypeEnum.INTEGER) + || driverVariable.getDataType().equals(DataTypeEnum.FLOAT) + || driverVariable.getDataType().equals(DataTypeEnum.NUMERIC) + || driverVariable.getDataType().equals(DataTypeEnum.STATUSINT) + || driverVariable.getDataType().equals(DataTypeEnum.ANALOGINT); + } +} diff --git a/src/main/java/io/gec/raw/connector/device/control/RittalDeviceBuilder.java b/src/main/java/io/gec/raw/connector/device/control/RittalDeviceBuilder.java new file mode 100755 index 0000000..02d78d0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/control/RittalDeviceBuilder.java @@ -0,0 +1,354 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.enums.*; +import io.gec.raw.connector.deviceproperty.control.DeviceTypeProvider; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import io.gec.raw.connector.utils.control.RittalVariableConfigList; +import io.gec.raw.connector.utils.control.ValueScalingHelper; +import io.gec.raw.connector.variable.control.VariableConstraintParser; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.annotation.Nullable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static io.gec.raw.connector.device.enums.VariableFieldName.*; +import static io.gec.raw.connector.utils.control.RittalVariableConfigList.excludedVariableNameList; +import static java.lang.Integer.parseInt; + +@ApplicationScoped +public class RittalDeviceBuilder { + @Inject + VariableConstraintParser constraintParser; + @Inject + ValueScalingHelper scalingHelper; + @Inject + DeviceTypeProvider deviceTypeProvider; + + public DeviceMapping buildDeviceTree(DeviceOidValueMap oidValueMap, UUID connectorId, UUID discoveryWorkItemId, String hostname) + throws NumberFormatException { + DeviceMapping rootDevice = DeviceMapping.builder() + .deviceURL(RittalDeviceConstants.HTTPS_PREFIX + hostname) + .name(oidValueMap.getSysName()) + .description(oidValueMap.getSysDescr()) + .connectorId(connectorId) + .discoveryWorkItemId(discoveryWorkItemId) + .properties(buildRootDeviceProperties(oidValueMap, hostname)) + .mode(ComponentMode.PAUSE) + .isRoot(true) + .build(); + + int numberOfDevices = parseInt((oidValueMap.get(".1.3.6.1.4.1.2606.7.4.1.1.2.0").toString())); + var deviceIndexes = getDeviceIndexes(oidValueMap, numberOfDevices); + + for (int subDevNumber = 0; subDevNumber < numberOfDevices; subDevNumber++) { + rootDevice.getSubDevices().add(buildSubDevice(oidValueMap, deviceIndexes[subDevNumber], connectorId, discoveryWorkItemId)); + } + + return rootDevice; + } + + int[] getDeviceIndexes(DeviceOidValueMap oidValueMap, int numberOfDevices) { + int deviceCounter = 1; + int deviceResultCounter = 0; + int[] result = new int[numberOfDevices]; + + while (deviceResultCounter < numberOfDevices && deviceCounter <= numberOfDevices) { + var searchString = oidValueMap.get(String.format(".1.3.6.1.4.1.2606.7.4.1.2.1.2.%s", deviceCounter)); + if (searchString != null) { + result[deviceResultCounter++] = deviceCounter; + } + deviceCounter++; + } + return result; + } + + DeviceMapping buildSubDevice(DeviceOidValueMap oidValueMap, int subDevNumber, UUID connectorId, UUID discoveryWorkItemId) { + var deviceName = oidValueMap.get(RittalDevicePropertyNameEnum.NAME.getIndexedOid(subDevNumber)).toString(); + var deviceAlias = oidValueMap.get(RittalDevicePropertyNameEnum.DEVICE_ALIAS.getIndexedOid(subDevNumber)).toString(); + + DeviceMapping subDevice = DeviceMapping.builder() + .description(deviceName) + .type(oidValueMap.get(RittalDevicePropertyNameEnum.TYPE.getIndexedOid(subDevNumber)).toString()) + .name(deviceAlias.isEmpty() ? deviceName : deviceAlias) + .properties(buildSubDeviceProperties(subDevNumber, oidValueMap)) + .connectorId(connectorId) + .discoveryWorkItemId(discoveryWorkItemId) + .isRoot(false) + .mode(ComponentMode.PAUSE) + .deviceIndex(subDevNumber) + .build(); + + int numberSnmpVars = parseInt(oidValueMap.get(RittalDevicePropertyNameEnum.NUMBER_OF_VARIABLES.getIndexedOid(subDevNumber)).toString()); + if (numberSnmpVars > 0) { + subDevice.setVariables(buildVariables(numberSnmpVars, subDevNumber, oidValueMap)); + } + + return subDevice; + } + + List buildRootDeviceProperties(DeviceOidValueMap oidValueMap, String hostname) { + List properties = Stream.of( + RittalDevicePropertyNameEnum.ROOT_SERIAL_NUMBER, + RittalDevicePropertyNameEnum.ROOT_HARDWARE_VERSION, + RittalDevicePropertyNameEnum.ROOT_SOFTWARE_VERSION, + RittalDevicePropertyNameEnum.ROOT_PRODUCTION_CODE, + RittalDevicePropertyNameEnum.ROOT_UNIT_TYPE + ).map(property -> createPropertyMapping(property, oidValueMap, null)) + .collect(Collectors.toList()); + + properties.add(createAccessDeviceTypeProperty(oidValueMap, AccessDeviceTypeEnum.ACCESS_MANAGEMENT_DEVICE)); + properties.add(createIpAddressProperty(hostname)); + + return properties; + } + + List buildVariables(int numberSnmpVars, int subDeviceIndex, DeviceOidValueMap oidValueMap) { + return IntStream.rangeClosed(1, numberSnmpVars) + .mapToObj(varIndex -> buildVariableFromSnmpVar(varIndex, subDeviceIndex, oidValueMap)) + .filter(variable -> !isVariableExcluded(variable.getName())) + .toList(); + } + + List buildSubDeviceProperties(int subDevNumber, DeviceOidValueMap oidValueMap) { + List properties = Stream.of( + RittalDevicePropertyNameEnum.DEVICE_ALIAS, + RittalDevicePropertyNameEnum.NAME, + RittalDevicePropertyNameEnum.TYPE, + RittalDevicePropertyNameEnum.NODE_ID, + RittalDevicePropertyNameEnum.STATUS, + RittalDevicePropertyNameEnum.MODEL_NUMBER, + RittalDevicePropertyNameEnum.LOCATION, + RittalDevicePropertyNameEnum.BUS, + RittalDevicePropertyNameEnum.POSITION, + RittalDevicePropertyNameEnum.SOFTWARE_VERSION, + RittalDevicePropertyNameEnum.HARDWARE_VERSION, + RittalDevicePropertyNameEnum.SERIAL_NUMBER, + RittalDevicePropertyNameEnum.NUMBER_OF_VARIABLES, + RittalDevicePropertyNameEnum.STATUS_TEXT) + .map(property -> createPropertyMapping(property, oidValueMap, subDevNumber)) + .collect(Collectors.toList()); + + getAccessDeviceTypeProperty(oidValueMap, subDevNumber).ifPresent(properties::add); + return properties; + } + + Optional getAccessDeviceTypeProperty(DeviceOidValueMap oidValueMap, Integer deviceIndex) { + var typeValue = oidValueMap.get(RittalDevicePropertyNameEnum.TYPE.getIndexedOid(deviceIndex)).toString(); + if (RittalDeviceConstants.ACCESS_DEVICE_TYPE_OID.equals(typeValue)) { + var accessDeviceTypeProperty = createAccessDeviceTypeProperty(oidValueMap, AccessDeviceTypeEnum.ACCESS_DEVICE); + return Optional.of(accessDeviceTypeProperty); + } + return Optional.empty(); + } + + public DevicePropertyMapping createAccessDeviceTypeProperty(DeviceOidValueMap oidValueMap, AccessDeviceTypeEnum accessDeviceType) { + var accessDeviceTypeProperty = createPropertyMapping(RittalDevicePropertyNameEnum.ACCESS_DEVICE_TYPE, oidValueMap, null); + accessDeviceTypeProperty.setValue(accessDeviceType.name()); + + return accessDeviceTypeProperty; + } + + DevicePropertyMapping createIpAddressProperty(String hostname) { + return createPropertyMapping(RittalDevicePropertyNameEnum.ROOT_IP_ADDRESS, hostname); + } + + DevicePropertyMapping createPropertyMapping(RittalDevicePropertyNameEnum rittalDevicePropertyNameEnum, String value) { + return createPropertyMapping( + rittalDevicePropertyNameEnum.getLabel(), + null, + value, + rittalDevicePropertyNameEnum.getDataType().name(), + rittalDevicePropertyNameEnum.isReadOnly()); + } + + DevicePropertyMapping createPropertyMapping(RittalDevicePropertyNameEnum rittalDevicePropertyEnum, DeviceOidValueMap oidValueMap, @Nullable Integer deviceIndex) { + var oid = deviceIndex == null ? rittalDevicePropertyEnum.getBaseOid() : rittalDevicePropertyEnum.getIndexedOid(deviceIndex); + var value = Optional.ofNullable(oidValueMap.get(oid)) + .orElse(RittalDeviceConstants.PROPERTY_NO_VALUE) + .toString(); + + if (rittalDevicePropertyEnum == RittalDevicePropertyNameEnum.TYPE) { + value = deviceTypeProvider.findByOid(value); + } + + return createPropertyMapping(rittalDevicePropertyEnum.getLabel(), oid, value, rittalDevicePropertyEnum.getDataType().name(), rittalDevicePropertyEnum.isReadOnly()); + } + + private DevicePropertyMapping createPropertyMapping(String name, String oid, String value, String valueDataType, boolean readOnly) { + return DevicePropertyMapping.builder() + .oid(oid) + .name(name) + .value(value) + .valueDatatype(valueDataType) + .readOnly(readOnly) + .mode(ComponentMode.PAUSE) + .build(); + } + + Optional getDeviceAliasPropertyByVariables(List sensorVariables, + DeviceOidValueMap oidValueMap) { + return sensorVariables.stream() + .filter(variable -> variable.getName().toLowerCase().endsWith(RittalDeviceConstants.VARIABLE_DESC_NAME)) + .findFirst() + .map(descNameVariable -> toDeviceAliasProperty(oidValueMap, descNameVariable)); + } + + private DevicePropertyMapping toDeviceAliasProperty(DeviceOidValueMap oidValueMap, Variable v) { + return DevicePropertyMapping.builder() + .oid(v.getValueAsStringOid()) + .name(RittalDevicePropertyNameEnum.DEVICE_ALIAS.getLabel()) + .value(String.valueOf(oidValueMap.getOrDefault(v.getValueAsStringOid(), RittalDeviceConstants.PROPERTY_NO_VALUE))) + .valueDatatype(PropertyClassType.STRING.name()) + .mode(ComponentMode.PAUSE) + .readOnly(false) + .build(); + } + + private boolean isVariableExcluded(String variableName) { + return excludedVariableNameList.stream() + .anyMatch(excludedVariableName -> + variableName.toLowerCase().endsWith(excludedVariableName) + ); + } + + private Variable buildVariableFromSnmpVar(int varStartIndex, int subDeviceIndex, DeviceOidValueMap oidValueMap) { + VarTypeEnum varType = VarTypeEnum.findByNumber(parseInt(getOidValue(oidValueMap, VARTYPE, subDeviceIndex, varStartIndex)[1])); + DataTypeEnum varDataType = DataTypeEnum.findByNumber(parseInt(getOidValue(oidValueMap, DATATYPE, subDeviceIndex, varStartIndex)[1])); + AccessTypeEnum varAccessType = AccessTypeEnum.findByNumber(parseInt(getOidValue(oidValueMap, ACCESS, subDeviceIndex, varStartIndex)[1])); + Variable variable = new Variable(); + variable.setName(getOidValue(oidValueMap, NAME, subDeviceIndex, varStartIndex)[1]); + variable.setVarType(varType); + variable.setUnit(getOidValue(oidValueMap, UNIT, subDeviceIndex, varStartIndex)[1]); + variable.setVarDataType(varDataType); + variable.setSnmpSetVarDataType(varDataType); + variable.setScale(getOidValue(oidValueMap, SCALE, subDeviceIndex, varStartIndex)[1]); + variable.setConstraints(constraintParser.parseConstraints(getOidValue(oidValueMap, CONSTRAINTS, subDeviceIndex, varStartIndex)[1])); + variable.setStep(getOidValue(oidValueMap, STEPS, subDeviceIndex, varStartIndex)[1]); + variable.setMode(ComponentMode.PAUSE); + variable.setVarAccessType(varAccessType); + + //INFO: String and Int Values + String[] stringResult = getOidValue(oidValueMap, VALUESTRING, subDeviceIndex, varStartIndex); + String[] integerResult = getOidValue(oidValueMap, VALUEINT, subDeviceIndex, varStartIndex); + variable.setValueAsStringOid(stringResult[0]); + variable.setValueAsIntegerOid(integerResult[0]); + + //INFO: Quality + var qualityResult = getOidValue(oidValueMap, QUALITY, subDeviceIndex, varStartIndex); + variable.setVarQualityOid(qualityResult[0]); + + variable.setSubscriptionInterval(getInterval(variable)); + variable.setVarDataType(getType(variable)); + variable.setFunctionType(getFunctionType(variable)); + + if (variable.getSnmpSetVarDataType() == DataTypeEnum.INTEGER) { + var minMaxMap = constraintParser.parseMinMaxConstraint(variable.getConstraints()); + if (minMaxMap.get("min") != null) { + variable.setMin(scalingHelper.scaleNumericValueFromDevice(minMaxMap.get("min"), variable.getScale())); + } + if (minMaxMap.get("max") != null) { + variable.setMax(scalingHelper.scaleNumericValueFromDevice(minMaxMap.get("max"), variable.getScale())); + } + } + + //INFO: If min max Null Ignore + return variable; + } + + // Intervals + /* + * 5 minutes for SetPtHigh and SetPtLow for Alarm and Warnings. + 5 minutes for DescName, Hysteresis, Category, Offset + 5 minutes for Circuit, Socket Type, Grouping + 10 secs for Values, Usage, Signal, Position + 30 secs for Status, Relay + once : Size + */ + int getInterval(Variable variable) { + var tempName = variable.getName(); + if (tempName.contains("Value") || tempName.contains("Usage") || + tempName.contains("Signal") || tempName.contains("Position")) { + return 10; + } else if (tempName.contains("Status") || tempName.contains("Relay")) { + return 30; + } else if (tempName.contains("Size")) { + return 1800; + } + return 300; + } + + FunctionTypeEnum getFunctionType(Variable variable) { + String variableName = variable.getName().toLowerCase(); + + if (variableName.endsWith(RittalDeviceConstants.VARIABLE_STATUS)) { + return FunctionTypeEnum.STATE; + } + + Optional trapFunctionType = RittalVariableConfigList.contains_FunctionTypeMap.entrySet().stream() + .filter(entry -> entry.getKey().stream().anyMatch(variableName::contains)) + .map(Map.Entry::getValue) + .findFirst(); + + if (trapFunctionType.isPresent()) { + return trapFunctionType.get(); + } + + Optional specificFunctionType = RittalVariableConfigList.endsWith_specificFunctionTypeMap.entrySet().stream() + .filter(entry -> entry.getKey().stream().anyMatch(variableName::endsWith)) + .map(Map.Entry::getValue) + .findFirst(); + + if (specificFunctionType.isPresent()) { + return specificFunctionType.get(); + } + Optional generalFunctionType = RittalVariableConfigList.endsWith_generalFunctionTypeMap.entrySet().stream() + .filter(entry -> entry.getKey().stream().anyMatch(variableName::endsWith)) + .map(Map.Entry::getValue) + .findFirst(); + + if (generalFunctionType.isPresent()) { + return generalFunctionType.get(); + } + return FunctionTypeEnum.VALUE; + } + + + + DataTypeEnum getType(Variable variable) { + if (variable.getName().toLowerCase().endsWith(RittalDeviceConstants.VARIABLE_STATUS)) { + return DataTypeEnum.STATUSINT; + } else if (variable.getVarDataType() == DataTypeEnum.INTEGER && (variable.getScale() > 1 || variable.getScale() < 0)) { + return DataTypeEnum.FLOAT; + } else if (variable.getVarDataType() == DataTypeEnum.INTEGER) { + return DataTypeEnum.NUMERIC; + } else if (variable.getVarDataType() == DataTypeEnum.ENUM) { + //TODO mabe Change to dedicated type + return DataTypeEnum.STATUSINT; //INFO: Cant be Numeric because of scaling + } else { + return DataTypeEnum.STRING; + } + } + + String[] getOidValue(DeviceOidValueMap oidValueMap, VariableFieldName variableFieldName, int subDeviceIndex, int varStartIndex) { + String oid = String.format(".1.3.6.1.4.1.2606.7.4.2.2.1.%s.%s.%s", variableFieldName.getValue(), subDeviceIndex, varStartIndex); + Object value = oidValueMap.get(oid); + + if (value == null) { + throw new NoSuchElementException("Can't find value in oidValueMap for OID: " + oid); + } + + return new String[] {oid, value.toString()}; + } + +} diff --git a/src/main/java/io/gec/raw/connector/device/domain/DeviceMapping.java b/src/main/java/io/gec/raw/connector/device/domain/DeviceMapping.java new file mode 100755 index 0000000..5ee52cc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/domain/DeviceMapping.java @@ -0,0 +1,40 @@ +package io.gec.raw.connector.device.domain; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import io.gec.raw.connector.variable.entity.Variable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMapping { + + private String description; + private String name; + private String type; + private String parentId; + private String id; + private String deviceURL; + private UUID connectorId; + private UUID discoveryWorkItemId; + private boolean isRoot; + private UUID driverHeaderId; + private ComponentMode mode; + @Builder.Default + private Integer deviceIndex = 0; + @Builder.Default + private List subDevices = new ArrayList<>(); + @Builder.Default + private List variables = new ArrayList<>(); + @Builder.Default + private List properties = new ArrayList<>(); +} diff --git a/src/main/java/io/gec/raw/connector/device/domain/DeviceOidValueMap.java b/src/main/java/io/gec/raw/connector/device/domain/DeviceOidValueMap.java new file mode 100755 index 0000000..63ac12f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/domain/DeviceOidValueMap.java @@ -0,0 +1,103 @@ +package io.gec.raw.connector.device.domain; + +import io.gec.raw.connector.device.enums.ExternalDeviceConstants; + +import java.util.HashMap; + +/** + * @author Frank.Pruefer + */ +public class DeviceOidValueMap extends HashMap { + + private String sysDescr; + private String sysObjectId; + private String sysUpTime; + private String sysContact; + private String sysName; + private String sysLocation; + private String sysServices; + private String enterprise; + + /** + * Set an oid as a string and the corresponding variable value + * + * @param oid the oid + * @param value the value + */ + + @Override + public Object put(String oid, Object value) { + switch (oid) { + case ExternalDeviceConstants.OID_DESCRIPTION: + sysDescr = value.toString(); + break; + case ExternalDeviceConstants.OID_SYS_OBJECT_ID: + sysObjectId = value.toString(); + break; + case ExternalDeviceConstants.OID_SYS_UP_TIME: + sysUpTime = value.toString(); + break; + case ExternalDeviceConstants.OID_SYS_CONTACT: + sysContact = value.toString(); + break; + case ExternalDeviceConstants.OID_SYS_NAME: + sysName = value.toString(); + break; + case ExternalDeviceConstants.OID_SYS_LOCATION: + sysLocation = value.toString(); + break; + case ExternalDeviceConstants.OID_SYS_SERVICES: + sysServices = value.toString(); + break; + default: + if (!oid.startsWith(ExternalDeviceConstants.OID_MIB_2_PREFIX)) { + try { + if (getEnterprise().isEmpty()) { + enterprise = oid.split("\\.")[7]; + } + } catch (Exception e) { + // ignore this exception when enterprise can't be determined from oid string + } + return super.put(oid, value); + } + } + + return null; + } + + /** + * @return true, if all oids for a default device are set (from sysDesc to sysServices) + */ + public boolean isComplete() { + return sysDescr != null && sysObjectId != null && sysContact != null && sysName != null + && sysLocation != null; + } + + public String getEnterprise() { + return enterprise == null ? "" : enterprise; + } + + public String getSysDescr() { + return sysDescr == null ? "" : sysDescr; + } + + public String getSysObjectId() { + return sysObjectId == null ? "" : sysObjectId; + } + + public String getSysUpTime() { + return sysUpTime == null ? "" : sysUpTime; + } + + public String getSysContact() { + return sysContact == null ? "" : sysContact; + } + + public String getSysName() { + return sysName == null ? "" : sysName; + } + + public String getSysLocation() { + return sysLocation == null ? "" : sysLocation; + } +} diff --git a/src/main/java/io/gec/raw/connector/device/dto/DeviceDTO.java b/src/main/java/io/gec/raw/connector/device/dto/DeviceDTO.java new file mode 100755 index 0000000..b9df7b1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/dto/DeviceDTO.java @@ -0,0 +1,59 @@ +/* + * (c) 2023 German Edge Cloud GmbH & Co. KG + * + */ + +package io.gec.raw.connector.device.dto; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.variable.dto.VariableDTO; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.deviceproperty.dto.DevicePropertyDTO; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +@Builder +public class DeviceDTO { + + private UUID id; + private UUID connectorId; + private UUID connectorDeviceId; + private UUID discoveryWorkitemId; + private String name; + private String description; + private String type; + private UUID parentId; + private String deviceUrl; + private UUID plantId; + private String assignedToProject; + private UUID commSvcId; + private UUID driverHeaderId; + private ComponentMode mode; + private List variables; + private List properties; + private List communicationProtocolIds; + private List subDevices; + + public static DeviceDTO from(Device entity) { + return DeviceDTO.builder() + .id(entity.getCommServiceId()) + .connectorId(entity.getConnectorId()) + .connectorDeviceId(entity.getId()) + .discoveryWorkitemId(entity.getDiscoveryWorkItemId()) + .name(entity.getName()) + .description(entity.getDescription()) + .type(entity.getType()) + .parentId(entity.getParentId()) + .deviceUrl(entity.getDeviceURL()) + .plantId(entity.getPlantId()) + .mode(entity.getMode()) + .driverHeaderId(entity.getDriverHeaderId()) + .build(); + } +} diff --git a/src/main/java/io/gec/raw/connector/device/dto/DevicePropertyResponseDTO.java b/src/main/java/io/gec/raw/connector/device/dto/DevicePropertyResponseDTO.java new file mode 100755 index 0000000..7591f64 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/dto/DevicePropertyResponseDTO.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.device.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class DevicePropertyResponseDTO { + + private UUID id; + private UUID deviceId; + private UUID connectorPropertyId; +} diff --git a/src/main/java/io/gec/raw/connector/device/dto/DeviceResponseDTO.java b/src/main/java/io/gec/raw/connector/device/dto/DeviceResponseDTO.java new file mode 100755 index 0000000..3ebcda1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/dto/DeviceResponseDTO.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.device.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +public class DeviceResponseDTO { + + private UUID id; + private UUID connectorId; + private UUID connectorDeviceId; + private UUID parentId; + private List subdevices; + private List variables; + private List properties; +} diff --git a/src/main/java/io/gec/raw/connector/device/dto/VariableResponseDTO.java b/src/main/java/io/gec/raw/connector/device/dto/VariableResponseDTO.java new file mode 100755 index 0000000..326da69 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/dto/VariableResponseDTO.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.device.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +@Builder +public class VariableResponseDTO { + + private UUID id; + private UUID deviceId; + private UUID connectorVariableId; +} diff --git a/src/main/java/io/gec/raw/connector/device/entity/AccessTypeEnum.java b/src/main/java/io/gec/raw/connector/device/entity/AccessTypeEnum.java new file mode 100755 index 0000000..1a6836f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/entity/AccessTypeEnum.java @@ -0,0 +1,31 @@ +package io.gec.raw.connector.device.entity; + +import lombok.Getter; + +@Getter +public enum AccessTypeEnum { + // CMC3 - Variable access types + NONE("NONE", 1), + READONLY("READONLY", 2), + READWRITE("READWRITE", 3), + READWRITESWITCH("READWRITESWITCH", 4), + READWRITEEXTENDED("READWRITEEXTENDED", 5); + + private final String ordinal; + private final Integer number; + + AccessTypeEnum(String ordinal, Integer number) { + this.ordinal = ordinal; + this.number = number; + } + + public static AccessTypeEnum findByNumber(Integer number) { + for (AccessTypeEnum accessType : AccessTypeEnum.values()) { + if (accessType.getNumber().equals(number)) { + return accessType; + } + } + + return null; + } +} diff --git a/src/main/java/io/gec/raw/connector/device/entity/DataTypeEnum.java b/src/main/java/io/gec/raw/connector/device/entity/DataTypeEnum.java new file mode 100755 index 0000000..7c6ab27 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/entity/DataTypeEnum.java @@ -0,0 +1,31 @@ +package io.gec.raw.connector.device.entity; + +import lombok.Getter; + +@Getter +public enum DataTypeEnum { + // CMC3 - Variables Datatype enum + INTEGER(2), + STRING(3), + ENUM(4), + ANALOGINT(5), + STATUSINT(6), + NUMERIC(7), + FLOAT(8); + + private final Integer number; + + DataTypeEnum(Integer number) { + this.number = number; + } + + public static DataTypeEnum findByNumber(Integer number) { + for (DataTypeEnum dataType : DataTypeEnum.values()) { + if (dataType.getNumber().equals(number)) { + return dataType; + } + } + + return null; + } +} diff --git a/src/main/java/io/gec/raw/connector/device/entity/Device.java b/src/main/java/io/gec/raw/connector/device/entity/Device.java new file mode 100755 index 0000000..74ce4e0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/entity/Device.java @@ -0,0 +1,52 @@ +package io.gec.raw.connector.device.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntity; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import jakarta.enterprise.context.Dependent; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Dependent +@Entity(name = "device") +@Table(name = "device", schema = "connector_svc") +@Getter +@Setter +public class Device extends SimpleBaseEntity { + + private String name; + private String description; + private String type; + + @Column(name = "parent_id") + private UUID parentId; + private String deviceURL; + + @Column(name = "plant_id") + private UUID plantId; + + @Column(name = "connector_id") + private UUID connectorId; + + @Column(name = "comm_svc_id") + private UUID commServiceId; + + @Column(name = "discoveryWorkitem_id") + private UUID discoveryWorkItemId; + + @Column(name = "driver_header_id") + private UUID driverHeaderId; + + @Column(name = "device_index", nullable = false) + private Integer deviceIndex; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ComponentMode mode; + + @Enumerated(EnumType.STRING) + @Column(name = "restore_mode", nullable = false) + private ComponentMode restoreMode; +} diff --git a/src/main/java/io/gec/raw/connector/device/enums/AccessDeviceTypeEnum.java b/src/main/java/io/gec/raw/connector/device/enums/AccessDeviceTypeEnum.java new file mode 100755 index 0000000..df645ed --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/enums/AccessDeviceTypeEnum.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.device.enums; + +public enum AccessDeviceTypeEnum { + ACCESS_DEVICE, + ACCESS_MANAGEMENT_DEVICE, + ACCESS_HANDLE, + ACCESS_KEYPAD, +} diff --git a/src/main/java/io/gec/raw/connector/device/enums/ExternalDeviceConstants.java b/src/main/java/io/gec/raw/connector/device/enums/ExternalDeviceConstants.java new file mode 100755 index 0000000..841f1f8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/enums/ExternalDeviceConstants.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.device.enums; + +public class ExternalDeviceConstants { + + private ExternalDeviceConstants() {} + + public static final String OID_MIB_2_PREFIX = ".1.3.6.1.2.1."; + public static final String OID_DESCRIPTION = ".1.3.6.1.2.1.1.1.0"; + public static final String OID_SYS_OBJECT_ID = ".1.3.6.1.2.1.1.2.0"; + public static final String OID_SYS_UP_TIME = ".1.3.6.1.2.1.1.3.0"; + public static final String OID_SYS_CONTACT = ".1.3.6.1.2.1.1.4.0"; + public static final String OID_SYS_NAME = ".1.3.6.1.2.1.1.5.0"; + public static final String OID_SYS_LOCATION = ".1.3.6.1.2.1.1.6.0"; + public static final String OID_SYS_SERVICES = ".1.3.6.1.2.1.1.7.0"; +} diff --git a/src/main/java/io/gec/raw/connector/device/enums/ExternalDevicePropertyEnum.java b/src/main/java/io/gec/raw/connector/device/enums/ExternalDevicePropertyEnum.java new file mode 100755 index 0000000..e2c320a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/enums/ExternalDevicePropertyEnum.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.device.enums; + +import io.gec.raw.connector.device.entity.DataTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum ExternalDevicePropertyEnum { + + DESCRIPTION("Description", ExternalDeviceConstants.OID_DESCRIPTION, DataTypeEnum.STRING, true), + NAME("Name", ExternalDeviceConstants.OID_SYS_NAME, DataTypeEnum.STRING, true), + LOCATION("Location", ExternalDeviceConstants.OID_SYS_LOCATION, DataTypeEnum.STRING, true), + CONTACT("Contact", ExternalDeviceConstants.OID_SYS_CONTACT, DataTypeEnum.STRING, true), + SERIAL_NUMBER("Serial number", ExternalDeviceConstants.OID_DESCRIPTION, DataTypeEnum.STRING, true); + + private final String name; + private final String oid; + private final DataTypeEnum dataType; + private boolean readOnly; +} diff --git a/src/main/java/io/gec/raw/connector/device/enums/FunctionTypeEnum.java b/src/main/java/io/gec/raw/connector/device/enums/FunctionTypeEnum.java new file mode 100755 index 0000000..b76bf9a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/enums/FunctionTypeEnum.java @@ -0,0 +1,12 @@ +package io.gec.raw.connector.device.enums; + +public enum FunctionTypeEnum { + + UNDEFINED, + STATE, + VALUE, + SETTING, + CONFIGURATION, + SERVICE, + EXECUTE +} diff --git a/src/main/java/io/gec/raw/connector/device/enums/PropertyClassType.java b/src/main/java/io/gec/raw/connector/device/enums/PropertyClassType.java new file mode 100755 index 0000000..f31f387 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/enums/PropertyClassType.java @@ -0,0 +1,5 @@ +package io.gec.raw.connector.device.enums; + +public enum PropertyClassType { + GROUP, INT, FLOAT, BOOL, STRING, URL, ENUM, IP_V4, IP_V6 +} diff --git a/src/main/java/io/gec/raw/connector/device/enums/RittalDeviceConstants.java b/src/main/java/io/gec/raw/connector/device/enums/RittalDeviceConstants.java new file mode 100755 index 0000000..fe806cd --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/enums/RittalDeviceConstants.java @@ -0,0 +1,98 @@ +package io.gec.raw.connector.device.enums; + +public class RittalDeviceConstants { + + public static final String VARIABLE_DESC_NAME = ".descname"; + + //Excluded VariableNames + public static final String VARIABLE_KEY_CODE = ".keycode"; + public static final String VARIABLE_KEY_COMMAND = ".keycommand"; + public static final String VARIABLE_CATEGORY = ".category"; + + //Status functionType + public static final String VARIABLE_STATUS = ".status"; + + //setting functionType + public static final String VARIABLE_SETPT = ".setpt"; + public static final String VARIABLE_OFFSET = ".offset"; + public static final String VARIABLE_SENSITIVITY = ".sensitivity"; + public static final String VARIABLE_GROUPING = ".grouping"; + public static final String VARIABLE_HYSTERESIS = ".hysteresis"; + public static final String VARIABLE_SETPOINT = ".setpoint"; + public static final String VARIABLE_AVERAGE = ".average"; + public static final String VARIABLE_LOGIC = ".logic"; + public static final String VARIABLE_START = ".start"; + public static final String VARIABLE_END = ".end"; + public static final String VARIABLE_UNIT = ".unit"; + public static final String VARIABLE_FACTOR = "factor"; + public static final String VARIABLE_POWER_ON_DELAY = ".power on delay"; + public static final String VARIABLE_MIN_VALUE = ".min.value"; + public static final String VARIABLE_MAX_VALUE = ".max.value"; + public static final String VARIABLE_MANUAL_VALUE = ".manual.value"; + public static final String VARIABLE_CONFIG = ".config"; + public static final String VARIABLE_GENERAL_ON_DELAY = ".general.on delay"; + public static final String VARIABLE_GENERAL_ERROR_DELAY = ".general.error delay"; + public static final String VARIABLE_ACTIVE_CUSTOM_ENERGY_VALUE = ".activecustomenergy.value"; + + + //Execute functionType + public static final String VARIABLE_DELAY = ".delay"; + public static final String VARIABLE_LOGIN_DELAY = "login.delay"; + public static final String VARIABLE_RELAY = ".relay"; + public static final String VARIABLE_COMMAND = ".command"; + public static final String VARIABLE_ATTEMPTS = ".attempts"; + public static final String VARIABLE_RED = ".red"; + public static final String VARIABLE_GREEN = ".green"; + public static final String VARIABLE_BLUE = ".blue"; + public static final String VARIABLE_USER_COUNT = ".user count"; + public static final String VARIABLE_GENERAL_GROUPING = ".general.grouping"; + + //Configuration functionType + public static final String VARIABLE_DESCNAME = ".descname"; + public static final String VARIABLE_TYPE = ".type"; + public static final String VARIABLE_CIRCUIT = ".circuit"; + public static final String VARIABLE_SOCKET_TYPE = ".socket type"; + public static final String VARIABLE_MODE = ".mode"; + public static final String VARIABLE_LED_COMMAND = "led.command"; + public static final String VARIABLE_SEQUENCE_MODE = ".sequence mode"; + public static final String VARIABLE_CUSTOM_VALUE = "custom.value"; + public static final String VARIABLE_ERROR_INFO = ".error info"; + public static final String VARIABLE_POSITION = "position"; + public static final String VARIABLE_CUSTOM_RUNTIME_VALUE = "custom.runtime.value"; + public static final String VARIABLE_MESSAGE = "message"; + public static final String VARIABLE_GENERAL_SEQUENCE_MODE = ".general.sequence mode"; + + + //Service functionType + public static final String VARIABLE_SERVICE = "service"; + public static final String VARIABLE_TRAP_RECEIVER = "trapreceiver"; + public static final String VARIABLE_TRAP_ENABLE = "trapenable"; + + //other Constrains + public static final String PROPERTY_NO_VALUE = "No value"; + public static final String HTTPS_PREFIX = "https://"; + public static final String ACCESS_DEVICE_TYPE_OID = "1.3.6.1.4.1.2606.7.7.4.6144"; + public static final String ACCESS_HANDLE_DEVICE_NAME = "Handle"; + public static final String ACCESS_KEYPAD_DEVICE_NAME = "KeyPad"; + + + public static final String OID_DEVICE_ALIAS = ".1.3.6.1.4.1.2606.7.4.1.2.1.3"; + public static final String OID_NAME = ".1.3.6.1.4.1.2606.7.4.1.2.1.2"; + public static final String OID_TYPE = ".1.3.6.1.4.1.2606.7.4.1.2.1.4"; + public static final String OID_NODE_ID = ".1.3.6.1.4.1.2606.7.4.1.2.1.5"; + public static final String OID_STATUS = ".1.3.6.1.4.1.2606.7.4.1.2.1.6"; + public static final String OID_ORDER_NUMBER = ".1.3.6.1.4.1.2606.7.4.1.2.1.7"; + public static final String OID_LOCATION = ".1.3.6.1.4.1.2606.7.4.1.2.1.8"; + public static final String OID_BUS = ".1.3.6.1.4.1.2606.7.4.1.2.1.9"; + public static final String OID_POSITION = ".1.3.6.1.4.1.2606.7.4.1.2.1.10"; + public static final String OID_SOFTWARE_VERSION = ".1.3.6.1.4.1.2606.7.4.1.2.1.11"; + public static final String OID_HARDWARE_VERSION = ".1.3.6.1.4.1.2606.7.4.1.2.1.12"; + public static final String OID_SERIAL_NUMBER = ".1.3.6.1.4.1.2606.7.4.1.2.1.13"; + public static final String OID_NUMBER_OF_VARIABLES = ".1.3.6.1.4.1.2606.7.4.1.2.1.17"; + public static final String OID_STATUS_TEXT = ".1.3.6.1.4.1.2606.7.4.1.2.1.19"; + public static final String OID_ROOT_SERIAL_NUMBER = ".1.3.6.1.4.1.2606.7.2.6.0"; + public static final String OID_ROOT_HARDWARE_VERSION = ".1.3.6.1.4.1.2606.7.2.3.0"; + public static final String OID_ROOT_SOFTWARE_VERSION = ".1.3.6.1.4.1.2606.7.2.4.0"; + public static final String OID_ROOT_PRODUCTION_CODE = ".1.3.6.1.4.1.2606.7.2.7.0"; + public static final String OID_ROOT_UNIT_TYPE = ".1.3.6.1.4.1.2606.7.2.8.0"; +} diff --git a/src/main/java/io/gec/raw/connector/device/enums/RittalDevicePropertyNameEnum.java b/src/main/java/io/gec/raw/connector/device/enums/RittalDevicePropertyNameEnum.java new file mode 100755 index 0000000..b2df058 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/enums/RittalDevicePropertyNameEnum.java @@ -0,0 +1,47 @@ +package io.gec.raw.connector.device.enums; + +import io.gec.raw.connector.device.entity.DataTypeEnum; +import lombok.Getter; + +@Getter +public enum RittalDevicePropertyNameEnum { + + DEVICE_ALIAS("Device alias", RittalDeviceConstants.OID_DEVICE_ALIAS, DataTypeEnum.STRING, false), //INFO: DO NOT CHANGE -> Property is used as DisplayName in the UI + ACCESS_DEVICE_TYPE("Access device type", null, DataTypeEnum.ENUM, true), //INFO: DO NOT CHANGE -> Property is used in Core.Svc + NAME("Name", RittalDeviceConstants.OID_NAME, DataTypeEnum.STRING, true), + TYPE("Type", RittalDeviceConstants.OID_TYPE, DataTypeEnum.STRING, true), + NODE_ID("Node Id", RittalDeviceConstants.OID_NODE_ID, DataTypeEnum.INTEGER, true), + STATUS("Status", RittalDeviceConstants.OID_STATUS, DataTypeEnum.STRING, true), + MODEL_NUMBER("Model number", RittalDeviceConstants.OID_ORDER_NUMBER, DataTypeEnum.STRING, true), + LOCATION("Location", RittalDeviceConstants.OID_LOCATION, DataTypeEnum.STRING, false), + BUS("BUS", RittalDeviceConstants.OID_BUS, DataTypeEnum.STRING, true), + POSITION("Position", RittalDeviceConstants.OID_POSITION, DataTypeEnum.INTEGER, true), + SOFTWARE_VERSION("Software version", RittalDeviceConstants.OID_SOFTWARE_VERSION, DataTypeEnum.STRING, true), + HARDWARE_VERSION("Hardware version", RittalDeviceConstants.OID_HARDWARE_VERSION, DataTypeEnum.STRING, true), + SERIAL_NUMBER("Serial number", RittalDeviceConstants.OID_SERIAL_NUMBER, DataTypeEnum.STRING, true), + NUMBER_OF_VARIABLES("Number of Variables", RittalDeviceConstants.OID_NUMBER_OF_VARIABLES, DataTypeEnum.INTEGER, true), + STATUS_TEXT("Statustext", RittalDeviceConstants.OID_STATUS_TEXT, DataTypeEnum.STRING, true), + // ROOT_DEVICE + ROOT_SERIAL_NUMBER("Serial number", RittalDeviceConstants.OID_ROOT_SERIAL_NUMBER, DataTypeEnum.STRING, true), + ROOT_HARDWARE_VERSION("Hardware version", RittalDeviceConstants.OID_ROOT_HARDWARE_VERSION, DataTypeEnum.STRING, true), + ROOT_SOFTWARE_VERSION("Software version", RittalDeviceConstants.OID_ROOT_SOFTWARE_VERSION, DataTypeEnum.STRING, true), + ROOT_PRODUCTION_CODE("Production Code", RittalDeviceConstants.OID_ROOT_PRODUCTION_CODE, DataTypeEnum.STRING, true), + ROOT_UNIT_TYPE("UnitType", RittalDeviceConstants.OID_ROOT_UNIT_TYPE, DataTypeEnum.STRING, true), + ROOT_IP_ADDRESS("IP address", null, DataTypeEnum.STRING, true); + + private final String label; + private final String baseOid; + private final DataTypeEnum dataType; + private final boolean readOnly; + + RittalDevicePropertyNameEnum(String label, String baseOid, DataTypeEnum dataType, boolean readOnly) { + this.label = label; + this.baseOid = baseOid; + this.dataType = dataType; + this.readOnly = readOnly; + } + + public String getIndexedOid(int index) { + return this.baseOid + "." + index; + } +} diff --git a/src/main/java/io/gec/raw/connector/device/enums/VariableFieldName.java b/src/main/java/io/gec/raw/connector/device/enums/VariableFieldName.java new file mode 100755 index 0000000..2af9739 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/enums/VariableFieldName.java @@ -0,0 +1,36 @@ +/* + * + * * (c) 2022 German Edge Cloud GmbH & Co. KG + * * + * + */ + +package io.gec.raw.connector.device.enums; + +import lombok.Getter; + +@Getter +public enum VariableFieldName { + + NAME("Name", 3), + VARTYPE("VarType", 4), + UNIT("Unit", 5), + DATATYPE("Datatype", 6), + SCALE("Scale", 7), + CONSTRAINTS("Constraints", 8), + STEPS("Steps", 9), + VALUESTRING("ValueString", 10), + VALUEINT("ValueInt", 11), + LASTCHANGE("LastChange", 12), + ACCESS("Access", 13), + QUALITY("Quality", 14), + ENTPHYSICALINDEX("EntPhysicalIndex", 15); + + private final String text; + private final int value; + + VariableFieldName(String text, int value) { + this.text = text; + this.value = value; + } +} diff --git a/src/main/java/io/gec/raw/connector/device/projection/DeviceParentIdProjection.java b/src/main/java/io/gec/raw/connector/device/projection/DeviceParentIdProjection.java new file mode 100755 index 0000000..5326fb9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/projection/DeviceParentIdProjection.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.device.projection; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.UUID; + +@RegisterForReflection +@AllArgsConstructor +@Getter +public class DeviceParentIdProjection { + + private UUID id; + private UUID parentId; +} diff --git a/src/main/java/io/gec/raw/connector/device/projection/DeviceURLProjection.java b/src/main/java/io/gec/raw/connector/device/projection/DeviceURLProjection.java new file mode 100755 index 0000000..66beaec --- /dev/null +++ b/src/main/java/io/gec/raw/connector/device/projection/DeviceURLProjection.java @@ -0,0 +1,13 @@ +package io.gec.raw.connector.device.projection; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@RegisterForReflection +@AllArgsConstructor +@Getter +public class DeviceURLProjection { + + private String deviceURL; +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyCachedService.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyCachedService.java new file mode 100755 index 0000000..1ca492e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyCachedService.java @@ -0,0 +1,55 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.deviceproperty.dto.PropertyValueRequestDTO; +import io.gec.raw.connector.statistic.control.StatisticCollectorController; +import io.gec.raw.connector.statistic.domain.StatisticCategory; +import io.quarkus.cache.Cache; +import io.quarkus.cache.CacheKey; +import io.quarkus.cache.CacheName; +import io.quarkus.cache.CacheResult; +import io.quarkus.cache.CaffeineCache; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +@ApplicationScoped +public class DevicePropertyCachedService { + + @CacheName("device-properties") + Cache cache; + @Inject + CommunicationServiceController communicationServiceController; + @Inject + Logger logger; + @Inject + StatisticCollectorController statisticCollectorController; + + @CacheResult(cacheName = "device-properties") + public Object getCachedValue(@CacheKey UUID key) { + Object value = cache.as(CaffeineCache.class).getIfPresent(key).getNow(null); + logger.debugv("Getting variable from cache, key: {0}, value: {1}", key, value); + return value; + } + + public void updateDeviceProperty(@CacheKey UUID key, PropertyValueRequestDTO propertyValueRequestDTO) { + PropertyValueRequestDTO cachedPropertyValueRequestDTO = (PropertyValueRequestDTO) getCachedValue(key); + if (cachedPropertyValueRequestDTO == null || !cachedPropertyValueRequestDTO.equals(propertyValueRequestDTO)) { + long start = System.currentTimeMillis(); + communicationServiceController.updateDeviceProperty(propertyValueRequestDTO); + long end = System.currentTimeMillis(); + + StatisticCategory statisticCategory = StatisticCategory.of(this.getClass().getSimpleName(), + "PropertyValueRequestDTO"); + statisticCollectorController.add(statisticCategory, start, end, end); + cache.as(CaffeineCache.class).put(key, CompletableFuture.completedFuture(propertyValueRequestDTO)); + return; + } + //INFO: Cache update always because Items could be removed automatically after expiration + cache.as(CaffeineCache.class).put(key, CompletableFuture.completedFuture(propertyValueRequestDTO)); + logger.debugv("{0} added to cache: key: {1}, value: {2}", propertyValueRequestDTO.getClass().getSimpleName(), key, propertyValueRequestDTO); + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyController.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyController.java new file mode 100755 index 0000000..bf31632 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyController.java @@ -0,0 +1,152 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.dto.DevicePropertyResponseDTO; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import io.gec.raw.connector.deviceproperty.exception.DevicePropertyNotFoundException; +import io.gec.raw.connector.deviceproperty.projection.DevicePropertyNameProjection; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.persistence.EntityNotFoundException; +import jakarta.transaction.Transactional; +import org.jboss.logging.Logger; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class DevicePropertyController { + + @Inject + Logger logger; + @Inject + DevicePropertyRepository devicePropertyRepository; + @Inject + DevicePropertyMapper devicePropertyMapper; + @Inject + DevicePropertyTaskScheduler devicePropertyTaskScheduler; + + @Transactional + public void createProperties(List properties, UUID deviceId) { + if (properties != null) { + for (DevicePropertyMapping property : properties) { + DeviceProperty tempProperty = devicePropertyMapper.toDeviceProperty(deviceId, property); + devicePropertyRepository.persist(tempProperty); + } + } + } + + @Transactional + public void createPropertiesIfNotExistByName(List properties, UUID deviceId) { + var devicePropertyNames = devicePropertyRepository.findNamesByDeviceId(deviceId).stream() + .map(DevicePropertyNameProjection::getName) + .toList(); + + var newDeviceProperties = properties.stream() + .filter(property -> !devicePropertyNames.contains(property.getName())) + .toList(); + + createProperties(newDeviceProperties, deviceId); + } + + public DeviceProperty findById(UUID id) { + return devicePropertyRepository.findByIdOptional(id) + .orElseThrow(() -> new DevicePropertyNotFoundException(id)); + } + + @Transactional + public List findByDeviceId(UUID deviceId) throws EntityNotFoundException { + return devicePropertyRepository.findByDeviceId(deviceId); + } + + public Optional findByName(List properties, String name) { + return properties.stream() + .filter(property -> property.getName().equalsIgnoreCase(name)) + .findFirst(); + } + + public DeviceProperty findPropertyByCommSvcId(UUID commSvcId) { + return devicePropertyRepository.findByCommSvcId(commSvcId); + } + + public List findSubscribedDeviceProperties() { + return devicePropertyRepository.findWithNonNullValueOidByMode(ComponentMode.OPERATION); + } + + public List findSubscribableDevicePropertiesUpdatedAfter(OffsetDateTime stamp) { + return devicePropertyRepository.findWithNonNullValueOidAfterStamp(stamp); + } + + @Transactional + public void updatePropertyInterval(UUID propertyId, String intervalValue) { + validateSubmittedId(propertyId); + DeviceProperty deviceProperty = devicePropertyRepository.findById(propertyId); + var interval = parseIntervalStringToIntValue(deviceProperty, intervalValue); + deviceProperty.setSubscriptionInterval(interval); + logger.debugf("DeviceProperty (ID:'%s') interval changed to '%s'", propertyId, intervalValue); + } + + @Transactional + public void updateMode(DeviceProperty deviceProperty, ComponentMode mode) { + ComponentMode oldMode = deviceProperty.getMode(); + if (ComponentMode.PAUSE.equals(mode) && deviceProperty.isNotInitialValueFetched() && Objects.nonNull(deviceProperty.getValueChangeOid())) { + devicePropertyTaskScheduler.executeTask(deviceProperty); + deviceProperty.setInitialValueFetched(true); + } + if (deviceProperty.getMode().isRestorable()) { + deviceProperty.setRestoreMode(oldMode); + } + deviceProperty.setMode(mode); + logger.debugf("Property (ID:'%s') mode set to:'%s'", deviceProperty.getId(), mode); + } + + @Transactional + public void updateCommSvcId(List properties) { + properties.forEach(this::updatePropertyCommSvcId); + } + + private void updatePropertyCommSvcId(DevicePropertyResponseDTO property) { + Optional toUpdate = devicePropertyRepository.findByIdOptional(property.getConnectorPropertyId()); + toUpdate.ifPresentOrElse(deviceProperty -> deviceProperty.setCommServiceId(property.getId()), + () -> logger.warn("Could not store com_svc_id for " + property.getConnectorPropertyId())); + + } + + @Transactional + public void restoreMode(DeviceProperty property) { + Objects.requireNonNull(property, "Property required to restore mode"); + updateModeWithRestoreMode(property); + + logger.debugf("Property (ID:'%s') mode restored to:'%s'", property.getId(), property.getMode()); + } + + public void updateModeWithRestoreMode(DeviceProperty DeviceProperty) { + if (DeviceProperty != null) { + ComponentMode restoreMode = DeviceProperty.getRestoreMode(); + DeviceProperty.setMode(restoreMode); + } + } + + private void validateSubmittedId(UUID propertyId) { + if (propertyId == null) { + throw new IllegalStateException("Update Interval Failed, Property ID is missing"); + } + } + + @Transactional + public void updateDeviceProperty(DeviceProperty deviceProperty) { + devicePropertyRepository.update(deviceProperty); + } + + private Integer parseIntervalStringToIntValue(DeviceProperty deviceProperty, String value) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + throw new NumberFormatException("Invalid interval provided Property (ID:'%s'), interval:'%s'".formatted(deviceProperty.getId(), value)); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyExtractor.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyExtractor.java new file mode 100755 index 0000000..6fa29c5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyExtractor.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.deviceproperty.control; + +public interface DevicePropertyExtractor { + String getName(); + + String getValue(); +} + diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyHandler.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyHandler.java new file mode 100755 index 0000000..a2bd763 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyHandler.java @@ -0,0 +1,66 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.deviceproperty.dto.PropertyValueRequestDTO; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.variable.dto.VarQuality; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import org.jboss.logging.Logger; + +import java.util.Objects; + +@ApplicationScoped +public class DevicePropertyHandler { + + @Inject + DevicePropertyCachedService cachedService; + @Inject + Logger logger; + + @Transactional + public void handleDevicePropertyValue(DeviceProperty deviceProperty, String devicePropertyValue) { + validateDeviceProperty(deviceProperty); + logUpdate("START", deviceProperty, "handle value"); + updateDeviceProperty(deviceProperty, devicePropertyValue); + deviceProperty.setInitialValueFetched(true); + } + + void validateDeviceProperty(DeviceProperty deviceProperty) { + if (Objects.isNull(deviceProperty)) { + String message = "DeviceProperty is required but not provided"; + throw new IllegalArgumentException(message); + } + if (Objects.isNull(deviceProperty.getId())) { + String message = "id is required but not provided"; + throw new IllegalArgumentException(message); + } + if (deviceProperty.getSubscriptionInterval() == 0) { + String message = "subscriptionInterval is required to be other than 0"; + throw new IllegalArgumentException(message); + } + } + + private void updateDeviceProperty(DeviceProperty deviceProperty, String value) { + PropertyValueRequestDTO propertyValueRequestDTO = PropertyValueRequestDTO.builder() + .propertyId(deviceProperty.getId()) + .commSvcId(deviceProperty.getCommServiceId()) + .varQuality(value.isEmpty() ? VarQuality.WARNINGNOVALUE : VarQuality.OK) + .valueAsString(value) + .build(); + + logUpdate("RESULT", deviceProperty, "value=%s. quality=%s".formatted(value, propertyValueRequestDTO.getVarQuality())); + cachedService.updateDeviceProperty(deviceProperty.getId(), propertyValueRequestDTO); + } + + private void logUpdate(String action, DeviceProperty deviceProperty, String message) { + logger.debugf("[%s] DeviceProperty(ID=%s, mode=%s, initialValueFetched=%s, interval=%s) - %s", + action, + deviceProperty.getId(), + deviceProperty.getMode(), + deviceProperty.isInitialValueFetched(), + deviceProperty.getSubscriptionInterval(), + message + ); + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyMapper.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyMapper.java new file mode 100755 index 0000000..fafeb88 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyMapper.java @@ -0,0 +1,30 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.UUID; + +@ApplicationScoped +public class DevicePropertyMapper { + + public DeviceProperty toDeviceProperty(UUID deviceId, DevicePropertyMapping property) { + return DeviceProperty.builder() + .deviceId(deviceId) + .name(property.getName()) + .description(property.getDescription()) + .valueChangeDatatype(DataTypeEnum.valueOf(property.getValueDatatype())) + .valueChangeOid(property.getOid()) + .valueAsString(property.getValue()) + .propertyClass("CLASSES") + .propertyGroup("GENERAL") + .subscriptionInterval(300) + .isReadonly(property.isReadOnly()) + .mode(ComponentMode.PAUSE) + .restoreMode(ComponentMode.PAUSE) + .build(); + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyRepository.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyRepository.java new file mode 100755 index 0000000..134d030 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyRepository.java @@ -0,0 +1,41 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.deviceproperty.projection.DevicePropertyNameProjection; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class DevicePropertyRepository implements PanacheRepositoryBase { + + public List findByDeviceId(UUID deviceId) { + return find("deviceId", deviceId).list(); + } + + public List findNamesByDeviceId(UUID deviceId) { + return find("deviceId", deviceId) + .project(DevicePropertyNameProjection.class) + .list(); + } + + public void update(DeviceProperty deviceProperty) { + getEntityManager().merge(deviceProperty); + } + + public DeviceProperty findByCommSvcId(UUID id) { + return find("commServiceId", id).firstResult(); + } + + public List findWithNonNullValueOidByMode(ComponentMode mode) { + return list("valueChangeOid is not null and mode = ?1", mode); + } + + public List findWithNonNullValueOidAfterStamp(OffsetDateTime stamp) { + return list("valueChangeOid is not null and stamp > ?1 and created < ?1 and mode = 'OPERATION'", stamp); + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskScheduler.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskScheduler.java new file mode 100755 index 0000000..5557f77 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskScheduler.java @@ -0,0 +1,45 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.deviceproperty.domain.DevicePropertyScheduledTask; +import io.gec.raw.connector.deviceproperty.domain.DevicePropertySnmpMessageTaskData; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.subscription.control.AbstractTaskScheduler; +import io.gec.raw.connector.subscription.domain.ScheduledTask; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; + +import java.util.UUID; + +@ApplicationScoped +public class DevicePropertyTaskScheduler extends AbstractTaskScheduler { + + @Inject + DevicePropertyValueProvider devicePropertyValueProvider; + @Inject + DevicePropertyHandler devicePropertyHandler; + @Inject + DevicePropertyController devicePropertyController; + + @Override + public ScheduledTask createScheduledTask(DeviceProperty entity) { + return new DevicePropertyScheduledTask( + entity, + this::createTaskData, + this::runTask + ); + } + + @Override + @Transactional + protected DevicePropertySnmpMessageTaskData createTaskData(UUID devicePropertyId) { + var deviceProperty = devicePropertyController.findById(devicePropertyId); + return devicePropertyValueProvider.createSnmpMessageTaskData(deviceProperty); + } + + @Override + protected void runTask(DevicePropertySnmpMessageTaskData taskData) { + var devicePropertyValue = devicePropertyValueProvider.executeSnmpMessageTask(taskData); + devicePropertyHandler.handleDevicePropertyValue(taskData.entity(), devicePropertyValue); + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyValueProvider.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyValueProvider.java new file mode 100755 index 0000000..dcb3f4d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyValueProvider.java @@ -0,0 +1,69 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.deviceproperty.domain.DevicePropertySnmpMessageTaskData; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.discovery.control.DeviceDiscoveryProtocolService; +import io.gec.raw.connector.discovery.domain.DeviceDiscoveryProtocolData; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.snmp.common.domain.SnmpGetJob; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.Logger; + +import java.util.Objects; + +@ApplicationScoped +public class DevicePropertyValueProvider { + + private final DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + private final Logger logger; + private final SnmpService snmpService; + private final DeviceDiscoveryProtocolService deviceDiscoveryProtocolService; + + public DevicePropertyValueProvider(DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper, + Logger logger, + SnmpService snmpService, + DeviceDiscoveryProtocolService deviceDiscoveryProtocolService) { + this.discoveryWorkItemToDiscoveryDataMapper = discoveryWorkItemToDiscoveryDataMapper; + this.logger = logger; + this.snmpService = snmpService; + this.deviceDiscoveryProtocolService = deviceDiscoveryProtocolService; + } + + public String executeSnmpMessageTask(DevicePropertySnmpMessageTaskData snmpMessageTaskData) { + if (snmpMessageTaskData.isExecutable()) { + return snmpService.snmpGet(snmpMessageTaskData.messageDataValue()) + .orElse(""); + } + + return snmpMessageTaskData.entity().getValue(); + } + + public DevicePropertySnmpMessageTaskData createSnmpMessageTaskData(DeviceProperty deviceProperty) { + var dwiWithIp = deviceDiscoveryProtocolService.findDeviceDiscoveryProtocolData(deviceProperty.getDeviceId()); + + var snmpMessageData = buildDevicePropertyValueSnmpMessageData(deviceProperty, dwiWithIp); + + return new DevicePropertySnmpMessageTaskData(deviceProperty, snmpMessageData); + } + + private SnmpMessageData buildDevicePropertyValueSnmpMessageData(DeviceProperty deviceProperty, + DeviceDiscoveryProtocolData dwiWithIp) { + if (!(Objects.nonNull(dwiWithIp.deviceIP()) + && Objects.nonNull(dwiWithIp.snmpProtocolData()) + && Objects.nonNull(deviceProperty))) { + logger.warnv( + "Could not create DeviceProperty SNMP-GET Job due to NULL in one or more required data. , DeviceProperty={0}, RootDeviceIP={1}, SNMPProtocolData={2}", + deviceProperty, dwiWithIp.deviceIP(), dwiWithIp.snmpProtocolData()); + return null; + } + + var snmpGetJob = SnmpGetJob.builder() + .ipAddress(dwiWithIp.deviceIP()) + .oid(deviceProperty.getValueChangeOid()) + .build(); + return discoveryWorkItemToDiscoveryDataMapper.toSnmpGetMessageData(snmpGetJob, dwiWithIp.snmpProtocolData()); + } + +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/control/DeviceTypeProvider.java b/src/main/java/io/gec/raw/connector/deviceproperty/control/DeviceTypeProvider.java new file mode 100755 index 0000000..d271ca8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/control/DeviceTypeProvider.java @@ -0,0 +1,56 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.deviceproperty.entity.DevTypeEnum; +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@ApplicationScoped +public class DeviceTypeProvider { + + public String findByOid(String oid) { + if (oid.contains(".")) { + String[] parts = oid.split("\\."); + var enumIndex = Integer.parseInt(parts[parts.length - 1]); + return findByNumber(enumIndex).toString(); + } + + return DevTypeEnum.CMCIIIPRODUCTCHASSIS_INVALID_OID.getOrdinal(); + } + + private DevTypeEnum findByNumber(Integer number) { + for (DevTypeEnum qualityType : DevTypeEnum.values()) { + if (qualityType.getNumber().equals(number)) { + return qualityType; + } + } + + Log.warn("Can't find DevTypeEnum for " + number); + return DevTypeEnum.CMCIIIPRODUCTCHASSIS_NOTFOUND; + } + + public DevTypeEnum getEnumFromOid(String oid) { + try { + String regex = "\\.(\\d+)$"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(oid); + + if (matcher.find()) { + int oidValue = Integer.parseInt(matcher.group(1)); + + for (DevTypeEnum item : DevTypeEnum.values()) { + if (item.getNumber() == oidValue) { + return item; + } + } + return DevTypeEnum.CMCIIIPRODUCTCHASSIS_NOTFOUND; + } else { + return DevTypeEnum.CMCIIIPRODUCTCHASSIS_INVALID_OID; + } + } catch (Exception e) { + return DevTypeEnum.CMCIIIPRODUCTCHASSIS_INVALID_OID; + } + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/domain/DevicePropertyScheduledTask.java b/src/main/java/io/gec/raw/connector/deviceproperty/domain/DevicePropertyScheduledTask.java new file mode 100755 index 0000000..92fcfa5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/domain/DevicePropertyScheduledTask.java @@ -0,0 +1,47 @@ +package io.gec.raw.connector.deviceproperty.domain; + +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.subscription.domain.ScheduledTask; +import io.gec.raw.connector.subscription.domain.TaskAction; +import io.gec.raw.connector.subscription.domain.TaskDataFactory; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class DevicePropertyScheduledTask implements ScheduledTask { + + private final DeviceProperty entity; + private final TaskDataFactory dataFactory; + private final TaskAction action; + private final AtomicBoolean runningState; + + public DevicePropertyScheduledTask( + DeviceProperty entity, + TaskDataFactory dataFactory, + TaskAction action + ) { + this.entity = entity; + this.dataFactory = dataFactory; + this.action = action; + this.runningState = new AtomicBoolean(false); + } + + @Override + public DeviceProperty entity() { + return entity; + } + + @Override + public TaskDataFactory dataFactory() { + return dataFactory; + } + + @Override + public TaskAction action() { + return action; + } + + @Override + public AtomicBoolean runningState() { + return runningState; + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/domain/DevicePropertySnmpMessageTaskData.java b/src/main/java/io/gec/raw/connector/deviceproperty/domain/DevicePropertySnmpMessageTaskData.java new file mode 100755 index 0000000..72f9524 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/domain/DevicePropertySnmpMessageTaskData.java @@ -0,0 +1,12 @@ +package io.gec.raw.connector.deviceproperty.domain; + +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.subscription.domain.TaskData; + +public record DevicePropertySnmpMessageTaskData( + DeviceProperty entity, + SnmpMessageData messageDataValue +) + implements TaskData { +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/dto/DevicePropertyDTO.java b/src/main/java/io/gec/raw/connector/deviceproperty/dto/DevicePropertyDTO.java new file mode 100755 index 0000000..ead1da5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/dto/DevicePropertyDTO.java @@ -0,0 +1,51 @@ +/* + * (c) 2023 German Edge Cloud GmbH & Co. KG + * + */ + +package io.gec.raw.connector.deviceproperty.dto; + +import io.gec.raw.connector.deviceproperty.control.DevicePropertyExtractor; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +@Builder +public class DevicePropertyDTO implements DevicePropertyExtractor { + + private UUID id; + private String name; + private String description; + private UUID connectorPropertyId; + private String propertyClass; + private String propertyGroup; + private Boolean isReadonly; + private UUID deviceId; + private String valueAsString; + private String devicePropertyValueDataType; + + public static DevicePropertyDTO from(DeviceProperty deviceProperty) { + return DevicePropertyDTO.builder() + .id(deviceProperty.getCommServiceId()) + .connectorPropertyId(deviceProperty.getId()) + .name(deviceProperty.getName()) + .description(deviceProperty.getDescription()) + .deviceId(deviceProperty.getDeviceId()) + .propertyClass(deviceProperty.getPropertyClass()) + .propertyGroup(deviceProperty.getPropertyGroup()) + .isReadonly(deviceProperty.isReadonly()) + .valueAsString(deviceProperty.getValueAsString()) + .devicePropertyValueDataType(deviceProperty.getValueChangeDatatype().toString()) + .build(); + } + + @Override + public String getValue() { + return valueAsString; + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/dto/PropertyValueRequestDTO.java b/src/main/java/io/gec/raw/connector/deviceproperty/dto/PropertyValueRequestDTO.java new file mode 100755 index 0000000..05704ff --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/dto/PropertyValueRequestDTO.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.deviceproperty.dto; + +import io.gec.raw.connector.variable.dto.VarQuality; +import lombok.*; + +import java.util.UUID; + +@Setter +@Getter +@Builder +@EqualsAndHashCode +public class PropertyValueRequestDTO { + + private UUID propertyId; + private String valueAsString; + private VarQuality varQuality; + private UUID commSvcId; +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevBusEnum.java b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevBusEnum.java new file mode 100755 index 0000000..8802df9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevBusEnum.java @@ -0,0 +1,38 @@ +/* + Copyright 2023 © German Edge Cloud GmbH & Co. KG + */ + +package io.gec.raw.connector.deviceproperty.entity; +/* + * @Author Rafail Mathioudakis + */ + +import lombok.Getter; + +@Getter +public enum DevBusEnum { + + CANBUS1("CANBUS1", 1), + CANBUS2("CANBUS2", 2), + VIRTUAL("VIRTUAL", 3), + MODBUS("MODBUS", 4), + WIRELESS("WIRELESS", 5); + + private final String ordinal; + private final Integer number; + + DevBusEnum(String ordinal, Integer number) { + this.ordinal = ordinal; + this.number = number; + } + + public static DevBusEnum findByNumber(Integer number) { + for (DevBusEnum qualityType : DevBusEnum.values()) { + if (qualityType.getNumber().equals(number)) { + return qualityType; + } + } + + return null; + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevStatusEnum.java b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevStatusEnum.java new file mode 100755 index 0000000..bc48dc9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevStatusEnum.java @@ -0,0 +1,56 @@ +/* + Copyright 2023 © German Edge Cloud GmbH & Co. KG + */ + +package io.gec.raw.connector.deviceproperty.entity; +/* + * @Author Rafail Mathioudakis + */ + +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +public enum DevStatusEnum { + + TAVAIL("NOTAVAIL", 1, "Device not available"), + OK("OK", 2, "OK"), + DETECT("DETECT", 3, "Device detected, confirmation required"), + LOST("LOST", 4, "Device lost (disconnected), confirmation required"), + CHANGED("CHANGED", 5, "Device changed"), + ERROR("ERROR", 6, "Error"), + FWUPDATE("FWUPDATE", 7, "Firmware Update pending"), + FWUPDATERUN("FWUPDATERUN", 8, "Firmware Update running"); + + private final String ordinal; + private final int number; + private final String message; + + DevStatusEnum(String ordinal, int number, String message) { + this.ordinal = ordinal; + this.number = number; + this.message = message; + } + + public String getStringValue() { + return Integer.toString(number); + } + + public static DevStatusEnum findByNumber(int number) { + for (DevStatusEnum qualityType : DevStatusEnum.values()) { + if (qualityType.getNumber() == number) { + return qualityType; + } + } + + return null; + } + + public static Optional from(int value) { + return Arrays.stream(DevStatusEnum.values()) + .filter(devStatusEnum -> devStatusEnum.getNumber() == value) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevTypeEnum.java b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevTypeEnum.java new file mode 100755 index 0000000..b1d3df9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevTypeEnum.java @@ -0,0 +1,165 @@ +/* + Copyright 2023 © German Edge Cloud GmbH & Co. KG + */ + +package io.gec.raw.connector.deviceproperty.entity; + +import lombok.Getter; + +@Getter +public enum DevTypeEnum { + + + CMCIIIPRODUCTCHASSISGATESENSORUNKNOWN("CMCIIIPRODUCTCHASSISGATESENSORUNKNOWN", 256), + CMCIIIPRODUCTCHASSISGATESENSORACCESS("CMCIIIPRODUCTCHASSISGATESENSORACCESS", 273), + CMCIIIPRODUCTCHASSISGATESENSORMOTION("CMCIIIPRODUCTCHASSISGATESENSORMOTION", 277), + CMCIIIPRODUCTCHASSISGATESENSORSMOKE("CMCIIIPRODUCTCHASSISGATESENSORSMOKE", 279), + CMCIIIPRODUCTCHASSISGATESENSORAIRFLOW("CMCIIIPRODUCTCHASSISGATESENSORAIRFLOW", 281), + CMCIIIPRODUCTCHASSISGATESENSORINPUTNO("CMCIIIPRODUCTCHASSISGATESENSORINPUTNO", 289), + CMCIIIPRODUCTCHASSISGATESENSORINPUTNC("CMCIIIPRODUCTCHASSISGATESENSORINPUTNC", 290), + CMCIIIPRODUCTCHASSISGATESENSORVOLTAGE("CMCIIIPRODUCTCHASSISGATESENSORVOLTAGE", 297), + CMCIIIPRODUCTCHASSISGATESENSORTEMP("CMCIIIPRODUCTCHASSISGATESENSORTEMP", 305), + CMCIIIPRODUCTCHASSISGATESENSOR4TO20MA("CMCIIIPRODUCTCHASSISGATESENSOR4TO20MA", 307), + CMCIIIPRODUCTCHASSISGATESENSORFIREERROR("CMCIIIPRODUCTCHASSISGATESENSORFIREERROR", 337), + CMCIIIPRODUCTCHASSISGATESENSORFIREPRE("CMCIIIPRODUCTCHASSISGATESENSORFIREPRE", 338), + CMCIIIPRODUCTCHASSISGATESENSORFIREMAIN("CMCIIIPRODUCTCHASSISGATESENSORFIREMAIN", 339), + CMCIIIPRODUCTCHASSISGATESENSORLEAKAGE("CMCIIIPRODUCTCHASSISGATESENSORLEAKAGE", 345), + CMCIIIPRODUCTCHASSISGATESENSOROUTPUT("CMCIIIPRODUCTCHASSISGATESENSOROUTPUT", 401), + CMCIIIPRODUCTCHASSISGATESENSORDOORMAG("CMCIIIPRODUCTCHASSISGATESENSORDOORMAG", 402), + CMCIIIPRODUCTCHASSISGATELOCK("CMCIIIPRODUCTCHASSISGATELOCK", 512), + CMCIIIPRODUCTCHASSISTEMPERATURE("CMCIIIPRODUCTCHASSISTEMPERATURE", 768), + CMCIIIPRODUCTCHASSISTEMPHUMI("CMCIIIPRODUCTCHASSISTEMPHUMI", 1024), + CMCIIIPRODUCTCHASSISVANDALISM("CMCIIIPRODUCTCHASSISVANDALISM", 1280), + CMCIIIPRODUCTCHASSISPRESSURE("CMCIIIPRODUCTCHASSISPRESSURE", 1536), + CMCIIIPRODUCTCHASSISACCESS("CMCIIIPRODUCTCHASSISACCESS", 1792), + CMCIIIPRODUCTCHASSISIOINPUT("CMCIIIPRODUCTCHASSISIOINPUT", 2048), + CMCIIIPRODUCTCHASSISGATEUNITCFG1("CMCIIIPRODUCTCHASSISGATEUNIT-CFG1", 2304), + CMCIIIPRODUCTCHASSISGATEUNITCFG2("CMCIIIPRODUCTCHASSISGATEUNIT-CFG2", 2305), + CMCIIIPRODUCTCHASSISGATEUNITCFG3("CMCIIIPRODUCTCHASSISGATEUNIT-CFG3", 2306), + CMCIIIPRODUCTCHASSISGATEUNITCFG4("CMCIIIPRODUCTCHASSISGATEUNIT-CFG4", 2307), + CMCIIIPRODUCTCHASSISPOWEROLD("CMCIIIPRODUCTCHASSISPOWEROLD", 2560), + CMCIIIPRODUCTCHASSISDRC("CMCIIIPRODUCTCHASSISDRC", 2816), + CMCIIIPRODUCTCHASSISUNIINPUT("CMCIIIPRODUCTCHASSISUNIINPUT", 3328), + CMCIIIPRODUCTCHASSISPOWER("CMCIIIPRODUCTCHASSISPOWER", 3584), + CMCIIIPRODUCTCHASSISSMOKE("CMCIIIPRODUCTCHASSISSMOKE", 4096), + CMCIIIPRODUCTCHASSISDCM("CMCIIIPRODUCTCHASSISDCM", 4352), + CMCIIIPRODUCTCHASSISLEAKAGE("CMCIIIPRODUCTCHASSISLEAKAGE", 4608), + CMCIIIPRODUCTCHASSISPSMCANC13("CMCIIIPRODUCTCHASSISPSM-CAN-C13", 4864), + CMCIIIPRODUCTCHASSISPSMCANC19("CMCIIIPRODUCTCHASSISPSM-CAN-C19", 4865), + CMCIIIPRODUCTCHASSISPSMCANSCHUKO("CMCIIIPRODUCTCHASSISPSM-CAN-SCHUKO", 4866), + + ACCESSDEVICE("ACCESSDEVICE", 6144), + + CMCIIIPRODUCTCHASSISWIRELESSUNIT("CMCIIIPRODUCTCHASSISWIRELESSUNIT", 6400), + CMCIIIPRODUCTCHASSISLCPFAN("CMCIIIPRODUCTCHASSISLCPFAN", 8192), + CMCIIIPRODUCTCHASSISLCPWTR("CMCIIIPRODUCTCHASSISLCPWTR", 8448), + CMCIIIPRODUCTCHASSISLCPFCS("CMCIIIPRODUCTCHASSISLCPFCS", 8704), + CMCIIIPRODUCTCHASSISLCPTSW("CMCIIIPRODUCTCHASSISLCPTSW", 8960), + CMCIIIPRODUCTCHASSISLCPUDX("CMCIIIPRODUCTCHASSISLCPUDX", 9216), + CMCIIIPRODUCTCHASSISLCP5("CMCIIIPRODUCTCHASSISLCP5", 9472), + + CMCIIIPRODUCTCHASSISLCPCW("CMCIIIPRODUCTCHASSISLCP-CW", 9648), // most likely + + CMCIIIPRODUCTCHASSISLCPMSRZ("CMCIIIPRODUCTCHASSISLCPMSRZ", 9728), + CMCIIIPRODUCTCHASSISLCPT3("CMCIIIPRODUCTCHASSISLCPT3", 9984), + CMCIIIPRODUCTCHASSISLCPFLUSH("CMCIIIPRODUCTCHASSISLCPFLUSH", 10240), + CMCIIIPRODUCTCHASSISLCP("CMCIIIPRODUCTCHASSISLCP", 10496), + CMCIIIPRODUCTCHASSISPSMM16("CMCIIIPRODUCTCHASSISPSM-M16", 12288), + CMCIIIPRODUCTCHASSISPSMM32("CMCIIIPRODUCTCHASSISPSM-M32", 12544), + CMCIIIPRODUCTCHASSISPSMMIDM16("CMCIIIPRODUCTCHASSISPSM-MID-M16", 13312), + CMCIIIPRODUCTCHASSISPSMMIDM32("CMCIIIPRODUCTCHASSISPSM-MID-M32", 13568), + CMCIIIPRODUCTCHASSISPDUMETM1P16AC201200("CMCIIIPRODUCTCHASSISPDU-MET-M-1P-16A-C20-12-00", 14336), + CMCIIIPRODUCTCHASSISPDUMETM1P16ACEE2404("CMCIIIPRODUCTCHASSISPDU-MET-M-1P-16A-CEE-24-04", 14337), + CMCIIIPRODUCTCHASSISPDUMETM1P32ACEE2404("CMCIIIPRODUCTCHASSISPDU-MET-M-1P-32A-CEE-24-04", 14338), + CMCIIIPRODUCTCHASSISPDUMETM3P16ACEE1803("CMCIIIPRODUCTCHASSISPDU-MET-M-3P-16A-CEE-18-03", 14339), + CMCIIIPRODUCTCHASSISPDUMETM3P16ACEE2406("CMCIIIPRODUCTCHASSISPDU-MET-M-3P-16A-CEE-24-06", 14340), + CMCIIIPRODUCTCHASSISPDUMETM3P32ACEE2406("CMCIIIPRODUCTCHASSISPDU-MET-M-3P-32A-CEE-24-06", 14341), + CMCIIIPRODUCTCHASSISPDUMETM3P32ACEE3606("CMCIIIPRODUCTCHASSISPDU-MET-M-3P-32A-CEE-36-06", 14342), + CMCIIIPRODUCTCHASSISPDUMETM3P16ACEE4200("CMCIIIPRODUCTCHASSISPDU-MET-M-3P-16A-CEE-42-00", 14343), + CMCIIIPRODUCTCHASSISPDUMETM3P32ACEE4800("CMCIIIPRODUCTCHASSISPDU-MET-M-3P-32A-CEE-48-00", 14344), + CMCIIIPRODUCTCHASSISPDUMETM3P63ACEE1212("CMCIIIPRODUCTCHASSISPDU-MET-M-3P-63A-CEE-12-12", 14345), + CMCIIIPRODUCTCHASSISPDUMETMUSERDEFINED("CMCIIIPRODUCTCHASSISPDU-MET-M-USERDEFINED", 14591), + CMCIIIPRODUCTCHASSISPDUSWIM1P16AC201200("CMCIIIPRODUCTCHASSISPDU-SWI-M-1P-16A-C20-12-00", 14592), + CMCIIIPRODUCTCHASSISPDUSWIM1P16ACEE2404("CMCIIIPRODUCTCHASSISPDU-SWI-M-1P-16A-CEE-24-04", 14593), + CMCIIIPRODUCTCHASSISPDUSWIM1P32ACEE2404("CMCIIIPRODUCTCHASSISPDU-SWI-M-1P-32A-CEE-24-04", 14594), + CMCIIIPRODUCTCHASSISPDUSWIM3P16ACEE1803("CMCIIIPRODUCTCHASSISPDU-SWI-M-3P-16A-CEE-18-03", 14595), + CMCIIIPRODUCTCHASSISPDUSWIM3P16ACEE2406("CMCIIIPRODUCTCHASSISPDU-SWI-M-3P-16A-CEE-24-06", 14596), + CMCIIIPRODUCTCHASSISPDUSWIM3P32ACEE2406("CMCIIIPRODUCTCHASSISPDU-SWI-M-3P-32A-CEE-24-06", 14597), + CMCIIIPRODUCTCHASSISPDUSWIM3P32ACEE3606("CMCIIIPRODUCTCHASSISPDU-SWI-M-3P-32A-CEE-36-06", 14598), + CMCIIIPRODUCTCHASSISPDUSWIM3P16ACEE4200("CMCIIIPRODUCTCHASSISPDU-SWI-M-3P-16A-CEE-42-00", 14599), + CMCIIIPRODUCTCHASSISPDUSWIM3P32ACEE4800("CMCIIIPRODUCTCHASSISPDU-SWI-M-3P-32A-CEE-48-00", 14600), + CMCIIIPRODUCTCHASSISPDUSWIMUSERDEFINED("CMCIIIPRODUCTCHASSISPDU-SWI-M-USERDEFINED", 14847), + CMCIIIPRODUCTCHASSISPDUMANM1P16AC201200("CMCIIIPRODUCTCHASSISPDU-MAN-M-1P-16A-C20-12-00", 14848), + CMCIIIPRODUCTCHASSISPDUMANM1P16ACEE2404("CMCIIIPRODUCTCHASSISPDU-MAN-M-1P-16A-CEE-24-04", 14849), + CMCIIIPRODUCTCHASSISPDUMANM1P32ACEE2404("CMCIIIPRODUCTCHASSISPDU-MAN-M-1P-32A-CEE-24-04", 14850), + CMCIIIPRODUCTCHASSISPDUMANM3P16ACEE1803("CMCIIIPRODUCTCHASSISPDU-MAN-M-3P-16A-CEE-18-03", 14851), + CMCIIIPRODUCTCHASSISPDUMANM3P16ACEE2406("CMCIIIPRODUCTCHASSISPDU-MAN-M-3P-16A-CEE-24-06", 14852), + CMCIIIPRODUCTCHASSISPDUMANM3P32ACEE2406("CMCIIIPRODUCTCHASSISPDU-MAN-M-3P-32A-CEE-24-06", 14853), + CMCIIIPRODUCTCHASSISPDUMANM3P32ACEE3606("CMCIIIPRODUCTCHASSISPDU-MAN-M-3P-32A-CEE-36-06", 14854), + CMCIIIPRODUCTCHASSISPDUMANM3P16ACEE4200("CMCIIIPRODUCTCHASSISPDU-MAN-M-3P-16A-CEE-42-00", 14855), + CMCIIIPRODUCTCHASSISPDUMANM3P32ACEE4800("CMCIIIPRODUCTCHASSISPDU-MAN-M-3P-32A-CEE-48-00", 14856), + CMCIIIPRODUCTCHASSISPDUMANMUSERDEFINED("CMCIIIPRODUCTCHASSISPDU-MAN-M-USERDEFINED", 15103), + CMCIIIPRODUCTCHASSISPDUMANS1P16AC201200("CMCIIIPRODUCTCHASSISPDU-MAN-S-1P-16A-C20-12-00", 15104), + CMCIIIPRODUCTCHASSISPDUMANS1P16ACEE2404("CMCIIIPRODUCTCHASSISPDU-MAN-S-1P-16A-CEE-24-04", 15105), + CMCIIIPRODUCTCHASSISPDUMANS1P32ACEE2404("CMCIIIPRODUCTCHASSISPDU-MAN-S-1P-32A-CEE-24-04", 15106), + CMCIIIPRODUCTCHASSISPDUMANS3P16ACEE1803("CMCIIIPRODUCTCHASSISPDU-MAN-S-3P-16A-CEE-18-03", 15107), + CMCIIIPRODUCTCHASSISPDUMANS3P16ACEE2406("CMCIIIPRODUCTCHASSISPDU-MAN-S-3P-16A-CEE-24-06", 15108), + CMCIIIPRODUCTCHASSISPDUMANS3P32ACEE2406("CMCIIIPRODUCTCHASSISPDU-MAN-S-3P-32A-CEE-24-06", 15109), + CMCIIIPRODUCTCHASSISPDUMANSUSERDEFINED("CMCIIIPRODUCTCHASSISPDU-MAN-S-USERDEFINED", 15119), + CMCIIIPRODUCTCHASSISPDUUMETM1P13A0UK1600("CMCIIIPRODUCTCHASSISPDUU-MET-M-1P-13A-0UK-16-00", 15360), + CMCIIIPRODUCTCHASSISPDUUMETM1P16ACEE2404("CMCIIIPRODUCTCHASSISPDUU-MET-M-1P-16A-CEE-24-04", 15361), + CMCIIIPRODUCTCHASSISPDUUMETM1P32ACEE2404("CMCIIIPRODUCTCHASSISPDUU-MET-M-1P-32A-CEE-24-04", 15362), + CMCIIIPRODUCTCHASSISPDUUMETMUSERDEFINED("CMCIIIPRODUCTCHASSISPDUU-MET-M-USERDEFINED", 15615), + CMCIIIPRODUCTCHASSISPDUUSWIM1P13A0UK1600("CMCIIIPRODUCTCHASSISPDUU-SWI-M-1P-13A-0UK-16-00", 15616), + CMCIIIPRODUCTCHASSISPDUUSWIM1P16A0UK1600("CMCIIIPRODUCTCHASSISPDUU-SWI-M-1P-16A-0UK-16-00", 15617), + CMCIIIPRODUCTCHASSISPDUUSWIM1P32ACEE1604("CMCIIIPRODUCTCHASSISPDUU-SWI-M-1P-32A-CEE-16-04", 15618), + CMCIIIPRODUCTCHASSISPDUUSWIMUSERDEFINED("CMCIIIPRODUCTCHASSISPDUU-SWI-M-USERDEFINED", 15871), + CMCIIIPRODUCTCHASSISPDUUMANM1P13A0UK1600("CMCIIIPRODUCTCHASSISPDUU-MAN-M-1P-13A-0UK-16-00", 15872), + CMCIIIPRODUCTCHASSISPDUUMANM1P16ACEE1604("CMCIIIPRODUCTCHASSISPDUU-MAN-M-1P-16A-CEE-16-04", 15873), + CMCIIIPRODUCTCHASSISPDUUMANM1P32ACEE1604("CMCIIIPRODUCTCHASSISPDUU-MAN-M-1P-32A-CEE-16-04", 15874), + CMCIIIPRODUCTCHASSISPDUUMANMUSERDEFINED("CMCIIIPRODUCTCHASSISPDUU-MAN-M-USERDEFINED", 16127), + CMCIIIPRODUCTCHASSISPDUUMANS1P13A0UK1600("CMCIIIPRODUCTCHASSISPDUU-MAN-S-1P-13A-0UK-16-00", 16128), + CMCIIIPRODUCTCHASSISPDUUMANS1P16ACEE1604("CMCIIIPRODUCTCHASSISPDUU-MAN-S-1P-16A-CEE-16-04", 16129), + CMCIIIPRODUCTCHASSISPDUUMANS1P32ACEE1604("CMCIIIPRODUCTCHASSISPDUU-MAN-S-1P-32A-CEE-16-04", 16130), + CMCIIIPRODUCTCHASSISPDUUMANSUSERDEFINED("CMCIIIPRODUCTCHASSISPDUU-MAN-S-USERDEFINED", 16383), + CMCIIIPRODUCTCHASSISPDUUMETPMUSERDEFINED("CMCIIIPRODUCTCHASSISPDUU-METP-M-USERDEFINED", 16639), + CMCIIIPRODUCTCHASSISRIMATRIXSS6("CMCIIIPRODUCTCHASSISRIMATRIXS-S6", 20481), + CMCIIIPRODUCTCHASSISRIMATRIXSD6("CMCIIIPRODUCTCHASSISRIMATRIXS-D6", 20482), + CMCIIIPRODUCTCHASSISRIMATRIXSS9("CMCIIIPRODUCTCHASSISRIMATRIXS-S9", 20483), + CMCIIIPRODUCTCHASSISRIMATRIXSD9("CMCIIIPRODUCTCHASSISRIMATRIXS-D9", 20484), + CMCIIIPRODUCTCHASSISRIMATRIXSS6W("CMCIIIPRODUCTCHASSISRIMATRIXS-S6W", 20485), + CMCIIIPRODUCTCHASSISRIMATRIXSD6W("CMCIIIPRODUCTCHASSISRIMATRIXS-D6W", 20486), + CMCIIIPRODUCTCHASSISRIMATRIXSS9W("CMCIIIPRODUCTCHASSISRIMATRIXS-S9W", 20487), + CMCIIIPRODUCTCHASSISRIMATRIXSD9W("CMCIIIPRODUCTCHASSISRIMATRIXS-D9W", 20488), + CMCIIIPRODUCTCHASSISBLUEEPLUS("CMCIIIPRODUCTCHASSISBLUEE-PLUS", 24832), + CMCIIIPRODUCTCHASSISMINICHILLER("CMCIIIPRODUCTCHASSISMINICHILLER", 25088), + CMCIIIPRODUCTCHASSISFIREDETECT("CMCIIIPRODUCTCHASSISFIREDETECT", 28672), + CMCIIIPRODUCTCHASSISFIREEXT("CMCIIIPRODUCTCHASSISFIREEXT", 28928), + CMCIIIPRODUCTCHASSISFIREEXTSLAVE("CMCIIIPRODUCTCHASSISFIREEXTSLAVE", 29184), + CMCIIIPRODUCTCHASSISFIREEXTONEUMX("CMCIIIPRODUCTCHASSISFIREEXTONEU-MX", 29440), + CMCIIIPRODUCTCHASSISFIREEXTONEUMXED("CMCIIIPRODUCTCHASSISFIREEXTONEU-MX-ED", 29696), + CMCIIIPRODUCTCHASSISFIREEXTONEUMXDD("CMCIIIPRODUCTCHASSISFIREEXTONEU-MX-DD", 29952), + CMCIIIPRODUCTCHASSISFIREEXTONEUVSN("CMCIIIPRODUCTCHASSISFIREEXTONEU-VSN", 30208), + CMCIIIPRODUCTCHASSISFIREEXTONEUVSNED("CMCIIIPRODUCTCHASSISFIREEXTONEU-VSN-ED", 30464), + CMCIIIPRODUCTCHASSISFIREEXTONEUVSNDD("CMCIIIPRODUCTCHASSISFIREEXTONEU-VSN-DD", 30720), + CMCIIIPRODUCTCHASSISINTERNAL("CMCIIIPRODUCTCHASSISINTERNAL", 32768), + CMCIIIPRODUCTCHASSISINTERNALIOT("CMCIIIPRODUCTCHASSISINTERNAL-IOT", 33024), + CMCIIIPRODUCTCHASSISPDUISYS("CMCIIIPRODUCTCHASSISPDUI-SYS", 33536), + CMCIIIPRODUCTCHASSISPDUI("CMCIIIPRODUCTCHASSISPDUI", 33792), + CMCIIIPRODUCTCHASSISCIOC("CMCIIIPRODUCTCHASSISCIOC", 34048), // from product mib (20.08.2024) + CMCIIIPRODUCTCHASSISSES("CMCIIIPRODUCTCHASSISSES", 36864), + CMCIIIPRODUCTCHASSISWIRELESSLOCK("CMCIIIPRODUCTCHASSISWIRELESSLOCK", 53248), + CMCIIIPRODUCTCHASSISVIRTUALTWOLEVEL("CMCIIIPRODUCTCHASSISVIRTUALTWOLEVEL", 61440), + CMCIIIPRODUCTCHASSISVIRTUALACCESS("CMCIIIPRODUCTCHASSISVIRTUALACCESS", 61696), + CMCIIIPRODUCTCHASSIS_NOTFOUND("CMCIIIPRODUCTCHASSIS_NOTFOUND", Integer.MAX_VALUE - 1), + CMCIIIPRODUCTCHASSIS_INVALID_OID("CMCIIIPRODUCTCHASSIS_INVALID_OID", Integer.MAX_VALUE - 2); + + private final String ordinal; + private final Integer number; + + DevTypeEnum(String ordinal, Integer number) { + this.ordinal = ordinal; + this.number = number; + } + +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/entity/DeviceProperty.java b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DeviceProperty.java new file mode 100755 index 0000000..7da567a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DeviceProperty.java @@ -0,0 +1,74 @@ +package io.gec.raw.connector.deviceproperty.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntity; +import io.gec.raw.connector.base.entity.SubscribableEntity; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyExtractor; +import jakarta.enterprise.context.Dependent; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.UuidGenerator; + +import java.util.UUID; + +@Dependent +@Entity(name = "deviceproperty") +@Builder(toBuilder = true) +@AllArgsConstructor(access = AccessLevel.PACKAGE) +@NoArgsConstructor +@Setter +@Getter +@Table(name = "device_property", schema = "connector_svc") +public class DeviceProperty extends SimpleBaseEntity implements SubscribableEntity, DevicePropertyExtractor { + @Id + @UuidGenerator + private UUID id; + + @Column(name = "device_id") + private UUID deviceId; + + private String name; + + private String description; + + private String valueAsString; + + private String propertyClass; + + private String propertyGroup; + + private boolean isReadonly; + private String valueChangeOid; + + @Enumerated(EnumType.STRING) + private DataTypeEnum valueChangeDatatype; + + @Column(name = "comm_svc_id") + private UUID commServiceId; + + @Column(name = "subscription_interval") + private int subscriptionInterval; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ComponentMode mode; + + @Enumerated(EnumType.STRING) + @Column(name = "restore_mode", nullable = false) + private ComponentMode restoreMode; + + @Builder.Default + @Column(name = "initial_value_fetched", nullable = false) + private boolean initialValueFetched = false; + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return valueAsString; + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevicePropertyMapping.java b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevicePropertyMapping.java new file mode 100755 index 0000000..f297efd --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/entity/DevicePropertyMapping.java @@ -0,0 +1,35 @@ +package io.gec.raw.connector.deviceproperty.entity; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.enums.ExternalDevicePropertyEnum; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyExtractor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@Getter +@Setter +public class DevicePropertyMapping implements DevicePropertyExtractor { + + private String oid; + private String name; + private String description; + private String value; + private String valueChangeOid; + private String valueDatatype; + private String propertyClass; + private String propertyGroup; + private ComponentMode mode; + private boolean readOnly; + + public static DevicePropertyMapping createPropertyMapping(ExternalDevicePropertyEnum externalDevicePropertyEnum, String value) { + return DevicePropertyMapping.builder() + .oid(externalDevicePropertyEnum.getOid()) + .name(externalDevicePropertyEnum.getName()) + .value(value) + .valueDatatype(externalDevicePropertyEnum.getDataType().name()) + .readOnly(externalDevicePropertyEnum.isReadOnly()) + .build(); + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/exception/DevicePropertyNotFoundException.java b/src/main/java/io/gec/raw/connector/deviceproperty/exception/DevicePropertyNotFoundException.java new file mode 100755 index 0000000..635eb21 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/exception/DevicePropertyNotFoundException.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.deviceproperty.exception; + +import java.util.UUID; + +public class DevicePropertyNotFoundException extends RuntimeException { + + public DevicePropertyNotFoundException(UUID id) { + super(String.format("DeviceProperty with id %s was not found!", id)); + } +} diff --git a/src/main/java/io/gec/raw/connector/deviceproperty/projection/DevicePropertyNameProjection.java b/src/main/java/io/gec/raw/connector/deviceproperty/projection/DevicePropertyNameProjection.java new file mode 100755 index 0000000..318b054 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/deviceproperty/projection/DevicePropertyNameProjection.java @@ -0,0 +1,12 @@ +package io.gec.raw.connector.deviceproperty.projection; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@RegisterForReflection +@AllArgsConstructor +@Getter +public class DevicePropertyNameProjection { + private String name; +} diff --git a/src/main/java/io/gec/raw/connector/discovery/control/DeviceDiscoveryProtocolService.java b/src/main/java/io/gec/raw/connector/discovery/control/DeviceDiscoveryProtocolService.java new file mode 100755 index 0000000..4bfb7ba --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/control/DeviceDiscoveryProtocolService.java @@ -0,0 +1,55 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.discovery.domain.DeviceDiscoveryProtocolData; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import io.quarkus.cache.CacheInvalidateAll; +import io.quarkus.cache.CacheResult; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import org.jboss.logging.Logger; + +import java.util.UUID; + +@ApplicationScoped +public class DeviceDiscoveryProtocolService { + public static final String CACHE_NAME_DEVICE_DISCOVERY_PROTOCOL_DATA = "cache-device-discovery-protocol-data"; + + @Inject + Logger logger; + @Inject + DeviceController deviceController; + @Inject + DiscoveryController discoveryController; + @Inject + DiscoveryMapper discoveryMapper; + @Inject + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + @Inject + IPAddressHelper ipAddressHelper; + + @CacheResult(cacheName = CACHE_NAME_DEVICE_DISCOVERY_PROTOCOL_DATA) + @Transactional + public DeviceDiscoveryProtocolData findDeviceDiscoveryProtocolData(UUID deviceId) { + if (deviceId == null) { + throw new IllegalArgumentException("deviceId is null"); + } + logger.debugf("[CACHE:MISS] DeviceDiscoveryProtocolData for Device(ID=%s)", deviceId); + + var device = deviceController.getDeviceById(deviceId); + var rootDevice = deviceController.getRootDevice(device); + var ipAddress = ipAddressHelper.removeHttpFromIpAddress(rootDevice.getDeviceURL()); + var dwi = discoveryController.findByCommunicationServiceId(rootDevice.getDiscoveryWorkItemId()); + var dwiDto = discoveryMapper.createDiscoveryWorkItemDTO(dwi); + var snmpProtocolData = discoveryWorkItemToDiscoveryDataMapper.toSnmpProtocolData(dwiDto); + + return new DeviceDiscoveryProtocolData(snmpProtocolData, ipAddress); + } + + @CacheInvalidateAll(cacheName = CACHE_NAME_DEVICE_DISCOVERY_PROTOCOL_DATA) + public void invalidateCacheDeviceDiscoveryProtocolData() { + logger.debug("[CACHE:INVALIDATE] DeviceDiscoveryProtocolData"); + } +} diff --git a/src/main/java/io/gec/raw/connector/discovery/control/DeviceDriverService.java b/src/main/java/io/gec/raw/connector/discovery/control/DeviceDriverService.java new file mode 100755 index 0000000..3efdf7f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/control/DeviceDriverService.java @@ -0,0 +1,54 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.gec.raw.connector.driver.control.DriverHeaderRepository; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.ArrayList; +import java.util.List; + +@ApplicationScoped +public class DeviceDriverService { + + @Inject + Logger logger; + @Inject + DriverHeaderRepository driverHeaderRepository; + + protected List findMatchingDriver(String inputSysObjectId, String inputSysDescr) { + logger.debugv("Looking for matching Driver Header with inputSysObjectId: {0} and inputSysDescr: {1}", inputSysObjectId, inputSysDescr); + List driverHeaders = driverHeaderRepository.listAll(); + List matchingDrivers = new ArrayList<>(); + + for (DriverHeader driverHeader : driverHeaders) { + String description = driverHeader.getDescription(); + logger.debugv("Found Driver Header with id: {0}, name: {1}, sysObjectId: {2}, description: {3}", + driverHeader.getId(), driverHeader.getName(), driverHeader.getSysObjectId(), description); + + String sysObjectId = driverHeader.getSysObjectId(); + if (sysObjectId != null && !sysObjectId.isEmpty()) { + if (!inputSysObjectId.equals(sysObjectId)) { + logger.debugv("-> Driver Header skipped, sysObjectId is different"); + continue; + } + } else { + logger.tracev("-> Driver Header skipped, sysObjectId is null or empty!"); + continue; + } + + if (description != null && !description.isEmpty() && inputSysDescr != null && !inputSysDescr.isEmpty()) { + if (!description.matches(inputSysDescr) && !inputSysDescr.matches(description)) { // regex can be hardcoded in driver or device's attribute + logger.debugv("-> Driver Header skipped, description mismatch"); + continue; + } + + matchingDrivers.add(driverHeader); + } + } + + logger.debugv("End of processing, found {0} matching Driver Headers", matchingDrivers.size()); + return matchingDrivers; + } +} diff --git a/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryController.java b/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryController.java new file mode 100755 index 0000000..17f51e7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryController.java @@ -0,0 +1,276 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.protocol.control.PropertyRepository; +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.protocol.domain.CommunicationProtocolEnum; +import io.gec.raw.connector.protocol.domain.DiscoveryPropertyNameEnum; +import io.gec.raw.connector.communicationservice.control.CommunicationService; +import io.gec.raw.connector.device.dto.DeviceResponseDTO; +import io.gec.raw.connector.device.dto.DeviceDTO; +import io.gec.raw.connector.config.entity.ConnectorConfig; +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.discovery.dto.DiscoveryValueDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.discovery.entity.DiscoveryWorkItem; +import io.gec.raw.connector.discovery.entity.SnmpDiscoveryData; +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.gec.raw.connector.job.domain.ProcessingCanceledException; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.protocol.control.ProtocolService; +import io.gec.raw.connector.protocol.entity.Property; +import io.gec.raw.connector.device.control.DeviceStructureService; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.snmp.common.control.SnmpWalk; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.utils.control.Measurement; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.transaction.Transactional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.jboss.logging.Logger; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +@ApplicationScoped +public class DiscoveryController { + + private final ProtocolService protocolService; + private final PropertyRepository propertyRepository; + private final ConnectorConfig connectorConfig; + private final DeviceController deviceController; + private final CommunicationService communicationService; + private final SnmpWalk snmpWalk; + private final DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + private final Logger logger; + private final DeviceDriverService deviceDriverService; + private final SnmpConfig snmpConfig; + private final DeviceStructureService deviceStructureService; + private final SnmpDiscoveryAsyncRunner snmpDiscoveryAsyncRunner; + private final DiscoveryWorkItemRepository discoveryWorkItemRepository; + private final DiscoveryMapper discoveryMapper; + private final DeviceDiscoveryProtocolService deviceDiscoveryProtocolService; + + public DiscoveryController(ProtocolService protocolService, + PropertyRepository propertyRepository, + ConnectorConfig connectorConfig, + DeviceController deviceController, + @RestClient CommunicationService communicationService, + SnmpWalk snmpWalk, + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper, + Logger logger, + DeviceDriverService deviceDriverService, + SnmpConfig snmpConfig, + DeviceStructureService deviceStructureService, + SnmpDiscoveryAsyncRunner snmpDiscoveryAsyncRunner, + DiscoveryWorkItemRepository discoveryWorkItemRepository, + DiscoveryMapper discoveryMapper, + DeviceDiscoveryProtocolService deviceDiscoveryProtocolService) { + this.protocolService = protocolService; + this.propertyRepository = propertyRepository; + this.connectorConfig = connectorConfig; + this.deviceController = deviceController; + this.communicationService = communicationService; + this.snmpWalk = snmpWalk; + this.discoveryWorkItemToDiscoveryDataMapper = discoveryWorkItemToDiscoveryDataMapper; + this.logger = logger; + this.deviceDriverService = deviceDriverService; + this.snmpConfig = snmpConfig; + this.deviceStructureService = deviceStructureService; + this.snmpDiscoveryAsyncRunner = snmpDiscoveryAsyncRunner; + this.discoveryWorkItemRepository = discoveryWorkItemRepository; + this.discoveryMapper = discoveryMapper; + this.deviceDiscoveryProtocolService = deviceDiscoveryProtocolService; + } + + public DiscoveryWorkItemStatus performDiscovery(DiscoveryWorkItemDTO dwiDTO, ProcessingCancellationChecker processingCancellationChecker) { + try { + Measurement.start("DiscoveryLoop"); + + List snmpDiscoveryData = toSnmpDiscoveryData(dwiDTO, processingCancellationChecker); + logger.infof("Discovery start for DiscoveryWorkItem with ID: '%s' and number of hostnames: '%s'", dwiDTO.getId(), snmpDiscoveryData.size()); + + List results = snmpDiscoveryAsyncRunner.startParallelDiscovery( + this::discoveryRun, + snmpDiscoveryData); + DiscoveryWorkItemStatus status = getDiscoveryWorkItemStatus(results, snmpDiscoveryData.size()); + + logger.infof("Discovery finished with status: '%s' for DiscoveryWorkItem with ID: '%s'", status, dwiDTO.getId()); + + Measurement.stop("DiscoveryLoop"); + + return status; + } finally { + snmpDiscoveryAsyncRunner.cleanup(); + deviceDiscoveryProtocolService.invalidateCacheDeviceDiscoveryProtocolData(); + } + } + + private DiscoveryWorkItemStatus getDiscoveryWorkItemStatus(List results, int expectedResultsCount) { + results.stream() + .collect(Collectors.groupingByConcurrent(Function.identity(), Collectors.counting())) + .forEach((key, value) -> logger.debugf("DiscoveryWorkItemStatus '%s' count: %d", key, value)); + + if (snmpDiscoveryAsyncRunner.checkIfFinished(results, expectedResultsCount)) { + return DiscoveryWorkItemStatus.FINISHED; + } + + if (snmpDiscoveryAsyncRunner.checkIfCanceled(results)) { + return DiscoveryWorkItemStatus.CANCELED; + } + + return DiscoveryWorkItemStatus.FAILED; + } + + @Transactional + public Optional getDiscoveryPropertyValue(DiscoveryPropertyNameEnum propertyNameEnum, + DiscoveryWorkItemDTO dwiDTO) { + return propertyRepository.findByNameAndProtocolCommunicationServiceId(propertyNameEnum.getName(), + dwiDTO.getProtocolId()) + .map(Property::getCommunicationServiceId) + .flatMap(propertyId -> findPropertyValueByPropertyId(dwiDTO.getDiscoveryValues(), propertyId)); + } + + private Optional findPropertyValueByPropertyId(List discoveryValues, UUID propertyId) { + return discoveryValues.stream() + .filter(discoveryValue -> discoveryValue.getPropertyId().equals(propertyId)) + .findFirst() + .map(DiscoveryValueDTO::getPropertyValue); + } + + @Transactional + public void persistDiscoveryWorkItem(DiscoveryWorkItemDTO dwiDTO) { + var dwi = discoveryMapper.createDiscoveryWorkItem(dwiDTO); + var discoveryValues = discoveryMapper.createDiscoveryValues(dwiDTO.getDiscoveryValues(), dwi); + dwi.setDiscoveryValues(discoveryValues); + + discoveryWorkItemRepository.persist(dwi); + } + + @Transactional + public void updateDiscoveryWorkItemStatusByCommSvcId(UUID discoveryWorkItemCommSvcId, DiscoveryWorkItemStatus status) { + discoveryWorkItemRepository.updateStatusByCommSvcId(discoveryWorkItemCommSvcId, status); + } + + public DiscoveryWorkItem findByCommunicationServiceId(UUID discoveryWorkItemId) { + return discoveryWorkItemRepository.findByCommunicationServiceId(discoveryWorkItemId); + } + + private List toSnmpDiscoveryData(DiscoveryWorkItemDTO dwiDTO, ProcessingCancellationChecker processingCancellationChecker) { + String rootOid = snmpConfig.getDiscoveryRootOid(); + + return discoveryWorkItemToDiscoveryDataMapper.toSnmpMessageDataList(dwiDTO, rootOid).stream() + .map(snmpMessageData -> SnmpDiscoveryData.of(dwiDTO, snmpMessageData, processingCancellationChecker)) + .toList(); + } + + @ActivateRequestContext + DiscoveryWorkItemStatus discoveryRun(SnmpDiscoveryData snmpDiscoveryData) { + SnmpMessageData snmpMessageData = snmpDiscoveryData.getSnmpMessageData(); + String hostname = snmpMessageData.getHostname(); + String currentThreadName = Thread.currentThread().getName(); + + logger.infof("Discovery for host: '%s', thread name: '%s' - STARTED", hostname, currentThreadName); + logger.debugf("Discovery data: %s", snmpMessageData); + + try { + DeviceOidValueMap deviceOidValueMap = snmpWalk.collectDeviceOidValueMap(snmpMessageData, snmpDiscoveryData.getProcessingCancellationChecker()); + processDeviceOidValues(snmpDiscoveryData, deviceOidValueMap); + + logger.infof("Discovery for host: '%s', thread name: '%s' - FINISHED", hostname, currentThreadName); + return DiscoveryWorkItemStatus.FINISHED; + } catch (ProcessingCanceledException e) { + logger.infof("Discovery for host: '%s', thread name: '%s' - CANCELLED", hostname, currentThreadName); + return DiscoveryWorkItemStatus.CANCELED; + } + } + + private void processDeviceOidValues(SnmpDiscoveryData snmpDiscoveryData, DeviceOidValueMap deviceOidValueMap) throws ProcessingCanceledException { + if (snmpDiscoveryData.getProcessingCancellationChecker().isProcessingCanceled()) { + throw new ProcessingCanceledException(); + } + + String hostname = snmpDiscoveryData.getSnmpMessageData().getHostname(); + if (deviceOidValueMap.isComplete()) { + logger.infof("Host '%s' contains snmp devices", hostname); + evaluateOidValueMap(snmpDiscoveryData.getDiscoveryWorkItem(), deviceOidValueMap, hostname); + } else { + logger.infof("Host '%s' does not contain snmp devices", hostname); + } + } + + public DiscoveryWorkItemDTO getDiscoveryWorkItemByDeviceId(UUID deviceId) { + if (deviceId == null) { + throw new IllegalArgumentException("deviceId is null"); + } + + Device device = deviceController.getDeviceById(deviceId); + var dwi = findByCommunicationServiceId(device.getDiscoveryWorkItemId()); + + return discoveryMapper.createDiscoveryWorkItemDTO(dwi); + } + + @Transactional + void evaluateOidValueMap(DiscoveryWorkItemDTO dwiDTO, + DeviceOidValueMap oidValueMap, + String hostname) { + if (oidValueMap.isComplete()) { + logger.debug("OidValueMap is complete"); + } + List driverHeader = deviceDriverService.findMatchingDriver(oidValueMap.getSysObjectId(), oidValueMap.getSysDescr()); + if (!driverHeader.isEmpty()) { + if (driverHeader.size() > 1) { + logger.errorf( + "Found %d driver(s) matching the search criteria, using the first driver (ID:'%s', name:'%s')", + driverHeader.size(), driverHeader.get(0).getId(), driverHeader.get(0).getName()); + } + UUID driverHeaderId = driverHeader.get(0).getId(); + try { + DeviceMapping externalDeviceStructure = deviceStructureService.createExternalDeviceStructure( + oidValueMap, + connectorConfig.getConnectorId(), dwiDTO.getId(), driverHeaderId, hostname); + Device rootDevice = deviceController.storeDevice(externalDeviceStructure, + dwiDTO.getPlantId(), null); + //INFO: Return the device tree for the communication service + createAndUpdateCommSvcDevicesByDevice(rootDevice, Collections.emptyList()); + } catch (Exception ex) { + logger.errorf(ex, "Create device structure for third party driver (ID:'%s') - FAILED", driverHeaderId); + throw new RuntimeException(ex); //FIXME dedicated exception should be thrown + } + } else { + try { + if (oidValueMap.getSysObjectId().equals("1.3.6.1.4.1.2606.7")) { + DeviceMapping rootDeviceStructure = deviceStructureService.createRittalDeviceStructure(oidValueMap, + connectorConfig.getConnectorId(), dwiDTO.getId(), hostname); + Device rzRootDevice = deviceController.storeDevice(rootDeviceStructure, + dwiDTO.getPlantId(), null); + //INFO: Return the device tree for the communication service + var protocolId = protocolService.findProtocolByName(CommunicationProtocolEnum.SFTP.getName()).getCommunicationServiceId(); + createAndUpdateCommSvcDevicesByDevice(rzRootDevice, List.of(protocolId)); + } else { + logger.errorf("Driver was not found for DiscoveryWorkItem (ID:'%s')", dwiDTO.getId()); + throw new IllegalArgumentException("No Matching Driver found"); + } + } catch (Exception e) { + logger.errorf(e, "Could not create device structure for DiscoveryWorkItem (ID:'%s')", e.getMessage()); + throw new RuntimeException(e); //FIXME dedicated exception should be thrown + } + } + } + + private void createAndUpdateCommSvcDevicesByDevice(Device device, + List protocolIds) { + DeviceDTO commSvcDeviceDTO = deviceController.createCommSvcDeviceDTO(device.getId()); + if (commSvcDeviceDTO != null) { + commSvcDeviceDTO.setCommunicationProtocolIds(protocolIds); + DeviceResponseDTO newDeviceWithIds = communicationService.createOrUpdateDevicesWithSubDevices( + commSvcDeviceDTO); + deviceController.updateCommSvcId(newDeviceWithIds); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryMapper.java b/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryMapper.java new file mode 100755 index 0000000..9679ecd --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryMapper.java @@ -0,0 +1,63 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.discovery.entity.DiscoveryValue; +import io.gec.raw.connector.discovery.dto.DiscoveryValueDTO; +import io.gec.raw.connector.discovery.entity.DiscoveryWorkItem; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import jakarta.enterprise.context.ApplicationScoped; + +import java.time.OffsetDateTime; +import java.util.List; + +@ApplicationScoped +public class DiscoveryMapper { + + public DiscoveryWorkItemDTO createDiscoveryWorkItemDTO(DiscoveryWorkItem dwi) { + return DiscoveryWorkItemDTO.builder() + .id(dwi.getId()) + .name(dwi.getName()) + .status(dwi.getStatus()) + .protocolId(dwi.getProtocolId()) + .plantId(dwi.getPlantId()) + .created(dwi.getCreated()) + .stamp(dwi.getStamp()) + .discoveryValues(createDiscoveryValueDTOs(dwi.getDiscoveryValues())) + .build(); + } + + public DiscoveryWorkItem createDiscoveryWorkItem(DiscoveryWorkItemDTO dwiDTO) { + return DiscoveryWorkItem.builder() + .name(dwiDTO.getName()) + .commDiscoveryId(dwiDTO.getId()) + .status(dwiDTO.getStatus()) + .protocolId(dwiDTO.getProtocolId()) + .plantId(dwiDTO.getPlantId()) + .build(); + } + + public List createDiscoveryValueDTOs(List discoveryValues) { + return discoveryValues.stream().map(this::createDiscoveryValueDTO).toList(); + } + + public DiscoveryValueDTO createDiscoveryValueDTO(DiscoveryValue dv) { + return DiscoveryValueDTO.builder() + .propertyId(dv.getPropertyId()) + .propertyValue(dv.getPropertyValue()) + .build(); + } + + public List createDiscoveryValues(List discoveryValueDTOs, DiscoveryWorkItem dwi) { + return discoveryValueDTOs.stream().map(dvDTO -> createDiscoveryValue(dvDTO, dwi)).toList(); + } + + public DiscoveryValue createDiscoveryValue(DiscoveryValueDTO dvDTO, DiscoveryWorkItem dwi) { + return DiscoveryValue.builder() + .discoveryWorkItem(dwi) + .propertyValue(dvDTO.getPropertyValue()) + .propertyId(dvDTO.getPropertyId()) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build(); + } + +} diff --git a/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryWorkItemRepository.java b/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryWorkItemRepository.java new file mode 100755 index 0000000..32f4eab --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/control/DiscoveryWorkItemRepository.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.discovery.entity.DiscoveryWorkItem; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; + +import java.util.UUID; + +@ApplicationScoped +public class DiscoveryWorkItemRepository implements PanacheRepositoryBase { + + @Transactional + public DiscoveryWorkItem findByCommunicationServiceId(UUID communicationServiceDiscoveryWorkItemId) { + return find("commDiscoveryId", communicationServiceDiscoveryWorkItemId) + .firstResult(); + } + + public void updateStatusByCommSvcId(UUID discoveryWorkItemCommSvcId, DiscoveryWorkItemStatus status) { + update("status = ?1 WHERE commDiscoveryId = ?2", status, discoveryWorkItemCommSvcId); + } +} diff --git a/src/main/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryAsyncRunner.java b/src/main/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryAsyncRunner.java new file mode 100755 index 0000000..b6187cb --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryAsyncRunner.java @@ -0,0 +1,137 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.discovery.entity.SnmpDiscoveryData; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.function.Function; + +@ApplicationScoped +public class SnmpDiscoveryAsyncRunner { + + private final SnmpDiscoveryThreadPool snmpDiscoveryThreadPool; + private final Logger logger; + + public SnmpDiscoveryAsyncRunner(SnmpDiscoveryThreadPool snmpDiscoveryThreadPool, Logger logger) { + this.snmpDiscoveryThreadPool = snmpDiscoveryThreadPool; + this.logger = logger; + } + + public List startParallelDiscovery(Function discoveryFunction, + List discoveryData) { + List> futures = createDiscoveryTasks(discoveryFunction, discoveryData); + runAllDiscoveryTasks(futures); + return getDiscoveryStatusEnums(futures); + } + + public boolean checkIfFinished(List results, int expectedResultsCount) { + long finishedResultsCount = results.stream() + .filter(result -> result.equals(DiscoveryWorkItemStatus.FINISHED)) + .count(); + return finishedResultsCount == expectedResultsCount; + } + + public boolean checkIfCanceled(List results) { + return results.stream().anyMatch(result -> result.equals(DiscoveryWorkItemStatus.CANCELED)); + } + + public void cleanup() { + this.snmpDiscoveryThreadPool.cleanup(); + } + + private List> createDiscoveryTasks(Function discoveryFunction, + List discoveryData) { + List> discoveryTasks = new ArrayList<>(); + + for (SnmpDiscoveryData data : discoveryData) { + CompletableFuture discoveryTask = createDiscoveryTask( + discoveryTasks, + discoveryFunction, + data); + discoveryTasks.add(discoveryTask); + } + + return discoveryTasks; + } + + private void runAllDiscoveryTasks(List> discoveryTasks) { + CompletableFuture.allOf(discoveryTasks.toArray(new CompletableFuture[0])) + .thenRun(() -> joinAll(discoveryTasks)) + .exceptionally(this::onException) + .join(); + } + + private void joinAll(List> discoveryTasks) { + discoveryTasks.forEach(CompletableFuture::join); + } + + private Void onException(Throwable error) { + logger.errorf("There was an error during the discovery, message: %s", error.getMessage()); + return null; + } + + private List getDiscoveryStatusEnums(List> discoveryTasks) { + return discoveryTasks.stream() + .map(future -> { + if (future.isCompletedExceptionally()) { + return DiscoveryWorkItemStatus.CANCELED; + } + + try { + return future.get(); + } catch (InterruptedException | ExecutionException ex) { + throw new RuntimeException(ex); + } + }).toList(); + } + + private CompletableFuture createDiscoveryTask(List> discoveryTasks, + Function discoveryFunction, + SnmpDiscoveryData discoveryData) { + UUID discoveryWorkItemId = discoveryData.getDiscoveryWorkItem().getId(); + + CompletableFuture discovery = createDiscovery(discoveryFunction, discoveryData); + discovery.thenRun(() -> cancelDiscoveryIfNeeded(discoveryTasks, discoveryWorkItemId, discoveryData.getProcessingCancellationChecker())); + discovery.exceptionally(onDiscoveryException(discoveryData)); + return discovery; + } + + private Function onDiscoveryException(SnmpDiscoveryData discoveryData) { + return throwable -> { + String hostname = discoveryData.getSnmpMessageData().getHostname(); + logger.errorf("There was an error during discovery run for hostname: %s, throwable: %s", hostname, throwable); + return DiscoveryWorkItemStatus.CANCELED; + }; + } + + private CompletableFuture createDiscovery(Function discoveryFunction, + SnmpDiscoveryData discoveryData) { + ExecutorService threadPool = snmpDiscoveryThreadPool.getThreadPool(); + return CompletableFuture.supplyAsync(() -> discoveryFunction.apply(discoveryData), threadPool); + } + + private void cancelDiscoveryIfNeeded(List> futures, + UUID discoveryWorkItemId, + ProcessingCancellationChecker processingCancellationChecker) { + if (processingCancellationChecker.isProcessingCanceled()) { + logger.infof("Remaining discoveries for DiscoveryWorkItemId: %s were cancelled.", discoveryWorkItemId); + cancelRemainingFutures(futures); + } + } + + private void cancelRemainingFutures(List> futures) { + for (CompletableFuture future : futures) { + if (!future.isDone() && !future.isCancelled()) { + future.cancel(false); + } + } + } +} diff --git a/src/main/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryThreadPool.java b/src/main/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryThreadPool.java new file mode 100755 index 0000000..839e3ad --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryThreadPool.java @@ -0,0 +1,53 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.config.entity.SnmpConfig; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.Optional; +import java.util.concurrent.*; + +@ApplicationScoped +public class SnmpDiscoveryThreadPool { + + @Inject + SnmpConfig snmpConfig; + + private Optional threadPool = Optional.empty(); + + public ExecutorService getThreadPool() { + return this.threadPool.orElseGet(this::createThreadPool); + } + + private void shutdown(ExecutorService executorService) { + executorService.shutdown(); + try { + if (!executorService.awaitTermination(3000, TimeUnit.MILLISECONDS)) { + executorService.shutdownNow(); + } + } catch (InterruptedException e) { + executorService.shutdownNow(); + } + } + + public void cleanup() { + this.threadPool.ifPresent(this::shutdown); + this.threadPool = Optional.empty(); + } + + public boolean isPoolInitialized() { + return this.threadPool.isPresent(); + } + + private ExecutorService createThreadPool() { + int poolSize = snmpConfig.getDiscoveryPoolSize(); + + ExecutorService pool = createThreadPool(poolSize); + this.threadPool = Optional.of(pool); + return pool; + } + + private ExecutorService createThreadPool(int poolSize) { + return Executors.newFixedThreadPool(poolSize); + } +} diff --git a/src/main/java/io/gec/raw/connector/discovery/domain/DeviceDiscoveryProtocolData.java b/src/main/java/io/gec/raw/connector/discovery/domain/DeviceDiscoveryProtocolData.java new file mode 100755 index 0000000..b2878bc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/domain/DeviceDiscoveryProtocolData.java @@ -0,0 +1,6 @@ +package io.gec.raw.connector.discovery.domain; + +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; + +public record DeviceDiscoveryProtocolData(SnmpProtocolData snmpProtocolData, String deviceIP) { +} diff --git a/src/main/java/io/gec/raw/connector/discovery/domain/DiscoveryWorkItemResult.java b/src/main/java/io/gec/raw/connector/discovery/domain/DiscoveryWorkItemResult.java new file mode 100755 index 0000000..b61eb54 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/domain/DiscoveryWorkItemResult.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.discovery.domain; + +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.job.domain.WorkItemResult; +import lombok.Getter; + +@Getter +public class DiscoveryWorkItemResult extends WorkItemResult { + private final DiscoveryWorkItemStatus status; + + public DiscoveryWorkItemResult(DiscoveryWorkItemStatus status, String message) { + super(message); + this.status = status; + } + + public DiscoveryWorkItemResult(DiscoveryWorkItemStatus status) { + this(status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/discovery/domain/DiscoveryWorkItemStatusWrapper.java b/src/main/java/io/gec/raw/connector/discovery/domain/DiscoveryWorkItemStatusWrapper.java new file mode 100755 index 0000000..e8978ad --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/domain/DiscoveryWorkItemStatusWrapper.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.discovery.domain; + +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; + +import java.util.UUID; + +public record DiscoveryWorkItemStatusWrapper(UUID workItemId, DiscoveryWorkItemStatus status, String message) { + public DiscoveryWorkItemStatusWrapper(UUID workItemId, DiscoveryWorkItemStatus status) { + this(workItemId, status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryValueDTO.java b/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryValueDTO.java new file mode 100755 index 0000000..3b662f8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryValueDTO.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.discovery.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.jackson.Jacksonized; + +import java.util.UUID; + +@Builder +@Getter +@Setter +@Jacksonized +@JsonIgnoreProperties(ignoreUnknown = true) +public class DiscoveryValueDTO { + + private UUID propertyId; + private String propertyValue; +} diff --git a/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemDTO.java b/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemDTO.java new file mode 100755 index 0000000..75c7134 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemDTO.java @@ -0,0 +1,28 @@ +package io.gec.raw.connector.discovery.dto; + +import io.gec.raw.connector.job.domain.WorkItem; +import lombok.*; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class DiscoveryWorkItemDTO extends WorkItem { + private UUID id; + private OffsetDateTime created; + private OffsetDateTime stamp; + private UUID connectorId; + private UUID protocolId; + private String name; + private UUID plantId; + + private DiscoveryWorkItemStatus status; + @Builder.Default + private List discoveryValues = new ArrayList<>(); +} diff --git a/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemStatus.java b/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemStatus.java new file mode 100755 index 0000000..f24e82a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemStatus.java @@ -0,0 +1,9 @@ +package io.gec.raw.connector.discovery.dto; + +public enum DiscoveryWorkItemStatus { + INSERTED, + RUNNING, + CANCELED, + FINISHED, + FAILED; +} diff --git a/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemUpdateDTO.java b/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemUpdateDTO.java new file mode 100755 index 0000000..1756a73 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/dto/DiscoveryWorkItemUpdateDTO.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.discovery.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class DiscoveryWorkItemUpdateDTO { + + private DiscoveryWorkItemStatus discoveryStatusEnum; + private String message; +} diff --git a/src/main/java/io/gec/raw/connector/discovery/entity/DiscoveryValue.java b/src/main/java/io/gec/raw/connector/discovery/entity/DiscoveryValue.java new file mode 100755 index 0000000..dbe88ff --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/entity/DiscoveryValue.java @@ -0,0 +1,42 @@ +/* + * (c) 2023 German Edge Cloud GmbH & Co. KG + * + */ + +package io.gec.raw.connector.discovery.entity; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.UuidGenerator; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Entity +@Table(name = "discovery_value", schema = "connector_svc") +public class DiscoveryValue { + + @Id + @UuidGenerator + @Column(updatable = false, nullable = false) + private UUID id; + @Column(updatable = false, nullable = false) + private OffsetDateTime created; + @Column(updatable = false, nullable = false) + private OffsetDateTime stamp; + @Column(name = "property_id", updatable = false, nullable = false) + private UUID propertyId; + @Column(name = "property_value", nullable = false) + private String propertyValue; + @ManyToOne + @JsonBackReference() + @JoinColumn(name = "discovery_workitem_id") + private DiscoveryWorkItem discoveryWorkItem; +} diff --git a/src/main/java/io/gec/raw/connector/discovery/entity/DiscoveryWorkItem.java b/src/main/java/io/gec/raw/connector/discovery/entity/DiscoveryWorkItem.java new file mode 100755 index 0000000..3e08f1f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/entity/DiscoveryWorkItem.java @@ -0,0 +1,39 @@ +package io.gec.raw.connector.discovery.entity; + +import com.fasterxml.jackson.annotation.JsonManagedReference; +import io.gec.raw.connector.base.entity.SimpleBaseEntity; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import jakarta.persistence.*; +import lombok.*; + +import java.util.List; +import java.util.UUID; + + +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Entity +@Table(name = "discovery_workitem", schema = "connector_svc") +public class DiscoveryWorkItem extends SimpleBaseEntity { + + @Column(updatable = false, nullable = false) + private String name; + @Column(name = "protocol_id", updatable = false, nullable = false) + private UUID protocolId; + @Column(name = "comm_discovery_id", updatable = false, nullable = false) + private UUID commDiscoveryId; + @Enumerated(EnumType.STRING) + private DiscoveryWorkItemStatus status; + @Column(name = "plant_id", updatable = false) + private UUID plantId; + @OneToMany(mappedBy = "discoveryWorkItem", cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JsonManagedReference + private List discoveryValues; +} + + + diff --git a/src/main/java/io/gec/raw/connector/discovery/entity/SnmpDiscoveryData.java b/src/main/java/io/gec/raw/connector/discovery/entity/SnmpDiscoveryData.java new file mode 100755 index 0000000..15af7c5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/entity/SnmpDiscoveryData.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.discovery.entity; + +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import lombok.ToString; +import lombok.Value; + +@Value(staticConstructor = "of") +@ToString +public class SnmpDiscoveryData { + + DiscoveryWorkItemDTO discoveryWorkItem; + SnmpMessageData snmpMessageData; + ProcessingCancellationChecker processingCancellationChecker; +} diff --git a/src/main/java/io/gec/raw/connector/discovery/handler/DiscoveryJobHandler.java b/src/main/java/io/gec/raw/connector/discovery/handler/DiscoveryJobHandler.java new file mode 100755 index 0000000..37e3e02 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/discovery/handler/DiscoveryJobHandler.java @@ -0,0 +1,108 @@ +package io.gec.raw.connector.discovery.handler; + +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.domain.DiscoveryWorkItemResult; +import io.gec.raw.connector.discovery.domain.DiscoveryWorkItemStatusWrapper; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemUpdateDTO; +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.WorkItemHandler; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class DiscoveryJobHandler extends WorkItemHandler { + @Inject + DiscoveryController discoveryController; + + @Override + protected Optional getWorkItem(UUID workItemId) { + return communicationServiceController.fetchDiscoveryWorkItem(workItemId); + } + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + var discoveryWorkItemStatus = new DiscoveryWorkItemStatusWrapper(workItemWrapper.workItemId(), DiscoveryWorkItemStatus.RUNNING); + updateDiscoveryWorkItemStatus(discoveryWorkItemStatus); + } + + @ActivateRequestContext + @Override + protected DiscoveryWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + logger.infof("Processing DiscoveryWorkItem (ID:'%s') ...", workItemWrapper.workItemId()); + try { + ProcessingCancellationChecker processingCancellationChecker = workItemWrapper.processingCancellationChecker(); + if (processingCancellationChecker.isProcessingCanceled()) { + return getCanceledWorkItemResult(); + } + + DiscoveryWorkItemDTO discoveryWorkItem = workItemWrapper.workItem(); + //INFO: We persist the work item because it contains values to access devices after discovery (we should think of a better way to do this) + discoveryController.persistDiscoveryWorkItem(discoveryWorkItem); + + DiscoveryWorkItemStatus discoveryStatus = discoveryController.performDiscovery(discoveryWorkItem, processingCancellationChecker); + discoveryController.updateDiscoveryWorkItemStatusByCommSvcId(discoveryWorkItem.getId(), discoveryStatus); + + return new DiscoveryWorkItemResult(discoveryStatus); + } catch (Exception e) { + logger.errorf(e, "Processing DiscoveryWorkItem (ID:'%s') - FAILED", workItemWrapper.workItemId()); + return new DiscoveryWorkItemResult(DiscoveryWorkItemStatus.FAILED, e.getMessage()); + } + } + + @Override + protected void finishProcessing(WorkItemWrapper workItemWrapper, DiscoveryWorkItemResult workItemResult) { + var discoveryWorkItemStatus = new DiscoveryWorkItemStatusWrapper( + workItemWrapper.workItemId(), + workItemResult.getStatus(), + workItemResult.getMessage()); + updateDiscoveryWorkItemStatus(discoveryWorkItemStatus); + } + + @Override + public JobResult mapToJobResult(DiscoveryWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case CANCELED -> JobStatus.CANCELED; + case FINISHED -> JobStatus.DONE; + case FAILED -> JobStatus.FAILED; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + protected DiscoveryWorkItemResult getCanceledWorkItemResult() { + return new DiscoveryWorkItemResult(DiscoveryWorkItemStatus.CANCELED); + } + + @Override + public JobType getJobType() { + return JobType.DISCOVERY; + } + + @Override + public JobAction getJobAction() { + return JobAction.EXECUTE; + } + + private void updateDiscoveryWorkItemStatus(DiscoveryWorkItemStatusWrapper discoveryWorkItemStatus) { + var discoveryStatusUpdateDTO = new DiscoveryWorkItemUpdateDTO(); + discoveryStatusUpdateDTO.setDiscoveryStatusEnum(discoveryWorkItemStatus.status()); + discoveryStatusUpdateDTO.setMessage(discoveryWorkItemStatus.message()); + + communicationServiceController.updateDiscoveryWorkItem(discoveryWorkItemStatus.workItemId(), discoveryStatusUpdateDTO); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/control/DeviceDriverController.java b/src/main/java/io/gec/raw/connector/driver/control/DeviceDriverController.java new file mode 100755 index 0000000..c3d0e93 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/control/DeviceDriverController.java @@ -0,0 +1,439 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.driver.domain.*; +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.gec.raw.connector.driver.entity.ValueMapping; +import io.gec.raw.connector.driver.entity.ValueMappingContainer; +import io.gec.raw.connector.driver.mapper.DataMapper; +import io.gec.raw.connector.driver.projection.ValueMappingContainerIdProjection; +import io.gec.raw.connector.exception.entity.DriverNotFoundException; +import io.gec.raw.connector.variable.control.VariableRepository; +import io.gec.raw.connector.variable.projection.VariableDriverVariableIdProjection; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.persistence.EntityNotFoundException; +import jakarta.transaction.Transactional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.jboss.logging.Logger; + +import java.util.*; + +import static java.util.stream.Collectors.*; + +@ApplicationScoped +public class DeviceDriverController { + + private final DriverHeaderRepository driverHeaderRepository; + private final DriverVariableRepository driverVariableRepository; + private final ValueMappingContainerRepository valueMappingContainerRepository; + private final ValueMappingRepository valueMappingRepository; + private final VariableRepository variableRepository; + private final DataMapper dataMapper; + private final DeviceDriverServiceClient deviceDriverServiceClient; + private final Logger logger; + + public DeviceDriverController(DriverHeaderRepository driverHeaderRepository, + DriverVariableRepository driverVariableRepository, + ValueMappingContainerRepository valueMappingContainerRepository, + ValueMappingRepository valueMappingRepository, + VariableRepository variableRepository, + DataMapper dataMapper, + @RestClient DeviceDriverServiceClient deviceDriverServiceClient, + Logger logger) { + this.driverHeaderRepository = driverHeaderRepository; + this.driverVariableRepository = driverVariableRepository; + this.valueMappingContainerRepository = valueMappingContainerRepository; + this.valueMappingRepository = valueMappingRepository; + this.variableRepository = variableRepository; + this.dataMapper = dataMapper; + this.deviceDriverServiceClient = deviceDriverServiceClient; + this.logger = logger; + } + + public void synchronizeDrivers() { + try { + List incomingDeviceDriverDTOs = deviceDriverServiceClient.findAll(); + logger.debugf("Device Drivers fetched (total: %d)", incomingDeviceDriverDTOs.size()); + if (!incomingDeviceDriverDTOs.isEmpty()) { + processDeviceDrivers(incomingDeviceDriverDTOs); + } + } catch (Exception e) { + logger.error("Fetch Device Drivers - FAILED", e); + throw e; + } + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) + void processDeviceDrivers(List incomingDeviceDriverDTOs) { + List validIncomingDeviceDriverDTOs = filterInvalidDeviceDrivers(incomingDeviceDriverDTOs); + List connectorDriverHeaderIds = driverHeaderRepository.findAllDriverHeaderIds(); + List deviceServiceDriverHeaderIds = validIncomingDeviceDriverDTOs.stream() + .map(DeviceDriverDTO::getDriverHeaderDTO) + .map(DriverHeaderDTO::getId) + .toList(); + + Map> incomingByExistence = partitionByExistence(validIncomingDeviceDriverDTOs, connectorDriverHeaderIds); + List driversToCreate = incomingByExistence.get(false); + List driversToUpdate = incomingByExistence.get(true); + + List driverHeaderToDeleteIds = getDriverHeaderToDeleteIds(connectorDriverHeaderIds, deviceServiceDriverHeaderIds); + + processDrivers(driversToCreate, driversToUpdate, driverHeaderToDeleteIds); + } + + private List filterInvalidDeviceDrivers(List deviceDriverDTOs) { + return deviceDriverDTOs.stream() + .filter(deviceDriverDTO -> Objects.nonNull(deviceDriverDTO.getDriverHeaderDTO())) + .toList(); + } + + Map> partitionByExistence(List incomingDeviceDriverDTOs, List existingDriverHeaderIds) { + return incomingDeviceDriverDTOs.stream() + .collect(partitioningBy(dto -> driverHeaderExists(dto, existingDriverHeaderIds))); + } + + private boolean driverHeaderExists(DeviceDriverDTO deviceDriverDTO, List existingDriverHeaderIds) { + return existingDriverHeaderIds.contains(deviceDriverDTO.getDriverHeaderDTO().getId()); + } + + List getDriverHeaderToDeleteIds(List connectorDriverHeaderIds, List deviceServiceDriverHeaderIds) { + return connectorDriverHeaderIds.stream() + .filter(localDriverHeaderId -> !deviceServiceDriverHeaderIds.contains(localDriverHeaderId)) + .toList(); + } + + private void processDrivers(List toCreateDTOs, + List toUpdateDTOs, + List driverHeaderToDeleteIds) { + createDrivers(toCreateDTOs); + updateDrivers(toUpdateDTOs); + deleteDrivers(driverHeaderToDeleteIds); + } + + public DeviceDriverDTO findDeviceDriverDTO(UUID driverHeaderId) throws DriverNotFoundException { + try { + return deviceDriverServiceClient.findById(driverHeaderId); + } catch (Exception e) { + var message = "Device Svc. - DeviceDriver (ID:'%s') not found".formatted(driverHeaderId); + logger.error(message, e); + throw new DriverNotFoundException(message); + } + } + + public void createDrivers(List deviceDriverDTOs) { + deviceDriverDTOs.forEach(this::createDriver); + } + + public void createDriver(UUID deviceDriverId) { + DeviceDriverDTO deviceDriverDTO = findDeviceDriverDTO(deviceDriverId); + this.createDriver(deviceDriverDTO); + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) + public void createDriver(DeviceDriverDTO deviceDriverDTO) { + DriverHeaderDTO driverHeaderDTO = deviceDriverDTO.getDriverHeaderDTO(); + DriverHeader driverHeader = dataMapper.toDriverHeader(driverHeaderDTO); + driverHeaderRepository.persist(driverHeader); + + List driverVariableDTOs = deviceDriverDTO.getDriverVariableDTOs(); + List driverVariables = dataMapper.toDriverVariables(driverVariableDTOs); + driverHeader.addDriverVariableRelations(driverVariables); + + List valueMappingDTOs = deviceDriverDTO.getValueMappingDTOs(); + List valueMappings = dataMapper.toValueMappings(valueMappingDTOs); + + List valueMappingContainerDTOs = deviceDriverDTO.getValueMappingContainerDTOs(); + + for (ValueMappingContainerDTO valueMappingContainerDTO : valueMappingContainerDTOs) { + createValueMappingContainer(valueMappingContainerDTO, driverVariables, valueMappings); + } + logger.infof("DriverHeader (ID:'%s') created", driverHeader.getId()); + } + + void updateDrivers(List deviceDriverIds) { + deviceDriverIds.forEach(this::updateDriver); + } + + public void updateDriver(UUID deviceDriverId) { + DeviceDriverDTO deviceDriverDTO = findDeviceDriverDTO(deviceDriverId); + this.updateDriver(deviceDriverDTO); + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) + void updateDriver(DeviceDriverDTO deviceDriverDTO) { + DriverHeaderDTO driverHeaderDTO = deviceDriverDTO.getDriverHeaderDTO(); + DriverHeader driverHeader = driverHeaderRepository.findByIdOptional(driverHeaderDTO.getId()) + .orElseThrow(EntityNotFoundException::new); + + updateDriverHeader(driverHeaderDTO, driverHeader); + + List existingDriverVariables = + driverVariableRepository.findByDriverHeaderId(driverHeaderDTO.getId()); + List existingDriverVariableIds = existingDriverVariables.stream() + .map(DriverVariable::getId) + .toList(); + + List incomingDriverVariableDTOs = deviceDriverDTO.getDriverVariableDTOs(); + List incomingDriverVariableIds = incomingDriverVariableDTOs.stream() + .map(DriverVariableDTO::getId) + .toList(); + + deleteDriverVariables(existingDriverVariables, incomingDriverVariableIds, driverHeader); + updateValueMappingContainers(deviceDriverDTO); + createOrUpdateDriverVariables(incomingDriverVariableDTOs, existingDriverVariableIds, driverHeader); + logger.infof("DriverHeader (ID:'%s') updated", driverHeader.getId()); + } + + void deleteDrivers(List driverHeaderIds) { + driverHeaderIds.forEach(this::deleteDriver); + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) + public void deleteDriver(UUID driverHeaderId) { + DriverHeader driverHeader = driverHeaderRepository.findByIdOptional(driverHeaderId) + .orElseThrow(EntityNotFoundException::new); + List driverVariables = driverHeader.getDriverVariables(); + List driverVariableToDeleteIds = driverVariables.stream() + .map(DriverVariable::getId) + .collect(toList()); + List driverVariableInUseIds = findDriverVariableInUseIds(driverVariableToDeleteIds); + driverVariableToDeleteIds.removeAll(driverVariableInUseIds); + List driverVariablesToDelete = driverVariables.stream() + .filter(driverVariable -> driverVariableToDeleteIds.contains(driverVariable.getId())) + .toList(); + + driverHeader.removeDriverVariableRelations(driverVariablesToDelete); + + if (driverHeader.getDriverVariables().isEmpty()) { + driverHeaderRepository.delete(driverHeader); + } + logger.infof("DriverHeader (ID:'%s') deleted", driverHeaderId); + } + + private void createValueMappingContainer(ValueMappingContainerDTO valueMappingContainerDTO, + List driverVariables, + List valueMappings) { + ValueMappingContainer valueMappingContainer = dataMapper.toValueMappingContainer(valueMappingContainerDTO); + setValueMappingContainerToDriverVariableRelations( + valueMappingContainerDTO.getDriverVariableIds(), driverVariables, valueMappingContainer); + setValueMappingContainerToValueMappingRelations( + valueMappingContainerDTO.getValueMappingIds(), valueMappings, valueMappingContainer); + valueMappingContainerRepository.persist(valueMappingContainer); + } + + private void setValueMappingContainerToDriverVariableRelations(List driverVariableIds, + List driverVariables, + ValueMappingContainer valueMappingContainer) { + List relatedDriverVariables = findDriverVariablesByIds(driverVariables, driverVariableIds); + valueMappingContainer.addDriverVariableRelations(relatedDriverVariables); + } + + private void setValueMappingContainerToValueMappingRelations(List valueMappingIds, + List valueMappings, + ValueMappingContainer valueMappingContainer) { + List relatedValueMappings = valueMappings.stream() + .filter(valueMapping -> valueMappingIds.contains(valueMapping.getId())) + .toList(); + valueMappingContainer.addValueMappingRelations(relatedValueMappings); + } + + + private void updateDriverHeader(DriverHeaderDTO driverHeaderDTO, DriverHeader driverHeader) { + driverHeader.setPayload(driverHeaderDTO.getPayload()); + driverHeader.setName(driverHeaderDTO.getName()); + driverHeader.setDescription(driverHeaderDTO.getDescription()); + + driverHeader.setSysObjectId(driverHeaderDTO.getSysObjectId()); + driverHeader.setBulkPolling(driverHeaderDTO.isBulkPolling()); + driverHeader.setContent(driverHeaderDTO.getContent()); + driverHeader.setDevices(driverHeaderDTO.getDevices()); + } + + private void deleteDriverVariables(List existingDriverVariables, + List incomingDriverVariableIds, DriverHeader driverHeader) { + List driverVariableToDeleteIds = + findDriverVariableToDeleteIds(existingDriverVariables, incomingDriverVariableIds); + List driverVariablesToDelete = + findDriverVariablesByIds(existingDriverVariables, driverVariableToDeleteIds); + + driverHeader.removeDriverVariableRelations(driverVariablesToDelete); + } + + private List findDriverVariablesByIds(List existingDriverVariables, + List driverVariableToDeleteIds) { + return existingDriverVariables.stream() + .filter(driverVariable -> driverVariableToDeleteIds.contains(driverVariable.getId())) + .toList(); + } + + private List findDriverVariableToDeleteIds(List existingDriverVariables, + List incomingDriverVariableIds) { + List driverVariableToDeleteIds = existingDriverVariables.stream() + .map(DriverVariable::getId) + .filter(id -> !incomingDriverVariableIds.contains(id)) + .collect(toList()); + List driverVariableInUseIds = findDriverVariableInUseIds(driverVariableToDeleteIds); + driverVariableToDeleteIds.removeAll(driverVariableInUseIds); + + return driverVariableToDeleteIds; + } + + private List findDriverVariableInUseIds(List driverVariableToDeleteIds) { + return variableRepository.findDriverVariableInUseIds(driverVariableToDeleteIds).stream() + .map(VariableDriverVariableIdProjection::getDriverVariableId) + .toList(); + } + + private void updateValueMappingContainers(DeviceDriverDTO deviceDriverDTO) { + List existingValueMappingContainerIds = valueMappingContainerRepository.findAllIds().stream() + .map(ValueMappingContainerIdProjection::id) + .toList(); + Map> valueMappingContainersByExistence = + partitionByContainerExistence(deviceDriverDTO.getValueMappingContainerDTOs(), + existingValueMappingContainerIds); + List valueMappingContainersToUpdate = valueMappingContainersByExistence.get(true); + List valueMappingContainersToCreate = valueMappingContainersByExistence.get(false); + + Map> valueMappingsByContainerId = toValueMappingsByContainerId(deviceDriverDTO); + createValueMappingContainers(valueMappingContainersToCreate, valueMappingsByContainerId); + updateValueMappingContainers(valueMappingContainersToUpdate, valueMappingsByContainerId); + } + + private Map> partitionByContainerExistence( + List incomingValueMappingContainerDTOs, + List existingValueMappingContainerIds) { + return incomingValueMappingContainerDTOs.stream() + .collect(partitioningBy(dto -> valueMappingContainerExists(dto, existingValueMappingContainerIds))); + } + + private boolean valueMappingContainerExists(ValueMappingContainerDTO valueMappingContainerDTO, + List existingValueMappingContainerIds) { + return existingValueMappingContainerIds.contains(valueMappingContainerDTO.getId()); + } + + private Map> toValueMappingsByContainerId(DeviceDriverDTO deviceDriverDTO) { + return deviceDriverDTO.getValueMappingDTOs().stream() + .collect(groupingBy(ValueMappingDTO::getValueMappingContainerId, + mapping(dataMapper::toValueMapping, toList()))); + } + + private void createValueMappingContainers(List valueMappingContainersToCreate, + Map> valueMappingsByContainerId) { + valueMappingContainersToCreate.forEach(valueMappingContainerDTO -> { + ValueMappingContainer toCreate = dataMapper.toValueMappingContainer(valueMappingContainerDTO); + List valueMappings = valueMappingsByContainerId.get(valueMappingContainerDTO.getId()); + if (Objects.nonNull(valueMappings)) { + toCreate.addValueMappingRelations(valueMappings); + } + valueMappingContainerRepository.persist(toCreate); + }); + } + + private void updateValueMappingContainers(List valueMappingContainersToUpdate, + Map> valueMappingsByContainerId) { + valueMappingContainersToUpdate.forEach(valueMappingContainerDTO -> { + ValueMappingContainer toUpdate = valueMappingContainerRepository.findById(valueMappingContainerDTO.getId()); + toUpdate.removeAllValueMappingRelations(); + valueMappingRepository.flush(); + + List valueMappings = valueMappingsByContainerId.get(valueMappingContainerDTO.getId()); + if (Objects.nonNull(valueMappings)) { + toUpdate.addValueMappingRelations(valueMappings); + } + }); + } + + private void createOrUpdateDriverVariables(List incomingDriverVariableDTOs, + List existingDriverVariableIds, + DriverHeader driverHeader) { + Map> driverVariablesByExistence = + partitionByDriverVariableExistence(incomingDriverVariableDTOs, existingDriverVariableIds); + List driverVariablesToCreate = driverVariablesByExistence.get(false); + List driverVariablesToUpdate = driverVariablesByExistence.get(true); + + createDriverVariables(driverHeader, driverVariablesToCreate); + updateDriverVariables(driverVariablesToUpdate); + } + + private Map> partitionByDriverVariableExistence( + List incomingDriverVariableDTOs, + List existingDriverVariableDTOs) { + return incomingDriverVariableDTOs.stream() + .collect(partitioningBy(dto -> driverVariableExists(dto, existingDriverVariableDTOs))); + } + + private boolean driverVariableExists(DriverVariableDTO driverVariableDTO, List existingDriverVariableIds) { + return existingDriverVariableIds.contains(driverVariableDTO.getId()); + } + + private void createDriverVariables(DriverHeader driverHeader, List driverVariableDTOs) { + driverVariableDTOs.forEach(driverVariableDTO -> { + DriverVariable driverVariable = dataMapper.toDriverVariable(driverVariableDTO); + driverHeader.addDriverVariableRelation(driverVariable); + + Optional.ofNullable(driverVariableDTO.getValueMappingContainerId()) + .map(valueMappingContainerRepository::findById) + .ifPresent(valueMappingContainer -> valueMappingContainer.addDriverVariableRelation(driverVariable)); + + driverVariableRepository.persist(driverVariable); + }); + } + + private void updateDriverVariables(List driverVariableDTOs) { + driverVariableDTOs.forEach(driverVariableDTO -> { + DriverVariable driverVariable = driverVariableRepository.findById(driverVariableDTO.getId()); + updateDriverVariable(driverVariableDTO, driverVariable); + updateDriverVariableToValueMappingContainerRelation(driverVariableDTO, driverVariable); + }); + } + + private void updateDriverVariable(DriverVariableDTO driverVariableDTO, DriverVariable driverVariable) { + driverVariable.setPayload(driverVariableDTO.getPayload()); + driverVariable.setName(driverVariableDTO.getName()); + driverVariable.setDescription(driverVariableDTO.getDescription()); + + driverVariable.setOid(driverVariableDTO.getOid()); + driverVariable.setDataType(driverVariableDTO.getDataType()); + driverVariable.setDisplayFormat(driverVariableDTO.getDisplayFormat()); + driverVariable.setDisplayFactor(driverVariableDTO.getDisplayFactor()); + driverVariable.setIsReadOnly(driverVariableDTO.getIsReadOnly()); + driverVariable.setMin(driverVariableDTO.getMin()); + driverVariable.setMax(driverVariableDTO.getMax()); + driverVariable.setStep(driverVariableDTO.getStep()); + driverVariable.setIntervalFactor(driverVariableDTO.getIntervalFactor()); + driverVariable.setScale(driverVariableDTO.getScale()); + driverVariable.setDisplayName(driverVariableDTO.getDisplayName()); + driverVariable.setFunctionType(driverVariableDTO.getFunctionType()); + driverVariable.setBaseOid(driverVariableDTO.getBaseOid()); + } + + private void updateDriverVariableToValueMappingContainerRelation(DriverVariableDTO driverVariableDTO, DriverVariable driverVariable) { + UUID newValueMappingContainerId = driverVariableDTO.getValueMappingContainerId(); + ValueMappingContainer oldValueMappingContainer = driverVariable.getValueMappingContainer(); + + if (Objects.isNull(newValueMappingContainerId)) { + if (Objects.nonNull(oldValueMappingContainer)) { + oldValueMappingContainer.removeDriverVariableRelation(driverVariable); + } + } else { + if (Objects.nonNull(oldValueMappingContainer)) { + UUID oldValueMappingContainerId = oldValueMappingContainer.getId(); + if (isNewContainerAssigned(oldValueMappingContainerId, newValueMappingContainerId)) { + setDriverVariableToValueMappingContainerRelation(driverVariable, newValueMappingContainerId); + } + } else { + setDriverVariableToValueMappingContainerRelation(driverVariable, newValueMappingContainerId); + } + } + } + + private boolean isNewContainerAssigned(UUID oldValueMappingContainerId, UUID newValueMappingContainerId) { + return !oldValueMappingContainerId.equals(newValueMappingContainerId); + } + + private void setDriverVariableToValueMappingContainerRelation(DriverVariable driverVariable, UUID newValueMappingContainerId) { + ValueMappingContainer newValueMappingContainer = + valueMappingContainerRepository.findById(newValueMappingContainerId); + newValueMappingContainer.addDriverVariableRelation(driverVariable); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/control/DeviceDriverServiceClient.java b/src/main/java/io/gec/raw/connector/driver/control/DeviceDriverServiceClient.java new file mode 100755 index 0000000..33fc414 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/control/DeviceDriverServiceClient.java @@ -0,0 +1,28 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.driver.domain.DeviceDriverDTO; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +@RegisterRestClient(configKey = "device-service") +@Path("api/resources/deviceDriver") +public interface DeviceDriverServiceClient { + + @GET + List findAll(); + + @GET + @Path("ids") + List findAllIds(); + + @GET + @Path("{id}") + DeviceDriverDTO findById(@PathParam("id") UUID driverHeaderId) throws Exception; +} diff --git a/src/main/java/io/gec/raw/connector/driver/control/DriverHeaderRepository.java b/src/main/java/io/gec/raw/connector/driver/control/DriverHeaderRepository.java new file mode 100755 index 0000000..6aebddf --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/control/DriverHeaderRepository.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.gec.raw.connector.driver.projection.DriverHeaderIdProjection; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class DriverHeaderRepository implements PanacheRepositoryBase { + + public List findAllDriverHeaderIds() { + return findAll() + .project(DriverHeaderIdProjection.class) + .list().stream() + .map(DriverHeaderIdProjection::id) + .toList(); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/control/DriverVariableRepository.java b/src/main/java/io/gec/raw/connector/driver/control/DriverVariableRepository.java new file mode 100755 index 0000000..dfe0c99 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/control/DriverVariableRepository.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class DriverVariableRepository implements PanacheRepositoryBase { + + @Transactional + public List findByDriverHeaderId(UUID driverHeaderId) { + return list("driverHeader.id", driverHeaderId); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/control/ValueMappingContainerRepository.java b/src/main/java/io/gec/raw/connector/driver/control/ValueMappingContainerRepository.java new file mode 100755 index 0000000..dd076e2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/control/ValueMappingContainerRepository.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.driver.entity.ValueMappingContainer; +import io.gec.raw.connector.driver.projection.ValueMappingContainerIdProjection; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class ValueMappingContainerRepository implements PanacheRepositoryBase { + + public List findAllIds() { + return findAll() + .project(ValueMappingContainerIdProjection.class) + .list(); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/control/ValueMappingRepository.java b/src/main/java/io/gec/raw/connector/driver/control/ValueMappingRepository.java new file mode 100755 index 0000000..6c7e4e0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/control/ValueMappingRepository.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.driver.entity.ValueMapping; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.UUID; + +@ApplicationScoped +public class ValueMappingRepository implements PanacheRepositoryBase { +} diff --git a/src/main/java/io/gec/raw/connector/driver/control/ValueMappingService.java b/src/main/java/io/gec/raw/connector/driver/control/ValueMappingService.java new file mode 100755 index 0000000..14fffa4 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/control/ValueMappingService.java @@ -0,0 +1,39 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.gec.raw.connector.driver.entity.ValueMapping; +import io.gec.raw.connector.driver.entity.ValueMappingContainer; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class ValueMappingService { + + private static final String DEFAULT_MAPPING_VALUE = String.valueOf(Integer.MIN_VALUE); + + @Inject + DriverVariableRepository driverVariableRepository; + + public String mapValue(UUID driverVariableId, String value) { + Optional optionalDriverVariableId = Optional.ofNullable(driverVariableId); + List valueMappings = optionalDriverVariableId.map(driverVariableRepository::findById) + .map(DriverVariable::getValueMappingContainer) + .map(ValueMappingContainer::getValueMappings) + .orElseGet(List::of); + + return findValueMapping(valueMappings, value) + .or(() -> findValueMapping(valueMappings, DEFAULT_MAPPING_VALUE)) + .map(ValueMapping::getMapping) + .orElse(value); + } + + private Optional findValueMapping(List valueMappings, String value) { + return valueMappings.stream() + .filter(valueMapping -> valueMapping.getValue().equals(value)) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/domain/DeviceDriverDTO.java b/src/main/java/io/gec/raw/connector/driver/domain/DeviceDriverDTO.java new file mode 100755 index 0000000..8e07afc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/domain/DeviceDriverDTO.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.driver.domain; + +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@Builder(toBuilder = true) +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DeviceDriverDTO { + + private DriverHeaderDTO driverHeaderDTO; + @Builder.Default + private List driverVariableDTOs = new ArrayList<>(); + @Builder.Default + private List valueMappingContainerDTOs = new ArrayList<>(); + @Builder.Default + private List valueMappingDTOs = new ArrayList<>(); +} diff --git a/src/main/java/io/gec/raw/connector/driver/domain/DriverHeaderDTO.java b/src/main/java/io/gec/raw/connector/driver/domain/DriverHeaderDTO.java new file mode 100755 index 0000000..182de1e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/domain/DriverHeaderDTO.java @@ -0,0 +1,49 @@ +package io.gec.raw.connector.driver.domain; + +import lombok.*; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Builder(toBuilder = true) +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DriverHeaderDTO { + + private UUID id; + private OffsetDateTime created; + private OffsetDateTime stamp; + private String payload; + private String name; + private String description; + + private String sysObjectId; + private boolean bulkPolling; + private String content; + private String devices; + private UUID mibHeaderId; + private String docRef; + private String format; + private boolean isCorrupted; + private boolean isFileMissing; + private UUID userId; + private String displayName; + + public boolean getIsCorrupted() { + return isCorrupted; + } + + public void setIsCorrupted(boolean isCorrupted) { + this.isCorrupted = isCorrupted; + } + + public boolean getIsFileMissing() { + return isFileMissing; + } + + public void setIsFileMissing(boolean isFileMissing) { + this.isFileMissing = isFileMissing; + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/domain/DriverVariableDTO.java b/src/main/java/io/gec/raw/connector/driver/domain/DriverVariableDTO.java new file mode 100755 index 0000000..c1db283 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/domain/DriverVariableDTO.java @@ -0,0 +1,49 @@ +package io.gec.raw.connector.driver.domain; + +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import lombok.*; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Builder(toBuilder = true) +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DriverVariableDTO { + + private UUID id; + private OffsetDateTime created; + private OffsetDateTime stamp; + private String payload; + private String name; + private String description; + + private UUID driverHeaderId; + private UUID valueMappingContainerId; + + private String oid; + private DataTypeEnum dataType; + private String displayFormat; + private String displayFactor; + private boolean isReadOnly; + private String min; + private String max; + private String step; + private String intervalFactor; + private String unit; + private String scale; + private String displayName; + private FunctionTypeEnum functionType; + private String baseOid; + + public boolean getIsReadOnly() { + return isReadOnly; + } + + public void setIsReadOnly(boolean readOnly) { + isReadOnly = readOnly; + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/domain/DriverWorkItemResult.java b/src/main/java/io/gec/raw/connector/driver/domain/DriverWorkItemResult.java new file mode 100755 index 0000000..fd6c44a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/domain/DriverWorkItemResult.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.driver.domain; + +import io.gec.raw.connector.driver.dto.DriverWorkItemStatus; +import io.gec.raw.connector.job.domain.WorkItemResult; +import lombok.Getter; + +@Getter +public class DriverWorkItemResult extends WorkItemResult { + private final DriverWorkItemStatus status; + + public DriverWorkItemResult(DriverWorkItemStatus status, String message) { + super(message); + this.status = status; + } + + public DriverWorkItemResult(DriverWorkItemStatus status) { + this(status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/domain/ValueMappingContainerDTO.java b/src/main/java/io/gec/raw/connector/driver/domain/ValueMappingContainerDTO.java new file mode 100755 index 0000000..4aa6294 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/domain/ValueMappingContainerDTO.java @@ -0,0 +1,25 @@ +package io.gec.raw.connector.driver.domain; + +import lombok.*; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Builder(toBuilder = true) +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class ValueMappingContainerDTO { + + private UUID id; + private OffsetDateTime created; + private OffsetDateTime stamp; + + @Builder.Default + private List driverVariableIds = new ArrayList<>(); + @Builder.Default + private List valueMappingIds = new ArrayList<>(); +} diff --git a/src/main/java/io/gec/raw/connector/driver/domain/ValueMappingDTO.java b/src/main/java/io/gec/raw/connector/driver/domain/ValueMappingDTO.java new file mode 100755 index 0000000..619edb7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/domain/ValueMappingDTO.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.driver.domain; + +import lombok.*; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Builder(toBuilder = true) +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class ValueMappingDTO { + + private UUID id; + private OffsetDateTime created; + private OffsetDateTime stamp; + private String value; + private String mapping; + private UUID valueMappingContainerId; +} diff --git a/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemDTO.java b/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemDTO.java new file mode 100755 index 0000000..731963a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemDTO.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.driver.dto; + +import io.gec.raw.connector.job.domain.WorkItem; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class DriverWorkItemDTO extends WorkItem { + private UUID id; + private UUID driverId; +} diff --git a/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemStatus.java b/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemStatus.java new file mode 100755 index 0000000..cbc4ce8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemStatus.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.driver.dto; + +public enum DriverWorkItemStatus { + CREATED, + IN_PROGRESS, + DONE, + FAILED +} diff --git a/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemUpdateDTO.java b/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemUpdateDTO.java new file mode 100755 index 0000000..146ded2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/dto/DriverWorkItemUpdateDTO.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.driver.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class DriverWorkItemUpdateDTO { + private DriverWorkItemStatus status; +} diff --git a/src/main/java/io/gec/raw/connector/driver/entity/DriverHeader.java b/src/main/java/io/gec/raw/connector/driver/entity/DriverHeader.java new file mode 100755 index 0000000..0eb398c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/entity/DriverHeader.java @@ -0,0 +1,61 @@ +package io.gec.raw.connector.driver.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntityWithPredefinedId; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity(name = "DRIVER_HEADER") +@Table(name = "Driver_Header", schema = "connector_svc") +public class DriverHeader extends SimpleBaseEntityWithPredefinedId { + + private String payload; + private String name; + private String description; + + @Column(name = "sys_object_id") + private String sysObjectId; + @Column(name = "bulk_polling") + private Boolean bulkPolling; + private String content; + private String devices; + @Column(name = "plant_id") + private UUID plant_id; //TODO: not present in DriverHeaderDTO, where it comes from? + + @OneToMany(mappedBy = "driverHeader", cascade = CascadeType.ALL, orphanRemoval = true) + private List driverVariables = new ArrayList<>(); + + public void addDriverVariableRelations(Collection driverVariables) { + driverVariables.forEach(this::addDriverVariableRelation); + } + + public void addDriverVariableRelation(DriverVariable driverVariable) { + if (this.driverVariables == null) { + this.driverVariables = new ArrayList<>(); + } + this.driverVariables.add(driverVariable); + driverVariable.setDriverHeader(this); + } + + public void removeDriverVariableRelations(Collection driverVariables) { + driverVariables.forEach(this::removeDriverVariableRelation); + } + + public void removeDriverVariableRelation(DriverVariable driverVariable) { + if (this.driverVariables != null) { + this.driverVariables.remove(driverVariable); + } + driverVariable.setDriverHeader(null); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/entity/DriverVariable.java b/src/main/java/io/gec/raw/connector/driver/entity/DriverVariable.java new file mode 100755 index 0000000..66bf75b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/entity/DriverVariable.java @@ -0,0 +1,91 @@ +package io.gec.raw.connector.driver.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntityWithPredefinedId; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +@Entity(name = "DRIVER_VARIABLE") +@Table(name = "Driver_Variable", schema = "connector_svc") +@AllArgsConstructor +@NoArgsConstructor +public class DriverVariable extends SimpleBaseEntityWithPredefinedId { + + private String payload; + private String name; + private String description; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "driver_header_id") + private DriverHeader driverHeader; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "value_mapping_container_id") + private ValueMappingContainer valueMappingContainer; + + private String oid; + + @Column(name = "data_type") + @Enumerated(EnumType.STRING) + private DataTypeEnum dataType; + + @Column(name = "display_format") + private String displayFormat; + + @Column(name = "display_factor") + private String displayFactor; + + private boolean isReadOnly; + + private String min; + private String max; + private String step; + + @Column(name = "interval_factor") + private String intervalFactor; + + @Column(name = "scale_factor", columnDefinition = "varchar(255) default '1'") + private String scale; + @Column(name = "display_name") + private String displayName; //TODO: display_name in device's database + + @Enumerated(EnumType.STRING) + @Column(name = "function_type") + private FunctionTypeEnum functionType; + + @Column(name = "base_oid") + private String baseOid; + + @Column(name = "plant_id") //TODO: not transferred from device service, where it comes from? + private UUID plant_id; + + public boolean getIsReadOnly() { + return isReadOnly; + } + + public void setIsReadOnly(boolean readOnly) { + isReadOnly = readOnly; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof DriverVariable)) + return false; + return this.getId() != null && this.getId().equals(((DriverVariable) o).getId()); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/entity/ValueMapping.java b/src/main/java/io/gec/raw/connector/driver/entity/ValueMapping.java new file mode 100755 index 0000000..1fe8c7f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/entity/ValueMapping.java @@ -0,0 +1,38 @@ +package io.gec.raw.connector.driver.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntityWithPredefinedId; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "VALUE_MAPPING", schema = "connector_svc") +public class ValueMapping extends SimpleBaseEntityWithPredefinedId { + + private String value; + private String mapping; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "value_mapping_container_id") + private ValueMappingContainer valueMappingContainer; + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof ValueMapping)) + return false; + return this.getId() != null && this.getId().equals(((ValueMapping) o).getId()); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/entity/ValueMappingContainer.java b/src/main/java/io/gec/raw/connector/driver/entity/ValueMappingContainer.java new file mode 100755 index 0000000..a6b354a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/entity/ValueMappingContainer.java @@ -0,0 +1,62 @@ +package io.gec.raw.connector.driver.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntityWithPredefinedId; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "VALUE_MAPPING_CONTAINER", schema = "connector_svc") +public class ValueMappingContainer extends SimpleBaseEntityWithPredefinedId { + + @OneToMany(mappedBy = "valueMappingContainer") + private List driverVariables = new ArrayList<>(); + + @OneToMany(mappedBy = "valueMappingContainer", cascade = CascadeType.ALL, orphanRemoval = true) + private List valueMappings = new ArrayList<>(); + + public void addDriverVariableRelations(Collection driverVariables) { + driverVariables.forEach(this::addDriverVariableRelation); + } + + public void addDriverVariableRelation(DriverVariable driverVariable) { + this.driverVariables.add(driverVariable); + driverVariable.setValueMappingContainer(this); + } + + public void removeDriverVariableRelation(DriverVariable driverVariable) { + if (Objects.nonNull(driverVariable)) { + this.driverVariables.remove(driverVariable); + driverVariable.setValueMappingContainer(null); + } + } + + public void addValueMappingRelations(Collection valueMappings) { + valueMappings.forEach(this::addValueMappingRelation); + } + + public void addValueMappingRelation(ValueMapping valueMapping) { + this.valueMappings.add(valueMapping); + valueMapping.setValueMappingContainer(this); + } + + public void removeAllValueMappingRelations() { + Iterator iterator = this.valueMappings.iterator(); + while (iterator.hasNext()) { + ValueMapping valueMapping = iterator.next(); + valueMapping.setValueMappingContainer(null); + iterator.remove(); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/handler/AbstractDriverWorkItemJobHandler.java b/src/main/java/io/gec/raw/connector/driver/handler/AbstractDriverWorkItemJobHandler.java new file mode 100755 index 0000000..a83918f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/handler/AbstractDriverWorkItemJobHandler.java @@ -0,0 +1,92 @@ +package io.gec.raw.connector.driver.handler; + +import io.gec.raw.connector.driver.control.DeviceDriverController; +import io.gec.raw.connector.driver.domain.DriverWorkItemResult; +import io.gec.raw.connector.driver.dto.DriverWorkItemDTO; +import io.gec.raw.connector.driver.dto.DriverWorkItemStatus; +import io.gec.raw.connector.driver.dto.DriverWorkItemUpdateDTO; +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.WorkItemHandler; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; +import jakarta.persistence.EntityNotFoundException; + +import java.util.Optional; +import java.util.UUID; + +public abstract class AbstractDriverWorkItemJobHandler extends WorkItemHandler { + + @Inject + DeviceDriverController deviceDriverController; + + @Override + protected Optional getWorkItem(UUID workItemId) { + return communicationServiceController.fetchDriverWorkItem(workItemId); + } + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + updateDriverWorkItemStatus(workItemWrapper.workItemId(), DriverWorkItemStatus.IN_PROGRESS); + } + + @ActivateRequestContext + @Override + protected DriverWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + logger.infof("Processing DriverWorkItem (ID:'%s') ...", workItemWrapper.workItemId()); + try { + validateDriverWorkItem(workItemWrapper); + processDeviceDriver(workItemWrapper.workItem().getDriverId()); + return new DriverWorkItemResult(DriverWorkItemStatus.DONE); + } catch (EntityNotFoundException e) { + var message = "DriverWorkItem (ID:'%s') not found".formatted(workItemWrapper.workItemId()); + logger.error(message, e); + return new DriverWorkItemResult(DriverWorkItemStatus.FAILED, message); + } catch (Exception e) { + logger.errorf(e, "Processing DriverWorkItem (ID:'%s') - FAILED", workItemWrapper.workItemId()); + return new DriverWorkItemResult(DriverWorkItemStatus.FAILED, e.getMessage()); + } + } + + protected void validateDriverWorkItem(WorkItemWrapper workItemWrapper) { + if (workItemWrapper.workItem() == null) { + throw new IllegalArgumentException("DriverWorkItemDTO is required but not provided for work item Id: %s".formatted(workItemWrapper.workItemId())); + } else if (workItemWrapper.workItem().getDriverId() == null) { + throw new IllegalArgumentException("Driver ID is required but not provided for work item Id: %s .".formatted(workItemWrapper.workItemId())); + } + } + + @Override + protected void finishProcessing(WorkItemWrapper workItemWrapper, DriverWorkItemResult workItemResult) { + updateDriverWorkItemStatus(workItemWrapper.workItemId(), workItemResult.getStatus()); + } + + @Override + protected JobResult mapToJobResult(DriverWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case DONE -> JobStatus.DONE; + case FAILED -> JobStatus.FAILED; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + public JobType getJobType() { + return JobType.DRIVER; + } + + private void updateDriverWorkItemStatus(UUID workItemId, DriverWorkItemStatus driverWorkItemStatus) { + var driverWorkItemUpdateDTO = new DriverWorkItemUpdateDTO(); + driverWorkItemUpdateDTO.setStatus(driverWorkItemStatus); + + communicationServiceController.updateDriverWorkItem(workItemId, driverWorkItemUpdateDTO); + } + + protected abstract void processDeviceDriver(UUID deviceDriverId); +} diff --git a/src/main/java/io/gec/raw/connector/driver/handler/CreateDriverWorkItemJobHandler.java b/src/main/java/io/gec/raw/connector/driver/handler/CreateDriverWorkItemJobHandler.java new file mode 100755 index 0000000..3c13211 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/handler/CreateDriverWorkItemJobHandler.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.driver.handler; + +import io.gec.raw.connector.job.dto.JobAction; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.UUID; + +@ApplicationScoped +public class CreateDriverWorkItemJobHandler extends AbstractDriverWorkItemJobHandler { + + @Override + protected void processDeviceDriver(UUID deviceDriverId) { + deviceDriverController.createDriver(deviceDriverId); + } + + @Override + public JobAction getJobAction() { + return JobAction.CREATE; + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/handler/DeleteDriverWorkItemJobHandler.java b/src/main/java/io/gec/raw/connector/driver/handler/DeleteDriverWorkItemJobHandler.java new file mode 100755 index 0000000..94c5aa7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/handler/DeleteDriverWorkItemJobHandler.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.driver.handler; + +import io.gec.raw.connector.job.dto.JobAction; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.UUID; + +@ApplicationScoped +public class DeleteDriverWorkItemJobHandler extends AbstractDriverWorkItemJobHandler { + + @Override + protected void processDeviceDriver(UUID deviceDriverId) { + deviceDriverController.deleteDriver(deviceDriverId); + } + + @Override + public JobAction getJobAction() { + return JobAction.DELETE; + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/handler/SynchronizeDriverWorkItemJobHandler.java b/src/main/java/io/gec/raw/connector/driver/handler/SynchronizeDriverWorkItemJobHandler.java new file mode 100755 index 0000000..2c40a3a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/handler/SynchronizeDriverWorkItemJobHandler.java @@ -0,0 +1,29 @@ +package io.gec.raw.connector.driver.handler; + +import io.gec.raw.connector.driver.dto.DriverWorkItemDTO; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.UUID; + +@ApplicationScoped +public class SynchronizeDriverWorkItemJobHandler extends AbstractDriverWorkItemJobHandler { + + @Override + protected void processDeviceDriver(UUID unused) { + deviceDriverController.synchronizeDrivers(); + } + + @Override + public JobAction getJobAction() { + return JobAction.SYNCHRONIZE; + } + + @Override + protected void validateDriverWorkItem(WorkItemWrapper workItemWrapper) { + if (workItemWrapper.workItem() == null) { + throw new IllegalArgumentException("DriverWorkItemDTO is required but not provided for work item Id: %s".formatted(workItemWrapper.workItemId())); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/handler/UpdateDriverWorkItemJobHandler.java b/src/main/java/io/gec/raw/connector/driver/handler/UpdateDriverWorkItemJobHandler.java new file mode 100755 index 0000000..3cd65a1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/handler/UpdateDriverWorkItemJobHandler.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.driver.handler; + +import io.gec.raw.connector.job.dto.JobAction; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.UUID; + +@ApplicationScoped +public class UpdateDriverWorkItemJobHandler extends AbstractDriverWorkItemJobHandler { + + @Override + protected void processDeviceDriver(UUID deviceDriverId) { + deviceDriverController.updateDriver(deviceDriverId); + } + + @Override + public JobAction getJobAction() { + return JobAction.UPDATE; + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/mapper/DataMapper.java b/src/main/java/io/gec/raw/connector/driver/mapper/DataMapper.java new file mode 100755 index 0000000..22baa96 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/mapper/DataMapper.java @@ -0,0 +1,51 @@ +package io.gec.raw.connector.driver.mapper; + +import io.gec.raw.connector.driver.domain.DriverHeaderDTO; +import io.gec.raw.connector.driver.domain.DriverVariableDTO; +import io.gec.raw.connector.driver.domain.ValueMappingContainerDTO; +import io.gec.raw.connector.driver.domain.ValueMappingDTO; +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.gec.raw.connector.driver.entity.ValueMapping; +import io.gec.raw.connector.driver.entity.ValueMappingContainer; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.List; + +@ApplicationScoped +public class DataMapper { + + private final DataMapperDefinitions dataMapperDefinitions; + + public DataMapper(DataMapperDefinitions dataMapperDefinitions) { + this.dataMapperDefinitions = dataMapperDefinitions; + } + + public DriverHeader toDriverHeader(DriverHeaderDTO dto) { + return dataMapperDefinitions.toDriverHeader(dto); + } + + public DriverVariable toDriverVariable(DriverVariableDTO dto) { + return dataMapperDefinitions.toDriverVariable(dto); + } + + public List toDriverVariables(List dtoses) { + return dtoses.stream() + .map(dataMapperDefinitions::toDriverVariable) + .toList(); + } + + public ValueMappingContainer toValueMappingContainer(ValueMappingContainerDTO dto) { + return dataMapperDefinitions.toValueMappingContainer(dto); + } + + public ValueMapping toValueMapping(ValueMappingDTO dto) { + return dataMapperDefinitions.toValueMapping(dto); + } + + public List toValueMappings(List dtoses) { + return dtoses.stream() + .map(dataMapperDefinitions::toValueMapping) + .toList(); + } +} diff --git a/src/main/java/io/gec/raw/connector/driver/mapper/DataMapperDefinitions.java b/src/main/java/io/gec/raw/connector/driver/mapper/DataMapperDefinitions.java new file mode 100755 index 0000000..9412bb0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/mapper/DataMapperDefinitions.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.driver.mapper; + +import io.gec.raw.connector.driver.domain.DriverHeaderDTO; +import io.gec.raw.connector.driver.domain.DriverVariableDTO; +import io.gec.raw.connector.driver.domain.ValueMappingContainerDTO; +import io.gec.raw.connector.driver.domain.ValueMappingDTO; +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.gec.raw.connector.driver.entity.ValueMapping; +import io.gec.raw.connector.driver.entity.ValueMappingContainer; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "cdi") +public interface DataMapperDefinitions { + + DriverHeader toDriverHeader(DriverHeaderDTO dto); + + DriverVariable toDriverVariable(DriverVariableDTO dto); + + ValueMappingContainer toValueMappingContainer(ValueMappingContainerDTO dto); + + ValueMapping toValueMapping(ValueMappingDTO dto); +} diff --git a/src/main/java/io/gec/raw/connector/driver/projection/DriverHeaderIdProjection.java b/src/main/java/io/gec/raw/connector/driver/projection/DriverHeaderIdProjection.java new file mode 100755 index 0000000..73fb8a0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/projection/DriverHeaderIdProjection.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.driver.projection; + +import io.quarkus.hibernate.orm.panache.common.ProjectedFieldName; +import io.quarkus.runtime.annotations.RegisterForReflection; + +import java.util.UUID; + +@RegisterForReflection +public record DriverHeaderIdProjection(@ProjectedFieldName("id") UUID id) { +} diff --git a/src/main/java/io/gec/raw/connector/driver/projection/ValueMappingContainerIdProjection.java b/src/main/java/io/gec/raw/connector/driver/projection/ValueMappingContainerIdProjection.java new file mode 100755 index 0000000..7ef3f4d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/driver/projection/ValueMappingContainerIdProjection.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.driver.projection; + +import io.quarkus.hibernate.orm.panache.common.ProjectedFieldName; +import io.quarkus.runtime.annotations.RegisterForReflection; + +import java.util.UUID; + +@RegisterForReflection +public record ValueMappingContainerIdProjection(@ProjectedFieldName("id") UUID id) { +} diff --git a/src/main/java/io/gec/raw/connector/exception/entity/CacheUpdateException.java b/src/main/java/io/gec/raw/connector/exception/entity/CacheUpdateException.java new file mode 100755 index 0000000..aedaa51 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/exception/entity/CacheUpdateException.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.exception.entity; + +public class CacheUpdateException extends RuntimeException { + + public CacheUpdateException(Exception e) { + super("There was an error while updating the cache", e); + } +} diff --git a/src/main/java/io/gec/raw/connector/exception/entity/DriverNotFoundException.java b/src/main/java/io/gec/raw/connector/exception/entity/DriverNotFoundException.java new file mode 100755 index 0000000..225adcd --- /dev/null +++ b/src/main/java/io/gec/raw/connector/exception/entity/DriverNotFoundException.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.exception.entity; + +public class DriverNotFoundException extends RuntimeException { + public DriverNotFoundException(String string) { + super(string); + } +} + diff --git a/src/main/java/io/gec/raw/connector/exception/entity/KeyNotFoundException.java b/src/main/java/io/gec/raw/connector/exception/entity/KeyNotFoundException.java new file mode 100755 index 0000000..82360de --- /dev/null +++ b/src/main/java/io/gec/raw/connector/exception/entity/KeyNotFoundException.java @@ -0,0 +1,9 @@ +package io.gec.raw.connector.exception.entity; + +public class KeyNotFoundException extends Exception { + + public KeyNotFoundException(String string) { + super(string); + } + +} diff --git a/src/main/java/io/gec/raw/connector/exception/entity/SftpException.java b/src/main/java/io/gec/raw/connector/exception/entity/SftpException.java new file mode 100755 index 0000000..af0e236 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/exception/entity/SftpException.java @@ -0,0 +1,9 @@ +package io.gec.raw.connector.exception.entity; + +public class SftpException extends Exception { + + public SftpException(String string) { + super(string); + } + +} diff --git a/src/main/java/io/gec/raw/connector/exception/entity/SnmpInitializationException.java b/src/main/java/io/gec/raw/connector/exception/entity/SnmpInitializationException.java new file mode 100755 index 0000000..293f35b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/exception/entity/SnmpInitializationException.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.exception.entity; + +public class SnmpInitializationException extends RuntimeException { + + public SnmpInitializationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/FirmwareDownloadController.java b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareDownloadController.java new file mode 100755 index 0000000..ac803a1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareDownloadController.java @@ -0,0 +1,141 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.communicationservice.exception.CommunicationServiceException; +import io.gec.raw.connector.firmware.domain.FirmwareDownloadException; +import io.gec.raw.connector.firmware.domain.FirmwareFileNotFoundException; +import io.gec.raw.connector.firmware.domain.TooManyFirmwareFilesException; +import io.gec.raw.connector.firmware.dto.FirmwareFileMetadataDTO; +import io.gec.raw.connector.job.domain.ProcessingCanceledException; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.utils.control.ChecksumController; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.io.IOException; +import java.io.InputStream; +import java.util.UUID; + +@ApplicationScoped +public class FirmwareDownloadController { + @Inject + FirmwareStorageController firmwareStorageController; + @Inject + FirmwareFileConfigProvider firmwareFileConfigProvider; + @Inject + CommunicationServiceController communicationServiceController; + @Inject + ChecksumController checksumController; + @Inject + Logger logger; + + public void downloadFirmwareFile(UUID firmwareId, UUID workItemId, ProcessingCancellationChecker processingCancellationChecker) + throws ProcessingCanceledException { + + boolean downloadFile = false; + boolean removeStoredFiles = false; + + try { + String firmwareFileName = firmwareStorageController.findFirmwareFileName(firmwareId); + logger.infof("Firmware file is already stored for ID: '%s' with name: '%s'", firmwareId, firmwareFileName); + + } catch (FirmwareFileNotFoundException e) { + downloadFile = true; + logger.warnf("Firmware file not found for ID: '%s'", firmwareId); + } catch (TooManyFirmwareFilesException e) { + removeStoredFiles = true; + downloadFile = true; + logger.warnf("Too many firmware files found for ID:'%s'", firmwareId); + } + + if (removeStoredFiles) { + removeStoredFiles(firmwareId); + } + + if (downloadFile) { + downloadFile(firmwareId, workItemId, processingCancellationChecker); + } + } + + void removeStoredFiles(UUID firmwareId) { + logger.infof("Removing all stored files related to firmware ID: '%s'", firmwareId); + + try { + firmwareStorageController.removeAllFiles(firmwareId); + } catch (IOException e) { + throw new FirmwareDownloadException("Cannot remove all files related to firmware ID: '%s'".formatted(firmwareId), e); + } + } + + void downloadFile(UUID firmwareId, UUID workItemId, ProcessingCancellationChecker processingCancellationChecker) + throws ProcessingCanceledException { + + FirmwareFileMetadataDTO firmwareFileMetadataDTO = downloadFileMetadata(firmwareId, workItemId); + InputStream firmwareStream = downloadFirmwareStream(firmwareId, workItemId); + + if (processingCancellationChecker.isProcessingCanceled()) { + throw new ProcessingCanceledException(); + } + + storeFile(firmwareId, firmwareFileMetadataDTO, firmwareStream); + verifyChecksum(firmwareId, firmwareFileMetadataDTO.getFileName(), firmwareFileMetadataDTO.getSha1()); + } + + private FirmwareFileMetadataDTO downloadFileMetadata(UUID firmwareId, UUID workItemId) { + logger.infof("Download file metadata (ID: '%s') - started", firmwareId); + long startTime = System.currentTimeMillis(); + + try { + FirmwareFileMetadataDTO firmwareFileMetadataDTO = communicationServiceController.fetchFirmwareFileMetadata(firmwareId, workItemId); + + long downloadTime = System.currentTimeMillis() - startTime; + logger.infof("Download file metadata (ID: '%s') - finished in %d ms", firmwareId, downloadTime); + + return firmwareFileMetadataDTO; + } catch (CommunicationServiceException e) { + throw new FirmwareDownloadException("Cannot download file metadata for firmware ID: '%s'".formatted(firmwareId), e); + } + } + + private InputStream downloadFirmwareStream(UUID firmwareId, UUID workItemId) { + logger.infof("Download firmware stream (ID: '%s') - started", firmwareId); + long startTime = System.currentTimeMillis(); + + try { + InputStream firmwareStream = communicationServiceController.fetchFirmwareFileStream(firmwareId, workItemId); + + long downloadTime = System.currentTimeMillis() - startTime; + logger.infof("Download firmware stream (ID: '%s') - finished in %d ms", firmwareId, downloadTime); + + return firmwareStream; + } catch (CommunicationServiceException e) { + throw new FirmwareDownloadException("Cannot download firmware stream for firmware ID: '%s'".formatted(firmwareId), e); + } + } + + private void storeFile(UUID firmwareId, FirmwareFileMetadataDTO firmwareFile, InputStream firmwareStream) { + logger.infof("Storing the firmware file (ID: '%s') - started", firmwareId); + long startTime = System.currentTimeMillis(); + + String fileName = firmwareFile.getFileName(); + try { + firmwareStorageController.storeFirmwareFile(firmwareId, fileName, firmwareStream); + + long storeTime = System.currentTimeMillis() - startTime; + logger.infof("Storing the firmware file (ID: '%s') - finished in %d ms", firmwareId, storeTime); + } catch (IOException e) { + throw new FirmwareDownloadException("Cannot store firmware file with ID: '%s' and name: '%s'".formatted(firmwareId, fileName), e); + } + } + + private void verifyChecksum(UUID firmwareId, String fileName, String expectedSha1) { + String firmwareFilePath = firmwareFileConfigProvider.getFirmwareFileDownloadPath(firmwareId, fileName); + + boolean doesChecksumMatch = checksumController.verifySha1(firmwareFilePath, expectedSha1); + if (!doesChecksumMatch) { + removeStoredFiles(firmwareId); + throw new FirmwareDownloadException("Checksum of downloaded file does not match for firmware ID: '%s'".formatted(firmwareId)); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/FirmwareFileConfigProvider.java b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareFileConfigProvider.java new file mode 100755 index 0000000..bc18fc0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareFileConfigProvider.java @@ -0,0 +1,33 @@ +package io.gec.raw.connector.firmware.control; + +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.UUID; + +@ApplicationScoped +public class FirmwareFileConfigProvider { + private static final String FIRMWARE_DOWNLOAD_DIR = "./firmware/"; + private static final String FIRMWARE_UPLOAD_DIR = "./update/"; + private static final String FIRMWARE_FILE_EXTENSION = ".tar"; + private static final String FIRMWARE_UPDATE_STATUS_FILE_EXTENSION = ".status"; + + public String getFirmwareDownloadDir(UUID firmwareId) { + return FIRMWARE_DOWNLOAD_DIR + firmwareId.toString() + "/"; + } + + public String getFirmwareFileDownloadPath(UUID firmwareId, String firmwareFileName) { + return getFirmwareDownloadDir(firmwareId) + firmwareFileName; + } + + public String getUploadDir() { + return FIRMWARE_UPLOAD_DIR; + } + + public String getFirmwareFileExtension() { + return FIRMWARE_FILE_EXTENSION; + } + + public String getFirmwareUpdateStatusFileExtension() { + return FIRMWARE_UPDATE_STATUS_FILE_EXTENSION; + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/FirmwareFileUploader.java b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareFileUploader.java new file mode 100755 index 0000000..204ef39 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareFileUploader.java @@ -0,0 +1,68 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.firmware.domain.FirmwareUploadException; +import io.gec.raw.connector.ftp.control.SSHClientProvider; +import io.gec.raw.connector.ftp.control.SftpDirectoryCleaner; +import io.gec.raw.connector.ftp.control.SftpUploader; +import io.gec.raw.connector.ftp.domain.FileItem; +import io.gec.raw.connector.ftp.domain.SftpData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import net.schmizz.sshj.SSHClient; +import net.schmizz.sshj.sftp.SFTPClient; +import org.jboss.logging.Logger; + +import java.io.IOException; + +@ApplicationScoped +public class FirmwareFileUploader { + private static final String DEFAULT_REMOTE_PATH_SEPARATOR = "/"; + @Inject + SSHClientProvider sshClientProvider; + @Inject + SftpUploader sftpUploader; + @Inject + SftpDirectoryCleaner sftpDirectoryCleaner; + @Inject + Logger logger; + + public void uploadFirmwareFile(SftpData sftpData, FileItem fileItem) { + try (SSHClient sshClient = sshClientProvider.setupSsh(sftpData, false); + SFTPClient sftpClient = sshClient.newSFTPClient()) { + + String dirToClear = getDirFromFilePath(fileItem.destFilePath()); + sftpDirectoryCleaner.removeFilesFromDirectory(sftpClient, dirToClear); + + uploadFileToDevice(sftpClient, fileItem, sftpData.getIpAddress()); + } catch (IOException | SftpException e) { + throw new FirmwareUploadException("Cannot upload firmware file: '%s' to device with IP: '%s'".formatted(fileItem.destFilePath(), sftpData.getIpAddress()), e); + } + } + + void uploadFileToDevice(SFTPClient sftpClient, FileItem fileItem, String deviceIpAddress) throws SftpException { + logger.infof("Uploading firmware file to device started with source file: '%s', dest file: '%s', device IP: '%s'", + fileItem.sourceFilePath(), + fileItem.destFilePath(), + deviceIpAddress); + + sftpUploader.uploadFile(sftpClient, fileItem); + + logger.infof("Uploading firmware file to device finished with source file: '%s', dest file: '%s', device IP: '%s'", + fileItem.sourceFilePath(), + fileItem.destFilePath(), + deviceIpAddress); + } + + private String getDirFromFilePath(String filePath) { + if (filePath.endsWith(DEFAULT_REMOTE_PATH_SEPARATOR)) { + return filePath; + } + + if (!filePath.contains(DEFAULT_REMOTE_PATH_SEPARATOR)) { + return DEFAULT_REMOTE_PATH_SEPARATOR; + } + + return filePath.substring(0, filePath.lastIndexOf(DEFAULT_REMOTE_PATH_SEPARATOR) + 1); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/FirmwareStorageController.java b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareStorageController.java new file mode 100755 index 0000000..c2ac0d6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareStorageController.java @@ -0,0 +1,67 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.firmware.domain.FirmwareFileNotFoundException; +import io.gec.raw.connector.firmware.domain.TooManyFirmwareFilesException; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.apache.commons.io.FileUtils; +import org.jboss.logging.Logger; + +import java.io.*; +import java.util.UUID; + +@ApplicationScoped +public class FirmwareStorageController { + private static final int FIRMWARE_FILE_BUFFER_SIZE = 10240; + @Inject + FirmwareFileConfigProvider firmwareFileConfigProvider; + @Inject + Logger logger; + + public String findFirmwareFileName(UUID firmwareId) { + String firmwareDir = firmwareFileConfigProvider.getFirmwareDownloadDir(firmwareId); + String firmwareFileExtension = firmwareFileConfigProvider.getFirmwareFileExtension(); + File[] firmwareFiles = new File(firmwareDir).listFiles((dir, name) -> name.endsWith(firmwareFileExtension)); + + if (firmwareFiles == null) { + throw new FirmwareFileNotFoundException("No such directory found: '%s'".formatted(firmwareDir)); + } + + if (firmwareFiles.length == 0) { + throw new FirmwareFileNotFoundException("No files found in directory: '%s'".formatted(firmwareDir)); + } + + if (firmwareFiles.length > 1) { + throw new TooManyFirmwareFilesException("More than one firmware file found in directory: '%s'".formatted(firmwareDir)); + } + + String fileName = firmwareFiles[0].getName(); + + logger.infof("Found file name: '%s' for firmware ID: '%s'".formatted(fileName, firmwareId)); + + return fileName; + } + + public void removeAllFiles(UUID firmwareId) throws IOException { + File firmwareDir = new File(firmwareFileConfigProvider.getFirmwareDownloadDir(firmwareId)); + FileUtils.cleanDirectory(firmwareDir); + } + + public void storeFirmwareFile(UUID firmwareId, String fileName, InputStream firmwareStream) throws IOException { + String firmwareDir = firmwareFileConfigProvider.getFirmwareDownloadDir(firmwareId); + new File(firmwareDir).mkdirs(); + + byte[] buffer = new byte[FIRMWARE_FILE_BUFFER_SIZE]; + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(firmwareStream); + FileOutputStream fos = new FileOutputStream(firmwareDir + fileName)) { + + int bytesCount; + while ((bytesCount = bufferedInputStream.read(buffer)) != -1) { + fos.write(buffer, 0, bytesCount); + } + fos.flush(); + } + + logger.infof("File for firmware ID: '%s' stored with name: '%s'".formatted(firmwareId, fileName)); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUpdateStatusController.java b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUpdateStatusController.java new file mode 100755 index 0000000..1722bb2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUpdateStatusController.java @@ -0,0 +1,53 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.firmware.domain.FirmwareUpdateStatus; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateStatusResult; +import io.gec.raw.connector.ftp.domain.SftpData; +import org.jboss.logging.Logger; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class FirmwareUpdateStatusController { + + //WARN: do not change UPDATE_SUCCESS_MESSAGE and UPDATE_ERROR_PREFIX values - they come from analysis of real status files + private static final String UPDATE_SUCCESS_MESSAGE = "info - successful"; + private static final String UPDATE_ERROR_PREFIX = "error - "; + + @Inject + StatusFileContentProvider statusFileContentProvider; + @Inject + Logger logger; + + public FirmwareUpdateStatusResult getFirmwareUpdateStatus(UUID firmwareId, SftpData sftpData) { + logger.infof("Getting the firmware (ID: '%s') update status - started", firmwareId); + String statusFileContents = null; + try { + Optional contentOpt = statusFileContentProvider.readStatusFileContent(sftpData, firmwareId); + statusFileContents = contentOpt.orElse(null); + + FirmwareUpdateStatus status = contentOpt + .map(this::analyzeContent) + .orElse(FirmwareUpdateStatus.IN_PROGRESS); + + logger.infof("Getting the firmware (ID: '%s') update status - finished with status: '%s'", firmwareId, status); + return new FirmwareUpdateStatusResult(status, statusFileContents); + + } catch (Exception e) { + logger.errorf(e, "Error while getting the firmware (ID: '%s') update status", firmwareId); + return new FirmwareUpdateStatusResult(FirmwareUpdateStatus.ERROR, statusFileContents); + } + } + + private FirmwareUpdateStatus analyzeContent(String content) { + if (content.contains(UPDATE_ERROR_PREFIX)) { + return FirmwareUpdateStatus.ERROR; + } else if (content.contains(UPDATE_SUCCESS_MESSAGE)) { + return FirmwareUpdateStatus.SUCCESS; + } + return FirmwareUpdateStatus.IN_PROGRESS; + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUpdateVerificationController.java b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUpdateVerificationController.java new file mode 100755 index 0000000..63e8ba2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUpdateVerificationController.java @@ -0,0 +1,116 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateStatus; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateStatusResult; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateVerificationException; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateVerificationTimeoutException; +import io.gec.raw.connector.ftp.control.FtpController; +import io.gec.raw.connector.ftp.domain.SftpData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.jboss.logging.Logger; + +import java.time.Duration; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.*; + +/** + * 0. determine how many verification tasks can be run in parallel and increase property connector.job.firmware.update-verifier.pool-size 3? + * 1. OPTIONAL/FUTURE get current s/w version from device and set it to WorkItemWrapper (add Map of additional properties) in FirmwareUploadJobHandler + * 2. get status filename from firmwareStorageController.findFirmwareFileName(firmwareId) -> add ".status" extension + * 3. OPTIONAL/FUTURE for-loop with timeout ??? / interval ??? -> wait until device is OFF (no ssh connection) + * 4. for-loop with timeout 15min (config) / interval 30s (config) -> wait until device is ON (ssh connection) & there is status file on device in /update directory + * 5. parse status file and check update status of job + * - check if there is line with "error" -> FAIL + * - then check if there is line "info - successful" -> SUCCESS + * - then wait [interval] and: + * - check if no timeout -> go to p.4. -> re-read status file + * - check if timeout -> FAIL_WITH_TIMEOUT + * 6. OPTIONAL/FUTURE as additional check (or alternative?) get new s/w version and check if it is different than previous one + */ +@ApplicationScoped +public class FirmwareUpdateVerificationController { + @ConfigProperty(name = "connector.job.firmware.update-verifier.timeout") + Duration verificationTimeout; + @ConfigProperty(name = "connector.job.firmware.update-verifier.interval") + Duration verificationInterval; + @Inject + FirmwareUpdateStatusController firmwareUpdateStatusController; + @Inject + DeviceController deviceController; + @Inject + FtpController ftpController; + @Inject + Logger logger; + + public void verifyFirmwareUpdate(UUID firmwareId, + UUID commSvcDeviceId, + List connectionWorkItemValues) { + logger.infof("Firmware (ID: '%s') update verification - started", firmwareId); + SftpData sftpData = getSftpData(commSvcDeviceId, connectionWorkItemValues); + + FirmwareUpdateStatusResult firmwareUpdateStatusResult = null; + long verificationStartTime = System.currentTimeMillis(); + + while (isVerificationActive(firmwareUpdateStatusResult, verificationStartTime)) { + firmwareUpdateStatusResult = firmwareUpdateStatusController.getFirmwareUpdateStatus(firmwareId, sftpData); + + if (firmwareUpdateStatusResult.getStatus() != FirmwareUpdateStatus.IN_PROGRESS) { + break; + } + + waitForNextVerification(firmwareId); + } + + if (firmwareUpdateStatusResult == null || firmwareUpdateStatusResult.getStatus() == FirmwareUpdateStatus.IN_PROGRESS) { + logger.infof("Firmware (ID: '%s') update verification - finished with timeout", firmwareId); + throw new FirmwareUpdateVerificationTimeoutException( + "Firmware update verification timeout, it took more than %d minutes for firmwareId: '%s'".formatted(verificationTimeout.toMinutes(), firmwareId)); + } + + if (firmwareUpdateStatusResult.getStatus() == FirmwareUpdateStatus.ERROR) { + logger.infof("Firmware (ID: '%s') update verification - finished with error", firmwareId); + throw new FirmwareUpdateVerificationException( + "Firmware update verification for firmwareId: '%s' failed with status message: '%s'".formatted(firmwareId, firmwareUpdateStatusResult.getStatusMessage())); + } + + logger.infof("Firmware (ID: '%s') update verification - finished with success", firmwareId); + } + + private SftpData getSftpData(UUID commSvcDeviceId, List connectionWorkItemValues) { + Device rootDevice = deviceController.getDeviceByCommSvcId(commSvcDeviceId); + return ftpController.createSftpData(connectionWorkItemValues, rootDevice.getDeviceURL()); + } + + private boolean isVerificationActive(FirmwareUpdateStatusResult firmwareUpdateStatusResult, long verificationStartTime) { + if (verificationTimeExceeded(verificationStartTime)) { + return false; + } + + if (firmwareUpdateStatusResult == null) { + return true; + } + + return firmwareUpdateStatusResult.getStatus() == FirmwareUpdateStatus.IN_PROGRESS; + } + + boolean verificationTimeExceeded(long startTime) { + return System.currentTimeMillis() - startTime > verificationTimeout.toMillis(); + } + + private void waitForNextVerification(UUID firmwareId) { + try { + TimeUnit.MILLISECONDS.sleep(verificationInterval.toMillis()); + } catch (InterruptedException e) { + String errorMessage = "Verification firmware update interrupted (ID: '%s')".formatted(firmwareId); + logger.warn(errorMessage, e); + Thread.currentThread().interrupt(); + throw new FirmwareUpdateVerificationException(errorMessage, e); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUploadController.java b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUploadController.java new file mode 100755 index 0000000..69725f7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/FirmwareUploadController.java @@ -0,0 +1,50 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.firmware.domain.FirmwareFileNotFoundException; +import io.gec.raw.connector.firmware.domain.FirmwareUploadException; +import io.gec.raw.connector.firmware.domain.TooManyFirmwareFilesException; +import io.gec.raw.connector.ftp.control.*; +import io.gec.raw.connector.ftp.domain.FileItem; +import io.gec.raw.connector.ftp.domain.SftpData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class FirmwareUploadController { + @Inject + SftpDataProvider sftpDataProvider; + @Inject + FirmwareStorageController firmwareStorageController; + @Inject + FirmwareFileConfigProvider firmwareFileConfigProvider; + @Inject + FirmwareFileUploader firmwareFileUploader; + @Inject + Logger logger; + + public void uploadFirmwareFileToDevice(UUID firmwareId, + UUID commSvcDeviceId, + List connectionWorkItemValues) { + FileItem fileItem = getFileToUpload(firmwareId); + SftpData sftpData = sftpDataProvider.createSftpData(commSvcDeviceId, connectionWorkItemValues); + + firmwareFileUploader.uploadFirmwareFile(sftpData, fileItem); + } + + FileItem getFileToUpload(UUID firmwareId) { + try { + String firmwareFileName = firmwareStorageController.findFirmwareFileName(firmwareId); + String firmwareSourceFilePath = firmwareFileConfigProvider.getFirmwareFileDownloadPath(firmwareId, firmwareFileName); + String firmwareDestFilePath = firmwareFileConfigProvider.getUploadDir() + firmwareFileName; + + return new FileItem(firmwareSourceFilePath, firmwareDestFilePath); + } catch (FirmwareFileNotFoundException | TooManyFirmwareFilesException e) { + throw new FirmwareUploadException("Cannot get file with ID: '%s'".formatted(firmwareId), e); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/StatusFileContentProvider.java b/src/main/java/io/gec/raw/connector/firmware/control/StatusFileContentProvider.java new file mode 100755 index 0000000..7ce1b42 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/StatusFileContentProvider.java @@ -0,0 +1,80 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.firmware.domain.FirmwareFileNotFoundException; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateVerificationException; +import io.gec.raw.connector.firmware.domain.TooManyFirmwareFilesException; +import io.gec.raw.connector.ftp.control.SftpDownloader; +import io.gec.raw.connector.ftp.domain.SftpData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class StatusFileContentProvider { + + @Inject + SftpDownloader sftpDownloader; + @Inject + FirmwareStorageController firmwareStorageController; + @Inject + FirmwareFileConfigProvider firmwareFileConfigProvider; + @Inject + TempFileProvider tempFileProvider; + @Inject + Logger logger; + + public Optional readStatusFileContent(SftpData sftpAccessData, UUID firmwareId) { + Path tempStatusFilePath = null; + String sourceStatusFilePathStr = constructStatusFilePath(firmwareId); + try { + tempStatusFilePath = tempFileProvider.createTemporaryStatusFile(); + + logger.infof("Downloading the firmware status file from device started with source file: '%s', dest file: '%s', device IP: '%s'", + sourceStatusFilePathStr, + tempStatusFilePath.toString(), + sftpAccessData.getIpAddress()); + + sftpDownloader.downloadFileFromDevice(sftpAccessData, sourceStatusFilePathStr, tempStatusFilePath); + + logger.infof("Downloading the firmware status file from device finished with source file: '%s', dest file: '%s', device IP: '%s'", + sourceStatusFilePathStr, + tempStatusFilePath.toString(), + sftpAccessData.getIpAddress()); + + return Optional.ofNullable(Files.readString(tempStatusFilePath)); + } catch (SftpException | IOException e) { + logger.debugf(e, "Cannot read status file '%s' from device IP: '%s'", sourceStatusFilePathStr, sftpAccessData.getIpAddress()); + } finally { + deleteFile(tempStatusFilePath); + } + return Optional.empty(); + } + + String constructStatusFilePath(UUID firmwareId) { + try { + String firmwareFileName = firmwareStorageController.findFirmwareFileName(firmwareId); + String statusFileName = firmwareFileName + firmwareFileConfigProvider.getFirmwareUpdateStatusFileExtension(); + + return firmwareFileConfigProvider.getUploadDir() + statusFileName; + } catch (FirmwareFileNotFoundException | TooManyFirmwareFilesException e) { + throw new FirmwareUpdateVerificationException("Cannot create status file path for firmwareId: '%s'".formatted(firmwareId), e); + } + } + + private void deleteFile(Path path) { + if (path != null) { + try { + Files.deleteIfExists(path); + } catch (IOException e) { + logger.warnf(e, "Failed to delete temporary status file '%s'", path.toString()); + } + } + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/control/TempFileProvider.java b/src/main/java/io/gec/raw/connector/firmware/control/TempFileProvider.java new file mode 100755 index 0000000..94d0fd8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/control/TempFileProvider.java @@ -0,0 +1,13 @@ +package io.gec.raw.connector.firmware.control; + +import jakarta.enterprise.context.ApplicationScoped; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +@ApplicationScoped +public class TempFileProvider { + public Path createTemporaryStatusFile() throws IOException { + return Files.createTempFile("statusFile", ".tmp"); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareDownloadException.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareDownloadException.java new file mode 100755 index 0000000..f001b78 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareDownloadException.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.firmware.domain; + +public class FirmwareDownloadException extends RuntimeException { + public FirmwareDownloadException(String message, Throwable cause) { + super(message, cause); + } + + public FirmwareDownloadException(String message) { + super(message); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareFileNotFoundException.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareFileNotFoundException.java new file mode 100755 index 0000000..884e9a3 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareFileNotFoundException.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.firmware.domain; + +public class FirmwareFileNotFoundException extends RuntimeException { + + public FirmwareFileNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateStatus.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateStatus.java new file mode 100755 index 0000000..f17425e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateStatus.java @@ -0,0 +1,7 @@ +package io.gec.raw.connector.firmware.domain; + +public enum FirmwareUpdateStatus { + SUCCESS, + ERROR, + IN_PROGRESS +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateStatusResult.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateStatusResult.java new file mode 100755 index 0000000..54d36f7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateStatusResult.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.firmware.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class FirmwareUpdateStatusResult { + private FirmwareUpdateStatus status; + private String statusMessage; + + public FirmwareUpdateStatusResult(FirmwareUpdateStatus status) { + this.status = status; + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateVerificationException.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateVerificationException.java new file mode 100755 index 0000000..68109a7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateVerificationException.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.firmware.domain; + +public class FirmwareUpdateVerificationException extends RuntimeException { + public FirmwareUpdateVerificationException(String message, Throwable cause) { + super(message, cause); + } + + public FirmwareUpdateVerificationException(String message) { + super(message); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateVerificationTimeoutException.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateVerificationTimeoutException.java new file mode 100755 index 0000000..2bab251 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUpdateVerificationTimeoutException.java @@ -0,0 +1,7 @@ +package io.gec.raw.connector.firmware.domain; + +public class FirmwareUpdateVerificationTimeoutException extends RuntimeException { + public FirmwareUpdateVerificationTimeoutException(String message) { + super(message); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUploadException.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUploadException.java new file mode 100755 index 0000000..b9249a6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareUploadException.java @@ -0,0 +1,7 @@ +package io.gec.raw.connector.firmware.domain; + +public class FirmwareUploadException extends RuntimeException { + public FirmwareUploadException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareWorkItemResult.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareWorkItemResult.java new file mode 100755 index 0000000..786a981 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareWorkItemResult.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.firmware.domain; + +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemStatus; +import io.gec.raw.connector.job.domain.WorkItemResult; +import lombok.Getter; + +@Getter +public class FirmwareWorkItemResult extends WorkItemResult { + private final FirmwareWorkItemStatus status; + + public FirmwareWorkItemResult(FirmwareWorkItemStatus status, String message) { + super(message); + this.status = status; + } + + public FirmwareWorkItemResult(FirmwareWorkItemStatus status) { + this(status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareWorkItemStatusWrapper.java b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareWorkItemStatusWrapper.java new file mode 100755 index 0000000..cf17e1c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/FirmwareWorkItemStatusWrapper.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.firmware.domain; + +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemStatus; + +import java.util.UUID; + +public record FirmwareWorkItemStatusWrapper(UUID workItemId, FirmwareWorkItemStatus status, String message) { + public FirmwareWorkItemStatusWrapper(UUID workItemId, FirmwareWorkItemStatus status) { + this(workItemId, status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/domain/TooManyFirmwareFilesException.java b/src/main/java/io/gec/raw/connector/firmware/domain/TooManyFirmwareFilesException.java new file mode 100755 index 0000000..4066697 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/domain/TooManyFirmwareFilesException.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.firmware.domain; + +public class TooManyFirmwareFilesException extends RuntimeException { + + public TooManyFirmwareFilesException(String message) { + super(message); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareFileMetadataDTO.java b/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareFileMetadataDTO.java new file mode 100755 index 0000000..63642c5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareFileMetadataDTO.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.firmware.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class FirmwareFileMetadataDTO { + UUID documentId; + String fileName; + String sha1; +} diff --git a/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemDTO.java b/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemDTO.java new file mode 100755 index 0000000..b336a73 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemDTO.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.firmware.dto; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemDTO; +import io.gec.raw.connector.job.domain.WorkItem; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class FirmwareWorkItemDTO extends WorkItem { + private UUID id; + private UUID firmwareId; + private FirmwareWorkItemStatus status; + private ConnectionWorkItemDTO connectionWorkItem; +} diff --git a/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemStatus.java b/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemStatus.java new file mode 100755 index 0000000..0e747ce --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemStatus.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.firmware.dto; + +public enum FirmwareWorkItemStatus { + CREATED, + PREPARING_TO_DOWNLOAD, + DOWNLOADING, + DOWNLOAD_FAILED, + DOWNLOAD_FAILED_WRONG_CHECKSUM, + DOWNLOAD_CANCELED, + DOWNLOAD_FINISHED, + SENDING_TO_DEVICE, + SENDING_TO_DEVICE_FAILED, + SENDING_TO_DEVICE_FINISHED, + DEVICE_VERIFICATION_IN_PROGRESS, + DEVICE_VERIFICATION_REBOOTED, + DEVICE_VERIFICATION_FINISHED, + DEVICE_VERIFICATION_FAILED, + DEVICE_VERIFICATION_FAILED_WITH_TIMEOUT +} diff --git a/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemUpdateRequestDTO.java b/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemUpdateRequestDTO.java new file mode 100755 index 0000000..35084be --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/dto/FirmwareWorkItemUpdateRequestDTO.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.firmware.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class FirmwareWorkItemUpdateRequestDTO { + private FirmwareWorkItemStatus status; + private String message; +} diff --git a/src/main/java/io/gec/raw/connector/firmware/handler/AbstractFirmwareJobHandler.java b/src/main/java/io/gec/raw/connector/firmware/handler/AbstractFirmwareJobHandler.java new file mode 100755 index 0000000..9828609 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/handler/AbstractFirmwareJobHandler.java @@ -0,0 +1,48 @@ +package io.gec.raw.connector.firmware.handler; + +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemResult; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemStatusWrapper; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemUpdateRequestDTO; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.WorkItemHandler; + +import java.util.Optional; +import java.util.UUID; + +public abstract class AbstractFirmwareJobHandler extends WorkItemHandler { + + @Override + protected Optional getWorkItem(UUID workItemId) { + return communicationServiceController.fetchFirmwareWorkItem(workItemId); + } + + @Override + protected void finishProcessing(WorkItemWrapper workItemWrapper, FirmwareWorkItemResult workItemResult) { + var firmwareWorkItemStatus = new FirmwareWorkItemStatusWrapper( + workItemWrapper.workItemId(), + workItemResult.getStatus(), + workItemResult.getMessage()); + updateFirmwareWorkItemStatus(firmwareWorkItemStatus); + } + + @Override + public JobType getJobType() { + return JobType.FIRMWARE; + } + + @Override + public JobAction getJobAction() { + return JobAction.UPDATE; + } + + protected void updateFirmwareWorkItemStatus(FirmwareWorkItemStatusWrapper firmwareWorkItemStatus) { + var firmwareWorkItemUpdateRequestDTO = new FirmwareWorkItemUpdateRequestDTO(); + firmwareWorkItemUpdateRequestDTO.setStatus(firmwareWorkItemStatus.status()); + firmwareWorkItemUpdateRequestDTO.setMessage(firmwareWorkItemStatus.message()); + + communicationServiceController.updateFirmwareWorkItem(firmwareWorkItemStatus.workItemId(), firmwareWorkItemUpdateRequestDTO); + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareDownloadJobHandler.java b/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareDownloadJobHandler.java new file mode 100755 index 0000000..a6fe442 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareDownloadJobHandler.java @@ -0,0 +1,73 @@ +package io.gec.raw.connector.firmware.handler; + +import io.gec.raw.connector.firmware.control.FirmwareDownloadController; +import io.gec.raw.connector.firmware.domain.FirmwareDownloadException; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemResult; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemStatusWrapper; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemStatus; +import io.gec.raw.connector.job.domain.*; +import io.gec.raw.connector.job.dto.JobStatus; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.UUID; + +@ApplicationScoped +public class FirmwareDownloadJobHandler extends AbstractFirmwareJobHandler { + @Inject + FirmwareDownloadController firmwareDownloadController; + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + var firmwareWorkItemStatus = new FirmwareWorkItemStatusWrapper(workItemWrapper.workItemId(), FirmwareWorkItemStatus.PREPARING_TO_DOWNLOAD); + updateFirmwareWorkItemStatus(firmwareWorkItemStatus); + } + + @Override + protected FirmwareWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + ProcessingCancellationChecker processingCancellationChecker = workItemWrapper.processingCancellationChecker(); + if (processingCancellationChecker.isProcessingCanceled()) { + return getCanceledWorkItemResult(); + } + + UUID workItemId = workItemWrapper.workItemId(); + try { + UUID firmwareId = workItemWrapper.workItem().getFirmwareId(); + + firmwareDownloadController.downloadFirmwareFile(firmwareId, workItemId, processingCancellationChecker); + + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.DOWNLOAD_FINISHED); + } catch (FirmwareDownloadException e) { + logger.errorf(e, "Processing FirmwareWorkItem (ID:'%s') - FAILED", workItemId); + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.DOWNLOAD_FAILED, e.getMessage()); + } catch (ProcessingCanceledException e) { + logger.warnf("Processing FirmwareWorkItem (ID:'%s') - CANCELED", workItemId); + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.DOWNLOAD_CANCELED, e.getMessage()); + } + } + + @Override + protected JobResult mapToJobResult(FirmwareWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case DOWNLOAD_CANCELED -> JobStatus.CANCELED; + case DOWNLOAD_FAILED, DOWNLOAD_FAILED_WRONG_CHECKSUM -> JobStatus.FAILED; + case DOWNLOAD_FINISHED -> JobStatus.DONE; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + protected FirmwareWorkItemResult getCanceledWorkItemResult() { + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.DOWNLOAD_CANCELED); + } + + @Override + public JobHandlerGroup getJobHandlerGroup() { + return JobHandlerGroup.FIRMWARE_DOWNLOAD; + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareUpdateVerificationJobHandler.java b/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareUpdateVerificationJobHandler.java new file mode 100755 index 0000000..2d78a56 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareUpdateVerificationJobHandler.java @@ -0,0 +1,79 @@ +package io.gec.raw.connector.firmware.handler; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.componentmode.control.ComponentModeHandler; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.firmware.control.FirmwareUpdateVerificationController; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateVerificationException; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateVerificationTimeoutException; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemResult; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemStatusWrapper; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemStatus; +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class FirmwareUpdateVerificationJobHandler extends AbstractFirmwareJobHandler { + @Inject + FirmwareUpdateVerificationController firmwareUpdateVerificationController; + @Inject + ComponentModeHandler componentModeHandler; + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + var firmwareWorkItemStatus = new FirmwareWorkItemStatusWrapper(workItemWrapper.workItemId(), FirmwareWorkItemStatus.DEVICE_VERIFICATION_IN_PROGRESS); + updateFirmwareWorkItemStatus(firmwareWorkItemStatus); + } + + @Override + protected FirmwareWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + FirmwareWorkItemDTO workItem = workItemWrapper.workItem(); + UUID firmwareId = workItem.getFirmwareId(); + UUID commDeviceId = workItem.getConnectionWorkItem().getDeviceId(); + List connectionWorkItemValues = workItem.getConnectionWorkItem().getConnectionPropertyValues(); + + try { + firmwareUpdateVerificationController.verifyFirmwareUpdate(firmwareId, commDeviceId, connectionWorkItemValues); + + componentModeHandler.restoreComponentMode(commDeviceId); + + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FINISHED); + } catch (FirmwareUpdateVerificationException e) { + logger.errorf(e, "Processing FirmwareWorkItem (ID:'%s') - FAILED", workItemWrapper.workItemId()); + + componentModeHandler.restoreComponentMode(commDeviceId); + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FAILED, e.getMessage()); + } catch (FirmwareUpdateVerificationTimeoutException e) { + logger.errorf(e, "Processing FirmwareWorkItem (ID:'%s') - FAILED with timeout", workItemWrapper.workItemId()); + + componentModeHandler.changeComponentModeForDeviceTree(commDeviceId, ComponentMode.PAUSE); + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FAILED_WITH_TIMEOUT, e.getMessage()); + } + } + + @Override + protected JobResult mapToJobResult(FirmwareWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case DEVICE_VERIFICATION_FAILED, DEVICE_VERIFICATION_FAILED_WITH_TIMEOUT -> JobStatus.FAILED; + case DEVICE_VERIFICATION_FINISHED -> JobStatus.DONE; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + public JobHandlerGroup getJobHandlerGroup() { + return JobHandlerGroup.FIRMWARE_UPDATE_VERIFICATION; + } +} diff --git a/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareUploadJobHandler.java b/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareUploadJobHandler.java new file mode 100755 index 0000000..d1f3640 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/firmware/handler/FirmwareUploadJobHandler.java @@ -0,0 +1,72 @@ +package io.gec.raw.connector.firmware.handler; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.componentmode.control.ComponentModeHandler; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.firmware.control.FirmwareUploadController; +import io.gec.raw.connector.firmware.domain.FirmwareUploadException; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemResult; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemStatusWrapper; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemStatus; +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class FirmwareUploadJobHandler extends AbstractFirmwareJobHandler { + @Inject + FirmwareUploadController firmwareUploadController; + @Inject + ComponentModeHandler componentModeHandler; + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + var firmwareWorkItemStatus = new FirmwareWorkItemStatusWrapper(workItemWrapper.workItemId(), FirmwareWorkItemStatus.SENDING_TO_DEVICE); + updateFirmwareWorkItemStatus(firmwareWorkItemStatus); + } + + @Override + protected FirmwareWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + UUID firmwareId = workItemWrapper.workItem().getFirmwareId(); + UUID commDeviceId = workItemWrapper.workItem().getConnectionWorkItem().getDeviceId(); + List connectionWorkItemValues = workItemWrapper.workItem().getConnectionWorkItem().getConnectionPropertyValues(); + + try { + componentModeHandler.changeComponentMode(commDeviceId, ComponentMode.FIRMWARE_UPDATE); + + firmwareUploadController.uploadFirmwareFileToDevice(firmwareId, commDeviceId, connectionWorkItemValues); + + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.SENDING_TO_DEVICE_FINISHED); + } catch (FirmwareUploadException e) { + logger.errorf(e, "Processing FirmwareWorkItem (ID:'%s') - FAILED", workItemWrapper.workItemId()); + + componentModeHandler.restoreComponentMode(commDeviceId); + return new FirmwareWorkItemResult(FirmwareWorkItemStatus.SENDING_TO_DEVICE_FAILED, e.getMessage()); + } + } + + @Override + protected JobResult mapToJobResult(FirmwareWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case SENDING_TO_DEVICE_FAILED -> JobStatus.FAILED; + case SENDING_TO_DEVICE_FINISHED -> JobStatus.DONE; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + public JobHandlerGroup getJobHandlerGroup() { + return JobHandlerGroup.FIRMWARE_UPLOAD; + } +} diff --git a/src/main/java/io/gec/raw/connector/flyway/ConnectorFlywayMaintenanceCallback.java b/src/main/java/io/gec/raw/connector/flyway/ConnectorFlywayMaintenanceCallback.java new file mode 100755 index 0000000..bba2dab --- /dev/null +++ b/src/main/java/io/gec/raw/connector/flyway/ConnectorFlywayMaintenanceCallback.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.flyway; + +import java.util.Arrays; +import java.util.List; + +public class ConnectorFlywayMaintenanceCallback extends FlywayMaintenanceCallback { + @Override + protected List getCheckSumReplacements() { + return Arrays.asList( + new FlywayCheckSumReplacement(-1544347934, 2084881815, "0.000"), + new FlywayCheckSumReplacement(629725298, -1395617765, "1.0.0.0003") + ); + } +} diff --git a/src/main/java/io/gec/raw/connector/flyway/FlywayCheckSumReplacement.java b/src/main/java/io/gec/raw/connector/flyway/FlywayCheckSumReplacement.java new file mode 100755 index 0000000..89404e7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/flyway/FlywayCheckSumReplacement.java @@ -0,0 +1,4 @@ +package io.gec.raw.connector.flyway; + +public record FlywayCheckSumReplacement(int newChecksum, int oldChecksum, String scriptVersion) { +} diff --git a/src/main/java/io/gec/raw/connector/flyway/FlywayMaintenanceCallback.java b/src/main/java/io/gec/raw/connector/flyway/FlywayMaintenanceCallback.java new file mode 100755 index 0000000..f9e41a6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/flyway/FlywayMaintenanceCallback.java @@ -0,0 +1,159 @@ +package io.gec.raw.connector.flyway; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +import org.flywaydb.core.api.callback.BaseCallback; +import org.flywaydb.core.api.callback.Context; +import org.flywaydb.core.api.callback.Event; +import org.jboss.logging.Logger; + +/** + * FlywayMaintenanceCallback + *

+ * Compares the number of the latest on database executed flyway migration script with the baseline + * version of the starting application and breaks the application start, if the found version is too old. + *

+ * The configured baseline version (in application.properties) is decisive for the check + *

+ * quarkus.flyway.baseline-version=x.0 + *

+ * Supported are only database migrations from one major version to the next major version: x-1.y -> x.z + * If check is successful older migrations will be deleted from flyway_schema_history table: delete where version < x-1 + *

+ * + * Activate this class with following property in application.properties: + *

+ * quarkus.flyway.callbacks=io.gec.raw.connector.flyway.FlywayMaintenanceCallback + *

+ * CAUTION: + * Every new baseline version NEED the creation of a consolidating flyway database script that contains + * the whole database ddl script. + * + */ +public class FlywayMaintenanceCallback extends BaseCallback { + + private static final Logger LOG = Logger.getLogger(FlywayMaintenanceCallback.class); + static final String SELECT_MAX_VERSION = "SELECT MAX(CAST(substring(version, 0, position('.' in version) + coalesce(nullif(position('.' in substring(version, position('.' in version)+1)), 0), 100)) as double precision)) FROM %s.%s"; + static final String DELETE_OLD_MIGRATIONS = "DELETE FROM %s.%s WHERE CAST(substring(version, 0, position('.' in version) + coalesce(nullif(position('.' in substring(version, position('.' in version)+1)), 0), 100)) AS DOUBLE PRECISION) < %.1f"; + static final String FIX_CHECKSUM = "UPDATE %s.%s SET checksum=%d WHERE checksum=%d AND version='%s'"; + + @Override + public void handle(Event event, Context context) { + if (!event.equals(Event.BEFORE_VALIDATE)) { + return; + } + + double majorVersion = context.getConfiguration().getBaselineVersion().getMajor().doubleValue(); + double minMajorVersion = majorVersion - 1.0d; + + if (minMajorVersion >= 0.0d) { + String flywayHistoryTable = context.getConfiguration().getTable(); + String schema = context.getConfiguration().getSchemas()[0]; + + replaceChecksum(context, schema, flywayHistoryTable); + processOldMigrations(context, schema, flywayHistoryTable, majorVersion, minMajorVersion); + } + } + + private void replaceChecksum(Context context, String schema, String flywayHistoryTable) { + String sql = ""; + try { + for (FlywayCheckSumReplacement checkSumReplacement : getCheckSumReplacements()) { + sql = String.format( + Locale.US, + FIX_CHECKSUM, + schema, + flywayHistoryTable, + checkSumReplacement.newChecksum(), + checkSumReplacement.oldChecksum(), + checkSumReplacement.scriptVersion()); + + try (Statement stmt = context.getConnection().createStatement()) { + int updated = stmt.executeUpdate(sql); + + if (updated > 0) { + LOG.infof("Checksum of flyway script version %s fixed: %d replaced by %d", + checkSumReplacement.scriptVersion(), + checkSumReplacement.oldChecksum(), + checkSumReplacement.newChecksum()); + } + } + } + } catch (SQLException ex) { + LOG.errorf(ex, "Replacing checksum failed during execution of statement: '%s'", sql); + } + } + + private void processOldMigrations(Context context, + String schema, + String flywayHistoryTable, + double majorVersion, + double minMajorVersion) { + try { + validateRemovingOldMigrations(context, schema, flywayHistoryTable, majorVersion, minMajorVersion); + removeOldMigrations(context, schema, flywayHistoryTable, minMajorVersion); + } catch (SQLException ex) { + LOG.errorf(ex, "Processing old migrations failed"); + } + } + + private void validateRemovingOldMigrations(Context context, + String schema, + String flywayHistoryTable, + double majorVersion, + double minMajorVersion) throws SQLException { + String sql = String.format(SELECT_MAX_VERSION, schema, flywayHistoryTable); + + try (Statement stmt = context.getConnection().createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { + + if (!rs.next()) { + return; + } + double installedVersion = rs.getDouble(1); + boolean tooOldVersion = installedVersion > 0.0 && installedVersion < minMajorVersion; + + if (tooOldVersion) { + throw new IllegalStateException(String.format( + Locale.US, + "Current DB structure version is too old for direct migration to version %.1f (some migration scripts could be lost)." + + " Install all main versions between current version %.1f and version %.1f", + majorVersion, + installedVersion, + majorVersion)); + } + } catch (SQLException ex) { + LOG.errorf(ex, "Validation of old migrations failed during execution of statement: '%s'", sql); + throw ex; + } + } + + private void removeOldMigrations(Context context, + String schema, + String flywayHistoryTable, + double minMajorVersion) throws SQLException { + String sql = String.format(Locale.US, DELETE_OLD_MIGRATIONS, schema, flywayHistoryTable, minMajorVersion); + + try (Statement stmt = context.getConnection().createStatement()) { + int count = stmt.executeUpdate(sql); + LOG.infof("%d old migration scripts removed (which had main version below %.1f)", count, minMajorVersion); + } catch (SQLException ex) { + LOG.errorf("Removing old migrations failed during execution of statement: '%s'", sql); + throw ex; + } + } + + protected List getCheckSumReplacements() { + return Collections.emptyList(); + } + + @Override + public String getCallbackName() { + return "Flyway maintenance callback"; + } +} diff --git a/src/main/java/io/gec/raw/connector/ftp/boundary/FtpResource.java b/src/main/java/io/gec/raw/connector/ftp/boundary/FtpResource.java new file mode 100755 index 0000000..0a8bc6c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/boundary/FtpResource.java @@ -0,0 +1,27 @@ +package io.gec.raw.connector.ftp.boundary; + +import io.gec.raw.connector.access.configworkitem.dto.AccessDbDTO; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.control.FtpController; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +@RequestScoped +@Path("/ftp") +public class FtpResource { + + private final FtpController ftpController; + + @Inject + public FtpResource(FtpController ftpController) { + this.ftpController = ftpController; + } + + @GET + @Path("/testsftpaccessfile") + public AccessDbDTO testsftpaccessfile() throws SftpException { + return ftpController.getAccessFile("192.168.10.199", 22, "admin", "admin"); + } +} diff --git a/src/main/java/io/gec/raw/connector/ftp/control/FtpController.java b/src/main/java/io/gec/raw/connector/ftp/control/FtpController.java new file mode 100755 index 0000000..7e08c60 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/control/FtpController.java @@ -0,0 +1,261 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.access.configworkitem.control.AccessDbConfigParser; +import io.gec.raw.connector.access.configworkitem.domain.AccessPinConfig; +import io.gec.raw.connector.access.configworkitem.dto.AccessDbDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.access.logworkitem.control.AccessLogParser; +import io.gec.raw.connector.access.logworkitem.dto.AccessLogDTO; +import io.gec.raw.connector.ftp.domain.FileItem; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.domain.SftpData; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import net.schmizz.sshj.SSHClient; +import org.apache.commons.lang3.StringUtils; +import org.jboss.logging.Logger; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.OffsetDateTime; +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class FtpController { + private static final String UPLOAD_DIR = "./upload/"; + + private static final String ACCESS_CONFIG_FILE = UPLOAD_DIR + "access.cmc3"; + private static final String ACCESS_CONFIG_TEMP_FILE_PREFIX = "tempAccessFile"; + private static final String ACCESS_CONFIG_TEMP_FILE_SUFFIX = ".cmc3"; + + private static final String ACCESS_CONFIG_DB_FILE = UPLOAD_DIR + "Access.db"; + private static final String ACCESS_CONFIG_DB_TEMP_FILE_PREFIX = "tempAccessDbFile"; + private static final String ACCESS_CONFIG_DB_TEMP_FILE_SUFFIX = ".db"; + + private static final String EMERGENCY_PIN_FILE_PATTERN = UPLOAD_DIR + "emgy%s.cmc3"; + private static final String EMERGENCY_PIN_TEMP_FILE_PREFIX = "tempEmgy"; + private static final String EMERGENCY_PIN_TEMP_FILE_SUFFIX = ".cmc3"; + + private static final String ONE_TIME_PIN_FILE_PATTERN = UPLOAD_DIR + "code%s.cmc3"; + private static final String ONE_TIME_PIN_TEMP_FILE_PREFIX = "tempCode"; + private static final String ONE_TIME_PIN_TEMP_FILE_SUFFIX = ".cmc3"; + + private static final String LOGGING_FILE = "/download/Logging.cmc3"; + private static final String LOGGING_TEMP_FILE_PREFIX = "tempLogFile"; + private static final String LOGGING_TEMP_FILE_SUFFIX = ".txt"; + + private static final String SYSLOG_FILE = "./syslog.cmc"; + private static final String SYSLOG_TEMP_FILE_PREFIX = "tempSyslogFile"; + private static final String SYSLOG_TEMP_FILE_SUFFIX = ".txt"; + + private static final int MIN_PORT = 0; + private static final int MAX_PORT = 65534; + + @Inject + Logger logger; + @Inject + AccessDbConfigParser accessDbConfigParser; + @Inject + AccessLogParser accessLogParser; + @Inject + IPAddressHelper ipAddressHelper; + @Inject + SSHClientProvider sshClientProvider; + @Inject + SftpDataProvider sftpDataProvider; + @Inject + SftpDownloader sftpDownloader; + @Inject + SftpUploader sftpUploader; + + /** + * Loads access.db file via sFtp from Rittal CMC3-PU or PDU devices Parse them and returns an AccessDbDTO object + */ + public AccessDbDTO getAccessFile(String ip, int port, String username, String password) throws SftpException { + validateIpAndPort(ip, port); + + var sftpData = buildSftpData(ip, port, username, password); + + AccessDbDTO accessDb; + try { + Path tempFilePath = Files.createTempFile(ACCESS_CONFIG_DB_TEMP_FILE_PREFIX, ACCESS_CONFIG_DB_TEMP_FILE_SUFFIX); + sftpDownloader.downloadFileFromDevice(sftpData, ACCESS_CONFIG_DB_FILE, tempFilePath); + + accessDb = accessDbConfigParser.parseFileContent(tempFilePath); + logger.infof("Access file fetched from IP: %s, port: %s", ip, port); + + deleteTemporaryFile(tempFilePath); + } catch (Exception ex) { + logger.error("Error during getting access config file from device", ex); + throw new SftpException(ex.getMessage()); + } + return accessDb; + } + + public AccessLogDTO getLoggingFile(SftpData sftpData, + OffsetDateTime fromDateTime, + UUID rootDeviceId, + List deviceNumbers) throws IllegalArgumentException, IOException, SftpException { + validateIpAndPort(sftpData.getIpAddress(), sftpData.getPort()); + + Path tempFilePath = Files.createTempFile(LOGGING_TEMP_FILE_PREFIX, LOGGING_TEMP_FILE_SUFFIX); + sftpDownloader.downloadFileFromDevice(sftpData, LOGGING_FILE, tempFilePath); + + AccessLogDTO accessLog = accessLogParser.parseCmc3FileContent(tempFilePath, fromDateTime, rootDeviceId, deviceNumbers); + logger.infof("Access log fetched from IP: %s, port: %s", sftpData.getIpAddress(), sftpData.getPort()); + + deleteTemporaryFile(tempFilePath); + + return accessLog; + } + + /** + * Loads syslog.cmc file via sFtp from Rittal CMC3-PU or PDU devices Parse them and returns an AccessLogDTO object + */ + public AccessLogDTO getSyslogFile(String ip, + int port, + String username, + String password, + OffsetDateTime fromDateTime, + UUID rootDeviceId, + List deviceNumberList) throws SftpException { + validateSyslogFileParameter(ip, port, deviceNumberList); + + var sftpData = buildSftpData(ip, port, username, password); + + AccessLogDTO accessLog; + try { + Path tempFilePath = Files.createTempFile(SYSLOG_TEMP_FILE_PREFIX, SYSLOG_TEMP_FILE_SUFFIX); + sftpDownloader.downloadFileFromDevice(sftpData, SYSLOG_FILE, tempFilePath); + + accessLog = accessLogParser.parseCmcFileContent(tempFilePath, fromDateTime, rootDeviceId, deviceNumberList); + logger.infof("Syslog file fetched from IP: %s, port: %s", sftpData.getIpAddress(), sftpData.getPort()); + + deleteTemporaryFile(tempFilePath); + } catch (Exception ex) { + logger.error("Error during getting syslog file from device", ex); + throw new SftpException(ex.getMessage()); + } + return accessLog; + } + + private void validateSyslogFileParameter(String ip, int port, List deviceNumberList) { + validateIpAndPort(ip, port); + if (deviceNumberList == null || deviceNumberList.isEmpty()) { + throw new IllegalArgumentException("Device number list is null or empty"); + } + } + + public SftpData buildSftpData(String ip, int port, String username, String password) { + var sftpData = new SftpData(); + sftpData.setPort(port); + sftpData.setPassword(password); + sftpData.setUserName(username); + sftpData.setIpAddress(ip); + return sftpData; + } + + public boolean checkSftpConnection(List accessWorkItemValueDTOs, String deviceURL) throws SftpException { + SftpData sftpData = createSftpData(accessWorkItemValueDTOs, deviceURL); + + try (SSHClient sshClient = sshClientProvider.setupSsh(sftpData, false)) { + boolean result = sshClient.isConnected() && sshClient.isAuthenticated(); + logger.infof("SFTP connection successfully verified for IP: %s, port: %s", sftpData.getIpAddress(), sftpData.getPort()); + + return result; + } catch (IOException ex) { + throw new SftpException("Error occurred while checking SFTP connection: %s".formatted(ex.getMessage())); + } + } + + public SftpData createSftpData(List connectionWorkItemValueDTOS, String deviceURL) { + return sftpDataProvider.createSftpData(connectionWorkItemValueDTOS, deviceURL); + } + + private void validateIpAndPort(String ip, int port) { + if (StringUtils.isEmpty(ip)) { + throw new IllegalArgumentException("IP address is null or empty"); + } + if (port <= MIN_PORT || port > MAX_PORT) { + throw new IllegalArgumentException("Port %s is invalid. Port should be between %s-%s".formatted(port, MIN_PORT, MAX_PORT)); + } + try { + ipAddressHelper.validateIP(ip); + } catch (Exception ex) { + throw new IllegalArgumentException("IP address %s is invalid".formatted(ip)); + } + } + + public void putAccessConfigFile(SftpData sftpData, String fileContent) throws SftpException { + validateIpAndPort(sftpData.getIpAddress(), sftpData.getPort()); + + Path tempFilePath = storeTemporaryFile(fileContent, ACCESS_CONFIG_TEMP_FILE_PREFIX, ACCESS_CONFIG_TEMP_FILE_SUFFIX); + FileItem fileItem = new FileItem(tempFilePath.toString(), ACCESS_CONFIG_FILE); + + sftpUploader.uploadFile(sftpData, fileItem); + logger.infof("Access config file uploaded to IP: %s, Port: %s", sftpData.getIpAddress(), sftpData.getPort()); + + deleteTemporaryFile(tempFilePath); + } + + public void putEmergencyPinFile(SftpData sftpData, AccessPinConfig accessPinConfig) throws SftpException { + validateIpAndPort(sftpData.getIpAddress(), sftpData.getPort()); + + Path tempFilePath = storeTemporaryFile( + accessPinConfig.content(), + EMERGENCY_PIN_TEMP_FILE_PREFIX + accessPinConfig.pinIdentifier(), + EMERGENCY_PIN_TEMP_FILE_SUFFIX); + FileItem fileItem = new FileItem(tempFilePath.toString(), EMERGENCY_PIN_FILE_PATTERN.formatted(accessPinConfig.pinIdentifier())); + + sftpUploader.uploadFile(sftpData, fileItem); + logger.infof("Emergency PIN file uploaded to IP: %s, Port: %s", sftpData.getIpAddress(), sftpData.getPort()); + + deleteTemporaryFile(tempFilePath); + } + + public void putOneTimePinFile(SftpData sftpData, AccessPinConfig accessPinConfig) throws SftpException { + validateIpAndPort(sftpData.getIpAddress(), sftpData.getPort()); + + Path tempFilePath = storeTemporaryFile( + accessPinConfig.content(), + ONE_TIME_PIN_TEMP_FILE_PREFIX + accessPinConfig.pinIdentifier(), + ONE_TIME_PIN_TEMP_FILE_SUFFIX); + FileItem fileItem = new FileItem(tempFilePath.toString(), ONE_TIME_PIN_FILE_PATTERN.formatted(accessPinConfig.pinIdentifier())); + + sftpUploader.uploadFile(sftpData, fileItem); + logger.infof("OneTime access config file uploaded to IP: %s, Port: %s", sftpData.getIpAddress(), sftpData.getPort()); + + deleteTemporaryFile(tempFilePath); + } + + + private Path storeTemporaryFile(String fileContent, String prefix, String suffix) throws SftpException { + Path tempFilePath = createTemporaryFile(prefix, suffix); + try { + Files.writeString(tempFilePath, fileContent, StandardCharsets.UTF_8); + return tempFilePath; + } catch (Exception e) { + throw new SftpException("Error storing temporary file on file system: " + e.getMessage()); + } + } + + private Path createTemporaryFile(String prefix, String suffix) throws SftpException { + try { + return Files.createTempFile(prefix, suffix); + } catch (Exception e) { + throw new SftpException("Error creating temporary file on file system: " + e.getMessage()); + } + } + + private void deleteTemporaryFile(Path tempFilePath) { + try { + Files.delete(tempFilePath); + } catch (IOException e) { + logger.warnf(e, "Cannot delete temporary file: %s", tempFilePath); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/ftp/control/SSHClientProvider.java b/src/main/java/io/gec/raw/connector/ftp/control/SSHClientProvider.java new file mode 100755 index 0000000..f52d8a2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/control/SSHClientProvider.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.ftp.domain.SftpData; +import jakarta.enterprise.context.ApplicationScoped; +import net.schmizz.sshj.SSHClient; +import net.schmizz.sshj.transport.verification.PromiscuousVerifier; + +import java.io.IOException; + +@ApplicationScoped +public class SSHClientProvider { + + public SSHClient setupSsh(SftpData sftpData, boolean useCompression) throws IOException { + SSHClient client = new SSHClient(); + client.addHostKeyVerifier(new PromiscuousVerifier()); + client.connect(sftpData.getIpAddress(), sftpData.getPort()); + if (useCompression) { + client.useCompression(); + } + client.authPassword(sftpData.getUserName(), sftpData.getPassword()); + return client; + } +} diff --git a/src/main/java/io/gec/raw/connector/ftp/control/SftpDataProvider.java b/src/main/java/io/gec/raw/connector/ftp/control/SftpDataProvider.java new file mode 100755 index 0000000..3d2405b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/control/SftpDataProvider.java @@ -0,0 +1,51 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.ftp.domain.SftpData; +import io.gec.raw.connector.protocol.control.PropertyRepository; +import io.gec.raw.connector.protocol.domain.CommunicationPropertyNameEnum; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class SftpDataProvider { + @Inject + DeviceController deviceController; + @Inject + PropertyRepository propertyRepository; + @Inject + IPAddressHelper ipAddressHelper; + + public SftpData createSftpData(UUID commSvcDeviceId, List connectionWorkItemValues) { + Device rootDevice = deviceController.getDeviceByCommSvcId(commSvcDeviceId); + return createSftpData(connectionWorkItemValues, rootDevice.getDeviceURL()); + } + + @Transactional + public SftpData createSftpData(List connectionWorkItemValues, String deviceURL) { + if (deviceURL == null) { + throw new IllegalArgumentException("Device URL can not be null"); + } + SftpData sftpData = new SftpData(); + String ipAddress = ipAddressHelper.removeHttpFromIpAddress(deviceURL); + + sftpData.setIpAddress(ipAddress); + + for (ConnectionWorkItemValueDTO valueDTO : connectionWorkItemValues) { + var property = propertyRepository.findByCommSvcId(valueDTO.getProtocolPropertyId()); + switch (CommunicationPropertyNameEnum.fromString(property.getName())) { + case COMMUNICATION_USER_NAME -> sftpData.setUserName(valueDTO.getProtocolPropertyValue()); + case COMMUNICATION_PASSWORD -> sftpData.setPassword(valueDTO.getProtocolPropertyValue()); + case COMMUNICATION_PORT -> sftpData.setPort(Integer.parseInt(valueDTO.getProtocolPropertyValue())); + } + } + return sftpData; + } +} diff --git a/src/main/java/io/gec/raw/connector/ftp/control/SftpDirectoryCleaner.java b/src/main/java/io/gec/raw/connector/ftp/control/SftpDirectoryCleaner.java new file mode 100755 index 0000000..1e20b4e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/control/SftpDirectoryCleaner.java @@ -0,0 +1,33 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.exception.entity.SftpException; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import net.schmizz.sshj.sftp.RemoteResourceInfo; +import net.schmizz.sshj.sftp.SFTPClient; +import org.jboss.logging.Logger; + +import java.io.IOException; +import java.util.List; + +@ApplicationScoped +public class SftpDirectoryCleaner { + @Inject + Logger logger; + + public void removeFilesFromDirectory(SFTPClient sftpClient, String dirToClear) throws SftpException { + try { + List remoteResourceInfos = sftpClient.ls(dirToClear); + + for (RemoteResourceInfo resourceInfo : remoteResourceInfos) { + if (!resourceInfo.isDirectory()) { + sftpClient.rm(resourceInfo.getPath()); + logger.debugf("File removed: %s", resourceInfo.getPath()); + } + } + } catch (IOException ex) { + logger.warnf(ex, "Error while removing file(s) from directory: %s", dirToClear); + throw new SftpException("Error while removing file(s): " + ex.getMessage()); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/ftp/control/SftpDownloader.java b/src/main/java/io/gec/raw/connector/ftp/control/SftpDownloader.java new file mode 100755 index 0000000..e303155 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/control/SftpDownloader.java @@ -0,0 +1,35 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.domain.SftpData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import net.schmizz.sshj.SSHClient; +import net.schmizz.sshj.sftp.SFTPClient; + +import java.io.IOException; +import java.nio.file.Path; + +@ApplicationScoped +public class SftpDownloader { + @Inject + SSHClientProvider sshClientProvider; + + /** + * Downloads a file from an external device using SFTP. + * + * @param sftpData The data required to establish the SFTP connection, such as IP address, port, and credentials. + * @param sourceFilePathStr The path to the source file on the external device. This path is a string to ensure compatibility with the remote filesystem. + * @param destFile The path to the destination file on the local machine. This path is represented as a Path object since it corresponds to the local filesystem. + * @throws SftpException If an error occurs during the SFTP file download. + */ + public void downloadFileFromDevice(SftpData sftpData, String sourceFilePathStr, Path destFile) throws SftpException { + try (SSHClient sshClient = sshClientProvider.setupSsh(sftpData, false); + SFTPClient sftpClient = sshClient.newSFTPClient()) { + sftpClient.get(sourceFilePathStr, destFile.toString()); + } catch (IOException ex) { + throw new SftpException("Error downloading file via SFTP: " + ex.getMessage()); + } + } + +} diff --git a/src/main/java/io/gec/raw/connector/ftp/control/SftpUploader.java b/src/main/java/io/gec/raw/connector/ftp/control/SftpUploader.java new file mode 100755 index 0000000..69df7cf --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/control/SftpUploader.java @@ -0,0 +1,54 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.domain.FileItem; +import io.gec.raw.connector.ftp.domain.SftpData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import net.schmizz.sshj.SSHClient; +import net.schmizz.sshj.sftp.SFTPClient; +import org.jboss.logging.Logger; + +import java.io.IOException; +import java.util.List; + +@ApplicationScoped +public class SftpUploader { + @Inject + SSHClientProvider sshClientProvider; + @Inject + Logger logger; + + public void uploadFile(SftpData sftpData, FileItem fileItem) throws SftpException { + uploadFiles(sftpData, List.of(fileItem)); + } + + public void uploadFiles(SftpData sftpData, List fileItems) throws SftpException { + try (SSHClient sshClient = sshClientProvider.setupSsh(sftpData, false); + SFTPClient sftpClient = sshClient.newSFTPClient()) { + + uploadFiles(sftpClient, fileItems); + } catch (IOException ex) { + logger.warnf(ex, "Error while connecting to: `%s` via SFTP", sftpData.getIpAddress()); + throw new SftpException("Error while connecting via SFTP: " + ex.getMessage()); + } + } + + public void uploadFile(SFTPClient sftpClient, FileItem fileItem) throws SftpException { + uploadFiles(sftpClient, List.of(fileItem)); + } + + public void uploadFiles(SFTPClient sftpClient, List fileItems) throws SftpException { + try { + for (FileItem fileItem : fileItems) { + sftpClient.put(fileItem.sourceFilePath(), fileItem.destFilePath()); + } + } catch (IOException ex) { + List files = fileItems.stream() + .map(FileItem::destFilePath) + .toList(); + logger.warnf(ex,"Error while uploading file(s): '%s'", files); + throw new SftpException("Error while uploading file(s) via SFTP: " + ex.getMessage()); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/ftp/domain/FileItem.java b/src/main/java/io/gec/raw/connector/ftp/domain/FileItem.java new file mode 100755 index 0000000..51778d8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/domain/FileItem.java @@ -0,0 +1,4 @@ +package io.gec.raw.connector.ftp.domain; + +public record FileItem(String sourceFilePath, String destFilePath) { +} diff --git a/src/main/java/io/gec/raw/connector/ftp/domain/SftpData.java b/src/main/java/io/gec/raw/connector/ftp/domain/SftpData.java new file mode 100755 index 0000000..f67b045 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/ftp/domain/SftpData.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.ftp.domain; + +import lombok.Data; + +@Data +public class SftpData { + private int port; + private String userName; + private String password; + private String ipAddress; +} diff --git a/src/main/java/io/gec/raw/connector/health/boundary/CommSvcServiceHealthCheck.java b/src/main/java/io/gec/raw/connector/health/boundary/CommSvcServiceHealthCheck.java new file mode 100755 index 0000000..e57cf13 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/health/boundary/CommSvcServiceHealthCheck.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.health.boundary; + +import jakarta.enterprise.context.ApplicationScoped; + +import io.smallrye.health.checks.UrlHealthCheck; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.eclipse.microprofile.health.HealthCheck; +import org.eclipse.microprofile.health.Readiness; + +import jakarta.ws.rs.HttpMethod; + +@ApplicationScoped +public class CommSvcServiceHealthCheck { + + @ConfigProperty(name = "server.communicationService") + String communicationServiceUrl; + + @Readiness + HealthCheck communicationService() { + return new UrlHealthCheck(communicationServiceUrl) + .name("Communication-Service health check").requestMethod(HttpMethod.GET).statusCode(200); + } +} diff --git a/src/main/java/io/gec/raw/connector/health/boundary/DeviceSvcHealthCheck.java b/src/main/java/io/gec/raw/connector/health/boundary/DeviceSvcHealthCheck.java new file mode 100755 index 0000000..19a5faf --- /dev/null +++ b/src/main/java/io/gec/raw/connector/health/boundary/DeviceSvcHealthCheck.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.health.boundary; + +import jakarta.enterprise.context.ApplicationScoped; + +import io.smallrye.health.checks.UrlHealthCheck; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.eclipse.microprofile.health.HealthCheck; +import org.eclipse.microprofile.health.Readiness; + +import jakarta.ws.rs.HttpMethod; + +@ApplicationScoped +public class DeviceSvcHealthCheck { + + @ConfigProperty(name = "server.deviceService") + String deviceServiceUrl; + + @Readiness + HealthCheck deviceService() { + return new UrlHealthCheck(deviceServiceUrl) + .name("Device-Service health check").requestMethod(HttpMethod.GET).statusCode(200); + } +} diff --git a/src/main/java/io/gec/raw/connector/job/control/JobController.java b/src/main/java/io/gec/raw/connector/job/control/JobController.java new file mode 100755 index 0000000..babd5a6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/control/JobController.java @@ -0,0 +1,63 @@ +package io.gec.raw.connector.job.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.job.dto.JobDTO; +import io.gec.raw.connector.job.handler.JobHandler; +import io.gec.raw.connector.registration.control.RegistrationService; +import io.quarkus.arc.All; +import io.quarkus.scheduler.Scheduled; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.time.OffsetDateTime; +import java.util.Comparator; +import java.util.List; + +import static io.quarkus.scheduler.Scheduled.ConcurrentExecution.SKIP; + +@ApplicationScoped +public class JobController { + + @Inject + CommunicationServiceController communicationServiceController; + @Inject + JobsExecutor jobsExecutor; + @All + @Inject + List jobHandlers; + @Inject + Logger logger; + + private OffsetDateTime sinceDate = OffsetDateTime.parse("2024-01-01T00:00:00Z"); + + @Scheduled(every = "1s", concurrentExecution = SKIP, skipExecutionIf = RegistrationService.class) + public void getJobs() { + try { + List jobs = communicationServiceController.fetchJobs(sinceDate.toString()); + if (!jobs.isEmpty()) { + logger.infof("Jobs fetched (total: %d)", jobs.size()); + } + + for (JobDTO job : jobs) { + + List jobHandlersForJob = jobHandlers.stream() + .filter(handler -> handler.getJobType() == job.getType()) + .filter(handler -> handler.getJobAction() == job.getAction()) + .sorted(Comparator.comparingInt(handler -> handler.getJobHandlerGroup().getPriority())) + .toList(); + + if (jobHandlersForJob.isEmpty()) { + logger.warnf("Job handler not found for Job Type: '%s' - Job (ID: '%s') ignored", job.getType(), job.getId()); + continue; + } + + jobsExecutor.execute(jobHandlersForJob, job); + + sinceDate = job.getStamp(); + } + } catch (Exception e) { + logger.error("Fetch Jobs - FAILED", e); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/job/control/JobExecutorProvider.java b/src/main/java/io/gec/raw/connector/job/control/JobExecutorProvider.java new file mode 100755 index 0000000..5d97981 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/control/JobExecutorProvider.java @@ -0,0 +1,40 @@ +package io.gec.raw.connector.job.control; + +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@ApplicationScoped +public class JobExecutorProvider { + @ConfigProperty(name = "connector.job.firmware.uploader.pool-size") + int firmwareUploaderPoolSize; + @ConfigProperty(name = "connector.job.firmware.update-verifier.pool-size") + int firmwareUpdateVerifierPoolSize; + + private ExecutorService defaultExecutorService; + + private ExecutorService firmwareDownloaderExecutorService; + private ExecutorService firmwareUploaderExecutorService; + private ExecutorService firmwareUpdateVerifierExecutorService; + + @PostConstruct + public void init() { + defaultExecutorService = Executors.newSingleThreadExecutor(); + firmwareDownloaderExecutorService = Executors.newSingleThreadExecutor(); + firmwareUploaderExecutorService = Executors.newFixedThreadPool(firmwareUploaderPoolSize); + firmwareUpdateVerifierExecutorService = Executors.newFixedThreadPool(firmwareUpdateVerifierPoolSize); + } + + public ExecutorService getExecutor(JobHandlerGroup jobHandlerGroup) { + return switch (jobHandlerGroup) { + case FIRMWARE_DOWNLOAD -> firmwareDownloaderExecutorService; + case FIRMWARE_UPLOAD -> firmwareUploaderExecutorService; + case FIRMWARE_UPDATE_VERIFICATION -> firmwareUpdateVerifierExecutorService; + case DEFAULT -> defaultExecutorService; + }; + } +} diff --git a/src/main/java/io/gec/raw/connector/job/control/JobMapper.java b/src/main/java/io/gec/raw/connector/job/control/JobMapper.java new file mode 100755 index 0000000..2d37275 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/control/JobMapper.java @@ -0,0 +1,15 @@ +package io.gec.raw.connector.job.control; + +import io.gec.raw.connector.job.dto.JobDTO; +import io.gec.raw.connector.job.dto.JobStateDTO; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class JobMapper { + public JobStateDTO createJobStateDTO(JobDTO job) { + JobStateDTO jobState = new JobStateDTO(); + jobState.setUserId(job.getUserId()); + jobState.setStatus(job.getStatus()); + return jobState; + } +} diff --git a/src/main/java/io/gec/raw/connector/job/control/JobsExecutor.java b/src/main/java/io/gec/raw/connector/job/control/JobsExecutor.java new file mode 100755 index 0000000..ed0b23c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/control/JobsExecutor.java @@ -0,0 +1,78 @@ +package io.gec.raw.connector.job.control; + +import io.gec.raw.connector.job.domain.FinishJobAction; +import io.gec.raw.connector.job.domain.JobWrapper; +import io.gec.raw.connector.job.dto.JobDTO; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.JobHandler; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; + +@ApplicationScoped +public class JobsExecutor { + @Inject + JobExecutorProvider jobExecutorProvider; + @Inject + Logger logger; + + private final Map cancellableJobs = new ConcurrentHashMap<>(); + + public void execute(List jobHandlers, JobDTO job) { + if (job.getStatus() == JobStatus.CANCEL_REQUESTED) { + cancelJob(job); + return; + } + + final JobWrapper jobWrapper = new JobWrapper(job, getFinishJobAction(job), jobHandlers.size()); + + if (isJobCancellable(job)) { + cancellableJobs.put(job.getId(), jobWrapper); + logger.infof("Job (ID:'%s') added to cancelable jobs storage", job.getId()); + } + + executeJob(jobHandlers, jobWrapper); + } + + void executeJob(List jobHandlers, JobWrapper jobWrapper) { + CompletableFuture completableFuture = CompletableFuture.completedFuture(null); + + for (JobHandler jobHandler : jobHandlers) { + ExecutorService executorServiceForJob = jobExecutorProvider.getExecutor(jobHandler.getJobHandlerGroup()); + completableFuture = completableFuture.thenRunAsync(() -> jobHandler.handle(jobWrapper), executorServiceForJob); + } + } + + void cancelJob(JobDTO job) { + final JobWrapper jobWrapper = cancellableJobs.get(job.getId()); + if (jobWrapper != null) { + logger.infof("Job (ID:'%s') cancel requested", job.getId()); + jobWrapper.cancelJob(); + } else { + logger.infof("Cannot cancel Job (ID:'%s'), there is no such job in the queue. Cancel request will be skipped", job.getId()); + } + } + + boolean isJobCancellable(JobDTO job) { + JobType jobType = job.getType(); + return jobType == JobType.DISCOVERY || jobType == JobType.FIRMWARE; + } + + private FinishJobAction getFinishJobAction(JobDTO job) { + if (isJobCancellable(job)) { + return () -> { + cancellableJobs.remove(job.getId()); + logger.infof("Job (ID:'%s') removed from cancelable jobs storage", job.getId()); + }; + } + return () -> {}; + } +} diff --git a/src/main/java/io/gec/raw/connector/job/domain/FinishJobAction.java b/src/main/java/io/gec/raw/connector/job/domain/FinishJobAction.java new file mode 100755 index 0000000..ade9913 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/FinishJobAction.java @@ -0,0 +1,6 @@ +package io.gec.raw.connector.job.domain; + +@FunctionalInterface +public interface FinishJobAction { + void finishJob(); +} diff --git a/src/main/java/io/gec/raw/connector/job/domain/JobHandlerGroup.java b/src/main/java/io/gec/raw/connector/job/domain/JobHandlerGroup.java new file mode 100755 index 0000000..e71494c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/JobHandlerGroup.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.job.domain; + +import lombok.Getter; + +@Getter +public enum JobHandlerGroup { + DEFAULT(0), + FIRMWARE_DOWNLOAD(1), + FIRMWARE_UPLOAD(2), + FIRMWARE_UPDATE_VERIFICATION(3); + + private final int priority; + JobHandlerGroup(int priority) { + this.priority = priority; + } +} diff --git a/src/main/java/io/gec/raw/connector/job/domain/JobResult.java b/src/main/java/io/gec/raw/connector/job/domain/JobResult.java new file mode 100755 index 0000000..a82f28d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/JobResult.java @@ -0,0 +1,5 @@ +package io.gec.raw.connector.job.domain; + +import io.gec.raw.connector.job.dto.JobStatus; + +public record JobResult(JobStatus status, String message) {} diff --git a/src/main/java/io/gec/raw/connector/job/domain/JobWrapper.java b/src/main/java/io/gec/raw/connector/job/domain/JobWrapper.java new file mode 100755 index 0000000..ebd9044 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/JobWrapper.java @@ -0,0 +1,51 @@ +package io.gec.raw.connector.job.domain; + +import io.gec.raw.connector.job.dto.JobDTO; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +@RequiredArgsConstructor +public class JobWrapper { + @Getter + private final JobDTO job; + private final FinishJobAction finishJobAction; + private final int expectedJobHandlersCount; + @Getter + private boolean isCanceled; + @Getter + private boolean isProcessingStarted; + @Getter + private boolean isProcessingFinished; + private int currentJobHandlerIndex = 0; + @Setter + private WorkItem workItem; + + public void setProcessingStarted() { + isProcessingStarted = true; + } + + public void setProcessingFinished() { + isProcessingFinished = true; + } + + public void cancelJob() { + isCanceled = true; + } + + public void finishJob() { + finishJobAction.finishJob(); + } + + public void incrementJobHandlerIndex() { + currentJobHandlerIndex++; + } + + public boolean isProcessingByLastJobHandler() { + return currentJobHandlerIndex == expectedJobHandlersCount; + } + + public T getWorkItem() { + return (T) workItem; + } +} diff --git a/src/main/java/io/gec/raw/connector/job/domain/ProcessingCanceledException.java b/src/main/java/io/gec/raw/connector/job/domain/ProcessingCanceledException.java new file mode 100755 index 0000000..bb2b5d8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/ProcessingCanceledException.java @@ -0,0 +1,4 @@ +package io.gec.raw.connector.job.domain; + +public class ProcessingCanceledException extends Exception{ +} diff --git a/src/main/java/io/gec/raw/connector/job/domain/ProcessingCancellationChecker.java b/src/main/java/io/gec/raw/connector/job/domain/ProcessingCancellationChecker.java new file mode 100755 index 0000000..bea6bf7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/ProcessingCancellationChecker.java @@ -0,0 +1,6 @@ +package io.gec.raw.connector.job.domain; + +@FunctionalInterface +public interface ProcessingCancellationChecker { + boolean isProcessingCanceled(); +} diff --git a/src/main/java/io/gec/raw/connector/job/domain/WorkItem.java b/src/main/java/io/gec/raw/connector/job/domain/WorkItem.java new file mode 100755 index 0000000..c523e0d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/WorkItem.java @@ -0,0 +1,4 @@ +package io.gec.raw.connector.job.domain; + +public abstract class WorkItem { +} diff --git a/src/main/java/io/gec/raw/connector/job/domain/WorkItemResult.java b/src/main/java/io/gec/raw/connector/job/domain/WorkItemResult.java new file mode 100755 index 0000000..d832927 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/WorkItemResult.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.job.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public abstract class WorkItemResult { + private final String message; +} diff --git a/src/main/java/io/gec/raw/connector/job/domain/WorkItemWrapper.java b/src/main/java/io/gec/raw/connector/job/domain/WorkItemWrapper.java new file mode 100755 index 0000000..0f3706c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/domain/WorkItemWrapper.java @@ -0,0 +1,6 @@ +package io.gec.raw.connector.job.domain; + +import java.util.UUID; + +public record WorkItemWrapper(UUID workItemId, T workItem, ProcessingCancellationChecker processingCancellationChecker) { +} diff --git a/src/main/java/io/gec/raw/connector/job/dto/JobAction.java b/src/main/java/io/gec/raw/connector/job/dto/JobAction.java new file mode 100755 index 0000000..30fa9fc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/dto/JobAction.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.job.dto; + +public enum JobAction { + SUBSCRIBE, + UNSUBSCRIBE, + DELETE, + ARCHIVE, + ENABLE, + DISABLE, + SET, + GET, + UPDATE, + EXECUTE, + CREATE, + SYNCHRONIZE +} diff --git a/src/main/java/io/gec/raw/connector/job/dto/JobDTO.java b/src/main/java/io/gec/raw/connector/job/dto/JobDTO.java new file mode 100755 index 0000000..385a5eb --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/dto/JobDTO.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.job.dto; + +import lombok.Data; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Data +public class JobDTO { + private UUID id; + private OffsetDateTime created; + private OffsetDateTime stamp; + private UUID plantId; + private UUID userId; + private UUID connectorId; + private JobType type; + private JobAction action; + private UUID referenceId; + private JobStatus status; +} diff --git a/src/main/java/io/gec/raw/connector/job/dto/JobStateDTO.java b/src/main/java/io/gec/raw/connector/job/dto/JobStateDTO.java new file mode 100755 index 0000000..a35e3c3 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/dto/JobStateDTO.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.job.dto; + +import lombok.Data; +import lombok.ToString; + +import java.util.UUID; + +@Data +@ToString +public class JobStateDTO { + private UUID userId; + private JobStatus status; + private String message; +} diff --git a/src/main/java/io/gec/raw/connector/job/dto/JobStatus.java b/src/main/java/io/gec/raw/connector/job/dto/JobStatus.java new file mode 100755 index 0000000..82ae6a0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/dto/JobStatus.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.job.dto; + +public enum JobStatus { + NEW, + RUNNING, + DONE, + + FAILED, + CANCEL_REQUESTED, + CANCELED +} diff --git a/src/main/java/io/gec/raw/connector/job/dto/JobType.java b/src/main/java/io/gec/raw/connector/job/dto/JobType.java new file mode 100755 index 0000000..d3199b5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/dto/JobType.java @@ -0,0 +1,13 @@ +package io.gec.raw.connector.job.dto; + +public enum JobType { + ACCESS_CONFIG, + ACCESS_CONNECTION, + ACCESS_LOG, + DISCOVERY, + VARIABLE, + PROPERTY, + DRIVER, + PAUSE, + FIRMWARE +} diff --git a/src/main/java/io/gec/raw/connector/job/handler/JobHandler.java b/src/main/java/io/gec/raw/connector/job/handler/JobHandler.java new file mode 100755 index 0000000..7d116ae --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/handler/JobHandler.java @@ -0,0 +1,104 @@ +package io.gec.raw.connector.job.handler; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.job.control.JobMapper; +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.JobWrapper; +import io.gec.raw.connector.job.dto.*; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +public abstract class JobHandler { + + @Inject + protected CommunicationServiceController communicationServiceController; + @Inject + protected Logger logger; + @Inject + JobMapper jobMapper; + + public void handle(JobWrapper jobWrapper) { + JobDTO jobDTO = jobWrapper.getJob(); + + if (jobWrapper.isProcessingFinished()) { + logger.infof("Job (ID:'%s') has already been processed and will not be handled again by this handler", jobDTO.getId()); + return; + } + + startProcessing(jobWrapper); + + JobResult jobResult; + try { + jobResult = process(jobWrapper); + } catch (Exception e) { + //NOTE: throwing an exception here should never happen - all exceptions should be handled in specific Job/WorkItem handlers + //but this part of code is added as a protection against interrupting of jobs handling process/thread. + String message = String.format("Unexpected error occurred during processing job id: %s", jobWrapper.getJob().getId()); + logger.error(message, e); + + String jobResultMessage = String.format("%s, exception message: %s", message, e.getMessage()); + jobResult = new JobResult(JobStatus.FAILED, jobResultMessage); + } + + if (shouldJobBeFinished(jobWrapper, jobResult)) { + finishProcessing(jobWrapper, jobResult); + jobWrapper.finishJob(); + } + } + + protected void startProcessing(JobWrapper jobWrapper) { + jobWrapper.incrementJobHandlerIndex(); + JobDTO jobDTO = jobWrapper.getJob(); + + if (jobWrapper.isProcessingStarted()) { + logger.infof("Processing Job (ID:'%s') has already been started - status won't be set", jobDTO.getId()); + return; + } + + logger.infof("Start processing Job (ID:'%s') - set status to 'RUNNING'", jobDTO.getId()); + + jobWrapper.setProcessingStarted(); + + var jobStateDTO = jobMapper.createJobStateDTO(jobDTO); + jobStateDTO.setStatus(JobStatus.RUNNING); + + communicationServiceController.createJobState(jobDTO.getId(), jobStateDTO); + } + + protected void finishProcessing(JobWrapper jobWrapper, JobResult jobResult) { + JobDTO jobDTO = jobWrapper.getJob(); + + logger.infof("Finish processing Job (ID:'%s') with status: '%s' and message: '%s'", + jobDTO.getId(), + jobResult.status(), + jobResult.message()); + + jobWrapper.setProcessingFinished(); + + var jobStateDTO = jobMapper.createJobStateDTO(jobDTO); + jobStateDTO.setStatus(jobResult.status()); + jobStateDTO.setMessage(jobResult.message()); + + communicationServiceController.createJobState(jobDTO.getId(), jobStateDTO); + } + + public JobHandlerGroup getJobHandlerGroup() { + return JobHandlerGroup.DEFAULT; + } + + public abstract JobType getJobType(); + + public abstract JobAction getJobAction(); + + protected abstract JobResult process(JobWrapper jobWrapper); + + private boolean shouldJobBeFinished(JobWrapper jobWrapper, JobResult jobResult) { + if (jobWrapper.isProcessingByLastJobHandler()) { + return true; + } + + JobStatus jobStatus = jobResult.status(); + return jobStatus == JobStatus.FAILED || jobStatus == JobStatus.CANCELED; + } +} diff --git a/src/main/java/io/gec/raw/connector/job/handler/WorkItemHandler.java b/src/main/java/io/gec/raw/connector/job/handler/WorkItemHandler.java new file mode 100755 index 0000000..7254833 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/job/handler/WorkItemHandler.java @@ -0,0 +1,67 @@ +package io.gec.raw.connector.job.handler; + +import io.gec.raw.connector.job.domain.*; +import io.gec.raw.connector.job.dto.JobStatus; + +import java.util.Optional; +import java.util.UUID; + +public abstract class WorkItemHandler extends JobHandler { + + @Override + protected JobResult process(JobWrapper jobWrapper) { + Optional workItem = Optional.ofNullable(jobWrapper.getWorkItem()); + + UUID workItemId = jobWrapper.getJob().getReferenceId(); + if (workItem.isEmpty()) { + workItem = getWorkItem(workItemId); + } + + if (workItem.isEmpty()) { + var message = "Could not find WorkItem with id %s".formatted(workItemId); + logger.warn(message); + return new JobResult(JobStatus.FAILED, message); + } + + jobWrapper.setWorkItem(workItem.get()); + + WorkItemWrapper workItemWrapper = createWorkItemWrapper(workItemId, workItem.get(), jobWrapper); + return processInternal(workItemWrapper); + } + + protected JobResult processInternal(WorkItemWrapper workItemWrapper) { + + if (getCanceledWorkItemResult() != null && workItemWrapper.processingCancellationChecker().isProcessingCanceled()) { + R canceledWorkItemResult = getCanceledWorkItemResult(); + finishProcessing(workItemWrapper, canceledWorkItemResult); + + return mapToJobResult(canceledWorkItemResult); + } + + startProcessing(workItemWrapper); + + R workItemResult = processWorkItem(workItemWrapper); + + finishProcessing(workItemWrapper, workItemResult); + + return mapToJobResult(workItemResult); + } + + protected R getCanceledWorkItemResult() { + return null; + } + + protected WorkItemWrapper createWorkItemWrapper(UUID workItemId, T workItem, JobWrapper jobWrapper) { + return new WorkItemWrapper<>(workItemId, workItem, jobWrapper::isCanceled); + } + + protected abstract Optional getWorkItem(UUID workItemId); + + protected abstract void startProcessing(WorkItemWrapper workItemWrapper); + + protected abstract R processWorkItem(WorkItemWrapper workItemWrapper); + + protected abstract void finishProcessing(WorkItemWrapper workItemWrapper, R workItemResult); + + protected abstract JobResult mapToJobResult(R workItemResult); +} diff --git a/src/main/java/io/gec/raw/connector/mappers/control/EntityMapper.java b/src/main/java/io/gec/raw/connector/mappers/control/EntityMapper.java new file mode 100755 index 0000000..efdc4ce --- /dev/null +++ b/src/main/java/io/gec/raw/connector/mappers/control/EntityMapper.java @@ -0,0 +1,41 @@ +package io.gec.raw.connector.mappers.control; + +import io.gec.raw.connector.protocol.dto.PropertyDTO; +import io.gec.raw.connector.protocol.dto.PropertyValueDTO; +import io.gec.raw.connector.protocol.dto.ProtocolDTO; +import io.gec.raw.connector.protocol.entity.Property; +import io.gec.raw.connector.protocol.entity.PropertyValue; +import io.gec.raw.connector.protocol.entity.Protocol; +import org.mapstruct.AfterMapping; +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; + +@Mapper(componentModel = "cdi") +public interface EntityMapper { + + Protocol toProtocol(ProtocolDTO dto); + + Property toProperty(PropertyDTO propertyDTO); + + PropertyValue toPropertyValue(PropertyValueDTO propertyValueDTO); + + @AfterMapping + default void protocolPostprocessing(ProtocolDTO protocolDTO, @MappingTarget Protocol.Builder builder) { + builder.id(null); + builder.communicationServiceId(protocolDTO.getId()); + } + + @AfterMapping + default void propertyPostprocessing(PropertyDTO propertyDTO, @MappingTarget Property.Builder builder) { + builder.id(null); + builder.communicationServiceId(propertyDTO.getId()); + } + + @AfterMapping + default void propertyValuePostprocessing(PropertyValueDTO propertyValueDTO, @MappingTarget PropertyValue.Builder builder) { + builder.id(null); + builder.communicationServiceId(propertyValueDTO.getId()); + } +} + + diff --git a/src/main/java/io/gec/raw/connector/pauseworkitem/domain/PauseWorkItemResult.java b/src/main/java/io/gec/raw/connector/pauseworkitem/domain/PauseWorkItemResult.java new file mode 100755 index 0000000..30ea338 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/pauseworkitem/domain/PauseWorkItemResult.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.pauseworkitem.domain; + +import io.gec.raw.connector.job.domain.WorkItemResult; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemStatus; +import lombok.Getter; + +@Getter +public class PauseWorkItemResult extends WorkItemResult { + private final PauseWorkItemStatus status; + + public PauseWorkItemResult(PauseWorkItemStatus status, String message) { + super(message); + this.status = status; + } + + public PauseWorkItemResult(PauseWorkItemStatus status) { + this(status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemDTO.java b/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemDTO.java new file mode 100755 index 0000000..b5ef1bc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemDTO.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.pauseworkitem.dto; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.job.domain.WorkItem; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class PauseWorkItemDTO extends WorkItem { + private UUID id; + private UUID deviceId; + private UUID variableId; + private ComponentMode mode; +} diff --git a/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemStatus.java b/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemStatus.java new file mode 100755 index 0000000..4b29d81 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemStatus.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.pauseworkitem.dto; + +public enum PauseWorkItemStatus { + CREATED, + IN_PROGRESS, + DONE, + FAILED +} diff --git a/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemUpdateDTO.java b/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemUpdateDTO.java new file mode 100755 index 0000000..5c3a421 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/pauseworkitem/dto/PauseWorkItemUpdateDTO.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.pauseworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PauseWorkItemUpdateDTO { + private PauseWorkItemStatus status; +} diff --git a/src/main/java/io/gec/raw/connector/pauseworkitem/handler/PauseWorkItemJobHandler.java b/src/main/java/io/gec/raw/connector/pauseworkitem/handler/PauseWorkItemJobHandler.java new file mode 100755 index 0000000..2e327f4 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/pauseworkitem/handler/PauseWorkItemJobHandler.java @@ -0,0 +1,103 @@ +package io.gec.raw.connector.pauseworkitem.handler; + +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.WorkItemHandler; +import io.gec.raw.connector.pauseworkitem.domain.PauseWorkItemResult; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemDTO; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemStatus; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemUpdateDTO; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.device.control.DeviceController; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; +import jakarta.persistence.EntityNotFoundException; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class PauseWorkItemJobHandler extends WorkItemHandler { + @Inject + VariableController variableController; + @Inject + DeviceController deviceController; + + @Override + protected Optional getWorkItem(UUID workItemId) { + return communicationServiceController.fetchPauseWorkItem(workItemId); + } + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + updatePauseWorkItemStatus(workItemWrapper.workItemId(), PauseWorkItemStatus.IN_PROGRESS); + } + + @ActivateRequestContext + @Override + protected PauseWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + logger.infof("Processing PauseWorkItem (ID:'%s') ...", workItemWrapper.workItemId()); + try { + validatePauseWorkItem(workItemWrapper); + PauseWorkItemDTO pauseWorkItemDTO = workItemWrapper.workItem(); + + if (pauseWorkItemDTO.getVariableId() != null) { + variableController.updateModeByCommSvcId(pauseWorkItemDTO.getVariableId(), pauseWorkItemDTO.getMode()); + } else if (pauseWorkItemDTO.getDeviceId() != null) { + deviceController.updateModeByCommSvcId(pauseWorkItemDTO.getDeviceId(), pauseWorkItemDTO.getMode()); + } + return new PauseWorkItemResult(PauseWorkItemStatus.DONE); + } catch (EntityNotFoundException e) { + var message = "PauseWorkItem (ID:'%s') not found".formatted(workItemWrapper.workItemId()); + logger.error(message, e); + return new PauseWorkItemResult(PauseWorkItemStatus.FAILED, message); + } + } + + private void validatePauseWorkItem(WorkItemWrapper workItemWrapper) { + if (workItemWrapper.workItem() == null) { + throw new IllegalArgumentException("PauseWorkItemDTO is required but not provided for work item Id: %s".formatted(workItemWrapper.workItemId())); + } else if (workItemWrapper.workItem().getDeviceId() == null) { + throw new IllegalArgumentException("Device ID is required but not provided for work item Id: %s .".formatted(workItemWrapper.workItemId())); + } + } + + @Override + protected void finishProcessing(WorkItemWrapper workItemWrapper, PauseWorkItemResult workItemResult) { + updatePauseWorkItemStatus(workItemWrapper.workItemId(), workItemResult.getStatus()); + } + + @Override + protected JobResult mapToJobResult(PauseWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case DONE -> JobStatus.DONE; + case FAILED -> JobStatus.FAILED; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + @Override + public JobType getJobType() { + return JobType.PAUSE; + } + + @Override + public JobAction getJobAction() { + return JobAction.SET; + } + + private void updatePauseWorkItemStatus(UUID workItemId, PauseWorkItemStatus pauseWorkItemStatus) { + var pauseWorkItemUpdateDTO = new PauseWorkItemUpdateDTO(); + pauseWorkItemUpdateDTO.setStatus(pauseWorkItemStatus); + + communicationServiceController.updatePauseWorkItem(workItemId, pauseWorkItemUpdateDTO); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/control/PropertyRepository.java b/src/main/java/io/gec/raw/connector/protocol/control/PropertyRepository.java new file mode 100755 index 0000000..bccfdc5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/control/PropertyRepository.java @@ -0,0 +1,26 @@ +package io.gec.raw.connector.protocol.control; + +import io.gec.raw.connector.protocol.entity.Property; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class PropertyRepository implements PanacheRepositoryBase { + + public Property findByCommSvcId(UUID commPropertyId) { + return find("communicationServiceId", commPropertyId).firstResult(); + } + + public Optional findByName(String name) { + return find("name", name) + .firstResultOptional(); + } + + public Optional findByNameAndProtocolCommunicationServiceId(String name, UUID protocolCommunicationServiceId) { + return find("name = ?1 and protocol.communicationServiceId = ?2", name, protocolCommunicationServiceId) + .firstResultOptional(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/control/PropertyValueRepository.java b/src/main/java/io/gec/raw/connector/protocol/control/PropertyValueRepository.java new file mode 100755 index 0000000..2c1dd90 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/control/PropertyValueRepository.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.protocol.control; + +import io.gec.raw.connector.protocol.entity.PropertyValue; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class PropertyValueRepository implements PanacheRepositoryBase { + + public Optional findByName(String name) { + return find("name", name) + .firstResultOptional(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/control/ProtocolMapper.java b/src/main/java/io/gec/raw/connector/protocol/control/ProtocolMapper.java new file mode 100755 index 0000000..a538d45 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/control/ProtocolMapper.java @@ -0,0 +1,320 @@ +package io.gec.raw.connector.protocol.control; + +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.protocol.domain.*; +import io.gec.raw.connector.protocol.dto.PropertyDTO; +import io.gec.raw.connector.protocol.dto.PropertyValueDTO; +import io.gec.raw.connector.protocol.dto.ProtocolDTO; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; + +import static io.gec.raw.connector.connector.dto.DataTypeEnum.INTEGER; +import static io.gec.raw.connector.connector.dto.DataTypeEnum.STRING; +import static io.gec.raw.connector.connector.dto.RepresentationEnum.*; +import static io.gec.raw.connector.protocol.domain.CommunicationPropertyNameEnum.*; +import static io.gec.raw.connector.protocol.domain.DiscoveryPropertyNameEnum.*; + +@ApplicationScoped +public class ProtocolMapper { + + private static final String PORT_CONSTRAINT = "0-65535"; + private static final String READ_COMMUNITY_DESCRIPTION = "Community string for reading values"; + private static final String WRITE_COMMUNITY_DESCRIPTION = "Community string to write values"; + private static final String START_IP_ADDRESS_DESCRIPTION = "Start IP address of the endpoint device"; + private static final String END_IP_ADDRESS_DESCRIPTION = "End IP address of the endpoint device"; + private static final String DEFAULT_SECURITY_LEVEL = SecurityLevelEnum.NOAUTHNOPRIV.getName(); + private static final String DEFAULT_PORT = "161"; + private static final String DEFAULT_READ_COMMUNITY = "public"; + private static final String DEFAULT_WRITE_COMMUNITY = "private"; + //FOR COMMUNICATION PROTOCOL + private static final String COMMUNICATION_USER_NAME_DESCRIPTION = "Username for SFTP Connection"; + private static final String COMMUNICATION_PASSWORD_DESCRIPTION = "Password for SFTP Connection"; + private static final String IP_ADDRESS_DESCRIPTION = "IP address of the endpoint device"; + private static final String COMMUNICATION_PORT_DESCRIPTION = "Destination port of the SFTP endpoint"; + private static final String COMMUNICATION_DEFAULT_PORT = "22"; + + + private final SnmpConfig snmpConfig; + private final Map> PROTOCOL_MAP = Map.of( + SnmpVersionEnum.SNMP_V1, this::v1, + SnmpVersionEnum.SNMP_V2C, this::v2c, + SnmpVersionEnum.SNMP_V3, this::v3, + CommunicationProtocolEnum.SFTP, this::sftp + ); + + public ProtocolMapper(SnmpConfig snmpConfig) { + this.snmpConfig = snmpConfig; + } + + public List getProtocols(List protocolTypes) { + return protocolTypes.stream() + .map(this::toProtocolDTO) + .toList(); + } + + public ProtocolDTO toProtocolDTO(DescribableEnum protocolType) { + return Optional.ofNullable(PROTOCOL_MAP.get(protocolType)) + .orElseThrow(() -> new IllegalArgumentException("Unsupported protocol type: " + protocolType)) + .get(); + } + + private ProtocolDTO sftp() { + return ProtocolDTO.builder() + .name(CommunicationProtocolEnum.SFTP.getName()) + .description(CommunicationProtocolEnum.SFTP.getDescription()) + .properties(List.of( + PropertyDTO.builder() + .name(COMMUNICATION_USER_NAME.getName()) + .description(COMMUNICATION_USER_NAME_DESCRIPTION) + .datatype(STRING) + .representation(TEXT) + .order(1) + .build(), + PropertyDTO.builder() + .name(COMMUNICATION_PORT.getName()) + .description(COMMUNICATION_PORT_DESCRIPTION) + .datatype(INTEGER) + .constraints(PORT_CONSTRAINT) + .representation(NUMBER) + .order(3) + .defaultValue(COMMUNICATION_DEFAULT_PORT) + .build(), + PropertyDTO.builder() + .name(COMMUNICATION_PASSWORD.getName()) + .description(COMMUNICATION_PASSWORD_DESCRIPTION) + .datatype(STRING) + .representation(PASSWORD) + .order(2) + .build())) + .deprecated(isDeprecated(CommunicationProtocolEnum.SFTP)) + .reserved(true) + .build(); + } + + private ProtocolDTO v1() { + return ProtocolDTO.builder() + .name(SnmpVersionEnum.SNMP_V1.getName()) + .description(SnmpVersionEnum.SNMP_V1.getDescription()) + .properties(List.of( + PropertyDTO.builder() + .name(START_IP_ADDRESS.getName()) + .description(START_IP_ADDRESS_DESCRIPTION) + .datatype(STRING) + .representation(IPV4) + .order(1) + .build(), + PropertyDTO.builder() + .name(END_IP_ADDRESS.getName()) + .description(END_IP_ADDRESS_DESCRIPTION) + .datatype(STRING) + .representation(IPV4) + .order(2) + .build(), + PropertyDTO.builder() + .name(PORT.getName()) + .description("Destination port of the SNMPv1 endpoint") + .datatype(INTEGER) + .constraints(PORT_CONSTRAINT) + .representation(NUMBER) + .order(3) + .defaultValue(DEFAULT_PORT) + .build(), + PropertyDTO.builder() + .name(READ_COMMUNITY.getName()) + .description(READ_COMMUNITY_DESCRIPTION) + .datatype(STRING) + .representation(TEXT) + .order(4) + .defaultValue(DEFAULT_READ_COMMUNITY) + .build(), + PropertyDTO.builder() + .name(WRITE_COMMUNITY.getName()) + .description(WRITE_COMMUNITY_DESCRIPTION) + .datatype(STRING) + .representation(TEXT) + .order(5) + .defaultValue(DEFAULT_WRITE_COMMUNITY) + .build())) + .deprecated(isDeprecated(SnmpVersionEnum.SNMP_V1)) + .reserved(false) + .build(); + } + + private ProtocolDTO v2c() { + return ProtocolDTO.builder() + .name(SnmpVersionEnum.SNMP_V2C.getName()) + .description(SnmpVersionEnum.SNMP_V2C.getDescription()) + .properties(List.of( + PropertyDTO.builder() + .name(START_IP_ADDRESS.getName()) + .description(START_IP_ADDRESS_DESCRIPTION) + .datatype(STRING) + .representation(IPV4) + .order(1) + .build(), + PropertyDTO.builder() + .name(END_IP_ADDRESS.getName()) + .description(END_IP_ADDRESS_DESCRIPTION) + .datatype(STRING) + .representation(IPV4) + .order(2) + .build(), + PropertyDTO.builder() + .name(PORT.getName()) + .description("Destination port of the SNMPv2c endpoint device") + .datatype(INTEGER) + .constraints(PORT_CONSTRAINT) + .representation(NUMBER) + .order(3) + .defaultValue(DEFAULT_PORT) + .build(), + PropertyDTO.builder() + .name(READ_COMMUNITY.getName()) + .description(READ_COMMUNITY_DESCRIPTION) + .datatype(STRING) + .representation(TEXT) + .order(4) + .defaultValue(DEFAULT_READ_COMMUNITY) + .build(), + PropertyDTO.builder() + .name(WRITE_COMMUNITY.getName()) + .description(WRITE_COMMUNITY_DESCRIPTION) + .datatype(STRING) + .representation(TEXT) + .order(5) + .defaultValue(DEFAULT_WRITE_COMMUNITY) + .build())) + .deprecated(isDeprecated(SnmpVersionEnum.SNMP_V2C)) + .reserved(false) + .build(); + } + + private ProtocolDTO v3() { + return ProtocolDTO.builder() + .name(SnmpVersionEnum.SNMP_V3.getName()) + .description(SnmpVersionEnum.SNMP_V3.getDescription()) + .properties(List.of( + PropertyDTO.builder() + .name(START_IP_ADDRESS.getName()) + .description(START_IP_ADDRESS_DESCRIPTION) + .datatype(STRING) + .representation(IPV4) + .order(1) + .build(), + PropertyDTO.builder() + .name(END_IP_ADDRESS.getName()) + .description(END_IP_ADDRESS_DESCRIPTION) + .datatype(STRING) + .representation(IPV4) + .order(2) + .build(), + PropertyDTO.builder() + .name(PORT.getName()) + .description("Destination port of the SNMPv3 endpoint device") + .datatype(INTEGER) + .constraints(PORT_CONSTRAINT) + .representation(NUMBER) + .order(3) + .defaultValue(DEFAULT_PORT) + .build(), + PropertyDTO.builder() + .name(READ_COMMUNITY.getName()) + .description(READ_COMMUNITY_DESCRIPTION) + .datatype(STRING) + .representation(TEXT) + .order(4) + .defaultValue(DEFAULT_READ_COMMUNITY) + .build(), + PropertyDTO.builder() + .name(WRITE_COMMUNITY.getName()) + .description(WRITE_COMMUNITY_DESCRIPTION) + .datatype(STRING) + .representation(TEXT) + .defaultValue(DEFAULT_WRITE_COMMUNITY) + .order(5) + .build(), + PropertyDTO.builder() + .name(CONTEXT_NAME.getName()) + .description("Context") + .datatype(STRING) + .representation(TEXT) + .order(6) + .build(), + PropertyDTO.builder() + .name(SECURITY_LEVEL.getName()) + .description("Security level") + .datatype(STRING) + .representation(TEXT) + .order(7) + .propertyValues(toPropertyValueDTOs(List.of(SecurityLevelEnum.values()))) + .defaultValue(DEFAULT_SECURITY_LEVEL) + .build(), + PropertyDTO.builder() + .name(SECURITY_NAME.getName()) + .description("Security name, not longer than 32 characters.") + .datatype(STRING) + .representation(TEXT) + .order(8) + .build(), + PropertyDTO.builder() + .name(AUTHENTICATION_PROTOCOL.getName()) + .description("Authenticates outgoing and incoming messages") + .datatype(STRING) + .representation(TEXT) + .order(9) + .propertyValues(toPropertyValueDTOs(List.of(AuthenticationProtocolEnum.values()))) + .build(), + PropertyDTO.builder() + .name(AUTHENTICATION_PASSPHRASE.getName()) + .description("The password to authenticate SNMPv3") + .datatype(STRING) + .representation(PASSWORD) + .order(10) + .build(), + PropertyDTO.builder() + .name(PRIVACY_ALGORITHM.getName()) + .description("Ensures data privacy through encryption") + .datatype(STRING) + .representation(TEXT) + .order(11) + .propertyValues(toPropertyValueDTOs(List.of(PrivacyAlgorithmEnum.values()))) + .build(), + PropertyDTO.builder() + .name(PRIVACY_PASSPHRASE.getName()) + .description("The password to encrypt SNMPv3 communication") + .datatype(STRING) + .representation(PASSWORD) + .order(12) + .build())) + .deprecated(isDeprecated(SnmpVersionEnum.SNMP_V3)) + .reserved(false) + .build(); + } + + private List toPropertyValueDTOs(List values) { + return values.stream() + .map(this::toPropertyValueDTO) + .toList(); + } + + private PropertyValueDTO toPropertyValueDTO(DescribableEnum value) { + return PropertyValueDTO.builder() + .name(value.getName()) + .description(value.getDescription()) + .order(value.getPosition()) + .build(); + } + + private boolean isDeprecated(DescribableEnum communicationProtocols) { + Optional> optionalDeprecatedProtocols = snmpConfig.getDiscoveryDeprecatedProtocols(); + + return optionalDeprecatedProtocols.map(deprecatedProtocols -> deprecatedProtocols.stream() + .map(String::trim) + .anyMatch(deprecatedProtocol -> deprecatedProtocol.equals(communicationProtocols.getName()))) + .orElse(false); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/control/ProtocolRepository.java b/src/main/java/io/gec/raw/connector/protocol/control/ProtocolRepository.java new file mode 100755 index 0000000..1b530d5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/control/ProtocolRepository.java @@ -0,0 +1,26 @@ +package io.gec.raw.connector.protocol.control; + +import io.gec.raw.connector.protocol.entity.Protocol; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class ProtocolRepository implements PanacheRepositoryBase { + + public Optional findByCommunicationServiceId(UUID communicationServiceId) { + return find("communicationServiceId", communicationServiceId) + .firstResultOptional(); + } + + public Optional findByName(String name) { + return find("name", name).firstResultOptional(); + } + + public Optional findByNameOrCommunicationServiceId(String name, UUID communicationServiceId) { + return find("name = ?1 or communicationServiceId = ?2", name, communicationServiceId) + .firstResultOptional(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/control/ProtocolService.java b/src/main/java/io/gec/raw/connector/protocol/control/ProtocolService.java new file mode 100755 index 0000000..47a8957 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/control/ProtocolService.java @@ -0,0 +1,171 @@ +package io.gec.raw.connector.protocol.control; + +import io.gec.raw.connector.mappers.control.EntityMapper; +import io.gec.raw.connector.protocol.dto.PropertyDTO; +import io.gec.raw.connector.protocol.dto.PropertyValueDTO; +import io.gec.raw.connector.protocol.dto.ProtocolDTO; +import io.gec.raw.connector.protocol.entity.Property; +import io.gec.raw.connector.protocol.entity.PropertyValue; +import io.gec.raw.connector.protocol.entity.Protocol; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; +import jakarta.ws.rs.NotFoundException; +import org.jboss.logging.Logger; + +import java.util.*; +import java.util.function.Predicate; + +@ApplicationScoped +public class ProtocolService { + + private final EntityMapper entityMapper; + private final Logger logger; + private final ProtocolRepository protocolRepository; + private final PropertyRepository propertyRepository; + private final PropertyValueRepository propertyValueRepository; + + public ProtocolService(EntityMapper entityMapper, Logger logger, + ProtocolRepository protocolRepository, + PropertyRepository propertyRepository, + PropertyValueRepository propertyValueRepository) { + this.entityMapper = entityMapper; + this.logger = logger; + this.protocolRepository = protocolRepository; + this.propertyRepository = propertyRepository; + this.propertyValueRepository = propertyValueRepository; + } + + public Protocol findProtocolByName(String name) { + var protocol = protocolRepository.findByName(name); + if (protocol.isEmpty()) { + logger.errorf("Protocol with name %s does not Exist", name); + throw new NotFoundException(String.format("Protocol with name %s does not Exist", name)); + } + return protocol.get(); + } + + @Transactional + public void createOrUpdateProtocols(List protocolDTOs) { + for (ProtocolDTO sourceProtocolDTO : protocolDTOs) { + Optional optionalTargetProtocolEntity = protocolRepository.findByNameOrCommunicationServiceId(sourceProtocolDTO.getName(), sourceProtocolDTO.getId()); + + if (optionalTargetProtocolEntity.isPresent()) { + Protocol targetProtocolEntity = optionalTargetProtocolEntity.get(); + targetProtocolEntity.setCommunicationServiceId(sourceProtocolDTO.getId()); + targetProtocolEntity.setStamp(sourceProtocolDTO.getStamp()); + targetProtocolEntity.setCreated(sourceProtocolDTO.getCreated()); + targetProtocolEntity.setDeprecated(sourceProtocolDTO.isDeprecated()); + targetProtocolEntity.setReserved(sourceProtocolDTO.isReserved()); + protocolRepository.persist(targetProtocolEntity); + + updatePropertyEntities(targetProtocolEntity, sourceProtocolDTO); + } else { + persistNewProtocol(sourceProtocolDTO); + } + } + } + + void persistNewProtocol(ProtocolDTO sourceProtocolDTO) { + Protocol protocol = entityMapper.toProtocol(sourceProtocolDTO); + protocolRepository.persist(protocol); + } + + private void updatePropertyEntities(Protocol targetProtocolEntity, ProtocolDTO sourceProtocolDTO) { + Set targetPropertyEntities = targetProtocolEntity.getProperties(); + List sourcePropertyDTOs = sourceProtocolDTO.getProperties(); + + List appliedPropertyDTOs = updatePropertyEntities(targetPropertyEntities, sourcePropertyDTOs); + + persistNewPropertyEntities(sourcePropertyDTOs, appliedPropertyDTOs); + } + + private List updatePropertyEntities(Set targetPropertyEntities, List sorucePropertyDTOs) { + List appliedPropertyDTOs = new ArrayList<>(); + + for (Property targetPropertyEntity : targetPropertyEntities) { + Optional optionalSourcePropertyDTO = sorucePropertyDTOs.stream() + .filter(matches(targetPropertyEntity)) + .findFirst(); + + if (optionalSourcePropertyDTO.isPresent()) { + PropertyDTO sourcePropertyDTO = optionalSourcePropertyDTO.get(); + appliedPropertyDTOs.add(sourcePropertyDTO); + targetPropertyEntity.setCommunicationServiceId(sourcePropertyDTO.getId()); + targetPropertyEntity.setStamp(sourcePropertyDTO.getStamp()); + targetPropertyEntity.setCreated(sourcePropertyDTO.getCreated()); + propertyRepository.persist(targetPropertyEntity); + updatePropertyValueEntities(targetPropertyEntity, sourcePropertyDTO); + } + } + + return appliedPropertyDTOs; + } + + void persistNewPropertyEntities(List sourcePropertyDTOs, List appliedPropertyDTOs) { + List notAppliedPropertyDTOs = getNotAppliedPropertyDTOs(sourcePropertyDTOs, appliedPropertyDTOs); + List properties = notAppliedPropertyDTOs.stream() + .map(entityMapper::toProperty) + .toList(); + propertyRepository.persist(properties); + } + + private void updatePropertyValueEntities(Property targetPropertyEntity, PropertyDTO sourcePropertyDTO) { + Set targetPropertyValueEntities = targetPropertyEntity.getPropertyValues(); + List sourcePropertyValueDTOs = sourcePropertyDTO.getPropertyValues(); + + List appliedPropertyValueDTOs = updatePropertyValues(targetPropertyValueEntities, sourcePropertyValueDTOs); + + persistNewPropertyValues(sourcePropertyValueDTOs, appliedPropertyValueDTOs); + } + + private List updatePropertyValues(Set targetPropertyValueEntities, List sourcePropertyValueDTOs) { + List appliedPropertyValueDTOs = new ArrayList<>(); + + for (PropertyValue targetPropertyValueEntity : targetPropertyValueEntities) { + Optional optionalSourcePropertyValueDTO = sourcePropertyValueDTOs.stream() + .filter(matches(targetPropertyValueEntity)) + .findFirst(); + + if (optionalSourcePropertyValueDTO.isPresent()) { + PropertyValueDTO sourcePropertyValueDTO = optionalSourcePropertyValueDTO.get(); + appliedPropertyValueDTOs.add(sourcePropertyValueDTO); + targetPropertyValueEntity.setCommunicationServiceId(sourcePropertyValueDTO.getId()); + targetPropertyValueEntity.setStamp(sourcePropertyValueDTO.getStamp()); + targetPropertyValueEntity.setCreated(sourcePropertyValueDTO.getCreated()); + propertyValueRepository.persist(targetPropertyValueEntity); + } + } + + return appliedPropertyValueDTOs; + } + + void persistNewPropertyValues(List sourcePropertyValueDTOs, List appliedPropertyValueDTOs) { + List notAppliedPropertyValueDTOs = getNotAppliedPropertyValueDTOs(sourcePropertyValueDTOs, appliedPropertyValueDTOs); + List propertyValues = notAppliedPropertyValueDTOs.stream() + .map(entityMapper::toPropertyValue) + .toList(); + propertyValueRepository.persist(propertyValues); + } + + private Predicate matches(Property entity) { + return dto -> dto.getName().equals(entity.getName()) + || Objects.equals(dto.getId(), entity.getCommunicationServiceId()); + } + + private Predicate matches(PropertyValue entity) { + return dto -> dto.getName().equals(entity.getName()) + || Objects.equals(dto.getId(), entity.getCommunicationServiceId()); + } + + private List getNotAppliedPropertyDTOs(List allPropertyDTOs, List appliedPropertyDTOs) { + return allPropertyDTOs.stream() + .filter(dto -> !appliedPropertyDTOs.contains(dto)) + .toList(); + } + + private List getNotAppliedPropertyValueDTOs(List allPropertyValueDTOs, List appliedPropertyValueDTOs) { + return allPropertyValueDTOs.stream() + .filter(dto -> !appliedPropertyValueDTOs.contains(dto)) + .toList(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/domain/AuthenticationProtocolEnum.java b/src/main/java/io/gec/raw/connector/protocol/domain/AuthenticationProtocolEnum.java new file mode 100755 index 0000000..7394969 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/domain/AuthenticationProtocolEnum.java @@ -0,0 +1,33 @@ +package io.gec.raw.connector.protocol.domain; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +public enum AuthenticationProtocolEnum implements DescribableEnum { + + MD5("MD5", "Uses Message Digest 5 (MD5) as your authentication protocol", 1), + SHA("SHA", "Uses Secure Hash Algorithm (SHA) as your authentication protocol", 2), + SHA224("SHA224", "Uses Secure Hash Algorithm (SHA224) as your authentication protocol", 3), + SHA256("SHA256", "Uses Secure Hash Algorithm (SHA256) as your authentication protocol", 4), + SHA384("SHA384", "Uses Secure Hash Algorithm (SHA384) as your authentication protocol", 5), + SHA512("SHA512", "Uses Secure Hash Algorithm (SHA512) as your authentication protocol", 6); + + private final String name; + private final String description; + private final int position; + + AuthenticationProtocolEnum(String name, String description, int position) { + this.name = name; + this.description = description; + this.position = position; + } + + public static Optional findByName(String name) { + return Arrays.stream(AuthenticationProtocolEnum.values()) + .filter(value -> value.getName().equals(name)) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/domain/CommunicationPropertyNameEnum.java b/src/main/java/io/gec/raw/connector/protocol/domain/CommunicationPropertyNameEnum.java new file mode 100755 index 0000000..8e3a1e0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/domain/CommunicationPropertyNameEnum.java @@ -0,0 +1,25 @@ +package io.gec.raw.connector.protocol.domain; + +import lombok.Getter; + +import java.util.Arrays; + +@Getter +public enum CommunicationPropertyNameEnum { + + IP_ADDRESS("IP address"), + COMMUNICATION_PORT("Port"), + COMMUNICATION_USER_NAME("Username"), + COMMUNICATION_PASSWORD("Password"); + + private final String name; + + CommunicationPropertyNameEnum(String name) { + this.name = name; + } + + public static CommunicationPropertyNameEnum fromString(String name) { + return Arrays.stream(CommunicationPropertyNameEnum.values()).filter(e -> e.getName().equals(name)).findFirst() + .orElseThrow(() -> new IllegalArgumentException("Invalid name: " + name)); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/domain/CommunicationProtocolEnum.java b/src/main/java/io/gec/raw/connector/protocol/domain/CommunicationProtocolEnum.java new file mode 100755 index 0000000..60f3424 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/domain/CommunicationProtocolEnum.java @@ -0,0 +1,33 @@ +package io.gec.raw.connector.protocol.domain; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; +import lombok.ToString; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +@ToString +public enum CommunicationProtocolEnum implements DescribableEnum { + + SFTP("SFTP", "SFTP", 1); + + + @JsonValue + private final String name; + private final String description; + private final int position; + + CommunicationProtocolEnum(String name, String description, int position) { + this.name = name; + this.description = description; + this.position = position; + } + + public static Optional findByName(String snmpVersion) { + return Arrays.stream(CommunicationProtocolEnum.values()) + .filter(value -> value.getName().equals(snmpVersion)) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/domain/DescribableEnum.java b/src/main/java/io/gec/raw/connector/protocol/domain/DescribableEnum.java new file mode 100755 index 0000000..1a58057 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/domain/DescribableEnum.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.protocol.domain; + +public interface DescribableEnum { + + String getName(); + + String getDescription(); + + int getPosition(); +} diff --git a/src/main/java/io/gec/raw/connector/protocol/domain/DiscoveryPropertyNameEnum.java b/src/main/java/io/gec/raw/connector/protocol/domain/DiscoveryPropertyNameEnum.java new file mode 100755 index 0000000..5b28fab --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/domain/DiscoveryPropertyNameEnum.java @@ -0,0 +1,35 @@ +package io.gec.raw.connector.protocol.domain; + +import lombok.Getter; + +@Getter +public enum DiscoveryPropertyNameEnum { + + START_IP_ADDRESS("Start IP address"), + END_IP_ADDRESS("End IP address"), + READ_COMMUNITY("Read community"), + WRITE_COMMUNITY("Write community"), + PORT("Port"), + SECURITY_LEVEL("Security level"), + SECURITY_NAME("Security name"), + AUTHENTICATION_PROTOCOL("Authentication protocol"), + AUTHENTICATION_PASSPHRASE("Authentication passphrase"), + PRIVACY_ALGORITHM("Privacy algorithm"), + PRIVACY_PASSPHRASE("Privacy passphrase"), + CONTEXT_NAME("Context"); + + private final String name; + + DiscoveryPropertyNameEnum(String name) { + this.name = name; + } + + public static DiscoveryPropertyNameEnum fromName(String name) { + for (DiscoveryPropertyNameEnum value : DiscoveryPropertyNameEnum.values()) { + if (value.getName().equals(name)) { + return value; + } + } + return null; + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/domain/PrivacyAlgorithmEnum.java b/src/main/java/io/gec/raw/connector/protocol/domain/PrivacyAlgorithmEnum.java new file mode 100755 index 0000000..17e27b9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/domain/PrivacyAlgorithmEnum.java @@ -0,0 +1,32 @@ +package io.gec.raw.connector.protocol.domain; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +public enum PrivacyAlgorithmEnum implements DescribableEnum { + + DES("DES", "DES", 1), + AES128("AES128", "AES 128", 2), + AES192("AES192", "AES 192", 3), + AES256("AES256", "AES 256", 4), + DES3("3DES", "Triple DES (DESEDE)", 5); + + private final String name; + private final String description; + private final int position; + + PrivacyAlgorithmEnum(String name, String description, int position) { + this.name = name; + this.description = description; + this.position = position; + } + + public static Optional findByName(String name) { + return Arrays.stream(PrivacyAlgorithmEnum.values()) + .filter(value -> value.getName().equals(name)) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/domain/SecurityLevelEnum.java b/src/main/java/io/gec/raw/connector/protocol/domain/SecurityLevelEnum.java new file mode 100755 index 0000000..ce19251 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/domain/SecurityLevelEnum.java @@ -0,0 +1,30 @@ +package io.gec.raw.connector.protocol.domain; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +public enum SecurityLevelEnum implements DescribableEnum { + + NOAUTHNOPRIV("NOAUTHNOPRIV", "Communication without authentication and privacy", 1), + AUTHNOPRIV("AUTHNOPRIV", "Communication with authentication and without privacy", 2), + AUTHPRIV("AUTHPRIV", "Communication with authentication and privacy", 3); + + private final String name; + private final String description; + private final int position; + + SecurityLevelEnum(String name, String description, int position) { + this.name = name; + this.description = description; + this.position = position; + } + + public static Optional findByName(String name) { + return Arrays.stream(SecurityLevelEnum.values()) + .filter(value -> value.getName().equals(name)) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/domain/SnmpVersionEnum.java b/src/main/java/io/gec/raw/connector/protocol/domain/SnmpVersionEnum.java new file mode 100755 index 0000000..6437433 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/domain/SnmpVersionEnum.java @@ -0,0 +1,34 @@ +package io.gec.raw.connector.protocol.domain; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; +import lombok.ToString; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +@ToString +public enum SnmpVersionEnum implements DescribableEnum { + + SNMP_V1("SNMPv1", "SNMPv1", 1), + SNMP_V2C("SNMPv2c", "SNMPv2c", 2), + SNMP_V3("SNMPv3", "SNMPv3", 3); + + @JsonValue + private final String name; + private final String description; + private final int position; + + SnmpVersionEnum(String name, String description, int position) { + this.name = name; + this.description = description; + this.position = position; + } + + public static Optional findByName(String snmpVersion) { + return Arrays.stream(SnmpVersionEnum.values()) + .filter(value -> value.getName().equals(snmpVersion)) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/dto/PropertyDTO.java b/src/main/java/io/gec/raw/connector/protocol/dto/PropertyDTO.java new file mode 100755 index 0000000..f5f09a8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/dto/PropertyDTO.java @@ -0,0 +1,36 @@ + /* + * (c) 2023 German Edge Cloud GmbH & Co. KG + */ + package io.gec.raw.connector.protocol.dto; + + import io.gec.raw.connector.connector.dto.DataTypeEnum; + import io.gec.raw.connector.connector.dto.RepresentationEnum; + import lombok.Builder; + import lombok.ToString; + import lombok.Value; + + import java.time.OffsetDateTime; + import java.util.ArrayList; + import java.util.List; + import java.util.UUID; + + @Builder + @Value + @ToString + public class PropertyDTO { + + UUID id; + String name; + OffsetDateTime created; + OffsetDateTime stamp; + String description; + String defaultValue; + + String constraints; + Integer order; + DataTypeEnum datatype; + RepresentationEnum representation; + + @Builder.Default + List propertyValues = new ArrayList<>(); + } diff --git a/src/main/java/io/gec/raw/connector/protocol/dto/PropertyValueDTO.java b/src/main/java/io/gec/raw/connector/protocol/dto/PropertyValueDTO.java new file mode 100755 index 0000000..80a2ccd --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/dto/PropertyValueDTO.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.protocol.dto; + +import lombok.Builder; +import lombok.Value; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Builder +@Value +public class PropertyValueDTO { + + UUID id; + String name; + OffsetDateTime created; + OffsetDateTime stamp; + String description; + Integer order; +} diff --git a/src/main/java/io/gec/raw/connector/protocol/dto/ProtocolDTO.java b/src/main/java/io/gec/raw/connector/protocol/dto/ProtocolDTO.java new file mode 100755 index 0000000..62a7e62 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/dto/ProtocolDTO.java @@ -0,0 +1,25 @@ +package io.gec.raw.connector.protocol.dto; + +import lombok.Builder; +import lombok.Value; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.UUID; + +@Value +@Builder +public class ProtocolDTO { + + UUID id; + String name; + OffsetDateTime created; + OffsetDateTime stamp; + boolean deprecated; + String description; + boolean reserved; + + + @Builder.Default + List properties = List.of(); +} diff --git a/src/main/java/io/gec/raw/connector/protocol/entity/Property.java b/src/main/java/io/gec/raw/connector/protocol/entity/Property.java new file mode 100755 index 0000000..6ae1ca2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/entity/Property.java @@ -0,0 +1,131 @@ +package io.gec.raw.connector.protocol.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.OffsetDateTime; +import java.util.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "Property", schema = "connector_svc") +@Entity(name = "Property") +public class Property extends SimpleBaseEntity { + + @NotNull + private String name; + + @Column(name = "communication_service_id") + private UUID communicationServiceId; + + @ManyToOne(fetch = FetchType.LAZY) + private Protocol protocol; + + @OneToMany(mappedBy = "property", cascade = CascadeType.ALL, orphanRemoval = true) + private Set propertyValues = new HashSet<>(); + + public void addPropertyValue(PropertyValue propertyValue) { + this.propertyValues.add(propertyValue); + propertyValue.setProperty(this); + } + + public void removePropertyValue(PropertyValue propertyValue) { + this.propertyValues.remove(propertyValue); + propertyValue.setProperty(null); + } + + public void addPropertyValues(Collection propertyValues) { + propertyValues.forEach(this::addPropertyValue); + } + + public void removeAllPropertyValues() { + Iterator iterator = this.propertyValues.iterator(); + while (iterator.hasNext()) { + PropertyValue propertyValue = iterator.next(); + propertyValue.setProperty(null); + iterator.remove(); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof Property)) + return false; + return id != null && id.equals(((Property) o).getId()); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private UUID id; + private String name; + private OffsetDateTime created; + private OffsetDateTime stamp; + private UUID communicationServiceId; + private final Collection propertyValues = new ArrayList<>(); + + public Builder id(UUID id) { + this.id = id; + return this; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder created(OffsetDateTime created) { + this.created = created; + return this; + } + + public Builder stamp(OffsetDateTime stamp) { + this.stamp = stamp; + return this; + } + + public Builder communicationServiceId(UUID communicationServiceId) { + this.communicationServiceId = communicationServiceId; + return this; + } + + public Builder propertyValues(Collection propertyValues) { + this.propertyValues.addAll(propertyValues); + return this; + } + + public Builder propertyValue(PropertyValue propertyValue) { + this.propertyValues.add(propertyValue); + return this; + } + + public Property build() { + Property property = new Property(); + property.setId(id); + property.setName(name); + property.setCreated(created); + property.setStamp(stamp); + property.setCommunicationServiceId(communicationServiceId); + property.addPropertyValues(propertyValues); + return property; + } + } +} + + diff --git a/src/main/java/io/gec/raw/connector/protocol/entity/PropertyValue.java b/src/main/java/io/gec/raw/connector/protocol/entity/PropertyValue.java new file mode 100755 index 0000000..b64a6b5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/entity/PropertyValue.java @@ -0,0 +1,94 @@ +/* + * (c) 2023 German Edge Cloud GmbH & Co. KG + */ +package io.gec.raw.connector.protocol.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "property_value", schema = "connector_svc") +public class PropertyValue extends SimpleBaseEntity { + + @NotNull + private String name; + + @Column(name = "communication_service_id") + private UUID communicationServiceId; + + @ManyToOne(fetch = FetchType.LAZY) + private Property property; + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof PropertyValue)) + return false; + return id != null && id.equals(((PropertyValue) o).getId()); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private UUID id; + private String name; + private OffsetDateTime created; + private OffsetDateTime stamp; + private UUID communicationServiceId; + + public Builder id(UUID id) { + this.id = id; + return this; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder created(OffsetDateTime created) { + this.created = created; + return this; + } + + public Builder stamp(OffsetDateTime stamp) { + this.stamp = stamp; + return this; + } + + public Builder communicationServiceId(UUID communicationServiceId) { + this.communicationServiceId = communicationServiceId; + return this; + } + + public PropertyValue build() { + PropertyValue propertyValue = new PropertyValue(); + propertyValue.setId(id); + propertyValue.setName(name); + propertyValue.setCreated(created); + propertyValue.setStamp(stamp); + propertyValue.setCommunicationServiceId(communicationServiceId); + return propertyValue; + } + } +} diff --git a/src/main/java/io/gec/raw/connector/protocol/entity/Protocol.java b/src/main/java/io/gec/raw/connector/protocol/entity/Protocol.java new file mode 100755 index 0000000..84459a6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/protocol/entity/Protocol.java @@ -0,0 +1,136 @@ +package io.gec.raw.connector.protocol.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.OffsetDateTime; +import java.util.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "Protocol", schema = "connector_svc") +@Entity +public class Protocol extends SimpleBaseEntity { + + @NotNull + private String name; + + private boolean deprecated; + + @Column(name = "communication_service_id") + private UUID communicationServiceId; + + @OneToMany(mappedBy = "protocol", cascade = CascadeType.ALL, orphanRemoval = true) + Set properties = new HashSet<>(); + + @Column(name = "reserved", nullable = false) + private boolean reserved; + + public void addProperties(Collection properties) { + properties.forEach(this::addProperty); + } + + public void addProperty(Property property) { + this.properties.add(property); + property.setProtocol(this); + } + + public void removeProperty(Property property) { + this.properties.remove(property); + property.setProtocol(null); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof Protocol)) + return false; + return id != null && id.equals(((Protocol) o).getId()); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private UUID id; + private String name; + private OffsetDateTime created; + private OffsetDateTime stamp; + private boolean deprecated; + private UUID communicationServiceId; + private boolean reserved; + private final Collection properties = new ArrayList<>(); + + public Builder id(UUID id) { + this.id = id; + return this; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder created(OffsetDateTime created) { + this.created = created; + return this; + } + + public Builder stamp(OffsetDateTime stamp) { + this.stamp = stamp; + return this; + } + + public Builder deprecated(boolean deprecated) { + this.deprecated = deprecated; + return this; + } + + public Builder communicationServiceId(UUID communicationServiceId) { + this.communicationServiceId = communicationServiceId; + return this; + } + + public Builder property(Property property) { + this.properties.add(property); + return this; + } + + public Builder properties(Collection property) { + this.properties.addAll(property); + return this; + } + + public Builder reserved(boolean reserved) { + this.reserved = reserved; + return this; + } + + public Protocol build() { + Protocol protocol = new Protocol(); + protocol.setId(id); + protocol.setName(name); + protocol.setCreated(created); + protocol.setStamp(stamp); + protocol.setDeprecated(deprecated); + protocol.setCommunicationServiceId(communicationServiceId); + protocol.addProperties(this.properties); + protocol.setReserved(reserved); + return protocol; + } + } +} diff --git a/src/main/java/io/gec/raw/connector/registration/control/RegistrationService.java b/src/main/java/io/gec/raw/connector/registration/control/RegistrationService.java new file mode 100755 index 0000000..019ecf5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/registration/control/RegistrationService.java @@ -0,0 +1,43 @@ +package io.gec.raw.connector.registration.control; + +import io.gec.raw.connector.connector.control.ConnectorController; +import io.quarkus.scheduler.Scheduled; +import io.quarkus.scheduler.ScheduledExecution; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + + +import static io.quarkus.scheduler.Scheduled.ConcurrentExecution.SKIP; + +@ApplicationScoped +public class RegistrationService implements Scheduled.SkipPredicate { + @Inject + RegistrationState registrationState; + @Inject + ConnectorController connectorController; + @Inject + Logger logger; + + private static final long RETRY_INTERVAL_SECONDS = 30; + + @Scheduled(every = RETRY_INTERVAL_SECONDS + "s", delayed = "5s", concurrentExecution = SKIP, skipExecutionIf = RegistrationState.class) + public void registerConnectorWithRetry() { + connectorController.registerOnServer().ifPresentOrElse( + connectorResponseDTO -> { + registrationState.setRegistered(true); + logger.infof("Connector successfully registered: ID=%s, name=%s, IP=%s", + connectorResponseDTO.getId(), + connectorResponseDTO.getName(), + connectorResponseDTO.getIpAddress() + ); + }, + () -> logger.warnf("Failed to register connector. Retrying in %d seconds...", RETRY_INTERVAL_SECONDS) + ); + } + + @Override + public boolean test(ScheduledExecution execution) { + return !registrationState.isRegistered(); + } +} diff --git a/src/main/java/io/gec/raw/connector/registration/control/RegistrationState.java b/src/main/java/io/gec/raw/connector/registration/control/RegistrationState.java new file mode 100755 index 0000000..852a1d0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/registration/control/RegistrationState.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.registration.control; + +import io.quarkus.scheduler.Scheduled; +import io.quarkus.scheduler.ScheduledExecution; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class RegistrationState implements Scheduled.SkipPredicate { + private boolean isRegistered = false; + + public void setRegistered(boolean isRegistered) { + this.isRegistered = isRegistered; + } + + public boolean isRegistered() { + return isRegistered; + } + + @Override + public boolean test(ScheduledExecution execution) { + return isRegistered(); + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/domain/RittalMibVariable.java b/src/main/java/io/gec/raw/connector/rittal/domain/RittalMibVariable.java new file mode 100755 index 0000000..0b96d0c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/domain/RittalMibVariable.java @@ -0,0 +1,38 @@ +package io.gec.raw.connector.rittal.domain; + +import lombok.Getter; +import org.snmp4j.smi.OID; + +@Getter +public enum RittalMibVariable { + + SNMP_TRAP_OID("1.3.6.1.6.3.1.1.4.1.0"), + + RITTAL("1.3.6.1.4.1.2606"), + + CMC_III_DEV_NAME("1.3.6.1.4.1.2606.7.4.1.2.1.2"), + CMC_III_DEV_STATUS("1.3.6.1.4.1.2606.7.4.1.2.1.6"), + CMC_III_DEV_STATUS_TEXT("1.3.6.1.4.1.2606.7.4.1.2.1.19"), + + CMC_III_VAR_VALUE_STR("1.3.6.1.4.1.2606.7.4.2.2.1.10"), + CMC_III_VAR_VALUE_INT("1.3.6.1.4.1.2606.7.4.2.2.1.11"), + + CMC_III_DYN_UPDATE_RATE("1.3.6.1.4.1.2606.7.4.2.1.6.0"), + + CMC_III_VAR_INT_DYN_TABLE("1.3.6.1.4.1.2606.7.4.2.5"), + CMC_III_VAR_INT_DYN_VALUE("1.3.6.1.4.1.2606.7.4.2.5.1.4"), + + CMC_III_VAR_STR_DYN_TABLE("1.3.6.1.4.1.2606.7.4.2.6"), + CMC_III_VAR_STR_DYN_VALUE("1.3.6.1.4.1.2606.7.4.2.6.1.4"), + + CMC_III_MSG_TEXT("1.3.6.1.4.1.2606.7.4.3.2.1.3"), + CMC_III_MSG_STATUS("1.3.6.1.4.1.2606.7.4.3.2.1.4"), + CMC_III_MSG_VAR_IDX("1.3.6.1.4.1.2606.7.4.3.2.1.14"), + CMC_III_MSG_STATUS_TEXT("1.3.6.1.4.1.2606.7.4.3.2.1.16"); + + private final OID oid; + + RittalMibVariable(String oid) { + this.oid = new OID(oid); + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/IRittalEnum.java b/src/main/java/io/gec/raw/connector/rittal/enums/IRittalEnum.java new file mode 100755 index 0000000..8ada28c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/IRittalEnum.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.rittal.enums; + +public interface IRittalEnum { + + String getDescription(); + int getValue(); +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/PduSequenceMode.java b/src/main/java/io/gec/raw/connector/rittal/enums/PduSequenceMode.java new file mode 100755 index 0000000..e2e515b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/PduSequenceMode.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum PduSequenceMode implements IRittalEnum { + DISABLED(0, "-"), + OFF(1, "Off"), + ON(2, "On"), + ; + + private final int value; + private final String description; + + PduSequenceMode(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateBatteryStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateBatteryStatus.java new file mode 100755 index 0000000..695d6e0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateBatteryStatus.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum UPSControllerStateBatteryStatus implements IRittalEnum { + UNKNOWN(1, "Unknown"), + BATTERY_NORMAL(2, "BatteryNormal"), + BATTERY_LOW(3, "BatteryLow"), + BATTERY_DEPLETED(4, "BatteryDepleted"), + ; + + private final int value; + private final String description; + + UPSControllerStateBatteryStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateOutputSource.java b/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateOutputSource.java new file mode 100755 index 0000000..9eadafc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateOutputSource.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum UPSControllerStateOutputSource implements IRittalEnum { + OTHER(1, "Other"), + NONE(2, "None"), + NORMAL(3, "Ok"), + BYPASS(4, "Bypass"), + BATTERY(5, "Battery"), + ; + + private final int value; + private final String description; + + UPSControllerStateOutputSource(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateTestResult.java b/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateTestResult.java new file mode 100755 index 0000000..5c29936 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/UPSControllerStateTestResult.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum UPSControllerStateTestResult implements IRittalEnum { + DONE_PASS(1, "Done passed"), + DONE_WARNING(2, "Done warning"), + DONE_ERROR(3, "Done alarm"), + ABORTED(4, "Aborted"), + IN_PROGRESS(5, "In progress"), + NO_TESTS_INITIATED(6, "No test initiated."), + ; + + private final int value; + private final String description; + + UPSControllerStateTestResult(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesRfidTagCom.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesRfidTagCom.java new file mode 100755 index 0000000..29a547f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesRfidTagCom.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesRfidTagCom implements IRittalEnum { + NO_QUIT(1, "No quit"), + QUIT(2, "Quit"), + LED_OUT(3, "LED out"), + LED_ON(4, "LED on"), + ; + + private final int value; + private final String description; + + ValuesRfidTagCom(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpChillerModeState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpChillerModeState.java new file mode 100755 index 0000000..2adc073 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpChillerModeState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpChillerModeState implements IRittalEnum { + CHILLER(0, "Chiller"), + FREECOOLING(1, "Freecooling"), + ; + + private final int value; + private final String description; + + ValuesSnmpChillerModeState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpCommand.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpCommand.java new file mode 100755 index 0000000..b051d22 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpCommand.java @@ -0,0 +1,29 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpCommand implements IRittalEnum { + LOCK(0, "Lock"), + UNLOCK(1, "Unlock"), + DELAY(2, "Delay"), + NA(3, "Not available"), + NONE(4, "--"), + CONFIRM(5, "Confirm"), + OPEN(6, "Open"), + CLOSED(7, "Closed"), + SWITCH(8, "Switch"), + EJECT(9, "Eject"), + TRIGGER(10, "Trigger"), + ON(11, "On"), + OFF(12, "Off"), + ; + + private final int value; + private final String description; + + ValuesSnmpCommand(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpConfig.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpConfig.java new file mode 100755 index 0000000..ee1d236 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpConfig.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpConfig implements IRittalEnum { + DISABLED(0, "Disabled"), + DIN(1, "Digital Input"), + S0(2, "S0 Interface"), + WIEGAND56(3, "Wiegand 56"), + WIEGAND86(4, "Wiegand 86"), + ; + + private final int value; + private final String description; + + ValuesSnmpConfig(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpCtrlCommand.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpCtrlCommand.java new file mode 100755 index 0000000..fe38c77 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpCtrlCommand.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpCtrlCommand implements IRittalEnum { + AUTO(0, "Auto"), + MANUAL(1, "Manual"), + OFF(2, "Off"), + MIN(3, "Min"), + FULL(4, "Full"), + ; + + private final int value; + private final String description; + + ValuesSnmpCtrlCommand(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDcmMagnetMotorConnected.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDcmMagnetMotorConnected.java new file mode 100755 index 0000000..920537a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDcmMagnetMotorConnected.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpDcmMagnetMotorConnected implements IRittalEnum { + NO(0, "No"), + YES(1, "Yes"), + ; + + private final int value; + private final String description; + + ValuesSnmpDcmMagnetMotorConnected(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDevStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDevStatus.java new file mode 100755 index 0000000..e8295af --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDevStatus.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpDevStatus implements IRittalEnum { + NOT_AVAIL(1, "Device not available"), + OK(2, "OK"), + DETECT(3, "Device detected, confirmation required"), + LOST(4, "Device lost (disconnected), confirmation required"), + CHANGED(5, "Device changed"), + ERROR(6, "Error"), + FW_UPDATE(7, "Firmware update pending"), + FW_UPDATE_RUN(8, "Firmware update running"); + + private final int value; + private final String description; + + ValuesSnmpDevStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDeviceStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDeviceStatus.java new file mode 100755 index 0000000..32e709b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpDeviceStatus.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpDeviceStatus implements IRittalEnum { + FAILED(1, "Failed"), + OK(2, "Ok"), + NO_CONNECTED(3, "Not connected"), + NO_LINK(4, "No Link"); + + private final int value; + private final String description; + + ValuesSnmpDeviceStatus(int value, String description) { + this.value = value; + this.description = description; + } +} + + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpFuseType.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpFuseType.java new file mode 100755 index 0000000..58c8338 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpFuseType.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpFuseType implements IRittalEnum { + NA(0, "n/a"), + B13(1, "B13"), + C13(2, "C13"), + B16(3, "B16"), + C16(4, "C16"), + B20(5, "B20"), + C20(6, "C20"), + ; + + private final int value; + private final String description; + + ValuesSnmpFuseType(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpGsmStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpGsmStatus.java new file mode 100755 index 0000000..d22aed0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpGsmStatus.java @@ -0,0 +1,32 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpGsmStatus implements IRittalEnum { + NO_SMS_UNIT_FOUND(0, "no SMS unit found"), + GSM_UNIT_FOUND(1, "GSM unit found"), + GSM_UNIT_OK(2, "GSM unit o.k."), + ISDN_UNIT_FOUND(3, "ISDN unit found"), + ISDN_UNIT_OK(4, "ISDN unit o.k."), + SENDING_SMS(5, "sending SMS"), + RECEIVE_SMS(6, "receive SMS"), + SMS_UNIT_TIMEOUT(7, "SMS unit timeout"), + GSM_UNIT_PIN_MISSING(8, "GSM unit: PIN is missing"), + GSM_UNIT_SER_NUM_MISSING(9, "GSM unit: Service number missing"), + GSM_UNIT_WRONG_PIN(10, "GSM unit: wrong PIN"), + GSM_UNIT_PUK_NEEDED(11, "GSM unit: PUK needed"), + GSM_UNIT_NOT_REGISTERED(12, "GSM unit: not registered"), + MSN_MISSING(13, "MSN missing"), + ISDN_NO_LINE(14, "ISDN no Line"), + DISPLAY_UNIT_OK(15, "Display Unit o.K."), + ; + + private final int value; + private final String description; + + ValuesSnmpGsmStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpLogic.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpLogic.java new file mode 100755 index 0000000..73bc7d1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpLogic.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpLogic implements IRittalEnum { + OFFON(0, "0:Off / 1:On"), + ONOFF(1, "0:On / 1:Off"), + OKALARM(2, "0:Ok / 1:Alarm"), + ALARMOK(3, "0:Alarm / 1:Ok"), + ; + + private final int value; + private final String description; + + ValuesSnmpLogic(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMathControllerResult.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMathControllerResult.java new file mode 100755 index 0000000..692923c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMathControllerResult.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpMathControllerResult implements IRittalEnum { + AVERAGE(0, "Average"), + SUM(1, "Σ"), + ; + + private final int value; + private final String description; + + ValuesSnmpMathControllerResult(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMibCondition.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMibCondition.java new file mode 100755 index 0000000..272dae2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMibCondition.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpMibCondition implements IRittalEnum { + OTHER(1, "Other"), + OK(2, "Ok"), + DEGRADED(3, "Warning"), + FAILED(4, "Alarm"), + CONFIGURATION_CHANGED(5, "Configuration has changed"); + + private final int value; + private final String description; + + ValuesSnmpMibCondition(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMibECondition.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMibECondition.java new file mode 100755 index 0000000..94edb7e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMibECondition.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpMibECondition implements IRittalEnum { + OTHER(1, "Other"), + OK(2, "Ok"), + DEGRADED(3, "Warning"), + FAILED(4, "Alarm"); + + private final int value; + private final String description; + + ValuesSnmpMibECondition(int value, String description) { + this.value = value; + this.description = description; + } +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMountingPosition.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMountingPosition.java new file mode 100755 index 0000000..2a90127 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpMountingPosition.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpMountingPosition implements IRittalEnum { + NA(0, "Not available"), + VERTICAL_UP(1, "Vertical up"), + VERTICAL_DOWN(2, "Vertical down"), + HORIZONTAL(3, "Horizontal"), + HORIZONTAL180(4, "Horizontal 180"), + CIRCUIT1(5, "Circuit 1"), + CIRCUIT2(6, "Circuit 2"), + ; + + private final int value; + private final String description; + + ValuesSnmpMountingPosition(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpNumberOfPoles.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpNumberOfPoles.java new file mode 100755 index 0000000..933bfb3 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpNumberOfPoles.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpNumberOfPoles implements IRittalEnum { + _3WIRE_SYSTEM(1, "3 wire system"), + _4WIRE_SYSTEM(2, "4 wire system"), + _3WIRE_SYSTEM_TOP(3, "3 wire system / top"), + _4WIRE_SYSTEM_TOP(4, "4 wire system / top"), + ; + + private final int value; + private final String description; + + ValuesSnmpNumberOfPoles(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOutput.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOutput.java new file mode 100755 index 0000000..bb0d917 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOutput.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpOutput implements IRittalEnum { + OFF(0, "Off"), + ON(1, "On"), + OFF10(2, "Off 10s"), + OFF30(3, "Off 30s"), + OFF60(4, "Off 60s"), + ; + + private final int value; + private final String description; + + ValuesSnmpOutput(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOverallDevStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOverallDevStatus.java new file mode 100755 index 0000000..fe7aca1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOverallDevStatus.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpOverallDevStatus implements IRittalEnum { + OK(1, "Ok"), + WARNING(2, "Warning"), + ALARM(3, "Alarm"), + DETECTED(4, "Detected"), + LOST(5, "Lost"), + CHANGED(6, "Changed"), + UPDATE(7, "Update"); + + private final int value; + private final String description; + + ValuesSnmpOverallDevStatus(int value, String description) { + this.value = value; + this.description = description; + } +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOverallMsgStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOverallMsgStatus.java new file mode 100755 index 0000000..3513224 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpOverallMsgStatus.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpOverallMsgStatus implements IRittalEnum { + OK(1, "Ok"), + WARNING(2, "Warning"), + ALARM(3, "Alarm"); + + private final int value; + private final String description; + + ValuesSnmpOverallMsgStatus(int value, String description) { + this.value = value; + this.description = description; + } +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpQuit.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpQuit.java new file mode 100755 index 0000000..561edeb --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpQuit.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpQuit implements IRittalEnum { + NO_QUIT(1, "No quit"), + QUIT(2, "Quit"), + RESTART(99, "Restart"); + + private final int value; + private final String description; + + ValuesSnmpQuit(int value, String description) { + this.value = value; + this.description = description; + } +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpQuitUnit.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpQuitUnit.java new file mode 100755 index 0000000..bdfc300 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpQuitUnit.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpQuitUnit implements IRittalEnum { + NO_QUIT(1, "No quit"), + QUIT(2, "Quit"); + + private final int value; + private final String description; + + ValuesSnmpQuitUnit(int value, String description) { + this.value = value; + this.description = description; + } +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRackComand.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRackComand.java new file mode 100755 index 0000000..c6d0f07 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRackComand.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpRackComand implements IRittalEnum { + NO_QUIT(0, "No quit"), + QUIT(1, "Quit"), + LED_AUTO(2, "LEDs auto"), + LED_ON_OCCUPIED(3, "LEDs on occupied"), + LED_ON_FREE_R_U(4, "LEDs on free U"), + ; + + private final int value; + private final String description; + + ValuesSnmpRackComand(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRcmCommand.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRcmCommand.java new file mode 100755 index 0000000..0067f4e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRcmCommand.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpRcmCommand implements IRittalEnum { + NONE(0, "none"), + RCM_TEST(1, "RCM Test"), + RCM_Test_ALARM(2, "RCM Test Alarm"), + ; + + private final int value; + private final String description; + + ValuesSnmpRcmCommand(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRcmPosition.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRcmPosition.java new file mode 100755 index 0000000..8974af5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpRcmPosition.java @@ -0,0 +1,35 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpRcmPosition implements IRittalEnum { + TOTAL(0, "Total"), + Supply_TOTAL(1, "Supply (total)"), + Socket_Block_1(2, "Socket Block 1"), + Socket_Block_2(3, "Socket Block 2"), + Socket_Block_3(4, "Socket Block 3"), + Socket_Block_4(5, "Socket Block 4"), + Socket_Block_5(6, "Socket Block 5"), + Socket_Block_6(7, "Socket Block 6"), + Fuse_F1_TOTAL(8, "Fuse F1 (total)"), + Fuse_F2_TOTAL(9, "Fuse F2 (total)"), + Supply_L1(10, "Supply L1"), + Supply_L2(11, "Supply L2"), + Supply_L3(12, "Supply L3"), + Fuse_F1L1(13, "Fuse F1,L1"), + Fuse_F1L2(14, "Fuse F1,L2"), + Fuse_F1L3(15, "Fuse F1,L3"), + Fuse_F2L1(16, "Fuse F2,L1"), + Fuse_F2L2(17, "Fuse F2,L2"), + Fuse_F2L3(18, "Fuse F2,L3"), + ; + + private final int value; + private final String description; + + ValuesSnmpRcmPosition(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpResetAktivState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpResetAktivState.java new file mode 100755 index 0000000..b8a34f2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpResetAktivState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpResetAktivState implements IRittalEnum { + AKTIV(1, "Active"), + INAKTIV(0, "Inactive"), + ; + + private final int value; + private final String description; + + ValuesSnmpResetAktivState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpSocketType.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpSocketType.java new file mode 100755 index 0000000..a32a9f6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpSocketType.java @@ -0,0 +1,29 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpSocketType implements IRittalEnum { + NONE(0, "None"), + C13_1(1, "C13"), + C13_2(2, "C13"), + C13_3(3, "C13"), + C19_1(4, "C19"), + C19_2(5, "C19"), + C19_3(6, "C19"), + UK_1(7, "UK"), + UK_2(8, "UK"), + UK_3(9, "UK"), + CEE7_3_1(10, "CEE7/3"), + CEE7_3_2(11, "CEE7/3"), + CEE7_3_3(12, "CEE7/3"), + ; + + private final int value; + private final String description; + + ValuesSnmpSocketType(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTemperatureUnit.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTemperatureUnit.java new file mode 100755 index 0000000..24291b1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTemperatureUnit.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpTemperatureUnit implements IRittalEnum { + CELSIUS(1, "Celsius"), + FAHRENHEIT(2, "Fahrenheit"); + + private final int value; + private final String description; + + ValuesSnmpTemperatureUnit(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTrapEnable.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTrapEnable.java new file mode 100755 index 0000000..a57c7be --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTrapEnable.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpTrapEnable implements IRittalEnum { + DISABLED(1, "Disabled"), + ENABLED(2, "Enabled"); + + private final int value; + private final String description; + + ValuesSnmpTrapEnable(int value, String description) { + this.value = value; + this.description = description; + } +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTrapReceiverStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTrapReceiverStatus.java new file mode 100755 index 0000000..5476703 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpTrapReceiverStatus.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpTrapReceiverStatus implements IRittalEnum { + DISABLED(1, "Disabled"), + SNMPV1_TRAP(2, "SNMPv1 Trap"), + SNMPV2C_TRAP(3, "SNMPv2c Trap"), + SNMPV2C_INFORM(4, "SNMPv2c Inform"), + SNMPV3_TRAP(5, "SNMPv3 Trap"), + SNMPV3_INFORM(6, "SNMPv3 Inform"); + + private final int value; + private final String description; + + ValuesSnmpTrapReceiverStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksAktivAlarmState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksAktivAlarmState.java new file mode 100755 index 0000000..7f92b87 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksAktivAlarmState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksAktivAlarmState implements IRittalEnum { + ALARM(1, "Alarm"), + OK(0, "OK"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksAktivAlarmState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksAktivState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksAktivState.java new file mode 100755 index 0000000..ae3563f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksAktivState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksAktivState implements IRittalEnum { + AKTIV(1, "Active"), + INAKTIV(0, "Inactive"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksAktivState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksDisabledState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksDisabledState.java new file mode 100755 index 0000000..5192498 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksDisabledState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksDisabledState implements IRittalEnum { + ENABLED(1, "Enabled"), + DISABLED(0, "Disabled"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksDisabledState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksEmergencyState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksEmergencyState.java new file mode 100755 index 0000000..0053c6b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksEmergencyState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksEmergencyState implements IRittalEnum { + AKTIV(1, "EPS_Active"), + INAKTIV(0, "EPS_Inactive"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksEmergencyState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksEnabledState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksEnabledState.java new file mode 100755 index 0000000..ab5cb23 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksEnabledState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksEnabledState implements IRittalEnum { + ENABLED(1, "Enabled"), + DISABLED(0, "Disabled"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksEnabledState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksFailureState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksFailureState.java new file mode 100755 index 0000000..74e6595 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksFailureState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksFailureState implements IRittalEnum { + ALARM(1, "Alarm"), + OK(0, "OK"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksFailureState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksInaktivState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksInaktivState.java new file mode 100755 index 0000000..43c1e25 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksInaktivState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksInaktivState implements IRittalEnum { + AKTIVE(1, "Active"), + INAKTIVE(0, "Inactive"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksInaktivState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksMaintenanceState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksMaintenanceState.java new file mode 100755 index 0000000..7089484 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksMaintenanceState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksMaintenanceState implements IRittalEnum { + MAINTENANCE(1, "Maintenance"), + NOMAINTENANCE(0, "NoMaintenance"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksMaintenanceState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksOnOfState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksOnOfState.java new file mode 100755 index 0000000..72a5a12 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksOnOfState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksOnOfState implements IRittalEnum { + OFF(1, "Off"), + ON(0, "On"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksOnOfState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksResetAktivState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksResetAktivState.java new file mode 100755 index 0000000..a61299a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksResetAktivState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksResetAktivState implements IRittalEnum { + AKTIV(1, "Active"), + INAKTIV(0, "Inactive"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksResetAktivState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksStandbyState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksStandbyState.java new file mode 100755 index 0000000..0596682 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksStandbyState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksStandbyState implements IRittalEnum { + ON(1, "On"), + STANDBY(0, "Standby"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksStandbyState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksState.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksState.java new file mode 100755 index 0000000..914fc7a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUksState.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUksState implements IRittalEnum { + OK(1, "OK"), + ALARM(0, "Alarm"), + ; + + private final int value; + private final String description; + + ValuesSnmpUksState(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatus.java new file mode 100755 index 0000000..e1c60ce --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatus.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUnitStatus implements IRittalEnum { + OK(1, "Ok"), + CONFIGURATION_CHANGED(3, "Configuration has changed"), + QUIT(4, "Quit"), + TIMEOUT(5, "Timeout"), + UNIT_DETECTED(6, "Unit detected"), + UNIT_IS_NOT_AVAILABLE(7, "Unit is not available"), + SUPPLY_VOLTAGE_LOW(8, "Supply voltage low"); + + private final int value; + private final String description; + + + ValuesSnmpUnitStatus(int value, String description) { + this.value = value; + this.description = description; + } +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatusError.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatusError.java new file mode 100755 index 0000000..bbbdcac --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatusError.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUnitStatusError implements IRittalEnum { + OK(1, "Ok"), + ERROR(2, "Error"), + CONFIGURATION_CHANGED(3, "Configuration has changed"), + QUIT(4, "Quit"), + TIMEOUT(5, "Timeout"), + UNIT_DETECTED(6, "Unit detected"), + UNIT_IS_NOT_AVAILABLE(7, "Unit is not available"), + SUPPLY_VOLTAGE_LOW(8, "Supply voltage low"), + FIRMWARE_UPGRADE(9, "Firmware upgrade"); + + private final int value; + private final String description; + + ValuesSnmpUnitStatusError(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatusMPSM.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatusMPSM.java new file mode 100755 index 0000000..7e3f2da --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpUnitStatusMPSM.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpUnitStatusMPSM implements IRittalEnum { + OK(1, "Ok"), + ERROR(2, "Error"), + CONFIGURATION_CHANGED(3, "Configuration has changed"), + QUIT(4, "Quit"), + TIMEOUT(5, "Timeout"), + UNIT_DETECTED(6, "Unit detected"), + UNIT_IS_NOT_AVAILABLE(7, "Unit is not available"), + SUPPLY_VOLTAGE_LOW(8, "Supply voltage low"), + FIRMWARE_UPGRADE(9, "Firmware upgrade"); + + private final int value; + private final String description; + + ValuesSnmpUnitStatusMPSM(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpValuesStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpValuesStatus.java new file mode 100755 index 0000000..228587e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpValuesStatus.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpValuesStatus implements IRittalEnum { + TOO_HIGH(6, "Too high"), + OK(4, "Ok"), + TOO_LOW(5, "Too low"), + ERROR(7, "Error"), + ; + + private final int value; + private final String description; + + ValuesSnmpValuesStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandBep.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandBep.java new file mode 100755 index 0000000..9729a56 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandBep.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarCommandBep implements IRittalEnum { + INSIDE_TEMP(0, "Inside temp."), + EXTERNAL_SENSOR(1, "External sensor"), + OUTLET_TEMP(2, "Outlet temp."); + + private final int value; + private final String description; + + ValuesSnmpVarCommandBep(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandControl.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandControl.java new file mode 100755 index 0000000..97654ba --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandControl.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarCommandControl implements IRittalEnum { + NORMAL_OPERATION(0, "Normal operation"), + REGISTER(1, "Register"), + UNREGISTER(2, "Unregister"); + + private final int value; + private final String description; + + ValuesSnmpVarCommandControl(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandSignal.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandSignal.java new file mode 100755 index 0000000..381d0c2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCommandSignal.java @@ -0,0 +1,30 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarCommandSignal implements IRittalEnum { + OFF(0, "Off"), + WHITE(1, "White"), + BLUE(2, "Blue"), + GREEN(3, "Green"), + YELLOW(4, "Yellow"), + PINK(5, "Pink"), + RED(6, "Red"), + CUSTOM(7, "Custom"), + WHITE_FLASHING(8, "White flashing"), + BLUE_FLASHING(9, "Blue flashing"), + GREEN_FLASHING(10, "Green flashing"), + YELLOW_FLASHING(11, "Yellow flashing"), + PINK_FLASHING(12, "Pink flashing"), + RED_FLASHING(13, "Red flashing"), + CUSTOM_FLASHING(14, "Custom flashing"); + + private final int value; + private final String description; + + ValuesSnmpVarCommandSignal(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCtrlCommandDp.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCtrlCommandDp.java new file mode 100755 index 0000000..82bdacf --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCtrlCommandDp.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarCtrlCommandDp implements IRittalEnum { + OFF(0, "Off"), + EMERGENCY(1, "Emergency"), + ONLY_ALARM_MESSAGES(2, "Only alarm messages"); + + private final int value; + private final String description; + + ValuesSnmpVarCtrlCommandDp(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCtrlCommandWdt.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCtrlCommandWdt.java new file mode 100755 index 0000000..a955105 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarCtrlCommandWdt.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarCtrlCommandWdt implements IRittalEnum { + OFF(0, "Off"), + ON(1, "On"); + + private final int value; + private final String description; + + ValuesSnmpVarCtrlCommandWdt(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarFanAffect.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarFanAffect.java new file mode 100755 index 0000000..435c26c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarFanAffect.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarFanAffect implements IRittalEnum { + NONE(0, "None"), + DEWPOINT(1, "Dewpoint"), + LEAKAGE_DELAY_TIME(2, "Leakage Delay Time"), + INVALID_AIR_TEMPERATURES(3, "Invalid Air Temperatures"), + REMOTE(4, "Remote"), + REMOTE_TEMPERATURE(5, "Remote Temperatures"); + + private final int value; + private final String description; + + ValuesSnmpVarFanAffect(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarLedMode.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarLedMode.java new file mode 100755 index 0000000..d30ebf6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarLedMode.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarLedMode implements IRittalEnum { + OFF(0, "Off"), + ACCESS(1, "Access"), + ACCESS_N_BEEPER(2, "Access & Beeper"), + CMC(3, "CMC"), + CMC_N_BEEPER(4, "CMC & Beeper"), + TASK(5, "Task"), + TASK_N_BEEPER(6, "Task & Beeper"); + + private final int value; + private final String description; + + ValuesSnmpVarLedMode(int value, String description) { + this.value = value; + this.description = description; + } +} + diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarOpModeBep.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarOpModeBep.java new file mode 100755 index 0000000..15174c2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarOpModeBep.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarOpModeBep implements IRittalEnum { + NO_COOLING(0, "No cooling"), + HEAT_PIPE_ONLY(1, "Heat pipe only"), + COMPRESSOR_WITH_HEAT_PIPE(2, "Compressor with heat pipe"), + COMPRESSOR_WITHOUT_HEAT_PIPE(3, "Compressor without heat pipe"); + + private final int value; + private final String description; + + ValuesSnmpVarOpModeBep(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarStatus.java new file mode 100755 index 0000000..2f62c7f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarStatus.java @@ -0,0 +1,60 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +public enum ValuesSnmpVarStatus implements IRittalEnum { + NA(1, "Not available"), + CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + OK(4, "OK"), + ALARM(5, "Alarm"), + HIGHWARN(6, "High Warning"), + LOWALARM(7, "Low Alarm"), + HIGHALARM(8, "High Alarm"), + LOWWARN(9, "Low Warning"), + OFF(10, "Off"), + ON(11, "On"), + OPEN(12, "Open"), + CLOSED(13, "Closed"), + LOCKED(14, "Locked"), + UNLREMOTE(15, "Unlocked"), + DOOROPEN(16, "Open"), + SERVICE(17, "Service"), + STANDBY(18, "Standby"), + BUSY(19, "Busy"), + NOACCESS(20, "No Access"), + LOST(21, "Lost"), + DETECTED(22, "Detected"), + LOWVOLTAGE(23, "Low voltage"), + PROBEOPEN(24, "Cable broken"), + PROBESHORT(25, "Cable short"), + CALIBRATION(26, "Calibration"), + INACTIVE(27, "Inactive"), + ACTIVE(28, "Active"), + NOPOWER(29, "No Power"), + READONLY(30, "Read only"), + EXCHANGED(31, "Device has been exchanged"), + VALVEOPENINFO(32, "Valve open"), + WARNING(33, "Warning"), + REMOTECONTROL(34, "Remote control"), + ; + + private final int value; + private final String description; + + ValuesSnmpVarStatus(int value, String description) { + this.value = value; + this.description = description; + } + + + public static Optional from(int value) { + return Arrays.stream(ValuesSnmpVarStatus.values()) + .filter(status -> status.getValue() == value) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarStatusRfidTag.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarStatusRfidTag.java new file mode 100755 index 0000000..f044bca --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarStatusRfidTag.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarStatusRfidTag implements IRittalEnum { + NA(1, "Not available"), + CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + OK(4, "OK"), + ALARM(5, "Alarm"), + SERVICE(17, "Service"), + LOST(21, "Lost"), + DETECTED(22, "Detected"), + ; + + private final int value; + private final String description; + + ValuesSnmpVarStatusRfidTag(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarWtrAffect.java b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarWtrAffect.java new file mode 100755 index 0000000..3097e73 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/ValuesSnmpVarWtrAffect.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum ValuesSnmpVarWtrAffect implements IRittalEnum { + NONE(0, "None"), + DEWPOINT(1, "Dewpoint"), + LEAKAGE_DELAY_TIME(2, "Leakage Delay Time"), + INVALID_AIR_TEMPERATURES(3, "Invalid Air Temperatures"), + REMOTE(4, "Remote"), + REMOTE_TEMPERATURE(5, "Remote Temperatures"), + ; + + private final int value; + private final String description; + + ValuesSnmpVarWtrAffect(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarAlarmOk.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarAlarmOk.java new file mode 100755 index 0000000..490cba2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarAlarmOk.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarAlarmOk implements IRittalEnum { + OK(1, "Ok"), + ALARM(0, "Alarm"), + ; + + private final int value; + private final String description; + + VarAlarmOk(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarAvailableNotAvailable.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarAvailableNotAvailable.java new file mode 100755 index 0000000..bf07955 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarAvailableNotAvailable.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarAvailableNotAvailable implements IRittalEnum { + NOT_AVAILABLE(0, "Not available"), + AVAILABLE(1, "Available"), + ; + + private final int value; + private final String description; + + VarAvailableNotAvailable(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarBackDoorStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarBackDoorStatus.java new file mode 100755 index 0000000..35c2844 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarBackDoorStatus.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarBackDoorStatus implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarBackDoorStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarCompressor.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarCompressor.java new file mode 100755 index 0000000..bc60d0c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarCompressor.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarCompressor implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarCompressor(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarCompressorStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarCompressorStatus.java new file mode 100755 index 0000000..f704653 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarCompressorStatus.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarCompressorStatus implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarCompressorStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarFanStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarFanStatus.java new file mode 100755 index 0000000..dad6ea1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarFanStatus.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarFanStatus implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarFanStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarFansGroup.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarFansGroup.java new file mode 100755 index 0000000..3d7d08e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarFansGroup.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarFansGroup implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarFansGroup(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarFlowSwitchStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarFlowSwitchStatus.java new file mode 100755 index 0000000..acfc37c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarFlowSwitchStatus.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarFlowSwitchStatus implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarFlowSwitchStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarHighPresureCirciutStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarHighPresureCirciutStatus.java new file mode 100755 index 0000000..93912fb --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarHighPresureCirciutStatus.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarHighPresureCirciutStatus implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarHighPresureCirciutStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnit.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnit.java new file mode 100755 index 0000000..c8c622f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnit.java @@ -0,0 +1,39 @@ +package io.gec.raw.connector.rittal.enums; + +public enum VarMsgStatusAccessUnit implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + OK(4, "Ok"), + ALARM(5, "Alarm"), + WARNING(6, "Warning"), + TOO_LOW(7, "Too Low"), + TOO_HIGH(8, "Too High"), + OPEN(11, "Open"), + CLOSED(12, "Closed"), + LOCKED(13, "Locked"), + UNL_REMOTE(14, "Unl. Remote"), + UNL_READER_KEYPAD(15, "Unl. Reader/Keypad"), + UNL_S_N_M_P(16, "Unl. SNMP"), + UNL_W_E_B(17, "Unl. WEB"), + UNL_TIMER(18, "Unl. Timer"), + NO_ACCESS(19, "No Access"), + LOW_BATT(22, "Low Battery"), + ; + + private final int value; + private final String description; + + VarMsgStatusAccessUnit(int value, String description) { + this.value = value; + this.description = description; + } + + public int getValue() { + return value; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnitDoorLock.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnitDoorLock.java new file mode 100755 index 0000000..b3e8c34 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnitDoorLock.java @@ -0,0 +1,28 @@ +package io.gec.raw.connector.rittal.enums; + +public enum VarMsgStatusAccessUnitDoorLock implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + OK(4, "Ok"), + ALARM(5, "Alarm"), + OPEN(11, "Open"), + CLOSED(12, "Closed"), + LOCKED(13, "Locked"), + ; + + private final int value; + private final String description; + + VarMsgStatusAccessUnitDoorLock(int value, String description) { + this.value = value; + this.description = description; + } + + public int getValue() { + return value; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnitLastAccess.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnitLastAccess.java new file mode 100755 index 0000000..8923b79 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAccessUnitLastAccess.java @@ -0,0 +1,30 @@ +package io.gec.raw.connector.rittal.enums; + +public enum VarMsgStatusAccessUnitLastAccess implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + OK(4, "Ok"), + UNL_REMOTE(14, "Unl. Remote"), + UNL_READER_KEYPAD(15, "Unl. Reader/Keypad"), + UNL_S_N_M_P(16, "Unl. SNMP"), + UNL_W_E_B(17, "Unl. WEB"), + UNL_TIMER(18, "Unl. Timer"), + NO_ACCESS(19, "No Access"), + ; + + private final int value; + private final String description; + + VarMsgStatusAccessUnitLastAccess(int value, String description) { + this.value = value; + this.description = description; + } + + public int getValue() { + return value; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAnalogWL.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAnalogWL.java new file mode 100755 index 0000000..7911363 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarMsgStatusAnalogWL.java @@ -0,0 +1,33 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarMsgStatusAnalogWL implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + OK(4, "Ok"), + WARNING(6, "Warning"), + TOO_LOW(7, "Too Low"), + TOO_HIGH(8, "Too High"), + OPEN(11, "Open"), + CLOSED(12, "Closed"), + LOCKED(13, "Locked"), + UNL_REMOTE(14, "Unlocked remote"), + UNL_READER_KEYPAD(15, "Unlocked reader keypad"), + UNL_S_N_M_P(16, "Unlocked SNMP"), + UNL_W_E_B(17, "Unlocked WEB"), + UNL_TIMER(18, "Unlocked timer"), + NO_ACCESS(19, "No access"), + LOW_BATT(22, "Low Battery"), + ; + + private final int value; + private final String description; + + VarMsgStatusAnalogWL(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarOnOff.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarOnOff.java new file mode 100755 index 0000000..d74beee --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarOnOff.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarOnOff implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarOnOff(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarOutputStatusPSMOutputOnOff.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarOutputStatusPSMOutputOnOff.java new file mode 100755 index 0000000..f0321c6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarOutputStatusPSMOutputOnOff.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarOutputStatusPSMOutputOnOff implements IRittalEnum { + OFF(5, "off"), + ON(6, "on"), + ; + + private final int value; + private final String description; + + VarOutputStatusPSMOutputOnOff(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarOutputValueDigitalValueOnOff.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarOutputValueDigitalValueOnOff.java new file mode 100755 index 0000000..a8945c9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarOutputValueDigitalValueOnOff.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarOutputValueDigitalValueOnOff implements IRittalEnum { + OFF(0, "off"), + ON(1, "on"), + ; + + private final int value; + private final String description; + + VarOutputValueDigitalValueOnOff(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarPhaseRotationStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarPhaseRotationStatus.java new file mode 100755 index 0000000..99d94a5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarPhaseRotationStatus.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarPhaseRotationStatus implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarPhaseRotationStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorDoorOpening.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorDoorOpening.java new file mode 100755 index 0000000..29e256b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorDoorOpening.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusActuatorDoorOpening implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIG_CHANGED(2, "Configuration has changed"), + SET_OFF(9, "Off"), + SET_ON(10, "On"), + ; + + private final int value; + private final String description; + + VarStatusActuatorDoorOpening(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorOutputDigitalOnOff.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorOutputDigitalOnOff.java new file mode 100755 index 0000000..52bdb1b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorOutputDigitalOnOff.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusActuatorOutputDigitalOnOff implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIG_CHANGED(2, "Configuration has changed"), + SET_OFF(9, "Off"), + SET_ON(10, "On"), + ; + + private final int value; + private final String description; + + VarStatusActuatorOutputDigitalOnOff(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorType.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorType.java new file mode 100755 index 0000000..72a7edb --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorType.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusActuatorType implements IRittalEnum { + Actuator_VOLTAGE610(11, "Voltage monitor"), + Actuator_VOLTAGE611(23, "Voltage monitor"), + ; + + private final int value; + private final String description; + + VarStatusActuatorType(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorVoltageOutputSet.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorVoltageOutputSet.java new file mode 100755 index 0000000..9d2f2db --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorVoltageOutputSet.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusActuatorVoltageOutputSet implements IRittalEnum { + OFF(1, "Off"), + ON(2, "On"), + ; + + private final int value; + private final String description; + + VarStatusActuatorVoltageOutputSet(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorVoltageTimeout.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorVoltageTimeout.java new file mode 100755 index 0000000..1ab6bfa --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusActuatorVoltageTimeout.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusActuatorVoltageTimeout implements IRittalEnum { + STAY(1, "Stay"), + OFF(2, "Off"), + ON(3, "On"), + ; + + private final int value; + private final String description; + + VarStatusActuatorVoltageTimeout(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogController.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogController.java new file mode 100755 index 0000000..e285991 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogController.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusAnalogController implements IRittalEnum { + TOO_HIGH(8, "Too high"), + WARNING(6, "Warning"), + OK(4, "Ok"), + ALARM(5, "Alarm"), + TOO_LOW(7, "Too low"), + CHANGED(3, "Configuration has changed"), + LOST(2, "Sensor lost"), + NOT_AVAILABLE(1, "Not available"), + ; + + private final int value; + private final String description; + + VarStatusAnalogController(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensors.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensors.java new file mode 100755 index 0000000..3fbf71c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensors.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusAnalogSensors implements IRittalEnum { + OK(4, "Ok"), + ALARM(5, "Alarm"), + NOT_AVAILABLE(1, "Not available"), + ; + + private final int value; + private final String description; + + VarStatusAnalogSensors(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensorsWOtoLow.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensorsWOtoLow.java new file mode 100755 index 0000000..cb873ab --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensorsWOtoLow.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusAnalogSensorsWOtoLow implements IRittalEnum { + TOO_HIGH(8, "Too high"), + WARNING(6, "Warning"), + OK(4, "Ok"), + CHANGED(3, "Configuration has changed"), + LOST(2, "Sensor lost"), + NOT_AVAILABLE(1, "Not available"), + ; + + private final int value; + private final String description; + + VarStatusAnalogSensorsWOtoLow(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensorsWOwarning.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensorsWOwarning.java new file mode 100755 index 0000000..ad6d300 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogSensorsWOwarning.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusAnalogSensorsWOwarning implements IRittalEnum { + TOO_HIGH(8, "Too high"), + TOO_LOW(7, "Too low"), + OK(4, "Ok"), + CHANGED(3, "Configuration has changed"), + LOST(2, "Sensor lost"), + NOT_AVAILABLE(1, "Not available"), + ; + + private final int value; + private final String description; + + VarStatusAnalogSensorsWOwarning(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogValue.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogValue.java new file mode 100755 index 0000000..bd13ea0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusAnalogValue.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusAnalogValue implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + OK(4, "Ok"), + ALARM(5, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusAnalogValue(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusCUOutputDigitalOnOff.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusCUOutputDigitalOnOff.java new file mode 100755 index 0000000..7df6680 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusCUOutputDigitalOnOff.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusCUOutputDigitalOnOff implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIG_CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + SET_OFF(9, "Off"), + SET_ON(10, "On"), + ; + + private final int value; + private final String description; + + VarStatusCUOutputDigitalOnOff(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDRC.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDRC.java new file mode 100755 index 0000000..06033fe --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDRC.java @@ -0,0 +1,26 @@ +package io.gec.raw.connector.rittal.enums; + +public enum VarStatusDRC implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + OK(4, "Ok"), + ALARM(5, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusDRC(int value, String description) { + this.value = value; + this.description = description; + } + + public int getValue() { + return value; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensors.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensors.java new file mode 100755 index 0000000..cf637b8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensors.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusDigitalSensors implements IRittalEnum { + OK(1, "Ok"), + ERROR(2, "Error"), + configuration_CHANGED(3, "Configuration has changed"), + QUIT(4, "Quit"), + TIMEOUT(5, "Timeout"), + unit_DETECTED(6, "Unit detected"), + unit_is_not_AVAILABLE(7, "Unit is not available"), + supplyvoltagel_LOW(8, "Supplyvoltagel low"), + ; + + private final int value; + private final String description; + + VarStatusDigitalSensors(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensorsAlarm.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensorsAlarm.java new file mode 100755 index 0000000..2d7e039 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensorsAlarm.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusDigitalSensorsAlarm implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + OK(4, "Ok"), + ALARM(5, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusDigitalSensorsAlarm(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensorsDoor.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensorsDoor.java new file mode 100755 index 0000000..390905b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusDigitalSensorsDoor.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusDigitalSensorsDoor implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + OK(4, "Ok"), + ALARM(5, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusDigitalSensorsDoor(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusFASType.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusFASType.java new file mode 100755 index 0000000..eadbcc7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusFASType.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.rittal.enums; + +public enum VarStatusFASType implements IRittalEnum { + FAS(19, "Fan Alarm System FAS"), + ; + + private final int value; + private final String description; + + VarStatusFASType(int value, String description) { + this.value = value; + this.description = description; + } + + public int getValue() { + return value; + } + + public String getDescription() { + return description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorDeltaPressure.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorDeltaPressure.java new file mode 100755 index 0000000..d54b4f7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorDeltaPressure.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXCompressorDeltaPressure implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXCompressorDeltaPressure(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorDischargeMaxTemp.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorDischargeMaxTemp.java new file mode 100755 index 0000000..dad3936 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorDischargeMaxTemp.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXCompressorDischargeMaxTemp implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXCompressorDischargeMaxTemp(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorLubricationStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorLubricationStatus.java new file mode 100755 index 0000000..4a0889f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorLubricationStatus.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXCompressorLubricationStatus implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXCompressorLubricationStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorOperating.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorOperating.java new file mode 100755 index 0000000..2f30534 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorOperating.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXCompressorOperating implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXCompressorOperating(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorOverload.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorOverload.java new file mode 100755 index 0000000..64bd5d4 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorOverload.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXCompressorOverload implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXCompressorOverload(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorStartUpRetry.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorStartUpRetry.java new file mode 100755 index 0000000..3bb848b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorStartUpRetry.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXCompressorStartUpRetry implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXCompressorStartUpRetry(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorStartUpStatus.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorStartUpStatus.java new file mode 100755 index 0000000..1672163 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXCompressorStartUpStatus.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXCompressorStartUpStatus implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXCompressorStartUpStatus(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXHighPressureSwitch.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXHighPressureSwitch.java new file mode 100755 index 0000000..52c3fe1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXHighPressureSwitch.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXHighPressureSwitch implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXHighPressureSwitch(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorDischargePressureBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorDischargePressureBroken.java new file mode 100755 index 0000000..fad3346 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorDischargePressureBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeCompressorDischargePressureBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeCompressorDischargePressureBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorDischargeTempBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorDischargeTempBroken.java new file mode 100755 index 0000000..0533dd1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorDischargeTempBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeCompressorDischargeTempBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeCompressorDischargeTempBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorSuctionPressureBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorSuctionPressureBroken.java new file mode 100755 index 0000000..a68bb54 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorSuctionPressureBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeCompressorSuctionPressureBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeCompressorSuctionPressureBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorSuctionTempBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorSuctionTempBroken.java new file mode 100755 index 0000000..ff117ae --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeCompressorSuctionTempBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeCompressorSuctionTempBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeCompressorSuctionTempBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInBotBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInBotBroken.java new file mode 100755 index 0000000..21c57fc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInBotBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeTempInBotBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeTempInBotBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInMidBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInMidBroken.java new file mode 100755 index 0000000..f7bcb14 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInMidBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeTempInMidBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeTempInMidBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInTopBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInTopBroken.java new file mode 100755 index 0000000..6874e0f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempInTopBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeTempInTopBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeTempInTopBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutBotBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutBotBroken.java new file mode 100755 index 0000000..02ebc9b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutBotBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeTempOutBotBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeTempOutBotBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutMidBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutMidBroken.java new file mode 100755 index 0000000..773eec3 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutMidBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeTempOutMidBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeTempOutMidBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutTopBroken.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutTopBroken.java new file mode 100755 index 0000000..0a2785c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXProbeTempOutTopBroken.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXProbeTempOutTopBroken implements IRittalEnum { + OK1(0, "Ok"), + ALARM1(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXProbeTempOutTopBroken(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXRemoteControl.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXRemoteControl.java new file mode 100755 index 0000000..161c23b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXRemoteControl.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXRemoteControl implements IRittalEnum { + ON1(1, "On"), + OFF1(0, "Off"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXRemoteControl(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXSetpointLCP.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXSetpointLCP.java new file mode 100755 index 0000000..cce80b7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXSetpointLCP.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXSetpointLCP implements IRittalEnum { + ; + + private final int value; + private final String description; + + VarStatusLCPDXSetpointLCP(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXStandby.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXStandby.java new file mode 100755 index 0000000..b2cc8a8 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXStandby.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXStandby implements IRittalEnum { + ON1(1, "On"), + OFF1(0, "Off"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXStandby(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXStatusCompressor.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXStatusCompressor.java new file mode 100755 index 0000000..8088c6e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusLCPDXStatusCompressor.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusLCPDXStatusCompressor implements IRittalEnum { + ON1(1, "On"), + OFF1(0, "Off"), + ; + + private final int value; + private final String description; + + VarStatusLCPDXStatusCompressor(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusOKALARM.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusOKALARM.java new file mode 100755 index 0000000..809a40d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusOKALARM.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusOKALARM implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarStatusOKALARM(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusOKWarning.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusOKWarning.java new file mode 100755 index 0000000..20f751f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusOKWarning.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusOKWarning implements IRittalEnum { + OK(0, "Ok"), + WARNING(1, "Warning"), + ; + + private final int value; + private final String description; + + VarStatusOKWarning(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusSensorType.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusSensorType.java new file mode 100755 index 0000000..c19e7b7 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusSensorType.java @@ -0,0 +1,43 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusSensorType implements IRittalEnum { + NOT_AVAIL(1, "Not available"), + FAILURE(2, "Failure"), + OVERFLOW(3, "Overflow"), + Sensor_ACCESS(4, "Access sensor"), + Sensor_VANDALISM(5, "Vandalism sensor"), + Sensor_MOTION(6, "Motion detector CMC-TC"), + Sensor_SMOKE(7, "Smoke alarm"), + Sensor_AIRFLOW(8, "Airflow monitor"), + Sensor_TEMPERATURE(10, "Temperature sensor"), + Sensor_ANALOG(11, "Analog sensor input module"), + Sensor_HUMIDITY(12, "Humidity sensor"), + Sensor_INPUT_N_C(13, "Digital sensor input NO module"), + Sensor_INPUT_N_O(14, "Digital sensor input NC module"), + Sensor_VOLT_OK(17, "Voltage monitor"), + Sensor_VOLTAGE(18, "Voltage monitor with switch"), + Sensor_LEAKAGE(23, "Leakage sensor"), + Sensor_ACOUSTIC(34, "CMC-TC acoustic anti-vandalism sensor"), + Sensor_DETAC_FAULT(35, "Rack extinguisher system DET-AC Plus"), + Sensor_DETAC_FIRST(36, "Rack extinguisher system DET-AC Plus"), + Sensor_DETAC_MAIN(37, "Rack extinguisher system DET-AC Plus"), + Sensor_TEMPERTURE_W_L(100, "Temperature wireless sensor"), + Sensor_HUMIDITY_W_L(102, "Humidity wireless sensor"), + Sensor_ACCESS_W_L(103, "Access wireless sensor"), + Sensor_INPUT_N_O_W_L(104, "Digital wireless sensor input module"), + Sensor_INPUT_N_C_W_L(105, "Digital wireless sensor input module"), + Sensor_RTTWL(108, "Rittal Top Therm wireless controller"), + Sensor_REPEATER_W_L(110, "Wireless repeater"), + ; + + private final int value; + private final String description; + + VarStatusSensorType(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusVandalismSensors.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusVandalismSensors.java new file mode 100755 index 0000000..796118a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusVandalismSensors.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusVandalismSensors implements IRittalEnum { + TOO_HIGH(8, "Too high"), + CHANGED(3, "Configuration has changed"), + NOT_AVAILABLE(1, "Not available"), + LOST(2, "Sensor lost"), + OK(4, "Ok"), + WARNING(6, "Warning"), + ; + + private final int value; + private final String description; + + VarStatusVandalismSensors(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusunitxOutputTypeDoorOpening.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusunitxOutputTypeDoorOpening.java new file mode 100755 index 0000000..7edb189 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusunitxOutputTypeDoorOpening.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusunitxOutputTypeDoorOpening implements IRittalEnum { + NO_OUTPUT_CONNECTED(1, "not avail"), + DOOR_MAGNET(24, "Door magnet"), + ; + + private final int value; + private final String description; + + VarStatusunitxOutputTypeDoorOpening(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusunitxOutputTypeOutputDigital.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusunitxOutputTypeOutputDigital.java new file mode 100755 index 0000000..eb65b74 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarStatusunitxOutputTypeOutputDigital.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarStatusunitxOutputTypeOutputDigital implements IRittalEnum { + NO_OUTPUT_CONNECTED(1, "Not avail"), + UNIVERSAL_RELAY_OUTPUT(9, "Relay output module"), + ; + + private final int value; + private final String description; + + VarStatusunitxOutputTypeOutputDigital(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarUnitxSensorStatusOkAlarm.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarUnitxSensorStatusOkAlarm.java new file mode 100755 index 0000000..201cd42 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarUnitxSensorStatusOkAlarm.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarUnitxSensorStatusOkAlarm implements IRittalEnum { + OK(4, "Ok"), + ALARM(5, "Alarm"), + ; + + private final int value; + private final String description; + + VarUnitxSensorStatusOkAlarm(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarUnitxSensorStatusOkWarning.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarUnitxSensorStatusOkWarning.java new file mode 100755 index 0000000..67e4498 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarUnitxSensorStatusOkWarning.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarUnitxSensorStatusOkWarning implements IRittalEnum { + OK(4, "Ok"), + WARNING(6, "Warning"), + ; + + private final int value; + private final String description; + + VarUnitxSensorStatusOkWarning(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalOutputSetDoor.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalOutputSetDoor.java new file mode 100755 index 0000000..b84b424 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalOutputSetDoor.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarValueDigitalOutputSetDoor implements IRittalEnum { + LOCK(3, "Lock"), + UNLOCK(4, "Unlock"), + unlock_DELAY(5, "Delay"), + ; + + private final int value; + private final String description; + + VarValueDigitalOutputSetDoor(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSensorsAlarm.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSensorsAlarm.java new file mode 100755 index 0000000..3b27fcb --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSensorsAlarm.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarValueDigitalSensorsAlarm implements IRittalEnum { + OK(1, "Ok"), + ALARM(0, "Alarm"), + ; + + private final int value; + private final String description; + + VarValueDigitalSensorsAlarm(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSensorsDoor.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSensorsDoor.java new file mode 100755 index 0000000..c736a11 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSensorsDoor.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarValueDigitalSensorsDoor implements IRittalEnum { + OPEN(0, "Open"), + CLOSED(1, "Closed"), + ; + + private final int value; + private final String description; + + VarValueDigitalSensorsDoor(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSwitch.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSwitch.java new file mode 100755 index 0000000..a03310c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarValueDigitalSwitch.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarValueDigitalSwitch implements IRittalEnum { + OFF(0, "Off"), + ON(1, "On"), + ; + + private final int value; + private final String description; + + VarValueDigitalSwitch(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarValuePosition.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarValuePosition.java new file mode 100755 index 0000000..b4ff289 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarValuePosition.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarValuePosition implements IRittalEnum { + CIRCUIT1(20, "Circuit1"), + CIRCUIT2(21, "Circuit2"), + ; + + private final int value; + private final String description; + + VarValuePosition(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarWaterStaticPresureStatusAlarm.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarWaterStaticPresureStatusAlarm.java new file mode 100755 index 0000000..dd5ff35 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarWaterStaticPresureStatusAlarm.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarWaterStaticPresureStatusAlarm implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarWaterStaticPresureStatusAlarm(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarWaterStaticPresureStatusWarning.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarWaterStaticPresureStatusWarning.java new file mode 100755 index 0000000..0bc216a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarWaterStaticPresureStatusWarning.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarWaterStaticPresureStatusWarning implements IRittalEnum { + OK(0, "Ok"), + ALARM(1, "Alarm"), + ; + + private final int value; + private final String description; + + VarWaterStaticPresureStatusWarning(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/enums/VarcmcTcUnitxMsgStatusWLAlarm.java b/src/main/java/io/gec/raw/connector/rittal/enums/VarcmcTcUnitxMsgStatusWLAlarm.java new file mode 100755 index 0000000..e80db0d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/enums/VarcmcTcUnitxMsgStatusWLAlarm.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.rittal.enums; + +import lombok.Getter; + +@Getter +public enum VarcmcTcUnitxMsgStatusWLAlarm implements IRittalEnum { + NOT_AVAILABLE(1, "Not available"), + CONFIGURATION_HAS_CHANGED(2, "Configuration has changed"), + ERROR(3, "Error"), + OK(4, "Ok"), + ALARM(5, "Alarm"), + LOW_BATT(22, "Low Battery"), + ; + + private final int value; + private final String description; + + VarcmcTcUnitxMsgStatusWLAlarm(int value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/helper/RittalEnumHelper.java b/src/main/java/io/gec/raw/connector/rittal/helper/RittalEnumHelper.java new file mode 100755 index 0000000..2b1db14 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/helper/RittalEnumHelper.java @@ -0,0 +1,42 @@ +package io.gec.raw.connector.rittal.helper; + +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.rittal.enums.*; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@ApplicationScoped +public class RittalEnumHelper { + + private static final Map rittalEnumMap = Map.ofEntries( + Map.entry(VarTypeEnum.COMMAND, ValuesSnmpCommand.values()), + Map.entry(VarTypeEnum.COMMANDSIGNAL, ValuesSnmpVarCommandSignal.values()), + Map.entry(VarTypeEnum.CONFIG, ValuesSnmpConfig.values()), + Map.entry(VarTypeEnum.GSMSTATUS, ValuesSnmpGsmStatus.values()), + Map.entry(VarTypeEnum.LEDMODE, ValuesSnmpVarLedMode.values()), + Map.entry(VarTypeEnum.LOGIC, ValuesSnmpLogic.values()), + Map.entry(VarTypeEnum.MODE, PduSequenceMode.values()), + Map.entry(VarTypeEnum.MOUNTPOS, ValuesSnmpMountingPosition.values()), + Map.entry(VarTypeEnum.OUTPUT, ValuesSnmpOutput.values()), + Map.entry(VarTypeEnum.SOCKETTYPE, ValuesSnmpSocketType.values()), + Map.entry(VarTypeEnum.STATUS, ValuesSnmpVarStatus.values()), + Map.entry(VarTypeEnum.TYPE, ValuesSnmpFuseType.values()) + ); + + public List getPossibleValues(VarTypeEnum type, List values) { + IRittalEnum[] enumValues = rittalEnumMap.get(type); + if (enumValues == null) { + throw new IllegalArgumentException("Type not found: " + type); + } + return Arrays.stream(enumValues) + .filter(rittalEnum -> values.contains(rittalEnum.getValue())) + .toList(); + } + + public boolean isVarTypeSupported(VarTypeEnum type) { + return rittalEnumMap.get(type) != null; + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupController.java b/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupController.java new file mode 100755 index 0000000..903c982 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupController.java @@ -0,0 +1,76 @@ +package io.gec.raw.connector.rittal.maintenancegroup.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.rittal.maintenancegroup.dto.MaintenanceGroupEnum; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class MaintenanceGroupController { + @Inject + DevicePropertyController devicePropertyController; + @Inject + MaintenanceGroupMapper maintenanceGroupMapper; + @Inject + DeviceController deviceController; + private static final String PROPERTY_NAME = "Model number"; + + public List getMaintenanceGroup(UUID deviceId) { + var device = deviceController.getDeviceById(deviceId); + + List maintenanceGroups = getMaintenanceGroups(device.getParentId(), device.getType(), device.getName()); + if (!maintenanceGroups.isEmpty()) { + return maintenanceGroups; + } + + return getModelNumberProperty(device.getId()) + .or(() -> getModelNumberProperty(device.getParentId())) + .map(property -> maintenanceGroupMapper.getMaintenanceGroupsByModelNumber(property.getValueAsString())) + .orElse(Collections.emptyList()); + } + + private Optional getModelNumberProperty(UUID deviceId) { + var properties = devicePropertyController.findByDeviceId(deviceId); + return devicePropertyController.findByName(properties, PROPERTY_NAME); + } + + private List getMaintenanceGroups(UUID parentDeviceId, String type, String name) { + + List maintenanceGroups = getMaintenanceGroupsByDeviceTypeOrName(type, name); + if (!maintenanceGroups.isEmpty()) { + return maintenanceGroups; + } + + var parentDevice = deviceController.getDeviceById(parentDeviceId); + if (parentDevice != null) { + maintenanceGroups = getMaintenanceGroupsByDeviceTypeOrName(parentDevice.getType(), parentDevice.getName()); + if (!maintenanceGroups.isEmpty()) { + return maintenanceGroups; + } + } + + return Collections.emptyList(); + } + + private List getMaintenanceGroupsByDeviceTypeOrName(String deviceTypeOid, String deviceName) { + List maintenanceGroupsByType = maintenanceGroupMapper.getMaintenanceGroupsByDeviceType(deviceTypeOid); + if (!maintenanceGroupsByType.isEmpty()) { + return maintenanceGroupsByType; + } + + List maintenanceGroupsByName = maintenanceGroupMapper.getMaintenanceGroupsByDeviceName(deviceName); + if (!maintenanceGroupsByName.isEmpty()) { + return maintenanceGroupsByName; + } + + return Collections.emptyList(); + } + +} diff --git a/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupMapper.java b/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupMapper.java new file mode 100755 index 0000000..00bf545 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupMapper.java @@ -0,0 +1,306 @@ +package io.gec.raw.connector.rittal.maintenancegroup.control; + +import io.gec.raw.connector.deviceproperty.control.DeviceTypeProvider; +import io.gec.raw.connector.deviceproperty.entity.DevTypeEnum; +import io.gec.raw.connector.rittal.maintenancegroup.dto.MaintenanceGroupEnum; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.*; + +/** + * WARNING: IF Update this Mapping Confluence page should be Updated as well URL: https://oncite.atlassian.net/wiki/x/HYAEDg + */ +@ApplicationScoped +public class MaintenanceGroupMapper { + @Inject + DeviceTypeProvider deviceTypeProvider; + + private static final Map> modelToMaintenanceGroupMap = new HashMap<>(); + private static final Map> deviceTypeToMaintenanceGroupMap = new HashMap<>(); + private static final Map> deviceNameToMaintenanceGroupMap = new HashMap<>(); + + static { + modelToMaintenanceGroupMap.put("7030200", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + modelToMaintenanceGroupMap.put("7030230", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + modelToMaintenanceGroupMap.put("7030233", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + modelToMaintenanceGroupMap.put("7030261", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + modelToMaintenanceGroupMap.put("7320793", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + modelToMaintenanceGroupMap.put("7338121", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + modelToMaintenanceGroupMap.put("7338130", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + modelToMaintenanceGroupMap.put("7338221", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + modelToMaintenanceGroupMap.put("7338321", Set.of(MaintenanceGroupEnum.AVAILABILITY)); + + modelToMaintenanceGroupMap.put("3232701", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3232711", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3232721", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3232731", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3311391", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3311490", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3311491", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3311492", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3311493", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313238", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313268", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313290", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313390", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313410", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313420", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313430", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313440", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313450", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313460", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313470", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313480", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313538", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313540", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313548", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313568", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3313610", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314130", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314230", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314250", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314260", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314530", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314540", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314542", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314550", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314560", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3314570", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336390", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336400", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336405", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336410", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336415", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336430", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336435", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336450", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336455", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336460", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336470", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("3336480", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("7030110", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("7030111", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("7030140", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("7030150", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("7030430", Set.of(MaintenanceGroupEnum.COOLING)); + modelToMaintenanceGroupMap.put("7030440", Set.of(MaintenanceGroupEnum.COOLING)); + + modelToMaintenanceGroupMap.put("7030000", Set.of(MaintenanceGroupEnum.MONITORING)); + modelToMaintenanceGroupMap.put("7030022", Set.of(MaintenanceGroupEnum.MONITORING)); + modelToMaintenanceGroupMap.put("7030040", Set.of(MaintenanceGroupEnum.MONITORING)); + modelToMaintenanceGroupMap.put("7030100", Set.of(MaintenanceGroupEnum.MONITORING)); + modelToMaintenanceGroupMap.put("7030400", Set.of(MaintenanceGroupEnum.MONITORING)); + modelToMaintenanceGroupMap.put("7030571", Set.of(MaintenanceGroupEnum.MONITORING)); + modelToMaintenanceGroupMap.put("7030950", Set.of(MaintenanceGroupEnum.MONITORING)); + modelToMaintenanceGroupMap.put("7030190", Set.of(MaintenanceGroupEnum.MONITORING)); + + modelToMaintenanceGroupMap.put("5050695", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7030050", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7030060", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856070", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856080", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856082", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856090", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856100", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856120", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856170", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856191", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856220", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856230", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856240", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856321", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7856323", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7857009", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7859410", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7859420", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7859430", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979102", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979103", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979104", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979110", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979111", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979112", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979113", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979114", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979115", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979116", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979117", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979118", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979130", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979131", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979132", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979133", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979134", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979135", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979136", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979137", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979138", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979139", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979140", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979141", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979142", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979143", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979175", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979202", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979203", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979204", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979210", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979211", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979212", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979213", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979214", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979215", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979216", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979217", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979218", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979230", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979231", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979232", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979233", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979234", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979235", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979236", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979237", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979238", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979239", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979240", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979242", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979256", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979276", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979302", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979303", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979304", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979310", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979311", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979312", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979313", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979314", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979315", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979316", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979317", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979318", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979330", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979331", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979332", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979333", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979334", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979335", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979336", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979337", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979338", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979339", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979340", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979342", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979402", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979403", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979404", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979410", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979411", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979412", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979413", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979414", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979415", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979416", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979417", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979418", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979430", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979431", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979432", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979433", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979434", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979435", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979436", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979437", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979438", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979439", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979440", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979442", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979502", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979503", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979504", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979510", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979511", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979512", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979513", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979514", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979515", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979516", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979530", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979531", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979532", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979533", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979534", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979535", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979536", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979537", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979538", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979539", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979540", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979542", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979615", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979616", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979711", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979712", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979713", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979714", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979721", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979722", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979723", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979724", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979801", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979811", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979812", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979813", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979814", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979815", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979821", Set.of(MaintenanceGroupEnum.POWER)); + modelToMaintenanceGroupMap.put("7979822", Set.of(MaintenanceGroupEnum.POWER)); + + modelToMaintenanceGroupMap.put("7030120", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7030128", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7030130", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7030202", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7030223", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7320570", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7320700", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7320721", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7320794", Set.of(MaintenanceGroupEnum.SECURITY)); + modelToMaintenanceGroupMap.put("7320814", Set.of(MaintenanceGroupEnum.SECURITY)); + + //DevTypes + deviceTypeToMaintenanceGroupMap.put(DevTypeEnum.CMCIIIPRODUCTCHASSISPDUISYS, Set.of(MaintenanceGroupEnum.MONITORING)); + deviceTypeToMaintenanceGroupMap.put(DevTypeEnum.CMCIIIPRODUCTCHASSISPDUI, Set.of(MaintenanceGroupEnum.MONITORING)); + + //DevNames + deviceNameToMaintenanceGroupMap.put("PDU-Controller", Set.of(MaintenanceGroupEnum.MONITORING)); + deviceNameToMaintenanceGroupMap.put("PDU-MAN", Set.of(MaintenanceGroupEnum.MONITORING)); + + } + + public List getMaintenanceGroupsByModelNumber(String modelNumber) { + String normalizedModelNumber = modelNumber.replace(".", ""); + Set groups = modelToMaintenanceGroupMap.get(normalizedModelNumber); + if (groups != null) { + return new ArrayList<>(groups); + } + return List.of(); + } + + public List getMaintenanceGroupsByDeviceType(String devTypeOid) { + DevTypeEnum deviceType = deviceTypeProvider.getEnumFromOid(devTypeOid); + Set groups = deviceTypeToMaintenanceGroupMap.get(deviceType); + if (groups != null) { + return new ArrayList<>(groups); + } + return List.of(); + } + + public List getMaintenanceGroupsByDeviceName(String deviceName) { + Set groups = deviceNameToMaintenanceGroupMap.get(deviceName); + if (groups != null) { + return new ArrayList<>(groups); + } + return List.of(); + } +} diff --git a/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/dto/MaintenanceGroupEnum.java b/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/dto/MaintenanceGroupEnum.java new file mode 100755 index 0000000..6b80276 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/rittal/maintenancegroup/dto/MaintenanceGroupEnum.java @@ -0,0 +1,5 @@ +package io.gec.raw.connector.rittal.maintenancegroup.dto; + +public enum MaintenanceGroupEnum { + COOLING, POWER, SECURITY, MONITORING, AVAILABILITY +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/controller/SnmpSetController.java b/src/main/java/io/gec/raw/connector/setworkitem/controller/SnmpSetController.java new file mode 100755 index 0000000..634a03a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/controller/SnmpSetController.java @@ -0,0 +1,107 @@ +package io.gec.raw.connector.setworkitem.controller; + +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.protocol.domain.DiscoveryPropertyNameEnum; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemDTO; +import io.gec.raw.connector.setworkitem.domain.SetWorkItemData; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import io.gec.raw.connector.variable.control.VariableController; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class SnmpSetController { + + @Inject + SnmpService snmpService; + @Inject + VariableController variableController; + @Inject + DevicePropertyController devicePropertyController; + @Inject + DeviceController deviceController; + @Inject + DiscoveryController discoveryController; + @Inject + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + @Inject + IPAddressHelper ipAddressHelper; + @Inject + Logger logger; + + private static final int SNMP_SET_RETRY_COUNT = 3; + + public void updateVariableInterval(UUID variableId, String value) { + try { + variableController.updateVariableInterval(variableId, value); + } catch (Exception e) { + throw new RuntimeException("Could not update variable", e); + } + } + + public void updatePropertyInterval(UUID propertyId, String value) { + try { + devicePropertyController.updatePropertyInterval(propertyId, value); + } catch (Exception e) { + throw new RuntimeException("Could not update Property", e); + } + } + + public Optional performSnmpSet(SetWorkItemDTO workItemDTO, UUID deviceId, String oid, DataTypeEnum dataTypeEnum) { + var setWorkItemData = buildSetWorkItemData(deviceId, oid, dataTypeEnum, workItemDTO.getValue()); + return performSnmpSet(workItemDTO, setWorkItemData); + } + + public Optional performSnmpSet(SetWorkItemDTO workItemDTO, SetWorkItemData setWorkItemData) { + logger.debug("Start with SNMP SET"); + Optional errorMessage = snmpService.snmpSet(discoveryWorkItemToDiscoveryDataMapper.toSnmpSetMessageData(setWorkItemData)); + if (errorMessage.isPresent()) { + return errorMessage; + } + + logger.debug(String.format("SNMP SET for Variable: %s or Property %s Worked Successfully for Value: %s", + workItemDTO.getVariableId(), workItemDTO.getPropertyId(), workItemDTO.getValue())); + + return Optional.empty(); + } + + public SetWorkItemData buildSetWorkItemData(UUID deviceId, String oid, DataTypeEnum dataTypeEnum, String value) { + validateSnmpSetData(deviceId, oid, dataTypeEnum, value); + DiscoveryWorkItemDTO dwiDTO = discoveryController.getDiscoveryWorkItemByDeviceId(deviceId); + Device deviceById = deviceController.getDeviceById(deviceId); + String deviceURL = deviceController.getRootDevice(deviceById).getDeviceURL(); + String ipAddress = ipAddressHelper.removeHttpFromIpAddress(deviceURL); + + return SetWorkItemData.builder() + .community(discoveryController.getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.WRITE_COMMUNITY, dwiDTO).get()) + .ipAddress(ipAddress) + .oid(oid) + .value(value) + .dataType(dataTypeEnum) + .discoveryWorkItemDTO(dwiDTO) + .build(); + } + + public void validateSnmpSetData(UUID deviceId, String oid, DataTypeEnum dataTypeEnum, String value) { + if (deviceId == null) { + throw new IllegalArgumentException("Submitted Device ID is null"); + } else if (oid == null) { + throw new IllegalArgumentException("Submitted OID is null"); + } else if (dataTypeEnum == null) { + throw new IllegalArgumentException("Submitted DataType is null"); + } else if (value == null) { + throw new IllegalArgumentException("Submitted Value is null"); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/domain/SetWorkItemData.java b/src/main/java/io/gec/raw/connector/setworkitem/domain/SetWorkItemData.java new file mode 100755 index 0000000..ba24da6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/domain/SetWorkItemData.java @@ -0,0 +1,19 @@ +package io.gec.raw.connector.setworkitem.domain; + +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder(toBuilder = true) +public class SetWorkItemData { + private String ipAddress; + private String oid; + private String community; + private String value; + private DataTypeEnum dataType; + private DiscoveryWorkItemDTO discoveryWorkItemDTO; +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/domain/SetWorkItemResult.java b/src/main/java/io/gec/raw/connector/setworkitem/domain/SetWorkItemResult.java new file mode 100755 index 0000000..afc8639 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/domain/SetWorkItemResult.java @@ -0,0 +1,20 @@ +package io.gec.raw.connector.setworkitem.domain; + +import io.gec.raw.connector.job.domain.WorkItemResult; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemStatus; +import io.gec.raw.connector.setworkitem.dto.SetStatusEnum; +import lombok.Getter; + +@Getter +public class SetWorkItemResult extends WorkItemResult { + private final SetStatusEnum status; + + public SetWorkItemResult(SetStatusEnum status, String message) { + super(message); + this.status = status; + } + + public SetWorkItemResult(SetStatusEnum status) { + this(status, null); + } +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/dto/ActionEnum.java b/src/main/java/io/gec/raw/connector/setworkitem/dto/ActionEnum.java new file mode 100755 index 0000000..c3c330e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/dto/ActionEnum.java @@ -0,0 +1,5 @@ +package io.gec.raw.connector.setworkitem.dto; + +public enum ActionEnum { + SET_VALUE, SET_INTERVAL +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/dto/SetStatusEnum.java b/src/main/java/io/gec/raw/connector/setworkitem/dto/SetStatusEnum.java new file mode 100755 index 0000000..1242822 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/dto/SetStatusEnum.java @@ -0,0 +1,5 @@ +package io.gec.raw.connector.setworkitem.dto; + +public enum SetStatusEnum { + CREATED, IN_PROGRESS, SUCCESS, FAILED, ERROR, ERROR_READONLY +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/dto/SetWorkItemDTO.java b/src/main/java/io/gec/raw/connector/setworkitem/dto/SetWorkItemDTO.java new file mode 100755 index 0000000..8749c9d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/dto/SetWorkItemDTO.java @@ -0,0 +1,22 @@ +package io.gec.raw.connector.setworkitem.dto; + +import io.gec.raw.connector.job.domain.WorkItem; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Builder(toBuilder = true) +@Getter +@Setter +@EqualsAndHashCode(callSuper = false) +public class SetWorkItemDTO extends WorkItem { + + private UUID variableId; + private UUID propertyId; + private ActionEnum action; + private String value; + private SetStatusEnum status; +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/dto/SetWorkItemUpdateDTO.java b/src/main/java/io/gec/raw/connector/setworkitem/dto/SetWorkItemUpdateDTO.java new file mode 100755 index 0000000..707780f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/dto/SetWorkItemUpdateDTO.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.setworkitem.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SetWorkItemUpdateDTO { + private SetStatusEnum status; + private String message; +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/handler/AbstractSetJobHandler.java b/src/main/java/io/gec/raw/connector/setworkitem/handler/AbstractSetJobHandler.java new file mode 100755 index 0000000..612e69b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/handler/AbstractSetJobHandler.java @@ -0,0 +1,67 @@ +package io.gec.raw.connector.setworkitem.handler; + +import io.gec.raw.connector.job.domain.JobResult; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.handler.WorkItemHandler; +import io.gec.raw.connector.setworkitem.controller.SnmpSetController; +import io.gec.raw.connector.setworkitem.domain.SetWorkItemResult; +import io.gec.raw.connector.setworkitem.dto.SetStatusEnum; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemDTO; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemUpdateDTO; +import jakarta.inject.Inject; + +import java.util.Optional; +import java.util.UUID; + +public abstract class AbstractSetJobHandler extends WorkItemHandler { + + @Inject + SnmpSetController snmpSetController; + + @Override + protected Optional getWorkItem(UUID workItemId) { + return communicationServiceController.fetchSetWorkItem(workItemId); + } + + @Override + protected void startProcessing(WorkItemWrapper workItemWrapper) { + updateSetWorkItemStatus(workItemWrapper.workItemId(), SetStatusEnum.IN_PROGRESS); + } + + @Override + protected void finishProcessing(WorkItemWrapper workItemWrapper, SetWorkItemResult workItemResult) { + updateSetWorkItemStatus(workItemWrapper.workItemId(), workItemResult.getStatus(), workItemResult.getMessage()); + } + + @Override + protected JobResult mapToJobResult(SetWorkItemResult workItemResult) { + var workItemStatus = workItemResult.getStatus(); + + var jobStatus = switch (workItemStatus) { + case SUCCESS -> JobStatus.DONE; + case FAILED, ERROR, ERROR_READONLY -> JobStatus.FAILED; + default -> throw new IllegalStateException("Mapping to job result failed, unexpected value: " + workItemStatus); + }; + + return new JobResult(jobStatus, workItemResult.getMessage()); + } + + private void updateSetWorkItemStatus(UUID workItemId, SetStatusEnum setStatus) { + updateSetWorkItemStatus(workItemId, setStatus, null); + } + + private void updateSetWorkItemStatus(UUID workItemId, SetStatusEnum setStatus, String message) { + var setWorkItemUpdateDTO = new SetWorkItemUpdateDTO(); + setWorkItemUpdateDTO.setStatus(setStatus); + setWorkItemUpdateDTO.setMessage(message); + + communicationServiceController.updateSetWorkItem(workItemId, setWorkItemUpdateDTO); + } + + @Override + public JobAction getJobAction() { + return JobAction.SET; + } +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/handler/SetPropertyJobHandler.java b/src/main/java/io/gec/raw/connector/setworkitem/handler/SetPropertyJobHandler.java new file mode 100755 index 0000000..6d7925b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/handler/SetPropertyJobHandler.java @@ -0,0 +1,68 @@ +package io.gec.raw.connector.setworkitem.handler; + +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.setworkitem.domain.SetWorkItemResult; +import io.gec.raw.connector.setworkitem.dto.SetStatusEnum; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemDTO; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; +import jakarta.persistence.EntityNotFoundException; + +import java.util.Optional; + +@ApplicationScoped +public class SetPropertyJobHandler extends AbstractSetJobHandler { + + @Inject + DevicePropertyController devicePropertyController; + + @ActivateRequestContext + @Override + protected SetWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + var propertyId = workItemWrapper.workItem() != null ? workItemWrapper.workItem().getPropertyId() : null; + logger.infof("Processing SetWorkItem (ID:'%s') for Property (ID:'%s') ...", workItemWrapper.workItemId(), propertyId); + try { + validateSetWorkItem(workItemWrapper); + SetWorkItemDTO workItem = workItemWrapper.workItem(); + var deviceProperty = devicePropertyController.findPropertyByCommSvcId(workItem.getPropertyId()); + + switch (workItem.getAction()) { + case SET_INTERVAL: + snmpSetController.updatePropertyInterval(deviceProperty.getId(), workItem.getValue()); + break; + case SET_VALUE: + Optional errorMessage = snmpSetController.performSnmpSet( + workItem, deviceProperty.getDeviceId(), deviceProperty.getValueChangeOid(), deviceProperty.getValueChangeDatatype()); + if (errorMessage.isPresent()) { + return new SetWorkItemResult(SetStatusEnum.FAILED, errorMessage.get()); + } + break; + } + return new SetWorkItemResult(SetStatusEnum.SUCCESS); + } catch (EntityNotFoundException e) { + var message = "SetWorkItem (ID:'%s') not found".formatted(workItemWrapper.workItemId()); + logger.error(message, e); + return new SetWorkItemResult(SetStatusEnum.FAILED, message); + } catch (RuntimeException e) { + logger.error(e.getMessage(), e); + return new SetWorkItemResult(SetStatusEnum.FAILED, e.getMessage()); + } + } + + private void validateSetWorkItem(WorkItemWrapper workItemWrapper) { + if (workItemWrapper.workItem() == null) { + throw new IllegalArgumentException("SetWorkItemDTO is required but not provided for work item Id: %s".formatted(workItemWrapper.workItemId())); + } + if (workItemWrapper.workItem().getPropertyId() == null) { + throw new IllegalArgumentException("Property ID is required but not provided for work item Id: %s".formatted(workItemWrapper.workItem())); + } + } + + @Override + public JobType getJobType() { + return JobType.PROPERTY; + } +} diff --git a/src/main/java/io/gec/raw/connector/setworkitem/handler/SetVariableJobHandler.java b/src/main/java/io/gec/raw/connector/setworkitem/handler/SetVariableJobHandler.java new file mode 100755 index 0000000..f2359a9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/setworkitem/handler/SetVariableJobHandler.java @@ -0,0 +1,92 @@ +package io.gec.raw.connector.setworkitem.handler; + +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.setworkitem.domain.SetWorkItemResult; +import io.gec.raw.connector.setworkitem.dto.SetStatusEnum; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemDTO; +import io.gec.raw.connector.utils.control.ValueScalingHelper; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.control.VariableHandler; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; +import jakarta.persistence.EntityNotFoundException; + +import java.util.Optional; + +@ApplicationScoped +public class SetVariableJobHandler extends AbstractSetJobHandler { + + @Inject + VariableController variableController; + @Inject + ValueScalingHelper scalingHelper; + @Inject + VariableHandler variableHandler; + + @ActivateRequestContext + @Override + protected SetWorkItemResult processWorkItem(WorkItemWrapper workItemWrapper) { + var variableId = workItemWrapper.workItem() != null ? workItemWrapper.workItem().getVariableId() : null; + logger.infof("Processing SetWorkItem (ID:'%s') for Variable (ID:'%s') ...", workItemWrapper.workItemId(), variableId); + try { + validateSetWorkItem(workItemWrapper); + SetWorkItemDTO workItem = workItemWrapper.workItem(); + var variable = variableController.findVariableByCommSvcId(workItem.getVariableId()); + + switch (workItem.getAction()) { + case SET_INTERVAL: + snmpSetController.updateVariableInterval(variable.getId(), workItem.getValue()); + break; + case SET_VALUE: + workItem.setValue(scalingHelper.getScaledVariableValueForDevice(variable.getVarDataType(), workItem.getValue(), variable.getScale())); + Optional errorMessage = snmpSetController.performSnmpSet(workItem, variable.getDeviceId(), getOidByDataType(variable), variable.getSnmpSetVarDataType()); + if (errorMessage.isPresent()) { + return new SetWorkItemResult(SetStatusEnum.FAILED, errorMessage.get()); + } + handleVariableValueFetchedFromDevice(variable, workItem.getValue()); + break; + } + return new SetWorkItemResult(SetStatusEnum.SUCCESS); + } catch (EntityNotFoundException e) { + var message = "SetWorkItem not found, id: '%s'".formatted(workItemWrapper.workItemId()); + logger.error(message, e); + return new SetWorkItemResult(SetStatusEnum.FAILED, message); + } catch (RuntimeException e) { + logger.error(e.getMessage(), e); + return new SetWorkItemResult(SetStatusEnum.FAILED, e.getMessage()); + } + } + + private void handleVariableValueFetchedFromDevice(Variable variable, String value) { + VariableValueData variableValueData = new VariableValueData(value, QualityType.GOOD); + variableHandler.handleVariableValueFetchedFromDevice(variable, variableValueData); + } + + private void validateSetWorkItem(WorkItemWrapper workItemWrapper) { + if (workItemWrapper.workItem() == null) { + throw new IllegalArgumentException("SetWorkItemDTO is required but not provided for work item Id: %s".formatted(workItemWrapper.workItemId())); + } + if (workItemWrapper.workItem().getVariableId() == null) { + throw new IllegalArgumentException("Variable ID is required but not provided for work item Id: %s".formatted(workItemWrapper.workItemId())); + } + } + + private String getOidByDataType(Variable variable) { + switch (variable.getSnmpSetVarDataType()) { + case STRING: + return variable.getValueAsStringOid(); + default: + return variable.getValueAsIntegerOid(); + } + } + + @Override + public JobType getJobType() { + return JobType.VARIABLE; + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/DiscoveryDataToSnmpMapper.java b/src/main/java/io/gec/raw/connector/snmp/common/control/DiscoveryDataToSnmpMapper.java new file mode 100755 index 0000000..4e51d3a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/DiscoveryDataToSnmpMapper.java @@ -0,0 +1,151 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.protocol.domain.AuthenticationProtocolEnum; +import io.gec.raw.connector.protocol.domain.PrivacyAlgorithmEnum; +import io.gec.raw.connector.protocol.domain.SecurityLevelEnum; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; +import io.gec.raw.connector.snmp.common.domain.SnmpRequestData; +import io.gec.raw.connector.snmp.common.domain.SnmpV3Data; +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.utils.control.ValueHelper; +import jakarta.enterprise.context.ApplicationScoped; +import org.snmp4j.PDU; +import org.snmp4j.PDUv1; +import org.snmp4j.ScopedPDU; +import org.snmp4j.mp.SnmpConstants; +import org.snmp4j.security.*; +import org.snmp4j.smi.*; + +import java.util.List; +import java.util.Optional; + +@ApplicationScoped +public class DiscoveryDataToSnmpMapper { + + private final ValueHelper valueHelper; + + public DiscoveryDataToSnmpMapper(ValueHelper valueHelper) { + this.valueHelper = valueHelper; + } + + public int toSecurityLevel(SecurityLevelEnum securityLevelEnum) { + return switch (securityLevelEnum) { + case NOAUTHNOPRIV -> SecurityLevel.NOAUTH_NOPRIV; + case AUTHNOPRIV -> SecurityLevel.AUTH_NOPRIV; + case AUTHPRIV -> SecurityLevel.AUTH_PRIV; + }; + } + + public int toSnmpVersion(SnmpVersionEnum snmpVersionEnum) { + return switch (snmpVersionEnum) { + case SNMP_V1 -> SnmpConstants.version1; + case SNMP_V2C -> SnmpConstants.version2c; + case SNMP_V3 -> SnmpConstants.version3; + }; + } + + public PDU toPDU(SnmpProtocolData snmpProtocolData) { + return switch (snmpProtocolData.getSnmpVersion()) { + case SNMP_V1 -> new PDUv1(); + case SNMP_V2C -> new PDU(); + case SNMP_V3 -> createScopedPDU(snmpProtocolData); + default -> throw new IllegalArgumentException("Unsupported SNMP version: " + snmpProtocolData.getSnmpVersion()); + }; + } + + private ScopedPDU createScopedPDU(SnmpProtocolData snmpProtocolData) { + ScopedPDU scopedPdu = new ScopedPDU(); + snmpProtocolData.getSnmpV3Data().flatMap(SnmpV3Data::getContextName).ifPresent(name -> scopedPdu.setContextName(new OctetString(name))); + return scopedPdu; + } + + + + public Integer toSnmpDiscoveryMessage(SnmpVersionEnum snmpVersionEnum) { + return switch (snmpVersionEnum) { + case SNMP_V1 -> PDU.GETNEXT; + case SNMP_V2C, SNMP_V3 -> PDU.GETBULK; + }; + } + + public Optional toCommunityString(SnmpRequestData snmpRequestData) { + switch (snmpRequestData.getSnmpMessage()) { + case PDU.GETNEXT, PDU.GETBULK, PDU.GET -> { + return snmpRequestData.getSnmpMessageData().getSnmpProtocolData().getReadCommunity(); + } + case PDU.SET -> { + return snmpRequestData.getSnmpMessageData().getSnmpProtocolData().getWriteCommunity(); + } + default -> throw new IllegalArgumentException(String.format("Given SNMP message: %s is not supported!", snmpRequestData.getSnmpMessage())); + } + } + + public UsmUser toUsmUser(SnmpV3Data snmpV3Data) { + Optional securityName = valueHelper.trim(snmpV3Data.getSecurityName()); + Optional authenticationProtocol = snmpV3Data.getAuthenticationProtocol(); + Optional authenticationPassphrase = valueHelper.trim(snmpV3Data.getAuthenticationPassphrase()); + Optional privacyAlgorithm = snmpV3Data.getPrivacyAlgorithm(); + Optional privacyPasssphrase = valueHelper.trim(snmpV3Data.getPrivacyPasssphrase()); + + if (securityName.isEmpty()) { + throw new IllegalArgumentException("Security name for Snmp V3 can not be empty!"); + } + + return new UsmUser( + new OctetString(securityName.get()), + authenticationProtocol.map(this::toAuthenticationProtocolID).orElse(null), + authenticationPassphrase.map(OctetString::new).orElse(null), + privacyAlgorithm.map(this::toPrivacyAlgorithmID).orElse(null), + privacyPasssphrase.map(OctetString::new).orElse(null)); + } + + public List toVariableBindings(String oid) { + return List.of(toVariableBinding(oid)); + } + + public List toVariableBindings(RittalMibVariable mibVariable) { + return List.of(toVariableBinding(mibVariable.getOid())); + } + + public List toVariableBindings(String oid, String value, DataTypeEnum dataTypeEnum) { + OID plainOID = new OID(oid); + + Variable variable = switch (dataTypeEnum) { + case INTEGER, NUMERIC, ANALOGINT, STATUSINT, ENUM -> new Integer32(Integer.parseInt(value)); + case STRING, FLOAT -> new OctetString(value); + }; + + return List.of(new VariableBinding(plainOID, variable)); + } + + public OID toAuthenticationProtocolID(AuthenticationProtocolEnum authenticationProtocolEnum) { + return switch (authenticationProtocolEnum) { + case MD5 -> AuthMD5.ID; + case SHA -> AuthSHA.ID; + case SHA224 -> AuthHMAC128SHA224.ID; + case SHA256 -> AuthHMAC192SHA256.ID; + case SHA384 -> AuthHMAC256SHA384.ID; + case SHA512 -> AuthHMAC384SHA512.ID; + }; + } + + public OID toPrivacyAlgorithmID(PrivacyAlgorithmEnum privacyAlgorithmEnum) { + return switch (privacyAlgorithmEnum) { + case DES -> PrivDES.ID; + case AES128 -> PrivAES128.ID; + case AES192 -> PrivAES192.ID; + case AES256 -> PrivAES256.ID; + case DES3 -> Priv3DES.ID; + }; + } + + public VariableBinding toVariableBinding(String oid) { + return new VariableBinding(new OID(oid)); + } + + private VariableBinding toVariableBinding(OID oid) { + return new VariableBinding(oid); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/DiscoveryWorkItemToDiscoveryDataMapper.java b/src/main/java/io/gec/raw/connector/snmp/common/control/DiscoveryWorkItemToDiscoveryDataMapper.java new file mode 100755 index 0000000..06fbbf2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/DiscoveryWorkItemToDiscoveryDataMapper.java @@ -0,0 +1,169 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.protocol.control.ProtocolRepository; +import io.gec.raw.connector.protocol.domain.*; +import io.gec.raw.connector.protocol.entity.Protocol; +import io.gec.raw.connector.setworkitem.domain.SetWorkItemData; +import io.gec.raw.connector.snmp.common.domain.SnmpGetJob; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; +import io.gec.raw.connector.snmp.common.domain.SnmpV3Data; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import io.quarkus.cache.CacheInvalidate; +import io.quarkus.cache.CacheKey; +import io.quarkus.cache.CacheResult; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.persistence.EntityNotFoundException; +import org.jboss.logging.Logger; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class DiscoveryWorkItemToDiscoveryDataMapper { + public static final String CACHE_NAME_SNMP_PROTOCOL_DATA = "cache-snmp-protocol-data"; + + private final Logger logger; + private final DiscoveryController discoveryController; + private final DiscoveryDataToSnmpMapper mapper; + private final IPAddressHelper ipAddressHelper; + private final ProtocolRepository protocolRepository; + + public DiscoveryWorkItemToDiscoveryDataMapper(Logger logger, + DiscoveryController discoveryController, + DiscoveryDataToSnmpMapper mapper, + IPAddressHelper ipAddressHelper, + ProtocolRepository protocolRepository) { + this.logger = logger; + this.discoveryController = discoveryController; + this.mapper = mapper; + this.ipAddressHelper = ipAddressHelper; + this.protocolRepository = protocolRepository; + } + + public List toSnmpMessageDataList(DiscoveryWorkItemDTO dwiDTO, String oid) { + Optional startIpAddress = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.START_IP_ADDRESS, dwiDTO); + Optional endIpAddress = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.END_IP_ADDRESS, dwiDTO); + + if (startIpAddress.isEmpty() || endIpAddress.isEmpty()) { + throw new IllegalStateException("Start and End IP addresses have to be set!"); + } + + ipAddressHelper.validateIpRange(startIpAddress.get(), endIpAddress.get()); + + List hostnames = ipAddressHelper.getStartEndIpOctet(startIpAddress.get(), endIpAddress.get()); + + return hostnames.stream() + .map(hostname -> toSnmpMessageData(hostname, dwiDTO, oid)) + .toList(); + } + + public SnmpMessageData toSnmpMessageData(String ipAddress, DiscoveryWorkItemDTO dwiDTO, String rootOid) { + return SnmpMessageData.builder() + .hostname(ipAddress) + .variableBindings(mapper.toVariableBindings(rootOid)) + .snmpProtocolData(toSnmpProtocolData(dwiDTO)) + .build(); + } + + public SnmpMessageData toSnmpGetMessageData(SnmpGetJob snmpGetJob, SnmpProtocolData protocolData) { + return SnmpMessageData.builder() + .hostname(snmpGetJob.getIpAddress()) + .variableBindings(mapper.toVariableBindings(snmpGetJob.getOid())) + .snmpProtocolData(protocolData) + .build(); + } + + public SnmpMessageData toSnmpGetMessageData(SnmpGetJob snmpGetJob, DiscoveryWorkItemDTO dwiDTO) { + return SnmpMessageData.builder() + .hostname(snmpGetJob.getIpAddress()) + .variableBindings(mapper.toVariableBindings(snmpGetJob.getOid())) + .snmpProtocolData(toSnmpProtocolData(dwiDTO)) + .build(); + } + + public SnmpMessageData toSnmpMessageData(String ipAddress, DiscoveryWorkItemDTO dwiDTO) { + return SnmpMessageData.builder() + .hostname(ipAddress) + .snmpProtocolData(toSnmpProtocolData(dwiDTO)) + .build(); + } + + public SnmpMessageData toSnmpSetMessageData(SetWorkItemData setWorkItemData) { + return SnmpMessageData.builder() + .hostname(setWorkItemData.getIpAddress()) + .variableBindings(mapper.toVariableBindings(setWorkItemData.getOid(), setWorkItemData.getValue(), setWorkItemData.getDataType())) + .snmpProtocolData(toSnmpProtocolData(setWorkItemData.getDiscoveryWorkItemDTO())) + .build(); + } + + public SnmpProtocolData toSnmpProtocolData(DiscoveryWorkItemDTO dwiDTO) { + return toSnmpProtocolData(dwiDTO.getId(), dwiDTO); + } + + @CacheResult(cacheName = CACHE_NAME_SNMP_PROTOCOL_DATA) + SnmpProtocolData toSnmpProtocolData(@CacheKey UUID dwiId, DiscoveryWorkItemDTO dwiDTO) { + logger.debugf("[CACHE:MISS] SnmpProtocolData for DiscoveryWorkItem(ID=%s)", dwiId); + String protocolName = protocolRepository.findByCommunicationServiceId(dwiDTO.getProtocolId()) + .map(Protocol::getName) + .orElseThrow(() -> new EntityNotFoundException( + String.format("Protocol with id: %s not found in connectors database!", + dwiDTO.getProtocolId()))); + + SnmpVersionEnum snmpVersionEnum = toSnmpVersionEnum(protocolName); + Optional snmpV3Data = toSnmpV3Data(snmpVersionEnum, dwiDTO); + + int port = Integer.parseInt(getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.PORT, dwiDTO) + .orElseThrow()); + + return SnmpProtocolData.builder() + .port(port) + .writeCommunity(getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.WRITE_COMMUNITY, dwiDTO)) + .readCommunity(getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.READ_COMMUNITY, dwiDTO)) + .snmpVersion(snmpVersionEnum) + .snmpV3Data(snmpV3Data) + .build(); + } + + @CacheInvalidate(cacheName = CACHE_NAME_SNMP_PROTOCOL_DATA) + public void invalidateSnmpProtocolData(@CacheKey UUID dwiId) { + // INFO: This method is not used, because we don't allow to update DiscoveryWorkItems right now. + logger.debugf("[CACHE:INVALIDATE] SnmpProtocolData for DiscoveryWorkItem(ID=%s)", dwiId); + } + + private Optional toSnmpV3Data(SnmpVersionEnum snmpVersionEnum, DiscoveryWorkItemDTO dwiDTO) { + if (!snmpVersionEnum.equals(SnmpVersionEnum.SNMP_V3)) { + return Optional.empty(); + } + + Optional securityName = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.SECURITY_NAME, dwiDTO); + Optional securityLevel = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.SECURITY_LEVEL, dwiDTO); + Optional authAlgorithm = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.AUTHENTICATION_PROTOCOL, dwiDTO); + Optional authPassphrase = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.AUTHENTICATION_PASSPHRASE, dwiDTO); + Optional privacyAlgorithm = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.PRIVACY_ALGORITHM, dwiDTO); + Optional privacyPassphrase = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.PRIVACY_PASSPHRASE, dwiDTO); + Optional contextName = getDiscoveryPropertyValue(DiscoveryPropertyNameEnum.CONTEXT_NAME, dwiDTO); + + return Optional.of(SnmpV3Data.builder() + .securityName(securityName) + .securityLevel(securityLevel.flatMap(SecurityLevelEnum::findByName)) + .authenticationProtocol(authAlgorithm.flatMap(AuthenticationProtocolEnum::findByName)) + .authenticationPassphrase(authPassphrase) + .privacyAlgorithm(privacyAlgorithm.flatMap(PrivacyAlgorithmEnum::findByName)) + .privacyPasssphrase(privacyPassphrase) + .contextName(contextName) + .build()); + } + + private Optional getDiscoveryPropertyValue(DiscoveryPropertyNameEnum discoveryPropertyNameEnum, DiscoveryWorkItemDTO dwiDTO) { + return discoveryController.getDiscoveryPropertyValue(discoveryPropertyNameEnum, dwiDTO); + } + + public SnmpVersionEnum toSnmpVersionEnum(String snmpVersion) { + return SnmpVersionEnum.findByName(snmpVersion) + .orElseThrow(() -> new IllegalArgumentException(String.format("SNMP version: %s is not supported!", snmpVersion))); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/PDUResponseMapper.java b/src/main/java/io/gec/raw/connector/snmp/common/control/PDUResponseMapper.java new file mode 100755 index 0000000..16df2af --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/PDUResponseMapper.java @@ -0,0 +1,74 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.dto.VarQuality; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; +import org.snmp4j.PDU; +import org.snmp4j.smi.Null; +import org.snmp4j.smi.SMIConstants; +import org.snmp4j.smi.VariableBinding; + +import java.util.Objects; +import java.util.Optional; + +@ApplicationScoped +public class PDUResponseMapper { + + @Inject + Logger logger; + + public QualityType toQualityType(PDU pdu) { + if (Objects.isNull(pdu)) { + return QualityType.DEVICE_COMMUNICATION_ISSUE; + } + + Optional optionalVariableBinding = pdu.getVariableBindings().stream().findFirst(); + if (optionalVariableBinding.isEmpty()) { + return QualityType.UNCERTAIN; + } + + VariableBinding variableBinding = optionalVariableBinding.get(); + if (variableBinding.isException()) { + return syntaxToQualityType(variableBinding.getSyntax()); + } + + if (Null.instance.equals(variableBinding.getVariable())) { + return QualityType.UNCERTAIN; + } + + String value = variableBinding.toValueString(); + if (value.isBlank()) { + return QualityType.UNCERTAIN; + } + + int intValue; + try { + intValue = Integer.parseInt(value); + } catch (NumberFormatException ex) { + logger.error("Received quality value is not an integer.", ex); + return QualityType.UNCERTAIN; + } + + Optional varQuality = VarQuality.toVarQuality(intValue); + return varQuality.map(this::varQualityToQualityType) + .orElse(QualityType.UNCERTAIN); + } + + private QualityType syntaxToQualityType(int syntax) { + return switch (syntax) { + case SMIConstants.EXCEPTION_NO_SUCH_OBJECT -> QualityType.UNCERTAIN; + case SMIConstants.EXCEPTION_NO_SUCH_INSTANCE -> QualityType.DEVICE_UNAVAILABLE; + default -> QualityType.UNCERTAIN; + }; + } + + private QualityType varQualityToQualityType(VarQuality varQuality) { + return switch (varQuality) { + case UNDEFINED -> QualityType.UNAVAILABLE; + case OK, WARNING, ALARM, INFO -> QualityType.GOOD; + case UNDEFINEDNOVALUE, OKNOVALUE, WARNINGNOVALUE, ALARMNOVALUE, INFONOVALUE -> QualityType.NO_VALUE; + }; + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpHelper.java b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpHelper.java new file mode 100755 index 0000000..37e0351 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpHelper.java @@ -0,0 +1,64 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.utils.control.IPAddressHelper; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.PDU; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.Null; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.VariableBinding; + +import java.net.SocketAddress; +import java.util.Optional; +import java.util.function.Consumer; + +@ApplicationScoped +public class SnmpHelper { + + @Inject + Logger logger; + @Inject + IPAddressHelper ipAddressHelper; + + public String oidToString(VariableBinding variableBinding) { + return "." + variableBinding.getOid().toString(); + } + + public boolean checkWalkFinished(OID rootOid, PDU pdu, VariableBinding vb) { + boolean finished = false; + if (pdu.getErrorStatus() != PDU.noError) { + logger.debug("[true] responsePDU.getErrorStatus() != PDU.noError "); + logger.debug(pdu.getErrorStatusText()); + finished = true; + } else if (vb.getOid().size() < rootOid.size()) { + logger.debug("[true] vb.getOid().size() < rootOid.size()"); + finished = true; + } else if (rootOid.leftMostCompare(rootOid.size(), vb.getOid()) != 0) { + logger.debug("[true] rootOid.leftMostCompare() != 0"); + finished = true; + } else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) { + logger.debug("[true] Null.isExceptionSyntax(vb.getVariable().getSyntax())"); + finished = true; + } else if (!vb.getOid().startsWith(rootOid)) { + logger.debug("[true] !vb.getOid().startsWith(rootOid)"); + finished = true; + } + return finished; + } + + public Consumer getLogger(PDU pdu) { + if (pdu.getErrorStatus() == PDU.noError) { + return logger::debug; + } + + return logger::error; + } + + public Optional getIpAddress(CommandResponderEvent commandResponderEvent) { + SocketAddress socketAddress = commandResponderEvent.getPeerAddress().getSocketAddress(); + return ipAddressHelper.extractIPv4(socketAddress.toString()); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpMessageSender.java b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpMessageSender.java new file mode 100755 index 0000000..ed671cc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpMessageSender.java @@ -0,0 +1,170 @@ +/* + * (c) 2022 German Edge Cloud GmbH & Co.KG + * + */ + +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.protocol.domain.SecurityLevelEnum; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.snmp.common.domain.*; +import io.gec.raw.connector.statistic.control.StatisticCollectorController; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import lombok.SneakyThrows; +import org.snmp4j.*; +import org.snmp4j.event.ResponseEvent; +import org.snmp4j.security.USM; +import org.snmp4j.security.UsmUser; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.GenericAddress; +import org.snmp4j.smi.OctetString; +import org.snmp4j.smi.VariableBinding; + +import java.io.IOException; +import java.util.List; +import java.util.Optional; +import java.util.function.BiFunction; + +@ApplicationScoped +public class SnmpMessageSender { + + private static final String DEFAULT_PROTOCOL = "udp"; + + @Inject + SnmpProvider snmpProvider; + @Inject + DiscoveryDataToSnmpMapper mapper; + @Inject + StatisticCollectorController statisticCollectorController; + + public ResponseEvent

sendSnmpMessage(SnmpRequestData snmpRequestData) { + long start = System.currentTimeMillis(); + + SnmpMessageData snmpMessageData = snmpRequestData.getSnmpMessageData(); + SnmpVersionEnum snmpVersion = snmpMessageData + .getSnmpProtocolData() + .getSnmpVersion(); + Snmp snmp = snmpProvider.getSnmp(SnmpConnectionType.COMMAND_SENDER); + + BiFunction> snmpRequestFunction = mapSnmpVersionToRequest(snmpVersion); + + ResponseEvent
result = snmpRequestFunction.apply(snmp, snmpRequestData); + long end = System.currentTimeMillis(); + + statisticCollectorController.add(snmpRequestData, start, end, end); + return result; + } + + private BiFunction> mapSnmpVersionToRequest(SnmpVersionEnum snmpVersionEnum) { + return switch (snmpVersionEnum) { + case SNMP_V1 -> this::requestV1; + case SNMP_V2C -> this::requestV2c; + case SNMP_V3 -> this::requestV3; + }; + } + + @SneakyThrows + private ResponseEvent
requestV1(Snmp snmp, SnmpRequestData snmpRequestData) { + Target
target = createTarget(snmpRequestData); + return sendMessage(snmp, snmpRequestData, target); + } + + @SneakyThrows + private ResponseEvent
requestV2c(Snmp snmp, SnmpRequestData snmpRequestData) { + return requestV1(snmp, snmpRequestData); + } + + @SneakyThrows + private ResponseEvent
requestV3(Snmp snmp, SnmpRequestData snmpRequestData) { + SnmpMessageData snmpMessageData = snmpRequestData.getSnmpMessageData(); + Optional usm = Optional.ofNullable(snmp.getUSM()); + + SnmpProtocolData snmpProtocolData = snmpMessageData.getSnmpProtocolData(); + Optional snmpV3Data = snmpProtocolData.getSnmpV3Data(); + Optional securityName = snmpV3Data.flatMap(SnmpV3Data::getSecurityName); + Optional securityLevelEnum = snmpV3Data.flatMap(SnmpV3Data::getSecurityLevel); + + usm.ifPresent(securityModel -> { + Optional usmUser = snmpProtocolData.getSnmpV3Data().map(data -> mapper.toUsmUser(data)); + securityName.ifPresent(name -> + usmUser.ifPresent(securityModel::addUser)); + }); + + SnmpTimeoutData timeoutData = snmpRequestData.getTimeoutData(); + Target
userTarget = new UserTarget<>(); + userTarget.setAddress(createAddress(snmpMessageData)); + userTarget.setRetries(timeoutData.getRequestRetries()); + userTarget.setTimeout(timeoutData.getRequestTimeout()); + userTarget.setVersion(mapper.toSnmpVersion(snmpProtocolData.getSnmpVersion())); + securityLevelEnum.ifPresent(level -> userTarget.setSecurityLevel(mapper.toSecurityLevel(level))); + securityName.ifPresent(name -> userTarget.setSecurityName(new OctetString(name))); + + return sendMessage(snmp, snmpRequestData, userTarget); + } + + private ResponseEvent
sendMessage(Snmp snmp, + SnmpRequestData snmpRequestData, + Target
target) throws IOException { + PDU pdu = getPdu(snmpRequestData); + List variableBindings = snmpRequestData.getSnmpMessageData().getVariableBindings(); + + // FIXME - pass variable bindings in SnmpMessageData or pdu in SnmpRequestData, not both + if (snmpRequestData.getPdu().isEmpty()) { + pdu.setVariableBindings(variableBindings); + } + + switch (snmpRequestData.getSnmpMessage()) { + case PDU.GETNEXT -> { + return snmp.getNext(pdu, target); + } + case PDU.GETBULK -> { + pdu.setMaxRepetitions(100); + pdu.setNonRepeaters(0); + return snmp.getBulk(pdu, target); + } + case PDU.GET -> { + return snmp.get(pdu, target); + } + case PDU.SET -> { + return snmp.set(pdu, target); + } + default -> throw new IllegalArgumentException("SnmpType not supported: " + snmpRequestData.getSnmpMessage()); + } + } + + private PDU getPdu(SnmpRequestData snmpRequestData) { + PDU pdu; + + if (snmpRequestData.getPdu().isPresent()) { + pdu = snmpRequestData.getPdu().get(); + } else { + pdu = mapper.toPDU(snmpRequestData.getSnmpMessageData().getSnmpProtocolData()); + } + + return pdu; + } + + CommunityTarget
createTarget(SnmpRequestData snmpRequestData) { + SnmpMessageData snmpMessageData = snmpRequestData.getSnmpMessageData(); + + CommunityTarget
target = new CommunityTarget<>(); + mapper.toCommunityString(snmpRequestData) + .ifPresent(community -> target.setCommunity(new OctetString(community))); + target.setAddress(createAddress(snmpMessageData)); + target.setVersion(mapper.toSnmpVersion(snmpMessageData.getSnmpProtocolData().getSnmpVersion())); + target.setTimeout(snmpRequestData.getTimeoutData().getRequestTimeout()); + target.setRetries(snmpRequestData.getTimeoutData().getRequestRetries()); + + return target; + } + + private Address createAddress(SnmpMessageData data) { + return GenericAddress.parse( + DEFAULT_PROTOCOL + + ":" + + data.getHostname() + + "/" + + data.getSnmpProtocolData().getPort()); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpProvider.java b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpProvider.java new file mode 100755 index 0000000..928e255 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpProvider.java @@ -0,0 +1,114 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.exception.entity.SnmpInitializationException; +import io.gec.raw.connector.snmp.common.domain.SnmpConnectionType; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; +import org.snmp4j.*; +import org.snmp4j.mp.MPv1; +import org.snmp4j.mp.MPv2c; +import org.snmp4j.mp.MPv3; +import org.snmp4j.security.*; +import org.snmp4j.smi.*; +import org.snmp4j.transport.AbstractTransportMapping; +import org.snmp4j.transport.DefaultTcpTransportMapping; +import org.snmp4j.transport.DefaultUdpTransportMapping; +import org.snmp4j.util.MultiThreadedMessageDispatcher; +import org.snmp4j.util.ThreadPool; + +import java.io.IOException; +import java.util.EnumMap; +import java.util.Map; +import java.util.Objects; + +import static io.gec.raw.connector.config.entity.SnmpConnectionTypesConfig.Connection; + +@ApplicationScoped +public class SnmpProvider { + + @Inject + Logger logger; + @Inject + SnmpConfig snmpConfig; + + private final Map snmpMap = new EnumMap<>(SnmpConnectionType.class); + + public Snmp getSnmp(SnmpConnectionType snmpType) throws SnmpInitializationException { + return snmpMap.computeIfAbsent(snmpType, type -> { + try { + AbstractTransportMapping transportMapping; + + if (Objects.requireNonNull(type) == SnmpConnectionType.TRAP_RECEIVER) { + Connection connection = snmpConfig.getSnmpConnectionTypesConfig().connectionTypes().get(type.getName()); + transportMapping = toTransportMapping(connection); + } else { + transportMapping = new DefaultUdpTransportMapping(); + } + + return initialize(transportMapping); + } catch (Exception exception) { + String message = String.format("There was some problem while initializing for: %s", snmpType.toString()); + throw new SnmpInitializationException(message, exception); + } + }); + } + + private AbstractTransportMapping toTransportMapping(Connection connection) throws IOException { + String protocol = connection.protocol(); + String hostname = connection.hostname(); + int port = connection.port(); + + switch (protocol.toLowerCase().trim()) { + case "udp" -> { + return new DefaultUdpTransportMapping(new UdpAddress(hostname + "/" + port)); + } + case "tcp" -> { + return new DefaultTcpTransportMapping(new TcpAddress(hostname + "/" + port)); + } + default -> { + return new DefaultUdpTransportMapping(); + } + } + } + + private Snmp initialize(AbstractTransportMapping transportMapping) throws IOException { + MessageDispatcher multiThreadedMessageDispatcher = getMessageDispatcher(); + Snmp snmp = new Snmp(multiThreadedMessageDispatcher, transportMapping); + + SecurityProtocols securityProtocols = SecurityProtocols.getInstance(); + securityProtocols.addAuthenticationProtocol(new AuthMD5()); + securityProtocols.addAuthenticationProtocol(new AuthSHA()); + securityProtocols.addPrivacyProtocol(new Priv3DES()); + SecurityProtocols.getInstance().addDefaultProtocols(); + + OctetString localEngineID = new OctetString(MPv3.createLocalEngineID()); + USM usm = new USM(securityProtocols, localEngineID, 0); + usm.setEngineDiscoveryEnabled(true); + + SecurityModels.getInstance().addSecurityModel(usm); + snmp.listen(); + + return snmp; + } + + private MessageDispatcher getMessageDispatcher() { + ThreadPool threadPool = ThreadPool.create("SnmpMessageDispatcherPoolSize", snmpConfig.getMessageDispatcherPoolSize()); + MessageDispatcher multiThreadedMessageDispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl()); + multiThreadedMessageDispatcher.addCommandResponder(getCommandResponder()); + multiThreadedMessageDispatcher.addMessageProcessingModel(new MPv2c()); + multiThreadedMessageDispatcher.addMessageProcessingModel(new MPv1()); + multiThreadedMessageDispatcher.addMessageProcessingModel(new MPv3()); + return multiThreadedMessageDispatcher; + } + + private CommandResponder getCommandResponder() { + return new CommandResponder() { + @Override + public void processPdu(CommandResponderEvent commandResponderEvent) { + logger.trace(commandResponderEvent.toString()); + } + }; + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpService.java b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpService.java new file mode 100755 index 0000000..d18cc86 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpService.java @@ -0,0 +1,144 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.discovery.control.DeviceDiscoveryProtocolService; +import io.gec.raw.connector.snmp.common.domain.SnmpGetJob; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.common.domain.SnmpRequestData; +import io.gec.raw.connector.statistic.control.StatisticCollectorController; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; +import org.snmp4j.PDU; +import org.snmp4j.event.ResponseEvent; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.VariableBinding; + +import java.util.Optional; +import java.util.UUID; +import java.util.function.Consumer; + +@ApplicationScoped +public class SnmpService { + private static final String NO_SUCH_INSTANCE = "noSuchInstance"; + private static final Integer NO_RESPONSE_FROM_DEVICE_MESSAGE_CODE = 99; + + @Inject + Logger logger; + @Inject + StatisticCollectorController statisticCollectorController; + @Inject + SnmpMessageSender snmpMessageSender; + @Inject + SnmpHelper snmpHelper; + @Inject + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + @Inject + SnmpTimeouts snmpTimeouts; + @Inject + DeviceDiscoveryProtocolService deviceDiscoveryProtocolService; + + public Optional snmpGet(UUID deviceId, String oid) { + var deviceProtocolData = deviceDiscoveryProtocolService.findDeviceDiscoveryProtocolData(deviceId); + var snmpGetJob = new SnmpGetJob(deviceProtocolData.deviceIP(), oid); + var snmpMessageData = discoveryWorkItemToDiscoveryDataMapper.toSnmpGetMessageData(snmpGetJob, deviceProtocolData.snmpProtocolData()); + + return this.snmpGet(snmpMessageData); + } + + public Optional snmpGet(SnmpMessageData snmpMessageData) { + Optional result = Optional.empty(); + + try { + SnmpRequestData snmpRequestData = SnmpRequestData.builder() + .snmpMessage(PDU.GET) + .snmpMessageData(snmpMessageData) + .timeoutData(snmpTimeouts.getSnmpGetTimeoutData()) + .build(); + ResponseEvent
responseEvent = snmpMessageSender.sendSnmpMessage(snmpRequestData); + + if (responseEvent.getResponse() != null) { + PDU responsePDU = responseEvent.getResponse(); + String responseStatus = responsePDU.getErrorStatusText(); + result = getResult(responsePDU); + logger.debug(String.format("Snmp.GET message result: %s", responseStatus)); + } + + } catch (Exception e) { + String message = String.format("Exception while sending Snmp.GET message: %s", e.getMessage()); + logger.error(message, e); + } + + return result; + } + + public PDU snmpGetPDU(SnmpMessageData snmpMessageData) { + try { + SnmpRequestData snmpRequestData = SnmpRequestData.builder() + .snmpMessage(PDU.GET) + .snmpMessageData(snmpMessageData) + .timeoutData(snmpTimeouts.getSnmpGetTimeoutData()) + .build(); + ResponseEvent
responseEvent = snmpMessageSender.sendSnmpMessage(snmpRequestData); + PDU pdu = responseEvent.getResponse(); + + return pdu; + } catch (Exception e) { + logger.errorv("Exception while sending Snmp.GET message: {0}", e.getMessage()); + return null; + } + } + + public Optional snmpSet(SnmpMessageData snmpMessageData) { + logger.debug("Starting SNMP-SET for: \n IP Address: " + snmpMessageData.getHostname() + "\n" + + " Port: " + snmpMessageData.getSnmpProtocolData().getPort() + "\n" + + " Community: " + snmpMessageData.getSnmpProtocolData().getWriteCommunity() + "\n" + + " OID: " + snmpMessageData.getVariableBindings().stream().findFirst().get().getOid().toString() + "\n" + + " Value: " + snmpMessageData.getVariableBindings().stream().findFirst().get().getVariable().toString()); + + try { + SnmpRequestData snmpRequestData = SnmpRequestData.builder() + .snmpMessage(PDU.SET) + .snmpMessageData(snmpMessageData) + .timeoutData(snmpTimeouts.getSnmpSetTimeoutData()) + .build(); + ResponseEvent
responseEvent = snmpMessageSender.sendSnmpMessage(snmpRequestData); + + return processResponse(responseEvent); + + } catch (Exception ex) { + logger.errorv(ex, "Exception while sending Snmp.GET message: {0}", ex.getMessage()); + } + + return Optional.empty(); + } + + private Optional processResponse(ResponseEvent
responseEvent) { + PDU pdu = responseEvent.getResponse(); + if (pdu == null) { + logger.debug("Error while sending Snmp.SET message: PDU is null!"); + String errorMessage = toErrorMessage(NO_RESPONSE_FROM_DEVICE_MESSAGE_CODE, "No response from device"); + return Optional.of(errorMessage); + } + + int errorStatus = pdu.getErrorStatus(); + if (errorStatus == PDU.noError) { + logger.debugv("Snmp Set Response = {0}", pdu.getVariableBindings()); + return Optional.empty(); + } + + logger.debugv("Error while sending Snmp.SET message: {0}", pdu.getErrorStatusText()); + String errorMessage = toErrorMessage(pdu.getErrorStatus(), pdu.getErrorStatusText()); + return Optional.of(errorMessage); + } + + private String toErrorMessage(int code, String message) { + return String.format("%s:%s", code, message); + } + + private Optional getResult(PDU responsePDU) { + return responsePDU.getVariableBindings().stream() + .findFirst() + .map(VariableBinding::toValueString) + .map(value -> NO_SUCH_INSTANCE.equals(value) ? null : value); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpTimeouts.java b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpTimeouts.java new file mode 100755 index 0000000..661dee5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpTimeouts.java @@ -0,0 +1,37 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.snmp.common.domain.SnmpTimeoutData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +@ApplicationScoped +public class SnmpTimeouts { + + @Inject + SnmpConfig snmpConfig; + + public SnmpTimeoutData getInitialGetTimeoutData() { + int requestRetries = snmpConfig.getDiscoveryInitialGetRetries(); + Long requestTimeout = snmpConfig.getDiscoveryInitialGetTimeout(); + return SnmpTimeoutData.of(requestRetries, requestTimeout); + } + + public SnmpTimeoutData getBulkGetTimeoutData() { + int requestRetries = snmpConfig.getDiscoveryBulkGetRetries(); + Long requestTimeout = snmpConfig.getDiscoveryBulkGetTimeout(); + return SnmpTimeoutData.of(requestRetries, requestTimeout); + } + + public SnmpTimeoutData getSnmpGetTimeoutData() { + int requestRetries = snmpConfig.getDiscoveryGetRetries(); + Long requestTimeout = snmpConfig.getDiscoveryGetTimeout(); + return SnmpTimeoutData.of(requestRetries, requestTimeout); + } + + public SnmpTimeoutData getSnmpSetTimeoutData() { + int requestRetries = snmpConfig.getDiscoverySetRetries(); + Long requestTimeout = snmpConfig.getDiscoverySetTimeout(); + return SnmpTimeoutData.of(requestRetries, requestTimeout); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpWalk.java b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpWalk.java new file mode 100755 index 0000000..3ecedfd --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/control/SnmpWalk.java @@ -0,0 +1,213 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.job.domain.ProcessingCanceledException; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.common.domain.SnmpRequestData; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.Logger; +import org.snmp4j.PDU; +import org.snmp4j.event.ResponseEvent; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.Integer32; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.VariableBinding; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; + +@ApplicationScoped +public class SnmpWalk { + + private final SnmpMessageSender snmpMessageSender; + private final DiscoveryDataToSnmpMapper mapper; + private final IPAddressHelper ipAddressHelper; + private final SnmpHelper snmpHelper; + private final Logger logger; + private final SnmpTimeouts snmpTimeouts; + + public SnmpWalk(SnmpMessageSender snmpMessageSender, + DiscoveryDataToSnmpMapper mapper, + IPAddressHelper ipAddressHelper, + SnmpHelper snmpHelper, + Logger logger, + SnmpTimeouts snmpTimeouts) { + this.snmpMessageSender = snmpMessageSender; + this.mapper = mapper; + this.ipAddressHelper = ipAddressHelper; + this.snmpHelper = snmpHelper; + this.logger = logger; + this.snmpTimeouts = snmpTimeouts; + } + + public DeviceOidValueMap collectDeviceOidValueMap(SnmpMessageData snmpMessageData, ProcessingCancellationChecker processingCancellationChecker) + throws ProcessingCanceledException { + + DeviceOidValueMap deviceOidValueMap = new DeviceOidValueMap(); + List variableBindings = collectVariableBindings(snmpMessageData, processingCancellationChecker); + + variableBindings.forEach(variableBinding -> { + String stringOid = snmpHelper.oidToString(variableBinding); + deviceOidValueMap.put(stringOid, variableBinding.getVariable()); + }); + + return deviceOidValueMap; + } + + public List collectVariableBindings(SnmpMessageData snmpMessageData, ProcessingCancellationChecker processingCancellationChecker) + throws ProcessingCanceledException { + + List variableBindings = new ArrayList<>(); + + logger.debugv("Starting Snmp Walk for snmp data: {0}", snmpMessageData); + + try { + ipAddressHelper.validateIP(snmpMessageData.getHostname()); + } catch (ParseException e) { + logger.warn(String.format("Hostname validation error, hostname: %s", snmpMessageData.getHostname())); + return List.of(); + } + + Optional rootOid = getFirstOid(snmpMessageData); + if (rootOid.isEmpty()) { + logger.warn("There is no root OID!"); + return List.of(); + } + + PDU pdu = mapper.toPDU(snmpMessageData.getSnmpProtocolData()); + pdu.setVariableBindings(snmpMessageData.getVariableBindings()); + + try { + Optional lastVariableBinding; + + // -------START OF FIRST OID------- + ResponseEvent
responseEvent = getFirstResponseEvent(snmpMessageData, pdu); + PDU responsePdu = responseEvent.getResponse(); + + if (responsePdu == null) { + logger.debug("Response for first get is null!"); + return List.of(); + } + + if (responsePdu.getType() == PDU.REPORT) { + logger.error("There was SNMPv3 authentication error!"); + return List.of(); + } + + if (responsePdu.size() > 0) { + lastVariableBinding = Optional.ofNullable(responsePdu.get(0)); + } else { + return List.of(); + } + + //INFO: Set up the variable binding for the next entry. + lastVariableBinding.ifPresent(variableBinding -> { + variableBindings.add(variableBinding); + setupPduVariableBinding(pdu, variableBinding); + }); + //INFO: END OF FIRST OID + + walkThroughWholeTree( + snmpMessageData, + pdu, + getPduResponseCallback(variableBindings, snmpMessageData), + rootOid.get(), + processingCancellationChecker); + } catch (ProcessingCanceledException pce) { + throw pce; + } catch (Exception e) { + logger.error(e.getMessage()); + } + + return variableBindings; + } + + private Optional getFirstOid(SnmpMessageData snmpMessageData) { + return snmpMessageData.getVariableBindings().stream() + .findFirst() + .map(VariableBinding::getOid); + } + + private ResponseEvent
getFirstResponseEvent(SnmpMessageData snmpMessageData, PDU pdu) { + return snmpMessageSender.sendSnmpMessage(SnmpRequestData.builder() + .snmpMessage(PDU.GETNEXT) + .pdu(Optional.of(pdu)) + .snmpMessageData(snmpMessageData) + .timeoutData(snmpTimeouts.getInitialGetTimeoutData()) + .build()); + } + + private void walkThroughWholeTree(SnmpMessageData snmpMessageData, + PDU pdu, + Consumer callback, + OID rootOid, + ProcessingCancellationChecker processingCancellationChecker) throws ProcessingCanceledException { + boolean finished = false; + + while (!finished) { + + if (processingCancellationChecker.isProcessingCanceled()) { + throw new ProcessingCanceledException(); + } + + Optional lastVariableBinding; + + ResponseEvent
responseEvent = snmpMessageSender.sendSnmpMessage(SnmpRequestData.builder() + .snmpMessage(mapper.toSnmpDiscoveryMessage(snmpMessageData.getSnmpProtocolData().getSnmpVersion())) + .pdu(Optional.of(pdu)) + .snmpMessageData(snmpMessageData) + .timeoutData(snmpTimeouts.getBulkGetTimeoutData()) + .build()); + Optional responsePdu = Optional.ofNullable(responseEvent.getResponse()); + + if (responsePdu.isPresent()) { + callback.accept(responsePdu.get()); + } else { + logger.debugv("Can not find last variable binding, Pdu is empty"); + } + + lastVariableBinding = findLastVariableBinding(responsePdu); + + if (lastVariableBinding.isPresent() && responsePdu.isPresent()) { + finished = snmpHelper.checkWalkFinished(rootOid, responsePdu.get(), lastVariableBinding.get()); + if (!finished) { + setupPduVariableBinding(pdu, lastVariableBinding.get()); + } + } + } + } + + private Consumer getPduResponseCallback(List variableBindings, SnmpMessageData snmpMessageData) { + return receivedPdu -> { + variableBindings.addAll(receivedPdu.getVariableBindings()); + + if (isVariableBindingsSizePrintAllowed(variableBindings)) { + logger.debug("Size of list for ip " + snmpMessageData.getHostname() + " = " + variableBindings.size()); + } + }; + } + + private boolean isVariableBindingsSizePrintAllowed(List variableBindings) { + return !variableBindings.isEmpty() && variableBindings.size() % 50 == 0; + } + + private Optional findLastVariableBinding(Optional responsePdu) { + return responsePdu.flatMap(pdu -> { + List variableBindings = pdu.getVariableBindings(); + if (!variableBindings.isEmpty()) { + return Optional.of(pdu.get(variableBindings.size() - 1)); + } + return Optional.empty(); + }); + } + + private void setupPduVariableBinding(PDU pdu, VariableBinding lastVariableBinding) { + pdu.setRequestID(new Integer32(0)); + pdu.set(0, lastVariableBinding); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpConnectionType.java b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpConnectionType.java new file mode 100755 index 0000000..82d8869 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpConnectionType.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.snmp.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; + +@Getter +@AllArgsConstructor +@ToString +public enum SnmpConnectionType { + + TRAP_RECEIVER("traps"), + COMMAND_SENDER("commands"); + + private final String name; +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpGetJob.java b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpGetJob.java new file mode 100755 index 0000000..f270f2c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpGetJob.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.snmp.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +@AllArgsConstructor +public class SnmpGetJob { + + private String ipAddress; + private String oid; +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpGetJobData.java b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpGetJobData.java new file mode 100755 index 0000000..6c974fe --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpGetJobData.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.snmp.common.domain; + +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class SnmpGetJobData { + + private DeviceProperty property; + private DiscoveryWorkItemDTO discoveryWorkItem; + private Device rootDevice; +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpMessageData.java b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpMessageData.java new file mode 100755 index 0000000..e1329b2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpMessageData.java @@ -0,0 +1,24 @@ +package io.gec.raw.connector.snmp.common.domain; + +import lombok.Builder; +import lombok.Builder.Default; +import lombok.Getter; +import lombok.NonNull; +import lombok.ToString; +import org.snmp4j.smi.VariableBinding; + +import java.util.ArrayList; +import java.util.List; + +@Builder(toBuilder = true) +@Getter +@ToString +public class SnmpMessageData { + + @Default + private final List variableBindings = new ArrayList<>(); + @NonNull + private final String hostname; + @NonNull + private final SnmpProtocolData snmpProtocolData; +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpProtocolData.java b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpProtocolData.java new file mode 100755 index 0000000..9e531c5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpProtocolData.java @@ -0,0 +1,27 @@ +package io.gec.raw.connector.snmp.common.domain; + +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import lombok.Builder; +import lombok.Builder.Default; +import lombok.Getter; +import lombok.NonNull; +import lombok.ToString; + +import java.util.Optional; + +@Builder +@Getter +@ToString +public class SnmpProtocolData { + + @NonNull + private final Integer port; + @Default + private final Optional writeCommunity = Optional.empty(); + @Default + private final Optional readCommunity = Optional.empty(); + @NonNull + private final SnmpVersionEnum snmpVersion; + @Default + private final Optional snmpV3Data = Optional.empty(); +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpRequestData.java b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpRequestData.java new file mode 100755 index 0000000..fd4c9fa --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpRequestData.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.snmp.common.domain; + +import lombok.Builder; +import lombok.Builder.Default; +import lombok.Getter; +import lombok.NonNull; +import org.snmp4j.PDU; + +import java.util.Optional; + +@Builder +@Getter +public class SnmpRequestData { + + @NonNull + private final Integer snmpMessage; + @Default + private final Optional pdu = Optional.empty(); //TODO: check if there is a need to return immutable version in getter + @NonNull + private final SnmpMessageData snmpMessageData; + @Default + private final SnmpTimeoutData timeoutData = SnmpTimeoutData.of(0, 200L); +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpTimeoutData.java b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpTimeoutData.java new file mode 100755 index 0000000..da0237c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpTimeoutData.java @@ -0,0 +1,13 @@ +package io.gec.raw.connector.snmp.common.domain; + +import lombok.NonNull; +import lombok.Value; + +@Value(staticConstructor = "of") +public class SnmpTimeoutData { + + @NonNull + Integer requestRetries; + @NonNull + Long requestTimeout; +} diff --git a/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpV3Data.java b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpV3Data.java new file mode 100755 index 0000000..f0a9110 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/common/domain/SnmpV3Data.java @@ -0,0 +1,30 @@ +package io.gec.raw.connector.snmp.common.domain; + +import io.gec.raw.connector.protocol.domain.AuthenticationProtocolEnum; +import io.gec.raw.connector.protocol.domain.PrivacyAlgorithmEnum; +import io.gec.raw.connector.protocol.domain.SecurityLevelEnum; +import lombok.Builder; +import lombok.Builder.Default; +import lombok.Value; + +import java.util.Optional; + +@Builder +@Value +public class SnmpV3Data { + + @Default + Optional securityName = Optional.empty(); + @Default + Optional securityLevel = Optional.empty(); + @Default + Optional authenticationProtocol = Optional.empty(); + @Default + Optional authenticationPassphrase = Optional.empty(); + @Default + Optional privacyAlgorithm = Optional.empty(); + @Default + Optional privacyPasssphrase = Optional.empty(); + @Default + Optional contextName = Optional.empty(); +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/control/PropertyTrapProcessor.java b/src/main/java/io/gec/raw/connector/snmp/traps/control/PropertyTrapProcessor.java new file mode 100755 index 0000000..dc92dd9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/control/PropertyTrapProcessor.java @@ -0,0 +1,32 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.snmp.traps.domain.PropertyTrapContent; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.smi.Address; + +import java.util.Optional; + +@ApplicationScoped +public class PropertyTrapProcessor { + @Inject + Logger logger; + @Inject + TrapContentHandler trapContentHandler; + @Inject + TrapContentMapper trapContentMapper; + + @ActivateRequestContext + public void processPropertyTrap(CommandResponderEvent commandResponderEvent) { + Optional trapContentOpt = trapContentMapper.toTrapContentWithProperty(commandResponderEvent); + + if (trapContentOpt.isEmpty()) { + logger.warnv("Some required data could not be extracted from the trap!"); + return; + } + trapContentHandler.updatePropertyStatus(trapContentOpt.get()); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapContentHandler.java b/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapContentHandler.java new file mode 100755 index 0000000..f86ebea --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapContentHandler.java @@ -0,0 +1,108 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.device.enums.RittalDevicePropertyNameEnum; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyHandler; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyMapper; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.snmp.traps.domain.PropertyTrapContent; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapData; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.control.VariableHandler; +import io.gec.raw.connector.variable.control.VariableMapper; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.*; + +@ApplicationScoped +public class TrapContentHandler { + + @Inject + VariableController variableController; + @Inject + DevicePropertyController devicePropertyController; + @Inject + DevicePropertyMapper devicePropertyMapper; + @Inject + IPAddressHelper ipAddressHelper; + @Inject + VariableHandler variableHandler; + @Inject + DevicePropertyHandler devicePropertyHandler; + @Inject + VariableMapper variableMapper; + @Inject + DeviceController deviceController; + @Inject + Logger logger; + + public void updateVariableStatus(VariableTrapData variableData) { + String value = String.valueOf(variableData.getStatusValue().getValue()); + List variables = variableController.findByValueAsIntOid(variableData.getValueAsIntOid()); + + if (variables.isEmpty()) { + logger.warnf("No matching Variables found for OID %s", variableData.getValueAsIntOid()); + } else if (variables.size() == 1) { + Variable statusVariable = variables.getFirst(); + updateStatusVariableValue(statusVariable, value); + } else { + findMatchingStatusVariable(variableData.getIpAddress(), variables) + .ifPresentOrElse(statusVariable -> updateStatusVariableValue(statusVariable, value), + () -> logger.warnf("No matching device IP found for submitted IP %s", variableData.getIpAddress())); + } + } + + private Optional findMatchingStatusVariable(String ipAddress, List variables) { + return variables.stream() + .filter(variable -> isRelatedToDeviceWithIPAddress(variable, ipAddress)) + .findFirst(); + } + + private boolean isRelatedToDeviceWithIPAddress(Variable variable, String ipAddress) { + Device device = deviceController.getDeviceById(variable.getDeviceId()); + Device rootDevice = deviceController.getRootDevice(device); + String rootDeviceIp = ipAddressHelper.removeHttpFromIpAddress(rootDevice.getDeviceURL()); + return Objects.equals(ipAddress, rootDeviceIp); + } + + private void updateStatusVariableValue(Variable statusVariable, String value) { + VariableValueData variableValueData = variableMapper.toVariableValueData(value, QualityType.GOOD); + variableHandler.handleVariableValueFetchedFromDevice(statusVariable, variableValueData); + } + + public void updatePropertyStatus(PropertyTrapContent propertyTrapContent) { + Device device = findDeviceByDeviceIndex(propertyTrapContent.getIpAddress(), propertyTrapContent.getDeviceIndex()); + List deviceProperties = devicePropertyController.findByDeviceId(device.getId()); + + Map.of(RittalDevicePropertyNameEnum.STATUS_TEXT, propertyTrapContent.getStatusText(), + RittalDevicePropertyNameEnum.STATUS, String.valueOf(propertyTrapContent.getStatusValue())) + .forEach((devicePropertyNameEnum, propertyValue) -> updateDeviceProperty(devicePropertyNameEnum, propertyValue, deviceProperties, device.getId())); + } + + private void updateDeviceProperty(RittalDevicePropertyNameEnum devicePropertyNameEnum, String propertyValue, List deviceProperties, UUID deviceId) { + Optional deviceProperty = devicePropertyController.findByName(deviceProperties, devicePropertyNameEnum.getLabel()); + deviceProperty.ifPresentOrElse(property -> updateDeviceProperty(property, propertyValue), + () -> logger.warnf("No matching property found for Device with ID: %s and propertyName: %s", deviceId, devicePropertyNameEnum.getLabel())); + } + + private void updateDeviceProperty(DeviceProperty deviceProperty, String value) { + devicePropertyHandler.handleDevicePropertyValue(deviceProperty, value); + devicePropertyController.updateDeviceProperty(deviceProperty); + } + + private Device findDeviceByDeviceIndex(String ipAddress, int deviceIndex) { + Optional rootDeviceIdOpt = deviceController.findDeviceIdByDeviceUrl(ipAddress); + if (rootDeviceIdOpt.isEmpty()) { + throw new IllegalArgumentException("No root device found for IP address: " + ipAddress); + } + return deviceController.getDeviceByDeviceIndex(rootDeviceIdOpt.get(), deviceIndex); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapContentMapper.java b/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapContentMapper.java new file mode 100755 index 0000000..fb47118 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapContentMapper.java @@ -0,0 +1,92 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import io.gec.raw.connector.snmp.common.control.SnmpHelper; +import io.gec.raw.connector.snmp.traps.domain.PropertyTrapContent; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapContent; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.PDU; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.VariableBinding; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +@ApplicationScoped +public class TrapContentMapper { + + @Inject + VariableBindingParser variableBindingParser; + @Inject + SnmpHelper snmpHelper; + + public Optional toTrapContentWithVariable(CommandResponderEvent commandResponderEvent) { + PDU pdu = commandResponderEvent.getPDU(); + List variableBindings = pdu.getVariableBindings(); + + Optional ipAddress = snmpHelper.getIpAddress(commandResponderEvent); + Optional deviceIndex = variableBindingParser.getLastOidFromVariableBinding(variableBindings, RittalMibVariable.CMC_III_DEV_NAME); + Optional variableIndex = variableBindingParser.getLastOidFromVariableBinding(variableBindings, RittalMibVariable.CMC_III_MSG_TEXT); + Optional variableName = variableBindingParser.getVariableStringValue(variableBindings, RittalMibVariable.CMC_III_MSG_TEXT); + Optional statusValue = variableBindingParser.getVariableIntValue(variableBindings, RittalMibVariable.CMC_III_MSG_STATUS) + .flatMap(ValuesSnmpVarStatus::from); + Optional statusText = variableBindingParser.getVariableStringValue(variableBindings, RittalMibVariable.CMC_III_MSG_STATUS_TEXT); + + if (Stream.of(ipAddress, deviceIndex, variableIndex, variableName, statusValue, statusText).anyMatch(Optional::isEmpty)) { + return Optional.empty(); + } + + return Optional.of(VariableTrapContent.builder() + .ipAddress(ipAddress.get()) + .deviceIndex(deviceIndex.get()) + .variableIndex(variableIndex.get()) + .variableName(variableName.get()) + .statusValue(statusValue.get()) + .statusText(statusText.get()) + .build()); + } + + public Optional toTrapContentWithProperty(CommandResponderEvent commandResponderEvent) { + PDU pdu = commandResponderEvent.getPDU(); + List variableBindings = pdu.getVariableBindings(); + + Optional ipAddress = snmpHelper.getIpAddress(commandResponderEvent); + Optional deviceIndex = variableBindingParser.getLastOidFromVariableBinding(variableBindings, RittalMibVariable.CMC_III_DEV_NAME); + Optional statusValue = variableBindingParser.getVariableIntValue(variableBindings, RittalMibVariable.CMC_III_DEV_STATUS); + Optional statusText = variableBindingParser.getVariableStringValue(variableBindings, RittalMibVariable.CMC_III_DEV_STATUS_TEXT); + + if (Stream.of(ipAddress, deviceIndex, statusValue, statusText).anyMatch(Optional::isEmpty)) { + return Optional.empty(); + } + + return Optional.of(PropertyTrapContent.builder() + .ipAddress(ipAddress.get()) + .deviceIndex(deviceIndex.get()) + .statusValue(statusValue.get()) + .statusText(statusText.get()) + .build()); + } + + public VariableTrapData toVariableData(String ipAddress, VariableTrapContent variableTrapContent, String varIdx) { + String valueAsIntOid = toValueAsIntOid(variableTrapContent.getDeviceIndex(), varIdx); + + return VariableTrapData.builder() + .ipAddress(ipAddress) + .valueAsIntOid(valueAsIntOid) + .statusValue(variableTrapContent.getStatusValue()) + .build(); + } + + private String toValueAsIntOid(Integer deviceIndex, String variableIndex) { + OID cmcIIIVarValueIntOid = new OID(RittalMibVariable.CMC_III_VAR_VALUE_INT.getOid()); + OID valueAsIntOid = cmcIIIVarValueIntOid.append(deviceIndex) + .append(variableIndex); + return "." + valueAsIntOid; + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapReceiver.java b/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapReceiver.java new file mode 100755 index 0000000..a1f35ba --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/control/TrapReceiver.java @@ -0,0 +1,117 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.exception.entity.SnmpInitializationException; +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.snmp.common.control.SnmpProvider; +import io.gec.raw.connector.snmp.common.domain.SnmpConnectionType; +import io.gec.raw.connector.snmp.traps.domain.TrapType; +import io.quarkus.runtime.ShutdownEvent; +import io.quarkus.runtime.StartupEvent; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; +import org.snmp4j.*; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.OID; + +import java.io.IOException; +import java.util.Optional; + +@ApplicationScoped +public class TrapReceiver implements CommandResponder { + + public static final String TRAP_CONTENT_BREAK_LINE_REGEX = ",|;\\s"; + + @Inject + SnmpProvider snmpProvider; + @Inject + Logger logger; + @Inject + VariableTrapProcessor variableTrapProcessor; + @Inject + PropertyTrapProcessor propertyTrapProcessor; + + Snmp snmp; + + void init(@Observes StartupEvent unused) { + logger.debug("Starting..."); + try { + this.snmp = snmpProvider.getSnmp(SnmpConnectionType.TRAP_RECEIVER); + this.snmp.addCommandResponder(this); + } catch (SnmpInitializationException exception) { + logger.error("Error while initializing receiver", exception); + } + } + + void destroy(@Observes ShutdownEvent unused) { + try { + logger.debug("Exiting..."); + if (this.snmp != null) { + this.snmp.close(); + } + } catch (IOException e) { + logger.error("Error while closing receiver..."); + } + } + + @Override + public void processPdu(CommandResponderEvent commandResponderEvent) { + PDU pdu = commandResponderEvent.getPDU(); + logger.infov("Received trap message, dispatching to trap processors... Trap content: \n{0}", formatTrapContent(pdu)); + + if (pdu.getErrorStatus() == PDU.noError) { + Optional trapOid = toTrapOid(pdu); + trapOid.flatMap(TrapType::fromOID) + .ifPresentOrElse(trapType -> { + switch (trapType) { + case VARIABLE_TRAP: + variableTrapProcessor.processVariableTrap(commandResponderEvent); + break; + case PROPERTY_TRAP: + propertyTrapProcessor.processPropertyTrap(commandResponderEvent); + break; + default: + logger.debug("Received trap of not supported type:" + trapType.getName()); + } + }, + () -> logger.debug("This trap format is not supported, requestID: " + pdu.getRequestID().toString())); + } else { + logger.warnv("Received trap contains an error: {0}", pdu.getErrorStatusText()); + } + } + + private String formatTrapContent(PDU pdu) { + return pdu.toString().replaceAll(TRAP_CONTENT_BREAK_LINE_REGEX, "\n\t"); + } + + private Optional toTrapOid(PDU pdu) { + int pduType = pdu.getType(); + + switch (pduType) { + case PDU.V1TRAP -> { + return getV1TrapOid((PDUv1) pdu); + } + case PDU.TRAP -> { + return getV2TrapOid(pdu); + } + default -> { + logger.warnv("Received PDU of type: {0} is not supported", pduType); + return Optional.empty(); + } + } + } + + private Optional getV1TrapOid(PDUv1 pdu) { + int specificTrap = pdu.getSpecificTrap(); + OID trapOid = pdu.getEnterprise(); + trapOid.append(0); //TODO replace by constant var with meaningful name + trapOid.append(specificTrap); + return Optional.of(trapOid); + } + + private Optional getV2TrapOid(PDU pdu) { + return Optional.ofNullable((OID) pdu.getVariable(RittalMibVariable.SNMP_TRAP_OID.getOid())); + } +} + diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableBindingParser.java b/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableBindingParser.java new file mode 100755 index 0000000..71ac45d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableBindingParser.java @@ -0,0 +1,38 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import jakarta.enterprise.context.ApplicationScoped; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.Variable; +import org.snmp4j.smi.VariableBinding; + +import java.util.List; +import java.util.Optional; + +@ApplicationScoped +public class VariableBindingParser { + + public Optional getVariableStringValue(List variableBindings, RittalMibVariable mibVariable) { + return variableBindings.stream() + .filter(variableBinding -> variableBinding.getOid().startsWith(mibVariable.getOid())) + .map(VariableBinding::getVariable) + .map(Variable::toString) + .findFirst(); + } + + public Optional getVariableIntValue(List variableBindings, RittalMibVariable mibVariable) { + return variableBindings.stream() + .filter(variableBinding -> variableBinding.getOid().startsWith(mibVariable.getOid())) + .map(VariableBinding::getVariable) + .map(Variable::toInt) + .findFirst(); + } + + public Optional getLastOidFromVariableBinding(List variableBindings, RittalMibVariable mibVariable) { + return variableBindings.stream() + .map(VariableBinding::getOid) + .filter(oid -> oid.startsWith(mibVariable.getOid())) + .findFirst() + .map(OID::last); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableStatusValueCache.java b/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableStatusValueCache.java new file mode 100755 index 0000000..5ea6496 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableStatusValueCache.java @@ -0,0 +1,32 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapContent; +import io.quarkus.cache.*; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +@ApplicationScoped +public class VariableStatusValueCache { + + @CacheName("variable-status-value-cache") + Cache cache; + + @CacheResult(cacheName = "variable-status-value-cache") + Object getLastStatusValueInternal(@CacheKey VariableTrapContent trapContent) { + return cache.as(CaffeineCache.class).getIfPresent(trapContent).getNow(null); + } + + public Optional getLastStatusValue(@CacheKey VariableTrapContent trapContent) { + ValuesSnmpVarStatus value = (ValuesSnmpVarStatus) getLastStatusValueInternal(trapContent); + cache.as(CaffeineCache.class).put(trapContent, CompletableFuture.completedFuture(trapContent.getStatusValue())); + + if (value == null || !value.equals(trapContent.getStatusValue())) { + return Optional.empty(); + } + + return Optional.of(trapContent.getStatusValue()); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableTrapProcessor.java b/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableTrapProcessor.java new file mode 100755 index 0000000..dad5d8c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/control/VariableTrapProcessor.java @@ -0,0 +1,99 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapContent; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapData; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.control.ActivateRequestContext; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.OID; + +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class VariableTrapProcessor { + @Inject + Logger logger; + @Inject + SnmpService snmpService; + @Inject + DiscoveryController discoveryController; + @Inject + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + @Inject + TrapContentHandler trapContentHandler; + @Inject + TrapContentMapper trapContentMapper; + @Inject + DeviceController deviceController; + @Inject + VariableStatusValueCache variableStatusValueCache; + + @ActivateRequestContext + public void processVariableTrap(CommandResponderEvent commandResponderEvent) { + Optional trapContentOpt = trapContentMapper.toTrapContentWithVariable(commandResponderEvent); + if (trapContentOpt.isEmpty()) { + logger.warnv("Some required data could not be extracted from the trap!"); + return; + } + + VariableTrapContent variableTrapContent = trapContentOpt.get(); + Optional lastStatusValue = + variableStatusValueCache.getLastStatusValue(variableTrapContent); + + if (lastStatusValue.isEmpty()) { + processTrapContent(variableTrapContent); + } else { + logger.info("Status value is the same as the last one, skipping trap processing"); + } + } + + private void processTrapContent(VariableTrapContent variableTrapContent) { + Optional rootDeviceIdOpt = deviceController.findDeviceIdByDeviceUrl(variableTrapContent.getIpAddress()); + if (rootDeviceIdOpt.isEmpty()) { + return; + } + + Optional dwiDTOOpt = Optional.ofNullable(discoveryController.getDiscoveryWorkItemByDeviceId(rootDeviceIdOpt.get())); + if (dwiDTOOpt.isEmpty()) { + return; + } + + SnmpMessageData snmpMessageData = buildSnmpMessageData(variableTrapContent.getIpAddress(), dwiDTOOpt.get(), variableTrapContent); + Optional msgVarIdxOpt = snmpService.snmpGet(snmpMessageData); + if (msgVarIdxOpt.isEmpty() || msgVarIdxOpt.get().isEmpty()) { + return; + } + + handleSnmpResponse(variableTrapContent, variableTrapContent.getIpAddress(), msgVarIdxOpt.get()); + } + + private SnmpMessageData buildSnmpMessageData(String ipAddress, DiscoveryWorkItemDTO dwiDTO, VariableTrapContent variableTrapContent) { + String oid = new OID(RittalMibVariable.CMC_III_MSG_VAR_IDX.getOid()) + .append(variableTrapContent.getDeviceIndex()) + .append(variableTrapContent.getVariableIndex()) + .toString(); + + return discoveryWorkItemToDiscoveryDataMapper.toSnmpMessageData(ipAddress, dwiDTO, oid); + } + + void handleSnmpResponse(VariableTrapContent variableTrapContent, String ipAddress, String varIdx) { + try { + VariableTrapData variableData = trapContentMapper.toVariableData(ipAddress, variableTrapContent, varIdx); + trapContentHandler.updateVariableStatus(variableData); + } catch (NumberFormatException e) { + logger.errorv("Failed to parse varIdx {0} to Integer for IP {1}", varIdx, ipAddress, e); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/domain/PropertyTrapContent.java b/src/main/java/io/gec/raw/connector/snmp/traps/domain/PropertyTrapContent.java new file mode 100755 index 0000000..cbca07a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/domain/PropertyTrapContent.java @@ -0,0 +1,27 @@ +package io.gec.raw.connector.snmp.traps.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PropertyTrapContent { + + private String ipAddress; + private Integer deviceIndex; + private int statusValue; + private String statusText; + + @Override + public String toString() { + return String.format(""" + \tipAddress: %s + \tdeviceIndex: %s + \tstatusValue: %s + \tstatusText: %s""", ipAddress, deviceIndex, statusValue, statusText); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/domain/TrapType.java b/src/main/java/io/gec/raw/connector/snmp/traps/domain/TrapType.java new file mode 100755 index 0000000..d33cfde --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/domain/TrapType.java @@ -0,0 +1,31 @@ +package io.gec.raw.connector.snmp.traps.domain; + +import lombok.Getter; +import org.snmp4j.smi.OID; + +import java.util.Optional; + +@Getter +public enum TrapType { + + VARIABLE_TRAP("1.3.6.1.4.1.2606.7.0.1", "variableTrap"), + PROPERTY_TRAP("1.3.6.1.4.1.2606.7.0.2", "propertyTrap"); + + private final OID oid; + private final String name; + + TrapType(String oid, String name) { + this.oid = new OID(oid); + this.name = name; + } + + public static Optional fromOID(OID oid) { + for (TrapType trapType : TrapType.values()) { + if (trapType.oid.equals(oid)) { + return Optional.of(trapType); + } + } + + return Optional.empty(); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/domain/VariableTrapContent.java b/src/main/java/io/gec/raw/connector/snmp/traps/domain/VariableTrapContent.java new file mode 100755 index 0000000..53dbfe0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/domain/VariableTrapContent.java @@ -0,0 +1,30 @@ +package io.gec.raw.connector.snmp.traps.domain; + +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import lombok.*; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@EqualsAndHashCode +public class VariableTrapContent { + + private String ipAddress; + private Integer deviceIndex; + private Integer variableIndex; + private String variableName; + private ValuesSnmpVarStatus statusValue; + private String statusText; + + @Override + public String toString() { + return String.format(""" + \tipAddress: %s + \tdeviceIndex: %s + \tvariableIndex: %s + \tvariableName: %s + \tstatusValue: %s + \tstatusText: %s""", ipAddress, deviceIndex, variableIndex, variableName, statusValue.getValue(), statusText); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/traps/domain/VariableTrapData.java b/src/main/java/io/gec/raw/connector/snmp/traps/domain/VariableTrapData.java new file mode 100755 index 0000000..1091403 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/traps/domain/VariableTrapData.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.snmp.traps.domain; + +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class VariableTrapData { + + String ipAddress; + String valueAsIntOid; + ValuesSnmpVarStatus statusValue; +} diff --git a/src/main/java/io/gec/raw/connector/snmp/vardyntable/control/VariableDynamicTableService.java b/src/main/java/io/gec/raw/connector/snmp/vardyntable/control/VariableDynamicTableService.java new file mode 100755 index 0000000..2ae0a00 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/vardyntable/control/VariableDynamicTableService.java @@ -0,0 +1,361 @@ +package io.gec.raw.connector.snmp.vardyntable.control; + +import io.gec.raw.connector.snmp.common.control.DiscoveryDataToSnmpMapper; +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.device.control.DeviceRepository; +import io.gec.raw.connector.job.domain.ProcessingCanceledException; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.device.projection.DeviceParentIdProjection; +import io.gec.raw.connector.device.projection.DeviceURLProjection; +import io.gec.raw.connector.variable.control.VariableHandler; +import io.gec.raw.connector.variable.control.VariableValueTaskScheduler; +import io.gec.raw.connector.variable.entity.Variable; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.snmp.common.control.SnmpWalk; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.snmp.vardyntable.domain.VariableDynamicTableRequestHolder; +import io.gec.raw.connector.snmp.vardyntable.domain.VariableTypeEnum; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; +import org.jboss.logging.Logger; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.VariableBinding; + +import java.util.*; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.*; + +@ApplicationScoped +public class VariableDynamicTableService { + + public static final List NUMERIC_DATATYPES = List.of( + DataTypeEnum.INTEGER, + DataTypeEnum.FLOAT, + DataTypeEnum.NUMERIC, + DataTypeEnum.STATUSINT, + DataTypeEnum.ANALOGINT); + + private static final int DEFAULT_EXCEPTIONAL_POOLING_INTERVAL = 10; + + private final Logger logger; + private final SnmpConfig snmpConfig; + private final SnmpService snmpService; + private final SnmpWalk snmpWalk; + private final DeviceRepository deviceRepository; + private final VariableController variableController; + private final DiscoveryDataToSnmpMapper discoveryDataToSnmpMapper; + private final DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + private final DiscoveryController discoveryController; + private final IPAddressHelper ipAddressHelper; + private final VariableHandler variableHandler; + private final VariableValueTaskScheduler variableValueTaskScheduler; + + private final ScheduledExecutorService executorService; + private final List variableDynamicTableRequestHolders = Collections.synchronizedList(new LinkedList<>()); + + public VariableDynamicTableService(Logger logger, + SnmpConfig snmpConfig, + SnmpService snmpService, + SnmpWalk snmpWalk, + DeviceRepository deviceRepository, + VariableController variableController, + DiscoveryDataToSnmpMapper discoveryDataToSnmpMapper, + DiscoveryController discoveryController, + IPAddressHelper ipAddressHelper, + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper, + VariableHandler variableHandler, + VariableValueTaskScheduler variableValueTaskScheduler) { + this.logger = logger; + this.snmpConfig = snmpConfig; + this.snmpService = snmpService; + this.snmpWalk = snmpWalk; + this.deviceRepository = deviceRepository; + this.variableController = variableController; + this.discoveryDataToSnmpMapper = discoveryDataToSnmpMapper; + this.discoveryController = discoveryController; + this.ipAddressHelper = ipAddressHelper; + this.discoveryWorkItemToDiscoveryDataMapper = discoveryWorkItemToDiscoveryDataMapper; + this.variableHandler = variableHandler; + this.variableValueTaskScheduler = variableValueTaskScheduler; + this.executorService = Executors.newScheduledThreadPool(snmpConfig.getDynamicTablePoolSize()); + } + + public void processVariables(List variables) { + Map> rittalVariablesBySubscribed = variableController + .filterByVendorOid(variables, RittalMibVariable.RITTAL).stream() + .collect(partitioningBy(Variable::isSubscribed)); + + Map> subscribedVariablesByRootDeviceId = toVariablesByRootDeviceId(rittalVariablesBySubscribed.get(true)); + Map> unsubscribedVariablesByRootDeviceId = toVariablesByRootDeviceId(rittalVariablesBySubscribed.get(false)); + + logger.debugv("Found {0} rootDeviceIds for subscribed, {1} rootDeviceIds for unsubscribed", + subscribedVariablesByRootDeviceId.keySet().size(), unsubscribedVariablesByRootDeviceId.keySet().size()); + + subscribedVariablesByRootDeviceId.forEach(this::processSubscribedVariablesForRootDevice); + unsubscribedVariablesByRootDeviceId.forEach(this::processUnsubscribedVariablesForRootDevice); + } + + List getVariableDynamicTableRequestHolders() { + return List.copyOf(variableDynamicTableRequestHolders); + } + + private Map> toVariablesByRootDeviceId(List variables) { + return variables.stream() + .filter(variable -> getDeviceParentId(variable).isPresent()) + .collect(groupingBy(variable -> getDeviceParentId(variable).get(), toList())); + } + + private Optional getDeviceParentId(Variable variable) { + UUID deviceId = variable.getDeviceId(); + + Optional deviceParentIdProjection = deviceRepository.findDeviceParentIdProjection(deviceId); + + while (deviceParentIdProjection.isPresent() && Objects.nonNull(deviceParentIdProjection.get().getParentId())) { + deviceParentIdProjection = deviceRepository.findDeviceParentIdProjection(deviceParentIdProjection.get().getParentId()); + } + + return deviceParentIdProjection.map(DeviceParentIdProjection::getId); + } + + private void processSubscribedVariablesForRootDevice(UUID rootDeviceId, List variables) { + logger.debugv("Processing rootDeviceId: {0} with {1} subscribed variables", rootDeviceId, variables.size()); + + Optional matchingRequestHolder = findMatchingHolder(rootDeviceId); + + Map> variableMapsByType = toVariableMapsByType(variables); + + matchingRequestHolder.ifPresentOrElse( + updateExistingRequestHolder(rootDeviceId, variableMapsByType), + createNewRequestHolder(rootDeviceId, variableMapsByType) + ); + } + + private void processUnsubscribedVariablesForRootDevice(UUID rootDeviceId, List variables) { + logger.debugv("Processing rootDeviceId: {0} with {1} unsubscribed variables", rootDeviceId, variables.size()); + + Map> variableMapsByType = toVariableMapsByType(variables); + Map intVariablesMap = variableMapsByType.get(VariableTypeEnum.INTEGER); + Map stringVariablesMap = variableMapsByType.get(VariableTypeEnum.STRING); + + Optional matchingRequestHolder = findMatchingHolder(rootDeviceId); + + matchingRequestHolder.ifPresent(requestHolder -> { + String intOidsToRemove = String.join(", ", intVariablesMap.keySet().stream().map(OID::toString).collect(toSet())); + String stringOidsToRemove = String.join(", ", stringVariablesMap.keySet().stream().map(OID::toString).collect(toSet())); + + logger.debugv("Count of oid suffixes to remove: {0}", intOidsToRemove.length() + stringOidsToRemove.length()); + logger.debugv("int oid suffixes to remove: {0}", intOidsToRemove); + logger.debugv("string oid suffixes to remove: {0}", stringOidsToRemove); + + requestHolder.getIntVariableUUIDbyOidSuffixes().keySet().removeAll(intVariablesMap.keySet()); + requestHolder.getStringVariableUUIDbyOidSuffixes().keySet().removeAll(stringVariablesMap.keySet()); + + terminateRequestHolderIfNoSubscriptions(rootDeviceId, requestHolder); + }); + } + + private Consumer updateExistingRequestHolder(UUID rootDeviceId, Map> variableMapsByType) { + return requestHolder -> { + logger.debugv("Request holder found for rootDeviceId, adding oid suffixes for rootDeviceId: {0}", rootDeviceId); + + Map intVariablesMap = variableMapsByType.get(VariableTypeEnum.INTEGER); + Map stringVariablesMap = variableMapsByType.get(VariableTypeEnum.STRING); + logger.debugv("Received int variable oid suffixes for subscription: {0}", intVariablesMap.size()); + logger.debugv("Received string variable oid suffixes for subscription: {0}", stringVariablesMap.size()); + + requestHolder.getIntVariableUUIDbyOidSuffixes().putAll(intVariablesMap); + requestHolder.getStringVariableUUIDbyOidSuffixes().putAll(stringVariablesMap); + }; + } + + private Runnable createNewRequestHolder(UUID rootDeviceId, Map> variableMapsByType) { + return () -> { + logger.debugv("Request holder not found for rootDeviceId: {0}, creating new one", rootDeviceId); + + Map intVariablesMap = variableMapsByType.get(VariableTypeEnum.INTEGER); + Map stringVariablesMap = variableMapsByType.get(VariableTypeEnum.STRING); + logger.debugv("Received int variable oid suffixes for subscription: {0}", intVariablesMap.size()); + logger.debugv("Received string variable oid suffixes for subscription: {0}", stringVariablesMap.size()); + + Optional deviceURLProjection = deviceRepository.findDeviceURLProjection(rootDeviceId); + if (deviceURLProjection.isEmpty()) { + logger.errorv("Root device with id: {0} does not have deviceURL attribute assigned! Request requestHolder will not be created", rootDeviceId); + return; + } + String ipAddress = ipAddressHelper.removeHttpFromIpAddress(deviceURLProjection.get().getDeviceURL()); + DiscoveryWorkItemDTO dwiDTO = discoveryController.getDiscoveryWorkItemByDeviceId(rootDeviceId); + + SnmpMessageData snmpMessageData = discoveryWorkItemToDiscoveryDataMapper.toSnmpMessageData(ipAddress, dwiDTO); + + int poolingInterval = getPoolingInterval(snmpMessageData); + logger.debugv("Pooling interval for this request holder: {0}", poolingInterval); + + VariableDynamicTableRequestHolder requestHolder = VariableDynamicTableRequestHolder.builder() + .rootDeviceId(rootDeviceId) + .snmpMessageData(snmpMessageData) + .intVariableUUIDbyOidSuffixes(intVariablesMap) + .stringVariableUUIDbyOidSuffixes(stringVariablesMap) + .build(); + + Runnable action = dynTableRequest(requestHolder); + ScheduledFuture scheduledAction = executorService.scheduleAtFixedRate(action, poolingInterval, poolingInterval, TimeUnit.SECONDS); + requestHolder.setScheduledAction(scheduledAction); + this.variableDynamicTableRequestHolders.add(requestHolder); + }; + } + + Map> toVariableMapsByType(List variables) { + Map> variablesByType = variables.stream() + .filter(variable -> Objects.nonNull(variable.getVarDataType())) + .collect(partitioningBy(variable -> NUMERIC_DATATYPES.contains(variable.getVarDataType()), toList())); + + Map intVariableUUIDbyOidSuffixes = getIntVariableUUIDsOID(variablesByType); + Map stringVariableUUIDByOidSuffixes = getStringVariableUUIDsByOID(variablesByType); + + return Map.of( + VariableTypeEnum.INTEGER, intVariableUUIDbyOidSuffixes, + VariableTypeEnum.STRING, stringVariableUUIDByOidSuffixes + ); + } + + private Map getIntVariableUUIDsOID(Map> variablesByType) { + return variablesByType.get(true).stream() + .filter(variable -> Objects.nonNull(variable.getValueAsIntegerOid())) + .filter(variable -> new OID(variable.getValueAsIntegerOid()).startsWith(RittalMibVariable.CMC_III_VAR_VALUE_INT.getOid())) + .collect(Collectors.toMap(variable -> + new OID(variable.getValueAsIntegerOid()).getSuffix(RittalMibVariable.CMC_III_VAR_VALUE_INT.getOid()), Variable::getId)); + } + + private Map getStringVariableUUIDsByOID(Map> variablesByType) { + return variablesByType.get(false).stream() + .filter(variable -> Objects.nonNull(variable.getValueAsStringOid())) + .filter(variable -> new OID(variable.getValueAsStringOid()).startsWith(RittalMibVariable.CMC_III_VAR_VALUE_STR.getOid())) + .collect(Collectors.toMap(variable -> + new OID(variable.getValueAsStringOid()).getSuffix(RittalMibVariable.CMC_III_VAR_VALUE_STR.getOid()), Variable::getId)); + } + + private void terminateRequestHolderIfNoSubscriptions(UUID rootDeviceId, VariableDynamicTableRequestHolder requestHolder) { + if (requestHolder.getIntVariableUUIDbyOidSuffixes().isEmpty() && requestHolder.getStringVariableUUIDbyOidSuffixes().isEmpty()) { + logger.debugv("No more subscriptions, terminating requestHolder for rootDeviceId: {0}", rootDeviceId); + ScheduledFuture scheduledAction = requestHolder.getScheduledAction(); + if (!scheduledAction.isDone() && !scheduledAction.isCancelled()) { + scheduledAction.cancel(false); + variableDynamicTableRequestHolders.remove(requestHolder); + } + } + } + + private Optional findMatchingHolder(UUID rootDeviceId) { + logger.debugv("Looking for variableDynamicTableRequestHolder, table size: {0}", variableDynamicTableRequestHolders.size()); + logger.debugv("Request holders defined for rootIds: {0}", getRootIdsString()); + logger.debugv("Looking for request holder for rootId: {0}", rootDeviceId.toString()); + return this.variableDynamicTableRequestHolders.stream() + .filter(variableDynamicTableRequestHolder -> variableDynamicTableRequestHolder.getRootDeviceId().equals(rootDeviceId)) + .findFirst(); + } + + private String getRootIdsString() { + return String.join(", ", this.variableDynamicTableRequestHolders.stream() + .map(VariableDynamicTableRequestHolder::getRootDeviceId) + .map(UUID::toString).toList()); + } + + private int getPoolingInterval(SnmpMessageData snmpMessageData) { + SnmpMessageData dynUpdateRateRequest = toMibVariableRequest(snmpMessageData, RittalMibVariable.CMC_III_DYN_UPDATE_RATE); + + int poolingInterval; + try { + poolingInterval = snmpService.snmpGet(dynUpdateRateRequest) + .map(Integer::valueOf) + .orElseGet(snmpConfig::getDynamicTableDefaultPoolingInterval); + } catch (Exception exception) { + logger.warn("There was an error while obtaining pooling interval value. Using exceptional default one.", exception); + poolingInterval = DEFAULT_EXCEPTIONAL_POOLING_INTERVAL; + } + + return poolingInterval; + } + + private List getDynamicTableVariableBindings(SnmpMessageData snmpMessageData, RittalMibVariable tableMibVariable) { + logger.debugv("Dynamic table request for oid: {0}", tableMibVariable.getOid()); + SnmpMessageData dynTableRequest = toMibVariableRequest(snmpMessageData, tableMibVariable); + + List variableBindings = null; + try { + variableBindings = snmpWalk.collectVariableBindings(dynTableRequest, () -> false); + + return variableBindings.stream() + .filter(variableBinding -> variableBinding.getOid().startsWith(tableMibVariable.getOid())) + .toList(); + } catch (ProcessingCanceledException e) { + return Collections.emptyList(); + } + } + + private SnmpMessageData toMibVariableRequest(SnmpMessageData snmpMessageData, RittalMibVariable mibVariable) { + return snmpMessageData.toBuilder() + .variableBindings(discoveryDataToSnmpMapper.toVariableBindings(mibVariable)) + .build(); + } + + private Runnable dynTableRequest(VariableDynamicTableRequestHolder requestHolder) { + return () -> { + try { + Map intVariableOidSuffixes = requestHolder.getIntVariableUUIDbyOidSuffixes(); + Map stringVariableOidSuffixes = requestHolder.getStringVariableUUIDbyOidSuffixes(); + logger.debugv("Dynamic Table request, int variables size: {0}, string variables size: {1}", intVariableOidSuffixes.size(), stringVariableOidSuffixes.size()); + + processVariables(requestHolder, intVariableOidSuffixes, RittalMibVariable.CMC_III_VAR_INT_DYN_TABLE, RittalMibVariable.CMC_III_VAR_INT_DYN_VALUE); + processVariables(requestHolder, stringVariableOidSuffixes, RittalMibVariable.CMC_III_VAR_STR_DYN_TABLE, RittalMibVariable.CMC_III_VAR_STR_DYN_VALUE); + } catch (Exception e) { + logger.debugv("There was an error: {0}", e); + } + }; + } + + @Transactional + void processVariables(VariableDynamicTableRequestHolder requestHolder, Map variablesByOidSuffix, RittalMibVariable tableMibVariable, RittalMibVariable valueMibVariable) { + SnmpMessageData snmpMessageData = requestHolder.getSnmpMessageData(); + List variableBindings = getDynamicTableVariableBindings(snmpMessageData, tableMibVariable); + variableBindings.forEach(variableBinding -> { + OID oid = variableBinding.getOid(); + OID oidSuffix = oid.getSuffix(valueMibVariable.getOid()); + oidSuffix.removeLast(); // last part is a timestamp, we need to remove it in order to have clean OID + + if (variablesByOidSuffix.containsKey(oidSuffix)) { + Variable variable = variableController.findById(variablesByOidSuffix.get(oidSuffix)); + if (variableValueTaskScheduler.isRunning(variable)) { + logger.debugf("Variable (ID:'%s') scheduled task is already running, skipping", variable.getId()); + return; + } + + variableValueTaskScheduler.resetNextExecutionInterval(variable); + String value = variableBinding.getVariable().toString(); + + logger.debugv("Found matching variable for oidSuffix: {0}, variable name: {1}, new value: {2}", oidSuffix, variable.getName(), value); + try { + VariableValueData variableValueData = new VariableValueData(value, QualityType.GOOD); + variableHandler.handleVariableValueFetchedFromDevice(variable, variableValueData); + } catch (Exception e) { + logger.errorv(e, "There was a problem while handling new value for variable with id: {0}", variable.getId()); + } + } else { + logger.tracev("Matching variable not found for oidSuffix: {0}", oidSuffix); + } + }); + } +} diff --git a/src/main/java/io/gec/raw/connector/snmp/vardyntable/domain/VariableDynamicTableRequestHolder.java b/src/main/java/io/gec/raw/connector/snmp/vardyntable/domain/VariableDynamicTableRequestHolder.java new file mode 100755 index 0000000..f903999 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/vardyntable/domain/VariableDynamicTableRequestHolder.java @@ -0,0 +1,25 @@ +package io.gec.raw.connector.snmp.vardyntable.domain; + +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import org.snmp4j.smi.OID; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; + +@Builder +@Getter +@Setter +public class VariableDynamicTableRequestHolder { + + private final UUID rootDeviceId; + private final SnmpMessageData snmpMessageData; + @Builder.Default + private final Map intVariableUUIDbyOidSuffixes = new ConcurrentHashMap<>(); + @Builder.Default + private final Map stringVariableUUIDbyOidSuffixes = new ConcurrentHashMap<>(); + private ScheduledFuture scheduledAction; +} diff --git a/src/main/java/io/gec/raw/connector/snmp/vardyntable/domain/VariableTypeEnum.java b/src/main/java/io/gec/raw/connector/snmp/vardyntable/domain/VariableTypeEnum.java new file mode 100755 index 0000000..eb5aa75 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/snmp/vardyntable/domain/VariableTypeEnum.java @@ -0,0 +1,7 @@ +package io.gec.raw.connector.snmp.vardyntable.domain; + +public enum VariableTypeEnum { + + INTEGER, + STRING +} diff --git a/src/main/java/io/gec/raw/connector/statistic/control/StatisticCategoryMapper.java b/src/main/java/io/gec/raw/connector/statistic/control/StatisticCategoryMapper.java new file mode 100755 index 0000000..e4bd6df --- /dev/null +++ b/src/main/java/io/gec/raw/connector/statistic/control/StatisticCategoryMapper.java @@ -0,0 +1,17 @@ +package io.gec.raw.connector.statistic.control; + +import io.gec.raw.connector.snmp.common.domain.SnmpRequestData; +import io.gec.raw.connector.statistic.domain.StatisticCategory; +import jakarta.enterprise.context.ApplicationScoped; +import org.snmp4j.PDU; + +@ApplicationScoped +public class StatisticCategoryMapper { + + public StatisticCategory toStatisticCategory(SnmpRequestData snmpRequestData) { + String snmpVersionName = snmpRequestData.getSnmpMessageData().getSnmpProtocolData().getSnmpVersion().getName(); + String snmpMessageAsString = PDU.getTypeString(snmpRequestData.getSnmpMessage()); + + return StatisticCategory.of(snmpVersionName, snmpMessageAsString); + } +} diff --git a/src/main/java/io/gec/raw/connector/statistic/control/StatisticCollectorController.java b/src/main/java/io/gec/raw/connector/statistic/control/StatisticCollectorController.java new file mode 100755 index 0000000..c13ce72 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/statistic/control/StatisticCollectorController.java @@ -0,0 +1,94 @@ +package io.gec.raw.connector.statistic.control; + +import io.gec.raw.connector.registration.control.RegistrationService; +import io.gec.raw.connector.snmp.common.domain.SnmpRequestData; +import io.gec.raw.connector.statistic.domain.StatisticCategory; +import io.gec.raw.connector.statistic.domain.StatisticInterval; +import io.quarkus.scheduler.Scheduled; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import static io.quarkus.scheduler.Scheduled.ConcurrentExecution.SKIP; + +/* + Record all calls, group by a minute. + Keep maxEntries records per category, automatically drop older items + count totalCalls, totalTime, totalAvg + */ +@ApplicationScoped +public class StatisticCollectorController { + + @Inject + StatisticCategoryMapper statisticCategoryMapper; + @Inject + Logger logger; + private static final int MAX_ENTRIES = 10; + private final ConcurrentMap> statisticData = new ConcurrentHashMap<>(); + private final StatisticInterval totalValues = new StatisticInterval(); + + public void add(SnmpRequestData snmpRequestData, long startTime, long endTime, long requestEndTime) { + add(statisticCategoryMapper.toStatisticCategory(snmpRequestData), startTime, endTime, requestEndTime); + } + + public void add(StatisticCategory category, long startTime, long endTime, long requestEndTime) { + long waitTime = endTime - requestEndTime; + long callDuration = endTime - startTime; + + totalValues.addCall(startTime, callDuration, waitTime); + long minutes = startTime / 60000; + + Map statisticForCategory = statisticData.computeIfAbsent(category, stats -> new ConcurrentHashMap<>()); + + if (statisticForCategory.containsKey(minutes)) { + statisticForCategory.get(minutes).addCall(startTime, callDuration, waitTime); + } else { + StatisticInterval statisticInterval = new StatisticInterval(); + statisticInterval.addCall(startTime, callDuration, waitTime); + statisticForCategory.put(minutes, statisticInterval); + cleanup(statisticForCategory); + } + } + + @Override + public String toString() { + StringBuilder result = new StringBuilder("\nTotal:\n" + totalValues + "\n"); + List orderedCategories = statisticData.keySet().stream() + .sorted() + .toList(); + + for (StatisticCategory cat : orderedCategories) { + result.append("Category: ").append(cat).append("\n"); + + Map statisticForCategory = statisticData.get(cat); + + List orderedTimes = statisticForCategory.keySet().stream().sorted().toList(); + for (Long timeStamp : orderedTimes) { + result.append(statisticForCategory.get(timeStamp).toString()).append("\n"); + } + } + return result.toString(); + } + + public String toJson() { + return "{\"json\":\"json\"}"; + } + + //INFO: delete the oldest item if size of table is exceeded + private void cleanup(Map statisticInterval) { + if (statisticInterval.size() > MAX_ENTRIES) { + Long oldestItem = statisticInterval.keySet().stream().sorted().toList().get(0); + statisticInterval.remove(oldestItem); + } + } + + @Scheduled(every = "60s", concurrentExecution = SKIP, skipExecutionIf = RegistrationService.class) + public void logStatistic() { + logger.debug(toString()); + } +} diff --git a/src/main/java/io/gec/raw/connector/statistic/domain/StatisticCategory.java b/src/main/java/io/gec/raw/connector/statistic/domain/StatisticCategory.java new file mode 100755 index 0000000..fb91690 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/statistic/domain/StatisticCategory.java @@ -0,0 +1,27 @@ +package io.gec.raw.connector.statistic.domain; + +import lombok.EqualsAndHashCode; +import lombok.NonNull; +import lombok.Value; + +import java.util.Comparator; + +@Value(staticConstructor = "of") +@EqualsAndHashCode +public class StatisticCategory implements Comparable { + + String categoryName; + String operationName; + + @Override + public String toString() { + return categoryName + " " + operationName; + } + + @Override + public int compareTo(@NonNull StatisticCategory other) { + return Comparator.comparing(StatisticCategory::getCategoryName) + .thenComparing(StatisticCategory::getOperationName) + .compare(this, other); + } +} diff --git a/src/main/java/io/gec/raw/connector/statistic/domain/StatisticInterval.java b/src/main/java/io/gec/raw/connector/statistic/domain/StatisticInterval.java new file mode 100755 index 0000000..fc01bea --- /dev/null +++ b/src/main/java/io/gec/raw/connector/statistic/domain/StatisticInterval.java @@ -0,0 +1,46 @@ +package io.gec.raw.connector.statistic.domain; + +import java.text.MessageFormat; +import java.util.Date; + +public class StatisticInterval { + + private long firstCall; // time of first call for this interval + private long lastCall; // time for last call for this interval + + private int count; // number of calls for this interval + private long minExecTime; // min execution tim in this interval + private long maxExecTime; // max execution time in this interval + private long callTimeSum; + private long waitTimeL; + + public void addCall(long time, long duration, long waitTime) { + if (firstCall == 0) { + firstCall = time; + } + if (time > lastCall) { + lastCall = time; + } + if (minExecTime == 0 || minExecTime > duration) { + minExecTime = duration; + } + if (maxExecTime < duration) { + maxExecTime = duration; + } + count++; + callTimeSum += duration; + waitTimeL += waitTime; + } + + public String toString() { + if (count == 0) { + return "no statistic data available for this interval"; + } + + return MessageFormat + .format("{0,time,HH:mm:ss}..{1,time,HH:mm:ss} calls: {2}, totalTime: {3} ms, min:{4} ms, max: {5} ms, avg: {6} ms, waitTime: {7} ms", + new Date(firstCall), new Date(lastCall), + count, callTimeSum, minExecTime, maxExecTime, (callTimeSum / count), waitTimeL); + } + +} diff --git a/src/main/java/io/gec/raw/connector/status/control/DeviceStatusController.java b/src/main/java/io/gec/raw/connector/status/control/DeviceStatusController.java new file mode 100755 index 0000000..1812823 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/status/control/DeviceStatusController.java @@ -0,0 +1,56 @@ +package io.gec.raw.connector.status.control; + +import io.gec.raw.connector.componentmode.control.ComponentModeHandler; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.registration.control.RegistrationService; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.quarkus.scheduler.Scheduled; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import static io.quarkus.scheduler.Scheduled.ConcurrentExecution.SKIP; + +@ApplicationScoped +public class DeviceStatusController { + @Inject + ComponentModeHandler componentModeHandler; + @Inject + DeviceController deviceController; + @Inject + SnmpService snmpService; + @Inject + Logger logger; + + private static final String OID_DESCRIPTION = ".1.3.6.1.2.1.1.1.0"; + + @Scheduled(every = "5s", concurrentExecution = SKIP, skipExecutionIf = RegistrationService.class) + public void runStatusCheck() { + processOnlineOfflineCheck(); + } + + void processOnlineOfflineCheck() { + deviceController.findAllRootDevices().stream() + .filter(device -> device.getMode() != ComponentMode.FIRMWARE_UPDATE) + .forEach(device -> snmpService.snmpGet(device.getId(), OID_DESCRIPTION).ifPresentOrElse( + response -> setDeviceOnline(device), + () -> setDeviceOffline(device) + )); + } + + private void setDeviceOnline(Device device) { + if (device.getMode() == ComponentMode.OFFLINE) { + logger.infof("Device (ID=%s, name=%s) is going ONLINE, Id: %s", device.getId(), device.getName()); + componentModeHandler.restoreComponentMode(device.getCommServiceId()); + } + } + + private void setDeviceOffline(Device device) { + if (device.getMode() != ComponentMode.OFFLINE) { + logger.infof("Device (ID=%s, name=%s) is going OFFLINE, Id: %s", device.getId(), device.getName()); + componentModeHandler.changeComponentModeForDeviceTree(device.getCommServiceId(), ComponentMode.OFFLINE); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/status/control/StatusController.java b/src/main/java/io/gec/raw/connector/status/control/StatusController.java new file mode 100755 index 0000000..57c32bf --- /dev/null +++ b/src/main/java/io/gec/raw/connector/status/control/StatusController.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.status.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.registration.control.RegistrationService; +import io.quarkus.scheduler.Scheduled; +import io.quarkus.scheduler.Scheduled.ConcurrentExecution; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +public class StatusController { + @Inject + CommunicationServiceController communicationServiceController; + @Inject + Logger logger; + + @Scheduled(every = "30s", concurrentExecution = ConcurrentExecution.SKIP, skipExecutionIf = RegistrationService.class) + public void hereIam() { + logger.info("I'm alive, trying to send connector status..."); + communicationServiceController.updateConnectorStatus(); + } +} diff --git a/src/main/java/io/gec/raw/connector/subscription/control/AbstractTaskScheduler.java b/src/main/java/io/gec/raw/connector/subscription/control/AbstractTaskScheduler.java new file mode 100755 index 0000000..34a2c02 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/subscription/control/AbstractTaskScheduler.java @@ -0,0 +1,47 @@ +package io.gec.raw.connector.subscription.control; + +import io.gec.raw.connector.base.entity.SubscribableEntity; +import io.gec.raw.connector.subscription.domain.ScheduledTask; +import io.gec.raw.connector.subscription.domain.TaskData; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.UUID; + +public abstract class AbstractTaskScheduler> { + + @Inject + ScheduledTaskService scheduledTaskService; + + public void scheduleTask(ENTITY entity) { + if (entity.isSubscribed()) { + var task = createScheduledTask(entity); + scheduledTaskService.scheduleTask(task); + } else if (entity.isInitialValueFetched()) { + var task = createScheduledTask(entity); + scheduledTaskService.executeActionAndRemoveTaskIfExists(task); + } + } + + public void scheduleTasks(List entities) { + entities.forEach(this::scheduleTask); + } + + public void executeTask(ENTITY entity) { + scheduledTaskService.executeTaskOnce(createScheduledTask(entity)); + } + + public void resetNextExecutionInterval(ENTITY entity) { + scheduledTaskService.resetNextExecutionInterval(entity); + } + + public boolean isRunning(ENTITY entity) { + return scheduledTaskService.isRunning(entity); + } + + protected abstract ScheduledTask createScheduledTask(ENTITY entity); + + protected abstract DATA createTaskData(UUID entityId); + + protected abstract void runTask(DATA data); +} diff --git a/src/main/java/io/gec/raw/connector/subscription/control/ScheduledTaskService.java b/src/main/java/io/gec/raw/connector/subscription/control/ScheduledTaskService.java new file mode 100755 index 0000000..c22ab7a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/subscription/control/ScheduledTaskService.java @@ -0,0 +1,157 @@ +package io.gec.raw.connector.subscription.control; + +import io.gec.raw.connector.base.entity.SubscribableEntity; +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.subscription.domain.ScheduledActiveTask; +import io.gec.raw.connector.subscription.domain.ScheduledTask; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +@ApplicationScoped +public class ScheduledTaskService { + + @Inject + Logger logger; + @Inject + SnmpConfig snmpConfig; + + private final ConcurrentHashMap scheduledActiveTasks = new ConcurrentHashMap<>(); + private ScheduledExecutorService scheduledExecutor; + + @PostConstruct + void init() { + scheduledExecutor = Executors.newScheduledThreadPool(snmpConfig.getScheduledTasksPoolSize()); + logger.infof("[SCHEDULED:INIT] ScheduledExecutor initialized with pool-size=%d", + snmpConfig.getScheduledTasksPoolSize()); + } + + public void scheduleTask(ScheduledTask task) { + scheduledActiveTasks.compute( + task.entity().getId(), + (id, scheduledTask) -> createOrRescheduleTask(task, scheduledTask) + ); + } + + public void resetNextExecutionInterval(SubscribableEntity entity) { + if (!entity.isSubscribed()) { + return; + } + + var activeTask = scheduledActiveTasks.get(entity.getId()); + if (activeTask == null) { + return; + } + + logUpdate("RESET", activeTask.scheduledTask(), "skipping next execution"); + terminateFuture(activeTask.future()); + scheduledActiveTasks.put( + entity.getId(), + createScheduledTaskWithInterval( + activeTask.scheduledTask(), + activeTask.scheduledTask().entity().getSubscriptionInterval())); + } + + public boolean isRunning(SubscribableEntity entity) { + var activeTask = scheduledActiveTasks.get(entity.getId()); + if (activeTask == null) { + return false; + } + + return activeTask.scheduledTask().isRunning(); + } + + private ScheduledActiveTask createOrRescheduleTask(ScheduledTask task, + ScheduledActiveTask activeTask) { + if (activeTask != null) { + return rescheduleIfChanged(activeTask, task); + } else { + return createScheduledTaskWithInterval(task, task.entity().getSubscriptionInterval()); + } + } + + private ScheduledActiveTask rescheduleIfChanged(ScheduledActiveTask activeTask, + ScheduledTask task) { + var currentInterval = activeTask.scheduledTask().entity().getSubscriptionInterval(); + var newInterval = task.entity().getSubscriptionInterval(); + if (currentInterval != newInterval) { + logUpdate("UPDATE", task, "interval changed %d -> %d".formatted( + currentInterval, + newInterval + )); + terminateFuture(activeTask.future()); + return createScheduledTaskWithInterval(task, newInterval); + } + return activeTask; + } + + private ScheduledActiveTask createScheduledTaskWithInterval(ScheduledTask task, + long initialDelay) { + logUpdate("CREATE", task, "initial delay=%d".formatted(initialDelay)); + return new ScheduledActiveTask( + task, + scheduledExecutor.scheduleWithFixedDelay( + () -> { + try { + logUpdate("EXECUTION", task, "started task"); + task.run(); + } catch (Exception e) { + logger.errorf(e, "[SCHEDULED:EXECUTION] Error executing task: %s", task); + } + }, + initialDelay, + task.entity().getSubscriptionInterval(), + TimeUnit.SECONDS) + ); + } + + public void executeTaskOnce(ScheduledTask task) { + logUpdate("EXECUTE_ONCE", task, "scheduled once"); + + scheduledExecutor.execute(task::run); + } + + private void terminateFuture(ScheduledFuture future) { + if (!future.isDone() && !future.isCancelled()) { + future.cancel(false); + } else { + logger.debugf("[SCHEDULED:TERMINATE] Future already terminated"); + } + } + + public void removeTaskIfExists(ScheduledTask task) { + var taskEntityId = task.entity().getId(); + var removedActiveTask = scheduledActiveTasks.remove(taskEntityId); + if (removedActiveTask == null) { + logger.debugf("[SCHEDULED:EXECUTE_REMOVE] no active task found for ID=%s", taskEntityId); + return; + } + + terminateFuture(removedActiveTask.future()); + logUpdate("REMOVED", removedActiveTask.scheduledTask(), "terminated and removed"); + } + + public void executeActionAndRemoveTaskIfExists(ScheduledTask task) { + removeTaskIfExists(task); + executeTaskOnce(task); + } + + private void logUpdate(String changeType, ScheduledTask scheduledTask, String message) { + var taskEntity = scheduledTask.entity(); + logger.debugf("[SCHEDULED:%s] %s(ID:'%s' Interval:%d) - %s", + changeType, + taskEntity.getClass().getSimpleName(), + taskEntity.getId(), + taskEntity.getSubscriptionInterval(), + message + ); + } +} diff --git a/src/main/java/io/gec/raw/connector/subscription/control/SubscriptionController.java b/src/main/java/io/gec/raw/connector/subscription/control/SubscriptionController.java new file mode 100755 index 0000000..6002825 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/subscription/control/SubscriptionController.java @@ -0,0 +1,76 @@ +package io.gec.raw.connector.subscription.control; + +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyTaskScheduler; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.registration.control.RegistrationService; +import io.gec.raw.connector.snmp.vardyntable.control.VariableDynamicTableService; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.control.VariableValueTaskScheduler; +import io.gec.raw.connector.variable.entity.Variable; +import io.quarkus.scheduler.Scheduled; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.time.OffsetDateTime; +import java.util.List; + +import static io.quarkus.scheduler.Scheduled.ConcurrentExecution.SKIP; + +@ApplicationScoped +public class SubscriptionController { + + @Inject + VariableController variableController; + @Inject + VariableDynamicTableService variableDynamicTableService; + @Inject + DevicePropertyController propertyController; + @Inject + Logger logger; + @Inject + VariableValueTaskScheduler variableValueTaskScheduler; + @Inject + DevicePropertyTaskScheduler devicePropertyTaskScheduler; + + private OffsetDateTime variablesLookupStamp = null; + private OffsetDateTime propertiesLookupStamp = null; + + @Scheduled(every = "5s", concurrentExecution = SKIP, skipExecutionIf = RegistrationService.class) + public void processSubscribedDeviceValues() { + processDeviceVariableValues(); + processDevicePropertyValues(); + } + + void processDeviceVariableValues() { + var updatedVariables = fetchNextIterationVariables(); + logger.debugf("Fetched %d updated variables", updatedVariables.size()); + variableValueTaskScheduler.scheduleTasks(updatedVariables); + variableDynamicTableService.processVariables(updatedVariables); + } + + void processDevicePropertyValues() { + var updatedProperties = fetchNextIterationProperties(); + logger.debugf("Fetched %d updated properties", updatedProperties.size()); + devicePropertyTaskScheduler.scheduleTasks(updatedProperties); + } + + private List fetchNextIterationVariables() { + var lookupStamp = variablesLookupStamp; + this.variablesLookupStamp = OffsetDateTime.now(); + + return lookupStamp == null ? + variableController.findVariablesInOperationMode() : + variableController.findVariablesUpdatedAfter(lookupStamp); + } + + private List fetchNextIterationProperties() { + var lookupStamp = propertiesLookupStamp; + this.propertiesLookupStamp = OffsetDateTime.now(); + + return lookupStamp == null ? + propertyController.findSubscribedDeviceProperties() : + propertyController.findSubscribableDevicePropertiesUpdatedAfter(lookupStamp); + } +} diff --git a/src/main/java/io/gec/raw/connector/subscription/domain/ScheduledActiveTask.java b/src/main/java/io/gec/raw/connector/subscription/domain/ScheduledActiveTask.java new file mode 100755 index 0000000..9707ccc --- /dev/null +++ b/src/main/java/io/gec/raw/connector/subscription/domain/ScheduledActiveTask.java @@ -0,0 +1,8 @@ +package io.gec.raw.connector.subscription.domain; + +import java.util.concurrent.ScheduledFuture; + +public record ScheduledActiveTask( + ScheduledTask scheduledTask, + ScheduledFuture future) { +} diff --git a/src/main/java/io/gec/raw/connector/subscription/domain/ScheduledTask.java b/src/main/java/io/gec/raw/connector/subscription/domain/ScheduledTask.java new file mode 100755 index 0000000..f3e1c2e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/subscription/domain/ScheduledTask.java @@ -0,0 +1,34 @@ +package io.gec.raw.connector.subscription.domain; + +import io.gec.raw.connector.base.entity.SubscribableEntity; + +import java.util.concurrent.atomic.AtomicBoolean; + + +public interface ScheduledTask> { + ENTITY entity(); + + TaskDataFactory dataFactory(); + + TaskAction action(); + + AtomicBoolean runningState(); + + default DATA data() { + return dataFactory().make(entity().getId()); + } + + default void run() { + if (runningState().compareAndSet(false, true)) { + try { + action().run(data()); + } finally { + runningState().set(false); + } + } + } + + default boolean isRunning() { + return runningState().get(); + } +} diff --git a/src/main/java/io/gec/raw/connector/subscription/domain/TaskAction.java b/src/main/java/io/gec/raw/connector/subscription/domain/TaskAction.java new file mode 100755 index 0000000..312bef0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/subscription/domain/TaskAction.java @@ -0,0 +1,6 @@ +package io.gec.raw.connector.subscription.domain; + +@FunctionalInterface +public interface TaskAction> { + void run(T data); +} diff --git a/src/main/java/io/gec/raw/connector/subscription/domain/TaskData.java b/src/main/java/io/gec/raw/connector/subscription/domain/TaskData.java new file mode 100755 index 0000000..aa6ff0a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/subscription/domain/TaskData.java @@ -0,0 +1,12 @@ +package io.gec.raw.connector.subscription.domain; + +import io.gec.raw.connector.base.entity.SubscribableEntity; +import io.gec.raw.connector.componentmode.dto.ComponentMode; + +public interface TaskData { + T entity(); + + default boolean isExecutable() { + return entity().getMode() == ComponentMode.OPERATION || entity().getMode() == ComponentMode.PAUSE; + } +} diff --git a/src/main/java/io/gec/raw/connector/subscription/domain/TaskDataFactory.java b/src/main/java/io/gec/raw/connector/subscription/domain/TaskDataFactory.java new file mode 100755 index 0000000..156ea00 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/subscription/domain/TaskDataFactory.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.subscription.domain; + +import io.gec.raw.connector.base.entity.SubscribableEntity; + +import java.util.UUID; + +@FunctionalInterface +public interface TaskDataFactory> { + DATA make(UUID entityId); +} diff --git a/src/main/java/io/gec/raw/connector/utils/control/ChecksumController.java b/src/main/java/io/gec/raw/connector/utils/control/ChecksumController.java new file mode 100755 index 0000000..cddecba --- /dev/null +++ b/src/main/java/io/gec/raw/connector/utils/control/ChecksumController.java @@ -0,0 +1,60 @@ +package io.gec.raw.connector.utils.control; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.io.FileInputStream; +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.HexFormat; + +@ApplicationScoped +public class ChecksumController { + @Inject + Logger logger; + + public boolean verifySha1(String filePath, String expectedSha1) { + try { + String calculatedChecksum = sha1(filePath); + boolean doesChecksumMatch = calculatedChecksum.equals(expectedSha1); + + String logMessage = "Sha1 checksum calculated: '%s', expected: '%s'".formatted(calculatedChecksum, expectedSha1); + if (doesChecksumMatch) { + logger.debugf(logMessage); + } else { + logger.errorf(logMessage); + } + + return doesChecksumMatch; + } catch (IOException | IllegalArgumentException e) { + logger.errorf(e, "Error during calculating sha1 for file: '%s'".formatted(filePath)); + } + + return false; + } + + String sha1(String filePath) throws IOException { + MessageDigest messageDigest = getMessageDigest("SHA-1"); + + try (FileInputStream fis = new FileInputStream(filePath)) { + byte[] data = new byte[1024]; + int read; + while ((read = fis.read(data)) != -1) { + messageDigest.update(data, 0, read); + } + + byte[] digest = messageDigest.digest(); + return HexFormat.of().formatHex(digest); + } + } + + private static MessageDigest getMessageDigest(String algorithm) { + try { + return MessageDigest.getInstance(algorithm); + } catch (NoSuchAlgorithmException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/src/main/java/io/gec/raw/connector/utils/control/IPAddressHelper.java b/src/main/java/io/gec/raw/connector/utils/control/IPAddressHelper.java new file mode 100755 index 0000000..23b5cfe --- /dev/null +++ b/src/main/java/io/gec/raw/connector/utils/control/IPAddressHelper.java @@ -0,0 +1,98 @@ +package io.gec.raw.connector.utils.control; + +import jakarta.enterprise.context.ApplicationScoped; + +import java.text.ParseException; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@ApplicationScoped +public class IPAddressHelper { + + Pattern IP_V4_PATTERN = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"); + + public void validateIpRange(String startIp, String endIp) { + String[] startOctets = startIp.split("\\."); + String[] endOctets = endIp.split("\\."); + + for (int octet = 0; octet < 3; octet++) { + if (!startOctets[octet].equals(endOctets[octet])) { + throw new IllegalArgumentException("First three octets are not the same!"); + } + } + + int iStart = Integer.parseInt(startOctets[3]); + int iEnd = Integer.parseInt(endOctets[3]); + + boolean validRange = iStart >= 0 && iEnd >= 0 && iEnd <= 255 && iStart <= iEnd; + + if (!validRange) { + throw new IllegalArgumentException("Start and End IP range is invalid!"); + } + } + + public List getStartEndIpOctet(String startIp, String endIp) { + String[] sStart = startIp.split("\\."); + String[] sEnd = endIp.split("\\."); + + String[] result; + Integer[] ipRange = new Integer[2]; + + ipRange[0] = Integer.parseInt(sStart[3]); + ipRange[1] = Integer.parseInt(sEnd[3]); + + if (ipRange[0].equals(ipRange[1])) { + //INFO: Only one IP address to discover + result = new String[1]; + result[0] = sStart[0] + "." + sStart[1] + "." + sStart[2] + "." + ipRange[0]; + } else { + //INFO: multiple IP addresses to discover + result = new String[(ipRange[1] - ipRange[0]) + 1]; + int iCounter = 0; + for (int i = ipRange[0]; i < ipRange[1] + 1; i++) { + result[iCounter++] = sStart[0] + "." + sStart[1] + "." + sStart[2] + "." + i; + } + } + + return Arrays.asList(result); + } + + public String removeHttpFromIpAddress(String ipAddress) { + if (ipAddress.contains("http")) { + String[] splitUp = ipAddress.split("/"); + return splitUp[2]; + } else { + return ipAddress; + } + } + + public String getIpAddressFromRootDevice(String rootDeviceURL) { + String[] splitUp = rootDeviceURL.split("/"); + + if (splitUp.length == 1) { + return splitUp[0]; + } else { + return splitUp[2]; + } + } + + public void validateIP(String ip) throws ParseException { + String[] split = ip.split("\\."); + if (split.length != 4) { + throw new ParseException("The IP-Address \"" + ip + "\" is invalid.", 1); + } + } + + public Optional extractIPv4(String text) { + Matcher matcher = IP_V4_PATTERN.matcher(text); + + if (matcher.find()) { + return Optional.ofNullable(matcher.group()); + } + + return Optional.empty(); + } +} diff --git a/src/main/java/io/gec/raw/connector/utils/control/Measurement.java b/src/main/java/io/gec/raw/connector/utils/control/Measurement.java new file mode 100755 index 0000000..6305670 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/utils/control/Measurement.java @@ -0,0 +1,80 @@ +package io.gec.raw.connector.utils.control; + +import java.util.Map; +import java.util.TreeMap; + +import io.gec.raw.connector.utils.domain.MeasurementItem; +import jakarta.inject.Singleton; + +@Singleton +public class Measurement { + + private static final Map treemap = new TreeMap<>(); + + private Measurement() { + } + + public static Boolean delete(String name) { + treemap.remove(name); + return true; + } + + public static Boolean start(String name) { + MeasurementItem item = treemap.putIfAbsent(name, new MeasurementItem()); + + if (item == null) { + item = treemap.get(name); + } + + item.setStartTime(System.currentTimeMillis()); + return true; + } + + public static Boolean stop(String name) { + var item = treemap.get(name); + item.setEstimatedTime(System.currentTimeMillis() - item.getStartTime()); + return true; + } + + public static String getHtml() { + + String head = ""; + head = ""; + head += ""; + head += ""; + head += ""; + head += ""; + head += ""; + head += "Connector Timings"; + head += ""; + head += ""; + head += ""; + + StringBuilder content = new StringBuilder(); + + for (Map.Entry entry : treemap.entrySet()) { + String key = entry.getKey(); + MeasurementItem value = entry.getValue(); + long time = value.getActive(); + + content.append("
"); + content.append(""); + + StringBuilder raute = new StringBuilder(); + for (int i = 0; i < time / 1000; i++) { + raute.append("#"); + } + content.append(""); + content.append(""); + content.append("
"); + } + + String foot = ""; + foot += ""; + foot += ""; + + return head + content + foot; + } + +} diff --git a/src/main/java/io/gec/raw/connector/utils/control/RittalVariableConfigList.java b/src/main/java/io/gec/raw/connector/utils/control/RittalVariableConfigList.java new file mode 100755 index 0000000..2859257 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/utils/control/RittalVariableConfigList.java @@ -0,0 +1,100 @@ +package io.gec.raw.connector.utils.control; + +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import io.gec.raw.connector.device.enums.RittalDeviceConstants; + +import java.util.List; +import java.util.Map; + +public class RittalVariableConfigList { + + private static final List variableSettingFunctionTypeList = List.of( + RittalDeviceConstants.VARIABLE_SETPT, + RittalDeviceConstants.VARIABLE_OFFSET, + RittalDeviceConstants.VARIABLE_SENSITIVITY, + RittalDeviceConstants.VARIABLE_DELAY, + RittalDeviceConstants.VARIABLE_GROUPING, + RittalDeviceConstants.VARIABLE_HYSTERESIS, + RittalDeviceConstants.VARIABLE_SETPOINT, + RittalDeviceConstants.VARIABLE_AVERAGE, + RittalDeviceConstants.VARIABLE_LOGIC, + RittalDeviceConstants.VARIABLE_START, + RittalDeviceConstants.VARIABLE_END, + RittalDeviceConstants.VARIABLE_UNIT, + RittalDeviceConstants.VARIABLE_FACTOR, + RittalDeviceConstants.VARIABLE_POWER_ON_DELAY, + RittalDeviceConstants.VARIABLE_MIN_VALUE, + RittalDeviceConstants.VARIABLE_MAX_VALUE, + RittalDeviceConstants.VARIABLE_MANUAL_VALUE, + RittalDeviceConstants.VARIABLE_ACTIVE_CUSTOM_ENERGY_VALUE, + RittalDeviceConstants.VARIABLE_CONFIG + ); + + private static final List variableExecuteFunctionTypeList = List.of( + RittalDeviceConstants.VARIABLE_RELAY, + RittalDeviceConstants.VARIABLE_COMMAND, + RittalDeviceConstants.VARIABLE_ATTEMPTS, + RittalDeviceConstants.VARIABLE_RED, + RittalDeviceConstants.VARIABLE_GREEN, + RittalDeviceConstants.VARIABLE_BLUE, + RittalDeviceConstants.VARIABLE_USER_COUNT, + RittalDeviceConstants.VARIABLE_GENERAL_GROUPING + ); + + private static final List variableServiceFunctionTypeList = List.of( + RittalDeviceConstants.VARIABLE_SERVICE + ); + + private static final List variableConfigurationFunctionTypeList = List.of( + RittalDeviceConstants.VARIABLE_DESCNAME, + RittalDeviceConstants.VARIABLE_TYPE, + RittalDeviceConstants.VARIABLE_CIRCUIT, + RittalDeviceConstants.VARIABLE_SOCKET_TYPE, + RittalDeviceConstants.VARIABLE_MODE, + RittalDeviceConstants.VARIABLE_LED_COMMAND, + RittalDeviceConstants.VARIABLE_SEQUENCE_MODE, + RittalDeviceConstants.VARIABLE_CUSTOM_VALUE, + RittalDeviceConstants.VARIABLE_ERROR_INFO, + RittalDeviceConstants.VARIABLE_POSITION, + RittalDeviceConstants.VARIABLE_CUSTOM_RUNTIME_VALUE, + RittalDeviceConstants.VARIABLE_MESSAGE + ); + + public static final Map, FunctionTypeEnum> endsWith_generalFunctionTypeMap = Map.of( + RittalVariableConfigList.variableSettingFunctionTypeList, FunctionTypeEnum.SETTING, + RittalVariableConfigList.variableConfigurationFunctionTypeList, FunctionTypeEnum.CONFIGURATION, + RittalVariableConfigList.variableExecuteFunctionTypeList, FunctionTypeEnum.EXECUTE, + RittalVariableConfigList.variableServiceFunctionTypeList, FunctionTypeEnum.SERVICE + ); + + public static final Map, FunctionTypeEnum> endsWith_specificFunctionTypeMap = Map.of( + List.of( + RittalDeviceConstants.VARIABLE_LED_COMMAND, + RittalDeviceConstants.VARIABLE_GENERAL_SEQUENCE_MODE + ), FunctionTypeEnum.CONFIGURATION, + List.of( + RittalDeviceConstants.VARIABLE_GENERAL_GROUPING, + RittalDeviceConstants.VARIABLE_LOGIN_DELAY + ), FunctionTypeEnum.EXECUTE, + List.of( + RittalDeviceConstants.VARIABLE_GENERAL_ON_DELAY, + RittalDeviceConstants.VARIABLE_GENERAL_ERROR_DELAY, + RittalDeviceConstants.VARIABLE_ACTIVE_CUSTOM_ENERGY_VALUE + ), FunctionTypeEnum.SETTING + ); + public static final Map, FunctionTypeEnum> contains_FunctionTypeMap = Map.of( + List.of( + RittalDeviceConstants.VARIABLE_TRAP_RECEIVER, + RittalDeviceConstants.VARIABLE_TRAP_ENABLE + ), FunctionTypeEnum.SERVICE, + List.of( + RittalDeviceConstants.VARIABLE_SETPT + ), FunctionTypeEnum.SETTING + ); + + public static final List excludedVariableNameList = + List.of(RittalDeviceConstants.VARIABLE_KEY_CODE, + RittalDeviceConstants.VARIABLE_KEY_COMMAND, + RittalDeviceConstants.VARIABLE_CATEGORY + ); +} diff --git a/src/main/java/io/gec/raw/connector/utils/control/ValueHelper.java b/src/main/java/io/gec/raw/connector/utils/control/ValueHelper.java new file mode 100755 index 0000000..1f14db9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/utils/control/ValueHelper.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.utils.control; + +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.Optional; + +@ApplicationScoped +public class ValueHelper { + + public Optional trim(Optional input) { + return input.map(String::trim) + .filter(v -> !v.isEmpty()); + } +} diff --git a/src/main/java/io/gec/raw/connector/utils/control/ValueScalingHelper.java b/src/main/java/io/gec/raw/connector/utils/control/ValueScalingHelper.java new file mode 100755 index 0000000..520a05b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/utils/control/ValueScalingHelper.java @@ -0,0 +1,77 @@ +package io.gec.raw.connector.utils.control; + +import io.gec.raw.connector.device.entity.DataTypeEnum; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +@ApplicationScoped +public class ValueScalingHelper { + @Inject + Logger logger; + + public int scaleNumericValueFromDevice(int value, int scaleFactor) { + if (value == 0 || scaleFactor == 0) { + return value; + } + if (scaleFactor < 0) { + return value / Math.abs(scaleFactor); + } + return value * scaleFactor; + } + + public int scaleNumericValueForDevice(int value, int scaleFactor) { + if (value == 0 || scaleFactor == 0) { + return value; + } + if (scaleFactor < 0) { + return value * Math.abs(scaleFactor); + } + return value / scaleFactor; + } + + public String getScaledVariableValueForDevice(DataTypeEnum dataType, String value, int scale) { + if (dataType != DataTypeEnum.NUMERIC + && dataType != DataTypeEnum.ANALOGINT + && dataType != DataTypeEnum.FLOAT) { + + return value; + } + if (DataTypeEnum.NUMERIC == dataType) { + return String.valueOf(scaleNumericValueForDevice(Integer.parseInt(value), scale)); + } + + logger.info(String.format("Variable value before scaling: %s", value)); + + float valueFloat = Float.parseFloat(value); + String newValue = null; + + // here we need to set the scaling and the correct oid for string or integer + if (scale < 0) { + float valueFloatScaled = (valueFloat * scale * -1); + newValue = Integer.toString((int) valueFloatScaled); + } else if (scale > 0 && scale != 1) { + float valueFloatScaled = valueFloat / (scale); + newValue = Integer.toString((int) valueFloatScaled); + } + + newValue = newValue == null + ? Float.toString(valueFloat) + : newValue; + + logger.info(String.format("Variable value after scaling: %s", newValue)); + return newValue; + } + + public String scaleValueFromDevice(Integer value, Integer scalingFactor) { + if (scalingFactor > 1) { + float calculation = value.floatValue() * scalingFactor; + return Float.toString(calculation); + } else if (scalingFactor < 0) { + float calculation = value.floatValue() / (scalingFactor * -1); + return Float.toString(calculation); + } + + return value.toString(); + } +} diff --git a/src/main/java/io/gec/raw/connector/utils/domain/MeasurementItem.java b/src/main/java/io/gec/raw/connector/utils/domain/MeasurementItem.java new file mode 100755 index 0000000..ae7d852 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/utils/domain/MeasurementItem.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.utils.domain; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class MeasurementItem { + + private long startTime = Long.MIN_VALUE; + private long estimatedTime = Long.MIN_VALUE; + + public long getActive() { + return System.currentTimeMillis() - this.startTime; + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableConstraintParser.java b/src/main/java/io/gec/raw/connector/variable/control/VariableConstraintParser.java new file mode 100755 index 0000000..391b70e --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableConstraintParser.java @@ -0,0 +1,78 @@ +package io.gec.raw.connector.variable.control; + +import com.cronutils.utils.StringUtils; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.IntStream; + +@ApplicationScoped +public class VariableConstraintParser { + + private static final Pattern MIN_MAX_CONSTRAINT_PATTERN = Pattern.compile("min\\s*(\\d+)|max\\s*(\\d+)"); + private static final Pattern COLON_CONSTRAINT_PATTERN = Pattern.compile("^[^:]*:\\s*(.*)$"); + private static final Pattern ENUM_RANGE_CONSTRAINT_PATTERN = Pattern.compile("^(\\d+)-(\\d+)$"); + private static final Pattern ENUM_CONSTRAINT_PATTERN = Pattern.compile("^(\\d+(,\\d+)*)$"); + + public Map parseMinMaxConstraint(String constraint) { + if (StringUtils.isEmpty(constraint)) { + throw new IllegalArgumentException("Constraint is empty"); + } + Map result = new HashMap<>(); + Matcher matcher = MIN_MAX_CONSTRAINT_PATTERN.matcher(constraint); + while (matcher.find()) { + if (matcher.group(1) != null) { + result.put("min", Integer.parseInt(matcher.group(1))); + } else if (matcher.group(2) != null) { + result.put("max", Integer.parseInt(matcher.group(2))); + } + } + + return result; + } + + public String parseConstraints(String constraints) { + if (StringUtils.isEmpty(constraints)) { + return null; + } + Matcher matcher = COLON_CONSTRAINT_PATTERN.matcher(constraints); + if (matcher.matches()) { + return matcher.group(1).trim(); + } else { + throw new IllegalArgumentException("invalid input format. Expected: 'type: ' but was %s".formatted(constraints)); + } + } + + public List parseEnumConstraints(String constraints) { + if (StringUtils.isEmpty(constraints)) { + return Collections.emptyList(); + } + Matcher rangeMatcher = ENUM_RANGE_CONSTRAINT_PATTERN.matcher(constraints); + Matcher enumMatcher = ENUM_CONSTRAINT_PATTERN.matcher(constraints); + + if (rangeMatcher.matches()) { + return getIntegersFromRangeConstraint(rangeMatcher); + } else if (enumMatcher.matches()) { + return getIntegersFromCommaConstraint(constraints); + } else { + throw new IllegalArgumentException("invalid input format. Expected: '1,2,3' or '0-9' but was %s".formatted(constraints)); + } + } + + private List getIntegersFromCommaConstraint(String constraints) { + return Arrays.stream(constraints.split(",")) + .map(String::trim) + .map(Integer::parseInt) + .toList(); + } + + private List getIntegersFromRangeConstraint(Matcher rangeMatcher) { + int start = Integer.parseInt(rangeMatcher.group(1)); + int end = Integer.parseInt(rangeMatcher.group(2)); + return IntStream.rangeClosed(start, end) + .boxed() + .toList(); + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableController.java b/src/main/java/io/gec/raw/connector/variable/control/VariableController.java new file mode 100755 index 0000000..e83d899 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableController.java @@ -0,0 +1,190 @@ +package io.gec.raw.connector.variable.control; + +import com.cronutils.utils.StringUtils; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.dto.VariableResponseDTO; +import io.gec.raw.connector.rittal.enums.IRittalEnum; +import io.gec.raw.connector.rittal.helper.RittalEnumHelper; +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.variable.entity.Variable; +import io.gec.raw.connector.variable.projection.VariableNameProjection; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.persistence.EntityNotFoundException; +import jakarta.transaction.Transactional; +import org.jboss.logging.Logger; + +import java.time.OffsetDateTime; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +@ApplicationScoped +public class VariableController { + + @Inject + Logger logger; + @Inject + VariableRepository variableRepository; + @Inject + VariableConstraintParser constraintParser; + @Inject + RittalEnumHelper rittalEnumHelper; + @Inject + VariableValueTaskScheduler variableValueTaskScheduler; + + @Transactional + public void createVariables(List variables, UUID deviceId) { + if (Objects.isNull(variables)) { + return; + } + + OffsetDateTime now = OffsetDateTime.now(); + + variables.forEach(variable -> { + variable.setCreated(now); + variable.setStamp(now); + variable.setDeviceId(deviceId); + variable.setMode(ComponentMode.PAUSE); + variable.setRestoreMode(ComponentMode.PAUSE); + }); + + variableRepository.persist(variables); + } + + public void createVariablesIfNotExistByName(List variables, UUID deviceId) { + var deviceVariableNames = variableRepository.findNamesByDeviceId(deviceId).stream() + .map(VariableNameProjection::getName) + .toList(); + + var newVariables = variables.stream() + .filter(variable -> !deviceVariableNames.contains(variable.getName())) + .toList(); + + createVariables(newVariables, deviceId); + } + + public List getPossibleValues(String constraints, VarTypeEnum varTypeEnum) { + if (StringUtils.isEmpty(constraints)) { + return Collections.emptyList(); + } + if (constraints.contains("-") || constraints.contains(",")) { + return rittalEnumHelper.getPossibleValues(varTypeEnum, constraintParser.parseEnumConstraints(constraints)); + } else { + throw new IllegalArgumentException("Constraint %s is not supported".formatted(constraints)); + } + } + + @Transactional + public void updateVariableInterval(UUID variableId, String value) { + validateSubmittedId(variableId); + Variable variable = variableRepository.findById(variableId); + var interval = parseIntervalStringToIntValue(variable, value); + variable.setSubscriptionInterval(interval); + } + + private void validateSubmittedId(UUID variableId) { + if (variableId == null) { + throw new IllegalStateException("Update Interval Failed, variableId is missing"); + } + } + + private Integer parseIntervalStringToIntValue(Variable variable, String value) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + throw new NumberFormatException("Invalid interval value: %s for Variable: %s".formatted(value, variable.getName())); + } + } + + @Transactional + public List getVariablesByDeviceId(UUID deviceId) { + return variableRepository.findByDeviceId(deviceId); + } + + public List findVariablesInOperationMode() { + return variableRepository.findByMode(ComponentMode.OPERATION); + } + + public List findVariablesUpdatedAfter(OffsetDateTime stamp) { + return variableRepository.findUpdatedAfter(stamp); + } + + public List filterByVendorOid(List variables, RittalMibVariable vendorOid) { + var vendorDotOid = vendorOid.getOid(); + + return variables.stream() + .filter(variable -> + Objects.nonNull(variable.getOidValueAsStringOid()) || Objects.nonNull(variable.getOidValueAsIntegerOid()) + ) + .filter(variable -> + variable.getOidValueAsStringOid().startsWith(vendorDotOid) || variable.getOidValueAsIntegerOid().startsWith(vendorDotOid) + ) + .toList(); + } + + public Variable findById(UUID variableId) { + return variableRepository.findById(variableId); + } + + public Variable findVariableByCommSvcId(UUID commSvcId) { + return variableRepository.findByCommSvcId(commSvcId); + } + + @Transactional + public void updateCommSvcId(List variables) { + variables.forEach(this::updateVariableCommSvcId); + } + + @Transactional + public void updateVariableCommSvcId(VariableResponseDTO variableResponseDTO) { + try { + Variable variable = variableRepository.findById(variableResponseDTO.getConnectorVariableId()); + variable.setCommServiceId(variableResponseDTO.getId()); + } catch (EntityNotFoundException ex) { + logger.warnv("Variable with id: {0} not found in database!", variableResponseDTO.getConnectorVariableId()); + } + } + + @Transactional + public void updateModeByCommSvcId(UUID commSvcId, ComponentMode mode) { + var variable = findVariableByCommSvcId(commSvcId); + updateMode(variable, mode); + logger.debugf("Variable (CommSvcID:'%s') mode set to:'%s'", commSvcId, mode); + } + + @Transactional + public void updateMode(Variable variable, ComponentMode newMode) { + if (ComponentMode.PAUSE.equals(newMode) && variable.isNotInitialValueFetched()) { + variableValueTaskScheduler.executeTask(variable); + variable.setInitialValueFetched(true); + } + if (variable.getMode().isRestorable()) { + variable.setRestoreMode(variable.getMode()); + } + variable.setMode(newMode); + logger.debugf("Variable (ID:'%s') mode set to:'%s'", variable.getId(), newMode); + } + + @Transactional + public void restoreMode(Variable variable) { + Objects.requireNonNull(variable, "Variable required to restore mode"); + updateModeWithRestoreMode(variable); + + logger.debugf("Variable (ID:'%s') mode restored to:'%s'", variable.getId(), variable.getMode()); + } + + public void updateModeWithRestoreMode(Variable variable) { + if (variable != null) { + ComponentMode restoreMode = variable.getRestoreMode(); + variable.setMode(restoreMode); + } + } + + public List findByValueAsIntOid(String valueAsIntOid) { + return variableRepository.findByValueAsIntOid(valueAsIntOid); + } + +} diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableHandler.java b/src/main/java/io/gec/raw/connector/variable/control/VariableHandler.java new file mode 100755 index 0000000..0cdfdd6 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableHandler.java @@ -0,0 +1,98 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.driver.control.ValueMappingService; +import io.gec.raw.connector.utils.control.ValueScalingHelper; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import org.jboss.logging.Logger; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +public class VariableHandler { + private static final String SPACE = " "; + + @Inject + VariableController variableController; + @Inject + ValueScalingHelper valueScalingHelper; + @Inject + VariableValueProvider variableValueProvider; + @Inject + ValueMappingService valueMappingService; + @Inject + VariableMapper variableMapper; + @Inject + VariableValueCacheHandler variableValueCacheHandler; + @Inject + Logger logger; + + @Transactional + public void updateVariable(UUID variableId) { + Variable variable = variableController.findById(variableId); + VariableValueData variableValue = variableValueProvider.getVariableValue(variable); + this.handleVariableValueFetchedFromDevice(variable, variableValue); + } + + @Transactional + public void handleVariableValueFetchedFromDevice(Variable variable, VariableValueData variableValueData) { + logUpdate("START", variable, "handle value"); + + String value = scaleValue(variable, variableValueData.value()); + value = valueMappingService.mapValue(variable.getDriverVariableId(), value); + QualityType currentQualityType = getCurrentQualityType(variable, variableValueData.qualityType()); + UpdateVariableRequestDTO updateVariableRequestDTO = variableMapper.toUpdateVariableRequestDTO(variable, value, currentQualityType); + variableValueCacheHandler.update(updateVariableRequestDTO.getVariableId(), updateVariableRequestDTO); + variable.setInitialValueFetched(true); + } + + private String scaleValue(Variable variable, String value) { + if (valueRequiresScaling(variable, value)) { + String[] splitValue = value.split(SPACE); + try { + int intValue = Integer.parseInt(splitValue[0]); + return valueScalingHelper.scaleValueFromDevice(intValue, variable.getScale()); + } catch (NumberFormatException e) { + logger.warnf(e, "Could not scale value for variable(ID=%s) due to invalid value: %s", variable.getId(), value); + } + } + + return value; + } + + boolean valueRequiresScaling(Variable variable, String value) { + return value != null && !value.isBlank() && isIntegerValue(variable.getVarDataType()); + } + + boolean isIntegerValue(DataTypeEnum dataTypeEnum) { + return List.of(DataTypeEnum.INTEGER, DataTypeEnum.NUMERIC, DataTypeEnum.FLOAT) + .contains(dataTypeEnum); + } + + private QualityType getCurrentQualityType(Variable variable, QualityType qualityType) { + return switch (variable.getMode()) { + case PAUSE -> QualityType.PAUSE; + case FIRMWARE_UPDATE -> QualityType.FIRMWARE_UPDATE; + default -> qualityType; + }; + } + + + private void logUpdate(String action, Variable variable, String message) { + logger.debugf("[%s] Variable(ID=%s, mode=%s, initialValueFetched=%s, interval=%s) - %s", + action, + variable.getId(), + variable.getMode(), + variable.isInitialValueFetched(), + variable.getSubscriptionInterval(), + message + ); + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableMapper.java b/src/main/java/io/gec/raw/connector/variable/control/VariableMapper.java new file mode 100755 index 0000000..29a32d9 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableMapper.java @@ -0,0 +1,115 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.rittal.enums.IRittalEnum; +import io.gec.raw.connector.rittal.helper.RittalEnumHelper; +import io.gec.raw.connector.rittal.maintenancegroup.control.MaintenanceGroupController; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.gec.raw.connector.variable.dto.VariableDTO; +import io.gec.raw.connector.variable.dto.VariableEnumConstraintDTO; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.Objects; + +@ApplicationScoped +public class VariableMapper { + @Inject + VariableController variableController; + @Inject + RittalEnumHelper rittalEnumHelper; + @Inject + MaintenanceGroupController maintenanceGroupController; + @Inject + Logger logger; + + public VariableDTO toVariableDTO(Variable variable) { + try { + var variableDTO = VariableDTO.builder() + .id(variable.getCommServiceId()) + .connectorVariableId(variable.getId()) + .name(variable.getName()) + .description(variable.getDescription()) + .deviceId(variable.getDeviceId()) + .min(variable.getMin()) + .max(variable.getMax()) + .readonly(variable.getVarAccessType() == AccessTypeEnum.READONLY) + .systemDefined(true) + .varType(variable.getVarType()) + .unit(variable.getUnit()) + .varDataType(variable.getVarDataType()) + .scale(variable.getScale()) + .step(variable.getStep()) + .varAccessType(variable.getVarAccessType()) + .interval(variable.getSubscriptionInterval()) + .functionType(variable.getFunctionType()) + .mode(variable.getMode()) + .build(); + if (variable.getName().contains(".Status")) { + variableDTO.setMaintenanceGroups(maintenanceGroupController.getMaintenanceGroup(variable.getDeviceId())); + } + if (variable.getSnmpSetVarDataType() == DataTypeEnum.STRING) { + variableDTO.setRegExp(variable.getConstraints()); + } + if (variable.getSnmpSetVarDataType() == DataTypeEnum.ENUM && rittalEnumHelper.isVarTypeSupported(variable.getVarType())) { + var enumConstraints = toVariableEnumConstraintDTOList(variableController.getPossibleValues(variable.getConstraints(), variable.getVarType())); + variableDTO.setEnumConstraints(enumConstraints); + } + return variableDTO; + } catch (NumberFormatException e) { + logger.errorf("Error while parsing variable %s with Constraint: %s, resulted with message: %s", + variable.getName(), + variable.getConstraints(), + e.getMessage()); + throw e; + } + } + + public List toVariableDTOs(List variables) { + if (Objects.isNull(variables)) { + return List.of(); + } + + return variables.stream() + .map(this::toVariableDTO) + .toList(); + } + + public VariableEnumConstraintDTO toVariableEnumConstraintDTO(IRittalEnum rittalEnum) { + VariableEnumConstraintDTO variableEnumConstraintDTO = new VariableEnumConstraintDTO(); + variableEnumConstraintDTO.setValue(rittalEnum.getValue()); + variableEnumConstraintDTO.setDisplayName(rittalEnum.getDescription()); + return variableEnumConstraintDTO; + } + + public List toVariableEnumConstraintDTOList(List iRittalEnums) { + if (iRittalEnums == null) { + throw new IllegalArgumentException("submitted list of RittalEnums was null"); + } + return iRittalEnums.stream().map(this::toVariableEnumConstraintDTO).toList(); + } + + public VariableValueData toVariableValueData(String value, QualityType qualityType) { + if (value == null || value.isEmpty()) { + throw new IllegalArgumentException("Value cannot be null or empty"); + } + return new VariableValueData(value, qualityType); + } + + public UpdateVariableRequestDTO toUpdateVariableRequestDTO(Variable variable, String mappedValue, QualityType qualityType) { + return UpdateVariableRequestDTO.builder() + .variableId(variable.getId()) + .communicationServiceVariableId(variable.getCommServiceId()) + .value(mappedValue) + .qualityType(qualityType) + .updateTime(OffsetDateTime.now()) + .build(); + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableRepository.java b/src/main/java/io/gec/raw/connector/variable/control/VariableRepository.java new file mode 100755 index 0000000..246a8e2 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableRepository.java @@ -0,0 +1,56 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.variable.entity.Variable; +import io.gec.raw.connector.variable.projection.VariableDriverVariableIdProjection; +import io.gec.raw.connector.variable.projection.VariableNameProjection; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.persistence.EntityNotFoundException; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@ApplicationScoped +public class VariableRepository implements PanacheRepositoryBase { + + public Optional findByDeviceIdAndName(UUID deviceId, String name) { + return find("deviceId = ?1 and name = ?2", deviceId, name) + .firstResultOptional(); + } + + public List findNamesByDeviceId(UUID deviceId) { + return find("deviceId", deviceId) + .project(VariableNameProjection.class) + .list(); + } + + public List findByDeviceId(UUID deviceId) { + return find("deviceId", deviceId).list(); + } + + public Variable findByCommSvcId(UUID id) { + return find("commServiceId", id).stream().findFirst() + .orElseThrow(EntityNotFoundException::new); + } + + public List findByValueAsIntOid(String valueAsIntOid) { + return list("valueAsIntegerOid", valueAsIntOid); + } + + public List findDriverVariableInUseIds(List driverVariableIds) { + return find("driverVariableId in ?1", driverVariableIds) + .project(VariableDriverVariableIdProjection.class) + .list(); + } + + public List findByMode(ComponentMode mode) { + return list("mode", mode); + } + + public List findUpdatedAfter(OffsetDateTime stamp) { + return list("stamp > ?1 and created < ?1", stamp); + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableValueBulkSender.java b/src/main/java/io/gec/raw/connector/variable/control/VariableValueBulkSender.java new file mode 100755 index 0000000..01e7d1b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableValueBulkSender.java @@ -0,0 +1,148 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.config.control.VariableBulkValueSendingConfig; +import io.gec.raw.connector.registration.control.RegistrationService; +import io.gec.raw.connector.statistic.control.StatisticCollectorController; +import io.gec.raw.connector.statistic.domain.StatisticCategory; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.quarkus.scheduler.Scheduled; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.time.OffsetDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@ApplicationScoped +public class VariableValueBulkSender { + + final Map sendingQueue = new HashMap<>(); + private final Lock lock = new ReentrantLock(); + OffsetDateTime firstItemUpdate = null; + OffsetDateTime lastItemUpdate = null; + + @Inject + Logger logger; + @Inject + StatisticCollectorController statisticCollectorController; + @Inject + VariableBulkValueSendingConfig variableBulkValueSendingConfig; + @Inject + CommunicationServiceController communicationServiceController; + + public void addToQueue(UpdateVariableRequestDTO dto) { + List dataForSending = Collections.emptyList(); + + lock.lock(); + try { + sendingQueue.put(dto.getVariableId(), dto); + updateTimeIndicators(dto.getUpdateTime()); + if (shouldTriggerSending()) { + dataForSending = prepareDataForSending(); + } + } finally { + lock.unlock(); + } + + sendDataIfProvided(dataForSending); + } + + @Scheduled(every = "5s", concurrentExecution = Scheduled.ConcurrentExecution.SKIP, skipExecutionIf = RegistrationService.class) + public void scheduledSend() { + List dataForSending = Collections.emptyList(); + + lock.lock(); + try { + if (shouldTriggerSending()) { + dataForSending = prepareDataForSending(); + } + } finally { + lock.unlock(); + } + + sendDataIfProvided(dataForSending); + } + + List prepareDataForSending() { + List variableRequestDTOs = new ArrayList<>(sendingQueue.values()); + sendingQueue.clear(); + resetTimeIndicators(); + + return variableRequestDTOs; + } + + void sendDataIfProvided(List variableRequestDTOs) { + if (!variableRequestDTOs.isEmpty()) { + printLogMessage(variableRequestDTOs); + long startMillis = System.currentTimeMillis(); + + communicationServiceController.updateVariableValues(variableRequestDTOs); + + fillStatistics(startMillis); + } + } + + boolean shouldTriggerSending() { + if (isQueueEmpty()) { + return false; + } + + OffsetDateTime now = OffsetDateTime.now(); + + return isQueueSizeExceeded() + || isFirstItemDelayExceeded(now) + || isLastItemDelayExceeded(now); + } + + boolean isQueueEmpty() { + return sendingQueue.isEmpty(); + } + + private boolean isQueueSizeExceeded() { + return sendingQueue.size() >= variableBulkValueSendingConfig.maxQueueSize(); + } + + private boolean isFirstItemDelayExceeded(OffsetDateTime now) { + return firstItemUpdate!=null && firstItemUpdate.plus(variableBulkValueSendingConfig.maxDelayForFirstValue()).isBefore(now); + } + + private boolean isLastItemDelayExceeded(OffsetDateTime now) { + return lastItemUpdate!=null && lastItemUpdate.plus(variableBulkValueSendingConfig.maxWaitTimeForNextValue()).isBefore(now); + } + + private void printLogMessage(List variableRequestDTOs) { + var firstVarValue = variableRequestDTOs.getFirst(); + var lastVarValue = variableRequestDTOs.getLast(); + var packageGatheringMillis = ChronoUnit.MILLIS.between(firstVarValue.getUpdateTime(), lastVarValue.getUpdateTime()); + logger.debugf("Bulk of Variable Values ready for sending - size: %d, gathering time: %s ms)", variableRequestDTOs.size(), packageGatheringMillis); + } + + private void fillStatistics(long startMillis) { + long endMillis = System.currentTimeMillis(); + + StatisticCategory statisticCategory = StatisticCategory.of(this.getClass().getSimpleName(), + "sendVariableValues"); + statisticCollectorController.add(statisticCategory, startMillis, endMillis, endMillis); + } + + void updateTimeIndicators(OffsetDateTime updateTime) { + if (firstItemUpdate == null) { + firstItemUpdate = updateTime; + } + lastItemUpdate = updateTime; + } + + private void resetTimeIndicators() { + firstItemUpdate = null; + lastItemUpdate = null; + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableValueCacheHandler.java b/src/main/java/io/gec/raw/connector/variable/control/VariableValueCacheHandler.java new file mode 100755 index 0000000..61b77aa --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableValueCacheHandler.java @@ -0,0 +1,81 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.quarkus.cache.Cache; +import io.quarkus.cache.CacheKey; +import io.quarkus.cache.CacheName; +import io.quarkus.cache.CacheResult; +import io.quarkus.cache.CaffeineCache; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.jboss.logging.Logger; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +@ApplicationScoped +public class VariableValueCacheHandler { + + @CacheName("variable-values") + Cache cache; + @Inject + Logger logger; + @Inject + VariableValueBulkSender variableValueBulkSender; + + @CacheResult(cacheName = "variable-values") + public UpdateVariableRequestDTO getCachedValue(@CacheKey UUID key) { + UpdateVariableRequestDTO value = (UpdateVariableRequestDTO) getCaffeineCache().getIfPresent(key).getNow(null); + logger.debugv("Getting variable from cache, key: {0}, value: {1}", key, value); + return value; + } + + public void update(@CacheKey UUID variableId, UpdateVariableRequestDTO incomingVariableDTO) { + UpdateVariableRequestDTO cachedVariableDTO = getCachedValue(variableId); + if (isNewValueForCache(incomingVariableDTO, cachedVariableDTO)) { + variableValueBulkSender.addToQueue(incomingVariableDTO); + putIntoCache(variableId, incomingVariableDTO); + } else { + //INFO: Refresh cached value to set new expiration time + putIntoCache(variableId, incomingVariableDTO); + } + } + + private void putIntoCache(UUID variableId, UpdateVariableRequestDTO incomingVariableDTO) { + getCaffeineCache().put(variableId, CompletableFuture.completedFuture(incomingVariableDTO)); + } + + private boolean isNewValueForCache(UpdateVariableRequestDTO incomingVariableDTO, UpdateVariableRequestDTO cachedVariableDTO) { + return cachedVariableDTO == null + || isValueChanged(incomingVariableDTO, cachedVariableDTO); + } + + private boolean isValueChanged(UpdateVariableRequestDTO incomingVariableDTO, UpdateVariableRequestDTO cachedVariableDTO) { + if (incomingVariableDTO.getValue() == null) { + return cachedVariableDTO.getValue() != null; + } else { + return !(incomingVariableDTO.getValue().equals(cachedVariableDTO.getValue())); + } + } + + public void removeFromCache(List variableIds) { + variableIds.parallelStream().forEach(variableId -> { + Uni uni = getCaffeineCache().invalidate(variableId); + //INFO: Subscribe to the Uni to ensure the operation completes and handle success/failure + uni.onItem().invoke(() -> + logger.trace("Cache invalidation invoked for variable ID: " + variableId) + ).onFailure().invoke(ex -> + logger.error("Failed to invalidate cache for variable ID: " + variableId, ex) + ).subscribe().with( + ignored -> logger.trace("Cache invalidation completed for variable ID: " + variableId), + ex -> logger.error("Unexpected error during cache invalidation for variable ID: " + variableId, ex) + ); + }); + } + + private CaffeineCache getCaffeineCache() { + return cache.as(CaffeineCache.class); + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableValueProvider.java b/src/main/java/io/gec/raw/connector/variable/control/VariableValueProvider.java new file mode 100755 index 0000000..e39a46b --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableValueProvider.java @@ -0,0 +1,132 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.discovery.control.DeviceDiscoveryProtocolService; +import io.gec.raw.connector.discovery.domain.DeviceDiscoveryProtocolData; +import io.gec.raw.connector.snmp.common.control.PDUResponseMapper; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.snmp.common.domain.SnmpGetJob; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.variable.domain.VariableSnmpMessageTaskData; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.Logger; +import org.snmp4j.PDU; + +import java.util.Objects; + +import static io.gec.raw.connector.device.control.ExternalDeviceBuilder.NO_QUALITY_OID; + +@ApplicationScoped +public class VariableValueProvider { + + private final DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + private final SnmpService snmpService; + private final PDUResponseMapper pduResponseMapper; + private final Logger logger; + private final DeviceDiscoveryProtocolService deviceDiscoveryProtocolService; + + public VariableValueProvider(DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper, + SnmpService snmpService, + PDUResponseMapper pduResponseMapper, + Logger logger, + DeviceDiscoveryProtocolService deviceDiscoveryProtocolService) { + this.discoveryWorkItemToDiscoveryDataMapper = discoveryWorkItemToDiscoveryDataMapper; + this.snmpService = snmpService; + this.pduResponseMapper = pduResponseMapper; + this.logger = logger; + this.deviceDiscoveryProtocolService = deviceDiscoveryProtocolService; + } + + public VariableValueData getVariableValue(Variable variable) { + var snmpMessageTaskData = this.createSnmpMessageTaskData(variable); + return executeSnmpMessageTask(snmpMessageTaskData); + } + + public VariableValueData executeSnmpMessageTask(VariableSnmpMessageTaskData snmpMessageTaskData) { + if (snmpMessageTaskData.isExecutable()) { + logger.debugf("Executing SNMP-GET Job for Variable: name=%s ID=%s", snmpMessageTaskData.entity().getName(), snmpMessageTaskData.entity().getId()); + var value = executeSnmpGetValue(snmpMessageTaskData.messageDataValue()); + var qualityType = executeSnmpGetQualityType(snmpMessageTaskData.messageDataQuality()); + + return new VariableValueData(value, qualityType); + } + + return new VariableValueData(null, QualityType.DEVICE_UNAVAILABLE); + } + + public VariableSnmpMessageTaskData createSnmpMessageTaskData(Variable variable) { + var deviceProtocolData = deviceDiscoveryProtocolService.findDeviceDiscoveryProtocolData(variable.getDeviceId()); + + var snmpMessageDataValue = buildVariableValueSnmpMessageData(variable, deviceProtocolData); + var snmpMessageDataQuality = buildVariableQualitySnmpMessageData(variable, deviceProtocolData); + + return new VariableSnmpMessageTaskData(variable, snmpMessageDataValue, snmpMessageDataQuality); + } + + private SnmpMessageData buildVariableValueSnmpMessageData(Variable variable, DeviceDiscoveryProtocolData deviceProtocolData) { + if (!(Objects.nonNull(deviceProtocolData.deviceIP()) + && Objects.nonNull(deviceProtocolData.snmpProtocolData()) + && Objects.nonNull(variable))) { + logger.warnv( + "Could not create Variable SNMP-GET Job due to NULL in one or more required data. RootDeviceIP: {0}, Variable: {1}, DiscoveryWorkItem: {2}", + deviceProtocolData.deviceIP(), variable, deviceProtocolData.snmpProtocolData()); + return null; + } + + var oid = determineOidBasedOnDataType(variable); + var snmpGetJob = SnmpGetJob.builder() + .ipAddress(deviceProtocolData.deviceIP()) + .oid(oid) + .build(); + + return discoveryWorkItemToDiscoveryDataMapper.toSnmpGetMessageData(snmpGetJob, deviceProtocolData.snmpProtocolData()); + } + + private SnmpMessageData buildVariableQualitySnmpMessageData(Variable variable, DeviceDiscoveryProtocolData deviceProtocolData) { + if (Objects.nonNull(deviceProtocolData.deviceIP()) + && Objects.nonNull(deviceProtocolData.snmpProtocolData()) + && Objects.nonNull(variable) + && !variable.getVarQualityOid().equals(NO_QUALITY_OID)) { + + var snmpGetJob = SnmpGetJob.builder() + .ipAddress(deviceProtocolData.deviceIP()) + .oid(variable.getVarQualityOid()) + .build(); + return discoveryWorkItemToDiscoveryDataMapper.toSnmpGetMessageData(snmpGetJob, deviceProtocolData.snmpProtocolData()); + } + return null; + } + + private String determineOidBasedOnDataType(Variable variable) { + DataTypeEnum dataType = variable.getVarDataType(); + if (dataType == DataTypeEnum.INTEGER || dataType == DataTypeEnum.ENUM || dataType == DataTypeEnum.NUMERIC || dataType == DataTypeEnum.FLOAT || dataType == DataTypeEnum.STATUSINT) { + return variable.getValueAsIntegerOid(); + } else { + return variable.getValueAsStringOid(); + } + } + + private String executeSnmpGetValue(SnmpMessageData snmpMessageData) { + if (snmpMessageData == null) { + logger.debugf("No SnmpMessageData for Value provided -> value=null"); + return null; + } + + return snmpService.snmpGet(snmpMessageData).orElse(null); + } + + private QualityType executeSnmpGetQualityType(SnmpMessageData snmpMessageData) { + if (snmpMessageData == null) { + logger.debugf("No SnmpMessageData for Quality provided -> Quality=GOOD"); + return QualityType.GOOD; + } + + PDU pdu = snmpService.snmpGetPDU(snmpMessageData); + return pduResponseMapper.toQualityType(pdu); + } +} + diff --git a/src/main/java/io/gec/raw/connector/variable/control/VariableValueTaskScheduler.java b/src/main/java/io/gec/raw/connector/variable/control/VariableValueTaskScheduler.java new file mode 100755 index 0000000..cb12f6a --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/control/VariableValueTaskScheduler.java @@ -0,0 +1,45 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.subscription.control.AbstractTaskScheduler; +import io.gec.raw.connector.subscription.domain.ScheduledTask; +import io.gec.raw.connector.variable.domain.VariableValueScheduledTask; +import io.gec.raw.connector.variable.domain.VariableSnmpMessageTaskData; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; + +import java.util.UUID; + +@ApplicationScoped +public class VariableValueTaskScheduler extends AbstractTaskScheduler { + + @Inject + VariableValueProvider variableValueProvider; + @Inject + VariableHandler variableHandler; + @Inject + VariableController variableController; + + @Override + protected ScheduledTask createScheduledTask(Variable entity) { + return new VariableValueScheduledTask( + entity, + this::createTaskData, + this::runTask + ); + } + + @Override + @Transactional + protected VariableSnmpMessageTaskData createTaskData(UUID variableId) { + var variable = variableController.findById(variableId); + return variableValueProvider.createSnmpMessageTaskData(variable); + } + + @Override + protected void runTask(VariableSnmpMessageTaskData taskData) { + var variableValueData = variableValueProvider.executeSnmpMessageTask(taskData); + variableHandler.handleVariableValueFetchedFromDevice(taskData.entity(), variableValueData); + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/domain/VariableSnmpMessageTaskData.java b/src/main/java/io/gec/raw/connector/variable/domain/VariableSnmpMessageTaskData.java new file mode 100755 index 0000000..a2fb53f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/domain/VariableSnmpMessageTaskData.java @@ -0,0 +1,12 @@ +package io.gec.raw.connector.variable.domain; + +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.subscription.domain.TaskData; +import io.gec.raw.connector.variable.entity.Variable; + +public record VariableSnmpMessageTaskData( + Variable entity, + SnmpMessageData messageDataValue, + SnmpMessageData messageDataQuality +) implements TaskData { +} diff --git a/src/main/java/io/gec/raw/connector/variable/domain/VariableValueData.java b/src/main/java/io/gec/raw/connector/variable/domain/VariableValueData.java new file mode 100755 index 0000000..cf8ad3f --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/domain/VariableValueData.java @@ -0,0 +1,6 @@ +package io.gec.raw.connector.variable.domain; + +import io.gec.raw.connector.variable.dto.QualityType; + +public record VariableValueData(String value, QualityType qualityType) { +} diff --git a/src/main/java/io/gec/raw/connector/variable/domain/VariableValueScheduledTask.java b/src/main/java/io/gec/raw/connector/variable/domain/VariableValueScheduledTask.java new file mode 100755 index 0000000..879fc39 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/domain/VariableValueScheduledTask.java @@ -0,0 +1,47 @@ +package io.gec.raw.connector.variable.domain; + +import io.gec.raw.connector.subscription.domain.ScheduledTask; +import io.gec.raw.connector.subscription.domain.TaskAction; +import io.gec.raw.connector.subscription.domain.TaskDataFactory; +import io.gec.raw.connector.variable.entity.Variable; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class VariableValueScheduledTask implements ScheduledTask { + + private final Variable entity; + private final TaskDataFactory dataFactory; + private final TaskAction action; + private final AtomicBoolean runningState; + + public VariableValueScheduledTask( + Variable entity, + TaskDataFactory dataFactory, + TaskAction action + ) { + this.entity = entity; + this.dataFactory = dataFactory; + this.action = action; + this.runningState = new AtomicBoolean(false); + } + + @Override + public Variable entity() { + return entity; + } + + @Override + public TaskDataFactory dataFactory() { + return dataFactory; + } + + @Override + public TaskAction action() { + return action; + } + + @Override + public AtomicBoolean runningState() { + return runningState; + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/dto/QualityType.java b/src/main/java/io/gec/raw/connector/variable/dto/QualityType.java new file mode 100755 index 0000000..95fda2d --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/dto/QualityType.java @@ -0,0 +1,18 @@ +package io.gec.raw.connector.variable.dto; + +import lombok.Getter; + +@Getter +public enum QualityType { + + GOOD, + BAD, + NO_VALUE, + UNCERTAIN, + UNAVAILABLE, + DEVICE_COMMUNICATION_ISSUE, + DEVICE_UNAVAILABLE, + PAUSE, + SERVICE, + FIRMWARE_UPDATE +} diff --git a/src/main/java/io/gec/raw/connector/variable/dto/UpdateVariableRequestDTO.java b/src/main/java/io/gec/raw/connector/variable/dto/UpdateVariableRequestDTO.java new file mode 100755 index 0000000..286862c --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/dto/UpdateVariableRequestDTO.java @@ -0,0 +1,21 @@ +package io.gec.raw.connector.variable.dto; + +import lombok.*; + +import java.time.OffsetDateTime; +import java.util.UUID; + +@Builder +@EqualsAndHashCode +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@ToString +public class UpdateVariableRequestDTO { + UUID variableId; + UUID communicationServiceVariableId; + String value; + QualityType qualityType; + OffsetDateTime updateTime; +} diff --git a/src/main/java/io/gec/raw/connector/variable/dto/VarQuality.java b/src/main/java/io/gec/raw/connector/variable/dto/VarQuality.java new file mode 100755 index 0000000..4465cc5 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/dto/VarQuality.java @@ -0,0 +1,31 @@ +package io.gec.raw.connector.variable.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +@Getter +@AllArgsConstructor +public enum VarQuality { + + UNDEFINED(1), + OK(2), + WARNING(3), + ALARM(4), + INFO(5), + UNDEFINEDNOVALUE(21), + OKNOVALUE(22), + WARNINGNOVALUE(23), + ALARMNOVALUE(24), + INFONOVALUE(25); + + private final int value; + + public static Optional toVarQuality(int value) { + return Arrays.stream(VarQuality.values()) + .filter(enumVal -> enumVal.getValue() == value) + .findFirst(); + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/dto/VariableDTO.java b/src/main/java/io/gec/raw/connector/variable/dto/VariableDTO.java new file mode 100755 index 0000000..3d9b3bf --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/dto/VariableDTO.java @@ -0,0 +1,43 @@ +package io.gec.raw.connector.variable.dto; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import io.gec.raw.connector.rittal.maintenancegroup.dto.MaintenanceGroupEnum; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +@Builder +public class VariableDTO { + + private UUID id; + private UUID connectorVariableId; + private String name; + private String description; + private UUID deviceId; + private Integer min; + private Integer max; + private boolean readonly; + private boolean systemDefined; + private DataTypeEnum varDataType; + private String unit; + private VarTypeEnum varType; + private VarQuality quality; + private Integer scale; + private Integer step; + private AccessTypeEnum varAccessType; + private FunctionTypeEnum functionType; + private int interval; + private ComponentMode mode; + private String regExp; + private List enumConstraints; + private List maintenanceGroups; +} diff --git a/src/main/java/io/gec/raw/connector/variable/dto/VariableEnumConstraintDTO.java b/src/main/java/io/gec/raw/connector/variable/dto/VariableEnumConstraintDTO.java new file mode 100755 index 0000000..e9288c1 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/dto/VariableEnumConstraintDTO.java @@ -0,0 +1,11 @@ +package io.gec.raw.connector.variable.dto; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class VariableEnumConstraintDTO { + int value; + String displayName; +} diff --git a/src/main/java/io/gec/raw/connector/variable/entity/VarTypeEnum.java b/src/main/java/io/gec/raw/connector/variable/entity/VarTypeEnum.java new file mode 100755 index 0000000..64aa5ee --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/entity/VarTypeEnum.java @@ -0,0 +1,132 @@ +package io.gec.raw.connector.variable.entity; + +import jakarta.enterprise.context.Dependent; +import lombok.Getter; + +@Dependent +@Getter +public enum VarTypeEnum { + DESCRIPTION("DESCRIPTION", 1), + VALUE("VALUE", 2), + SETHIGH("SETHIGH", 3), + SETWARN("SETWARN", 4), + SETLOW("SETLOW", 5), + HYSTERESIS("HYSTERESIS", 6), + STATUS("STATUS", 7), + STATUSENUM("STATUSENUM", 8), + SETWARNLOW("SETWARNLOW", 9), + UNIT("UNIT", 10), + ALARMDUR("ALARMDUR", 11), + STEPS("STEPS", 12), + CONFIGPAR("CONFIGPAR", 13), + CATEGORY("CATEGORY", 14), + LOGIC("LOGIC", 15), + LOGICENUM("LOGICENUM", 16), + SETCNTRL("SETCNTRL", 17), + OFFSET("OFFSET", 18), + TYPE("TYPE", 19), + OUTPUT("OUTPUT", 20), + OUTPUTDELAY("OUTPUTDELAY", 21), + OUTPUTACTION("OUTPUTACTION", 22), + OUTPUTDELAYEXEC("OUTPUTDELAYEXEC", 23), + OUTPUTENUM("OUTPUTENUM", 24), + CONFIG("CONFIG", 25), + CONFIGNUM("CONFIGNUM", 26), + CONFIGLCPFCS("CONFIGLCPFCS", 27), + ASSEMBLY("ASSEMBLY", 28), + CONFIGWIRING("CONFIGWIRING", 29), + SENSITIVITY("SENSITIVITY", 30), + ACCESSTIME("ACCESSTIME", 31), + ACCESLOGIC("ACCESLOGIC", 32), + POSITION("POSITION", 33), + POSITIONENUM("POSITIONENUM", 34), + PIN("PIN", 35), + SEQUENCE("SEQUENCE", 36), + REMOTE("REMOTE", 37), + STRINGVALUE("STRINGVALUE", 38), + REMOTETIMEOUT("REMOTETIMEOUT", 39), + OUTPUTPWM("OUTPUTPWM", 40), + ROTATION("ROTATION", 41), + CIRCUIT("CIRCUIT", 42), + RIZONEARRAY("RIZONEARRAY", 43), + SOCKETTYPE("SOCKETTYPE", 44), + CUSTOMVALUE("CUSTOMVALUE", 45), + RCMPOSITION("RCMPOSITION", 46), + RCMPOSENUM("RCMPOSENUM", 47), + RCMRESULT("RCMRESULT", 48), + PRODUCTDATE("PRODUCTDATE", 50), + ORDERNR("ORDERNR", 51), + DEVNAME("DEVNAME", 52), + DEVLOCATION("DEVLOCATION", 53), + CURRENTMIN("CURRENTMIN", 54), + CURRENTMAX("CURRENTMAX", 55), + MODE("MODE", 56), + KEYCODE("KEYCODE", 80), + COMMAND("COMMAND", 81), + COMMANDENUM("COMMANDENUM", 82), + COMMANDKEYPAD("COMMANDKEYPAD", 83), + COMMANDSERVICE("COMMANDSERVICE", 84), + COMMANDRACK("COMMANDRACK", 85), + COMMANDRCM("COMMANDRCM", 86), + COMMANDSTATUS("COMMANDSTATUS", 87), + UNITTYPE("UNITTYPE", 90), + SWVERSION("SWVERSION", 91), + SERIALNUMBER("SERIALNUMBER", 92), + MOUNTPOS("MOUNTPOS", 93), + MOUNTPOSENUM("MOUNTPOSENUM", 94), + GSMSTATUS("GSMSTATUS", 95), + CONNECTED("CONNECTED", 96), + CONNECTEDENUM("CONNECTEDENUM", 97), + HWVERSION("HWVERSION", 98), + GROUPING("GROUPING", 100), + SCALEVALUE("SCALEVALUE", 110), + SCALEUNIT("SCALEUNIT", 111), + SCALESTART("SCALESTART", 112), + SCALEEND("SCALEEND", 113), + COMMANDCTRL("COMMANDCTRL", 120), + COMMANDCTRLDP("COMMANDCTRLDP", 121), + COMMANDCTRLWDT("COMMANDCTRLWDT", 122), + FANAFFECT("FANAFFECT", 123), + WATERAFFECT("WATERAFFECT", 124), + COMMANDDP("COMMANDDP", 125), + COMMANDBEP("COMMANDBEP", 126), + COMMANDMINICH("COMMANDMINICH", 127), + REMOTEBEP("REMOTEBEP", 128), + LOCATION("LOCATION", 130), + BUILDING("BUILDING", 131), + LEVEL("LEVEL", 132), + ROOM("ROOM", 133), + ROW("ROW", 134), + RACK("RACK", 135), + OPERATIONTIME("OPERATIONTIME", 136), + NUMBEROFRU("NUMBEROFRU", 137), + TAGSQUIT("TAGSQUIT", 138), + TAGSCHANGED("TAGSCHANGED", 139), + UID("UID", 140), + OPMODEBEP("OPMODEBEP", 145), + LEDMODE("157", 157), + COMMANDSIGNAL("151", 151), + OPMODEMINICH("OPMODEMINICH", 146), + COMMANDCONTROL("COMMANDCONTROL", 150), + IGNORE("IGNORE", 254), + ILLEGAL("ILLEGAL", 255); + + + private final String ordinal; + private final Integer number; + + VarTypeEnum(String ordinal, Integer number) { + this.ordinal = ordinal; + this.number = number; + } + + public static VarTypeEnum findByNumber(Integer number) { + for (VarTypeEnum varType : VarTypeEnum.values()) { + if (varType.getNumber().equals(number)) { + return varType; + } + } + + return VarTypeEnum.ILLEGAL; + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/entity/Variable.java b/src/main/java/io/gec/raw/connector/variable/entity/Variable.java new file mode 100755 index 0000000..3bdb5d0 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/entity/Variable.java @@ -0,0 +1,117 @@ +package io.gec.raw.connector.variable.entity; + +import io.gec.raw.connector.base.entity.SimpleBaseEntity; +import io.gec.raw.connector.base.entity.SubscribableEntity; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import jakarta.enterprise.context.Dependent; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.UuidGenerator; +import org.snmp4j.smi.OID; + +import java.util.UUID; + +import static io.gec.raw.connector.device.control.ExternalDeviceBuilder.NO_QUALITY_OID; + +@Dependent +@Entity(name = "variable") +@Table(name = "variable", schema = "connector_svc") +@ToString +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Variable extends SimpleBaseEntity implements SubscribableEntity { + + @Id + @UuidGenerator + private UUID id; + + @Column(name = "device_id") + private UUID deviceId; + + private String name; + private String description; + private Integer min; + private Integer max; + + @Enumerated(EnumType.STRING) + private VarTypeEnum varType; + + @Enumerated(EnumType.STRING) + private DataTypeEnum varDataType; + + @Enumerated(EnumType.STRING) + @Column(name = "snmpset_vardatatype") + private DataTypeEnum snmpSetVarDataType; + + private String unit; + private Integer scale; + + @Column(name = "variable_constraints") + private String constraints; + + private Integer step; + + @Enumerated(EnumType.STRING) + private AccessTypeEnum varAccessType; + + private String varQualityOid; + private String valueAsIntegerOid; + private String valueAsStringOid; + + @Column(name = "comm_svc_id") + private UUID commServiceId; + + @Column(name = "subscription_interval") + private int subscriptionInterval; + + @Column(name = "driver_variable_id") + private UUID driverVariableId; + + @Enumerated(EnumType.STRING) + @Column(name = "function_type", nullable = false) + private FunctionTypeEnum functionType; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ComponentMode mode; + + @Enumerated(EnumType.STRING) + @Column(name = "restore_mode", nullable = false) + private ComponentMode restoreMode; + + @Builder.Default + @Column(name = "initial_value_fetched", nullable = false) + private boolean initialValueFetched = false; + + public void setScale(String scale) { + this.scale = Integer.parseInt(scale); + } + + public void setStep(String step) { + this.step = Integer.parseInt(step); + } + + public OID getOidValueAsStringOid() { + if (valueAsStringOid == null) + return null; + return new OID(valueAsStringOid); + } + + public OID getOidValueAsIntegerOid() { + if (valueAsIntegerOid == null) + return null; + return new OID(valueAsIntegerOid); + } + + public OID getOidVarQualityOid() { + if (varQualityOid == null || NO_QUALITY_OID.equals(varQualityOid)) + return null; + return new OID(varQualityOid); + } +} diff --git a/src/main/java/io/gec/raw/connector/variable/projection/VariableDriverVariableIdProjection.java b/src/main/java/io/gec/raw/connector/variable/projection/VariableDriverVariableIdProjection.java new file mode 100755 index 0000000..47d5e19 --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/projection/VariableDriverVariableIdProjection.java @@ -0,0 +1,14 @@ +package io.gec.raw.connector.variable.projection; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.UUID; + +@RegisterForReflection +@AllArgsConstructor +@Getter +public class VariableDriverVariableIdProjection { + private UUID driverVariableId; +} diff --git a/src/main/java/io/gec/raw/connector/variable/projection/VariableNameProjection.java b/src/main/java/io/gec/raw/connector/variable/projection/VariableNameProjection.java new file mode 100755 index 0000000..5a962ba --- /dev/null +++ b/src/main/java/io/gec/raw/connector/variable/projection/VariableNameProjection.java @@ -0,0 +1,12 @@ +package io.gec.raw.connector.variable.projection; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@RegisterForReflection +@AllArgsConstructor +@Getter +public class VariableNameProjection { + private String name; +} diff --git a/src/main/resources/META-INF/resources/index.html b/src/main/resources/META-INF/resources/index.html new file mode 100755 index 0000000..8d88dbd --- /dev/null +++ b/src/main/resources/META-INF/resources/index.html @@ -0,0 +1,286 @@ + + + + + Raw-Snmp-Connector - 1.0.0-SNAPSHOT + + + +
+
+
+ + + + + quarkus_logo_horizontal_rgb_1280px_reverse + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100755 index 0000000..5b1f369 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,21 @@ +connector: + name: "Dev Connector" + description: "Dev Connector" + +snmp: + connection-types: + traps: + port: 1162 # changed from default 162 until the proper solution is found, RIZ-2587 + +quarkus: + http: + port: 8083 + host: 0.0.0.0 + datasource: + jdbc: + url: jdbc:postgresql://localhost:5432/rizone + log: + level: INFO + category: + "io.gec.raw.connector": + level: DEBUG diff --git a/src/main/resources/application-local.yml.template b/src/main/resources/application-local.yml.template new file mode 100755 index 0000000..245b207 --- /dev/null +++ b/src/main/resources/application-local.yml.template @@ -0,0 +1,7 @@ +connector: + id: "" # Generate and set your own connector ID with UUID Generator: https://www.uuidgenerator.net/ + +server: + # uncomment below lines to use DEV environment with your local connector +# communicationService: https://rizone-dev.apps.st.alm.oncite.io/communication-svc/ +# deviceService: https://rizone-dev.apps.st.alm.oncite.io/device-svc/ diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100755 index 0000000..670625b --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,9 @@ +connector: + id: "222259b2-f94f-4285-8bdd-d3b561066992" + name: "RiZone OTM Suite SNMP Connector" + description: "RiZone OTM Suite SNMP Connector" + +quarkus: + datasource: + jdbc: + url: jdbc:postgresql://localhost:5432/rizone diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml new file mode 100755 index 0000000..bc9f217 --- /dev/null +++ b/src/main/resources/application-test.yml @@ -0,0 +1,17 @@ +connector: + id: "222259b2-f94f-4285-8bdd-d3b561066992" + name: "RiZone OTM Suite SNMP Connector" + description: "RiZone OTM Suite SNMP Connector" + +quarkus: + http: + test-port: 0 + scheduler: + enabled: false + datasource: + devservices: + image-name: postgres:15.2-alpine + log: + category: + "io.gec.raw.connector": + level: FATAL diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100755 index 0000000..9f231aa --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,127 @@ +connector: + job: + firmware: + uploader: + pool-size: 1 + update-verifier: + pool-size: 3 + timeout: 15m + interval: 30s + variable: + bulk-value-sending: + max-queue-size: 100 + max-delay-for-first-value: 2s + max-wait-time-for-next-value: 1s + +server: + communicationService: http://localhost:8081/communication-svc + deviceService: http://localhost:8082/device-svc + +snmp: + message-dispatcher-pool-size: 5 + dynamic-table: + pool-size: 5 + default-pooling-interval: 3 + scheduled-tasks: + pool-size: 5 + connection-types: + traps: + protocol: udp + hostname: 0.0.0.0 + port: 162 + discovery: + deprecated-protocols: + root-oid: 1.3.6.1 + pool-size: 2 + initial-get-retries: 3 + initial-get-timeout: 1000 + bulk-get-retries: 3 + bulk-get-timeout: 1000 + get-retries: 1 + get-timeout: 500 + set-retries: 3 + set-timeout: 5000 + +quarkus: + application: + name: ${project.name} + version: ${project.version} + arc: + test: + disable-application-lifecycle-observers: true + rest-client: + "communication-service": + url: ${server.communicationService} + connect-timeout: 5000 + read-timeout: 180000 + "device-service": + url: ${server.deviceService} + connect-timeout: 5000 + read-timeout: 120000 + thread-pool: + shutdown-timeout: 1 + otel: + traces: + sampler: + ~: traceidratio + # value: 1.0 - all traces are exported, 0.0 - no traces are exported + arg: 0.0 + datasource: + username: rizone + password: rizone + db-kind: postgresql + jdbc: + telemetry: true + max-size: 16 + new-connection-sql: set application_name to '${project.artifactId}' + validation-query-sql: select 1 + idle-removal-interval: 300s + max-lifetime: 600s + acquisition-timeout: 5s + hibernate-orm: + database: + #possible options: 'update' (dev only), 'validate' (prod) + generation: validate + flyway: + migrate-at-start: true + baseline-on-migrate: true + baseline-at-start: true + baseline-version: 1.0.0 + schemas: connector_svc + validate-on-migrate: true + callbacks: io.gec.raw.connector.flyway.ConnectorFlywayMaintenanceCallback + transaction-manager: + default-transaction-timeout: 180s + cache: + caffeine: + "variable-values": + maximum-size: 10000 + expire-after-write: 3h + "device-properties": + maximum-size: 10000 + expire-after-write: 3h + "cache-snmp-protocol-data": + expire-after-access: 10m + "cache-device-discovery-protocol-data": + expire-after-access: 10m + "variable-status-value-cache": + expire-after-write: 2s + maximum-size: 100 + log: + category: + "io.quarkus": + level: INFO + "io.gec.raw.connector": + level: INFO + level: INFO + file: + enable: true + level: DEBUG + path: ./connector-log.log + rotation: + max-file-size: 100M + max-backup-index: 5 + format: "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n" + console: + enable: true + level: DEBUG diff --git a/src/main/resources/db/migration/V0_000__Init.sql b/src/main/resources/db/migration/V0_000__Init.sql new file mode 100755 index 0000000..8becb43 --- /dev/null +++ b/src/main/resources/db/migration/V0_000__Init.sql @@ -0,0 +1,173 @@ +BEGIN; +CREATE SCHEMA if not exists raw_connector_db; +CREATE TABLE IF NOT EXISTS raw_connector_db.device +( + id uuid NOT NULL, + created timestamp(6) with time zone NOT NULL, + stamp timestamp(6) with time zone NOT NULL, + name character varying(255) COLLATE pg_catalog."default" NOT NULL, + description character varying(255) COLLATE pg_catalog."default" NOT NULL, + type character varying(255) COLLATE pg_catalog."default", + parent_id uuid, + deviceurl character varying(255) COLLATE pg_catalog."default", + plant_id uuid NOT NULL, + connector_id uuid NOT NULL, + comm_svc_id uuid, + discoveryworkitem_id uuid NOT NULL, + subscribed boolean DEFAULT false, + deployed boolean, + CONSTRAINT device_pkey PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS raw_connector_db.discoveryworkitem +( + id uuid NOT NULL, + name character varying(255) COLLATE pg_catalog."default", + description character varying(255) COLLATE pg_catalog."default", + payload text COLLATE pg_catalog."default", + created timestamp with time zone NOT NULL, + stamp timestamp with time zone NOT NULL, + delivered boolean NOT NULL DEFAULT false, + status character varying(50) COLLATE pg_catalog."default" NOT NULL, + plant_id uuid NOT NULL, + protocol_id uuid NOT NULL, + comm_discovery_id uuid, + CONSTRAINT id PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS raw_connector_db.driver_header +( + id uuid NOT NULL, + description character varying(255) COLLATE pg_catalog."default", + name character varying(255) COLLATE pg_catalog."default", + plant_id uuid, + payload character varying(255) COLLATE pg_catalog."default", + sys_object_id character varying(255) COLLATE pg_catalog."default", + bulk_polling boolean, + content character varying(255) COLLATE pg_catalog."default", + devices character varying(255) COLLATE pg_catalog."default" +); + +CREATE TABLE IF NOT EXISTS raw_connector_db.driver_variable +( + id uuid NOT NULL, + description character varying(255) COLLATE pg_catalog."default", + name character varying(255) COLLATE pg_catalog."default", + plant_id uuid, + payload character varying(255) COLLATE pg_catalog."default", + driver_header_id uuid NOT NULL, + oid character varying(255) COLLATE pg_catalog."default", + data_type character varying(255) COLLATE pg_catalog."default", + display_format character varying(255) COLLATE pg_catalog."default", + display_factor character varying(255) COLLATE pg_catalog."default", + isReadOnly boolean, + interval_factor character varying(255) COLLATE pg_catalog."default", + scale_factor character varying(255) COLLATE pg_catalog."default", + min character varying(255) COLLATE pg_catalog."default", + max character varying(255) COLLATE pg_catalog."default", + step character varying(255) COLLATE pg_catalog."default", + created timestamp(6) with time zone, + stamp timestamp(6) with time zone +); +CREATE TABLE IF NOT EXISTS raw_connector_db.protocol +( + id uuid NOT NULL, + name character varying(200) COLLATE pg_catalog."default" NOT NULL, + communication_service_id uuid, + CONSTRAINT protocol_pkey PRIMARY KEY (id) +); +CREATE TABLE IF NOT EXISTS raw_connector_db.discoveryvalue +( + id uuid NOT NULL, + name character varying(200) COLLATE pg_catalog."default", + description character varying(200) COLLATE pg_catalog."default", + payload text COLLATE pg_catalog."default", + created timestamp with time zone NOT NULL, + stamp timestamp with time zone NOT NULL, + property_id uuid NOT NULL, + discoveryworkitem_id UUID REFERENCES raw_connector_db.discoveryworkitem(id), + propertyvalue character varying(200) NOT NULL, + PRIMARY KEY (id) +); +CREATE TABLE IF NOT EXISTS raw_connector_db.property +( + id uuid NOT NULL, + name character varying(200) NOT NULL, + protocol_id uuid, + communication_service_id uuid, + CONSTRAINT property_pkey PRIMARY KEY (id) +); +CREATE TABLE IF NOT EXISTS raw_connector_db.propertyvalue +( + id uuid NOT NULL, + name character varying(255) COLLATE pg_catalog."default", + property_id uuid, + communication_service_id uuid, + CONSTRAINT propertyvalue_pkey PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS raw_connector_db.flyway_schema_history +( + installed_rank integer NOT NULL, + version character varying(50) , + description character varying(200) NOT NULL, + type character varying(20) NOT NULL, + script character varying(1000) NOT NULL, + checksum integer, + installed_by character varying(100) NOT NULL, + installed_on timestamp without time zone NOT NULL DEFAULT now(), + execution_time integer NOT NULL, + success boolean NOT NULL, + CONSTRAINT flyway_schema_history_pk PRIMARY KEY (installed_rank) +); + + +CREATE TABLE IF NOT EXISTS raw_connector_db.deviceproperty +( + id uuid NOT NULL, + device_id uuid NOT NULL, + name character varying(255) COLLATE pg_catalog."default", + description character varying(255) COLLATE pg_catalog."default", + created timestamp(6) with time zone NOT NULL, + stamp timestamp(6) with time zone NOT NULL, + valueasstringoid character varying(255) COLLATE pg_catalog."default", + valueasstring character varying(255) COLLATE pg_catalog."default", + propertyclass character varying(255) COLLATE pg_catalog."default", + propertygroup character varying(255) COLLATE pg_catalog."default", + isreadonly boolean NOT NULL, + valuechangeoid character varying(255) COLLATE pg_catalog."default", + valuechangedatatype character varying(255) COLLATE pg_catalog."default", + comm_svc_id uuid, + subscribed boolean DEFAULT false, + deployed boolean, + subscription_interval integer, + condition character varying(255) COLLATE pg_catalog."default", + CONSTRAINT deviceproperty_pkey PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS raw_connector_db.variable +( + id uuid NOT NULL, + device_id uuid NOT NULL, + created timestamp(6) with time zone NOT NULL, + stamp timestamp(6) with time zone NOT NULL, + name character varying(255) COLLATE pg_catalog."default" NOT NULL, + description character varying(255) COLLATE pg_catalog."default", + min integer, + max integer, + vartype character varying(255) COLLATE pg_catalog."default" NOT NULL, + vardatatype character varying(255) COLLATE pg_catalog."default" NOT NULL, + unit character varying(255) COLLATE pg_catalog."default", + scale integer, + step integer, + varaccesstype character varying(255) COLLATE pg_catalog."default" NOT NULL, + varqualityoid character varying(255) COLLATE pg_catalog."default" NOT NULL, + valueasintegeroid character varying(255) COLLATE pg_catalog."default" NOT NULL, + valueasstringoid character varying(255) COLLATE pg_catalog."default" NOT NULL, + comm_svc_id uuid, + subscribed boolean DEFAULT false, + deployed boolean, + subscription_interval integer, + CONSTRAINT variable_pkey PRIMARY KEY (id) +); +END; diff --git a/src/main/resources/db/migration/V0_001__addValueStatusMap.sql b/src/main/resources/db/migration/V0_001__addValueStatusMap.sql new file mode 100755 index 0000000..4d5b1bd --- /dev/null +++ b/src/main/resources/db/migration/V0_001__addValueStatusMap.sql @@ -0,0 +1,18 @@ +CREATE TABLE if not exists raw_connector_db."value_status_map" ( + id uuid NOT NULL, + key_factor character varying(255) COLLATE pg_catalog."default", + value_factor character varying(255) COLLATE pg_catalog."default", + variable_id uuid NOT NULL, + connector_variable_id uuid NULL, + created timestamp(6) with time zone NOT NULL, + stamp timestamp(6) with time zone NOT NULL +); + +ALTER TABLE IF EXISTS raw_com_svc_db.driver_header ADD COLUMN IF NOT EXISTS created timestamp(6) with time zone; +ALTER TABLE IF EXISTS raw_com_svc_db.driver_header ADD COLUMN IF NOT EXISTS stamp timestamp(6) with time zone; + +ALTER TABLE IF EXISTS raw_connector_db.driver_variable ADD CONSTRAINT driver_variable_pk PRIMARY KEY (id); +ALTER TABLE IF EXISTS raw_connector_db.value_status_map ADD CONSTRAINT valute_status_map_fk FOREIGN KEY (variable_id) REFERENCES raw_connector_db.driver_variable; + +ALTER TABLE IF EXISTS raw_connector_db.driver_header ADD CONSTRAINT driver_header_pk PRIMARY KEY (id); +ALTER TABLE IF EXISTS raw_connector_db.driver_variable ADD CONSTRAINT driver_variable_map_fk FOREIGN KEY (driver_header_id) REFERENCES raw_connector_db.driver_header; \ No newline at end of file diff --git a/src/main/resources/db/migration/V0_002__addDeprecatedColumnToProtocol.sql b/src/main/resources/db/migration/V0_002__addDeprecatedColumnToProtocol.sql new file mode 100755 index 0000000..3b53d3d --- /dev/null +++ b/src/main/resources/db/migration/V0_002__addDeprecatedColumnToProtocol.sql @@ -0,0 +1 @@ +ALTER TABLE IF EXISTS raw_connector_db.protocol ADD COLUMN IF NOT EXISTS deprecated boolean DEFAULT false; \ No newline at end of file diff --git a/src/main/resources/db/migration/V0_003__addSnmpSetVarDataTypeColumnToVariable.sql b/src/main/resources/db/migration/V0_003__addSnmpSetVarDataTypeColumnToVariable.sql new file mode 100755 index 0000000..699ad7d --- /dev/null +++ b/src/main/resources/db/migration/V0_003__addSnmpSetVarDataTypeColumnToVariable.sql @@ -0,0 +1,4 @@ +ALTER TABLE IF EXISTS raw_connector_db.variable ADD COLUMN IF NOT EXISTS snmpset_vardatatype character varying(255) COLLATE pg_catalog."default" NOT NULL DEFAULT 'INTEGER'; +COMMIT; + +UPDATE raw_connector_db.variable SET snmpset_vardatatype='STRING' WHERE vardatatype <> 'FLOAT'; \ No newline at end of file diff --git a/src/main/resources/db/migration/V0_004__addFunctionTypeEnumToVariable.sql b/src/main/resources/db/migration/V0_004__addFunctionTypeEnumToVariable.sql new file mode 100755 index 0000000..1d983ea --- /dev/null +++ b/src/main/resources/db/migration/V0_004__addFunctionTypeEnumToVariable.sql @@ -0,0 +1 @@ +ALTER TABLE IF EXISTS raw_connector_db.variable ADD COLUMN IF NOT EXISTS function_type character varying(255) COLLATE pg_catalog."default" NOT NULL DEFAULT 'VALUE'; diff --git a/src/main/resources/db/migration/V0_005__addDriverHeaderIdToDevice.sql b/src/main/resources/db/migration/V0_005__addDriverHeaderIdToDevice.sql new file mode 100755 index 0000000..b9b965b --- /dev/null +++ b/src/main/resources/db/migration/V0_005__addDriverHeaderIdToDevice.sql @@ -0,0 +1,2 @@ +ALTER TABLE raw_connector_db.device ADD COLUMN driver_header_id uuid; +ALTER TABLE raw_connector_db.device ADD CONSTRAINT driver_header_id_fk FOREIGN KEY (driver_header_id) REFERENCES raw_connector_db.driver_header; diff --git a/src/main/resources/db/migration/V0_006__addDriverVariableIdToVariable.sql b/src/main/resources/db/migration/V0_006__addDriverVariableIdToVariable.sql new file mode 100755 index 0000000..e36913f --- /dev/null +++ b/src/main/resources/db/migration/V0_006__addDriverVariableIdToVariable.sql @@ -0,0 +1,2 @@ +ALTER TABLE raw_connector_db.variable ADD COLUMN driver_variable_id uuid; +ALTER TABLE raw_connector_db.variable ADD CONSTRAINT driver_variable_id_fk FOREIGN KEY (driver_variable_id) REFERENCES raw_connector_db.driver_variable; diff --git a/src/main/resources/db/migration/V0_007__addBaseOidToDriverVariable.sql b/src/main/resources/db/migration/V0_007__addBaseOidToDriverVariable.sql new file mode 100755 index 0000000..e7e6ed6 --- /dev/null +++ b/src/main/resources/db/migration/V0_007__addBaseOidToDriverVariable.sql @@ -0,0 +1 @@ +ALTER TABLE IF EXISTS raw_connector_db.driver_variable ADD COLUMN IF NOT EXISTS base_oid VARCHAR(200); \ No newline at end of file diff --git a/src/main/resources/db/migration/V0_008__addUsageColumnToProtocolTable.sql b/src/main/resources/db/migration/V0_008__addUsageColumnToProtocolTable.sql new file mode 100755 index 0000000..c32d369 --- /dev/null +++ b/src/main/resources/db/migration/V0_008__addUsageColumnToProtocolTable.sql @@ -0,0 +1,2 @@ +ALTER TABLE IF EXISTS raw_connector_db.protocol ADD COLUMN IF + NOT EXISTS reserved boolean NOT NULL DEFAULT false; \ No newline at end of file diff --git a/src/main/resources/db/migration/V0_009__addDeviceIndexColumnToDeviceTbl.sql b/src/main/resources/db/migration/V0_009__addDeviceIndexColumnToDeviceTbl.sql new file mode 100755 index 0000000..3172037 --- /dev/null +++ b/src/main/resources/db/migration/V0_009__addDeviceIndexColumnToDeviceTbl.sql @@ -0,0 +1,2 @@ +ALTER TABLE IF EXISTS raw_connector_db.device ADD COLUMN IF + NOT EXISTS device_index integer NOT NULL DEFAULT 0; \ No newline at end of file diff --git a/src/main/resources/db/migration/V0_010__createVariableValueMappingContainerTable.sql b/src/main/resources/db/migration/V0_010__createVariableValueMappingContainerTable.sql new file mode 100755 index 0000000..db943bc --- /dev/null +++ b/src/main/resources/db/migration/V0_010__createVariableValueMappingContainerTable.sql @@ -0,0 +1,45 @@ +CREATE TABLE IF NOT EXISTS raw_connector_db.value_mapping_container +( + id uuid NOT NULL, + created TIMESTAMP WITH TIME ZONE, + stamp TIMESTAMP WITH TIME ZONE, + + CONSTRAINT value_mapping_container_pkey PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS raw_connector_db.value_mapping +( + id uuid NOT NULL, + created TIMESTAMP WITH TIME ZONE, + stamp TIMESTAMP WITH TIME ZONE, + value_mapping_container_id uuid, + + value character varying(255), + mapping character varying(255), + + CONSTRAINT value_mapping_pkey PRIMARY KEY (id), + CONSTRAINT value_mapping_container_pkey FOREIGN KEY (value_mapping_container_id) + REFERENCES raw_connector_db.value_mapping_container (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE NO ACTION +); + +DROP TABLE IF EXISTS raw_connector_db.value_status_map; + +ALTER TABLE IF EXISTS raw_connector_db.driver_variable + ADD COLUMN IF NOT EXISTS value_mapping_container_id uuid; + +ALTER TABLE IF EXISTS raw_connector_db.driver_variable + ADD CONSTRAINT value_mapping_container_id_pkey FOREIGN KEY (value_mapping_container_id) + REFERENCES raw_connector_db.value_mapping_container (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE NO ACTION; + +ALTER TABLE IF EXISTS raw_connector_db.driver_variable + ADD CONSTRAINT driver_header_id_pkey FOREIGN KEY (driver_header_id) + REFERENCES raw_connector_db.driver_header (id) MATCH SIMPLE + ON UPDATE NO ACTION + ON DELETE NO ACTION; + +ALTER TABLE IF EXISTS raw_connector_db.driver_header ADD COLUMN IF NOT EXISTS created timestamp(6) with time zone; +ALTER TABLE IF EXISTS raw_connector_db.driver_header ADD COLUMN IF NOT EXISTS stamp timestamp(6) with time zone; \ No newline at end of file diff --git a/src/main/resources/db/migration/V0_011__discoveryCleanup.sql b/src/main/resources/db/migration/V0_011__discoveryCleanup.sql new file mode 100755 index 0000000..defd62e --- /dev/null +++ b/src/main/resources/db/migration/V0_011__discoveryCleanup.sql @@ -0,0 +1,19 @@ +ALTER TABLE IF EXISTS raw_connector_db.discoveryworkitem RENAME TO discovery_workitem; +ALTER TABLE IF EXISTS raw_connector_db.discoveryvalue RENAME TO discovery_value; +ALTER TABLE IF EXISTS raw_connector_db.propertyvalue RENAME TO property_value; +ALTER TABLE IF EXISTS raw_connector_db.deviceproperty RENAME TO device_property; + +ALTER TABLE IF EXISTS raw_connector_db.discovery_value + RENAME COLUMN discoveryworkitem_id TO discovery_workitem_id; +ALTER TABLE IF EXISTS raw_connector_db.discovery_value + RENAME COLUMN propertyvalue TO property_value; + +ALTER TABLE IF EXISTS raw_connector_db.discovery_value DROP COLUMN IF EXISTS payload; +ALTER TABLE IF EXISTS raw_connector_db.discovery_value DROP COLUMN IF EXISTS description; +ALTER TABLE IF EXISTS raw_connector_db.discovery_value DROP COLUMN IF EXISTS name; + +ALTER TABLE IF EXISTS raw_connector_db.discovery_workitem DROP COLUMN IF EXISTS payload; +ALTER TABLE IF EXISTS raw_connector_db.discovery_workitem DROP COLUMN IF EXISTS description; +ALTER TABLE IF EXISTS raw_connector_db.discovery_workitem DROP COLUMN IF EXISTS delivered; + +ALTER TABLE raw_connector_db.discovery_workitem ALTER COLUMN status SET NOT NULL; diff --git a/src/main/resources/db/migration/V0_012__pauseWorkItem_mode.sql b/src/main/resources/db/migration/V0_012__pauseWorkItem_mode.sql new file mode 100755 index 0000000..2663a19 --- /dev/null +++ b/src/main/resources/db/migration/V0_012__pauseWorkItem_mode.sql @@ -0,0 +1,31 @@ +ALTER TABLE raw_connector_db.device + ADD COLUMN IF + NOT EXISTS mode character varying(255) NOT NULL default 'PAUSE'; + +ALTER TABLE IF EXISTS raw_connector_db.device + ADD CONSTRAINT device_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying]::text[])); + + +ALTER TABLE raw_connector_db.variable + ADD COLUMN IF + NOT EXISTS mode character varying(255) NOT NULL default 'PAUSE'; + +ALTER TABLE IF EXISTS raw_connector_db.variable + ADD CONSTRAINT variable_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying]::text[])); + +ALTER TABLE raw_connector_db.device_property + ADD COLUMN IF + NOT EXISTS mode character varying(255) NOT NULL default 'PAUSE'; + +ALTER TABLE IF EXISTS raw_connector_db.device_property + ADD CONSTRAINT property_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying]::text[])); + diff --git a/src/main/resources/db/migration/V0_013__variable_initialValueFetched.sql b/src/main/resources/db/migration/V0_013__variable_initialValueFetched.sql new file mode 100755 index 0000000..f17141a --- /dev/null +++ b/src/main/resources/db/migration/V0_013__variable_initialValueFetched.sql @@ -0,0 +1,3 @@ +ALTER TABLE raw_connector_db.variable + ADD COLUMN IF + NOT EXISTS initial_value_fetched boolean NOT NULL DEFAULT false; diff --git a/src/main/resources/db/migration/V0_014__addConstraintsToVariable.sql b/src/main/resources/db/migration/V0_014__addConstraintsToVariable.sql new file mode 100755 index 0000000..780df4d --- /dev/null +++ b/src/main/resources/db/migration/V0_014__addConstraintsToVariable.sql @@ -0,0 +1,3 @@ +ALTER TABLE raw_connector_db.variable + ADD COLUMN IF + NOT EXISTS variable_constraints character varying(255); diff --git a/src/main/resources/db/migration/V0_015__removeConditionAndFlagFromVariableAndProperties.sql b/src/main/resources/db/migration/V0_015__removeConditionAndFlagFromVariableAndProperties.sql new file mode 100755 index 0000000..3b2eff0 --- /dev/null +++ b/src/main/resources/db/migration/V0_015__removeConditionAndFlagFromVariableAndProperties.sql @@ -0,0 +1,17 @@ +ALTER TABLE raw_connector_db.variable +DROP COLUMN IF EXISTS subscribed; + +ALTER TABLE raw_connector_db.device_property +DROP COLUMN IF EXISTS subscribed; + +ALTER TABLE raw_connector_db.device_property +DROP COLUMN IF EXISTS deployed; + +ALTER TABLE raw_connector_db.device_property +DROP COLUMN IF EXISTS condition; + +ALTER TABLE raw_connector_db.device +DROP COLUMN IF EXISTS subscribed; + +ALTER TABLE raw_connector_db.device +DROP COLUMN IF EXISTS deployed; diff --git a/src/main/resources/db/migration/V0_016__removevalueAsStringOidFromProperty.sql b/src/main/resources/db/migration/V0_016__removevalueAsStringOidFromProperty.sql new file mode 100755 index 0000000..c744f84 --- /dev/null +++ b/src/main/resources/db/migration/V0_016__removevalueAsStringOidFromProperty.sql @@ -0,0 +1,2 @@ +ALTER TABLE raw_connector_db.device_property +DROP COLUMN IF EXISTS valueasstringoid; diff --git a/src/main/resources/db/migration/V0_017__deviceProperty_initialValueFetched.sql b/src/main/resources/db/migration/V0_017__deviceProperty_initialValueFetched.sql new file mode 100755 index 0000000..faf34d8 --- /dev/null +++ b/src/main/resources/db/migration/V0_017__deviceProperty_initialValueFetched.sql @@ -0,0 +1,3 @@ +ALTER TABLE raw_connector_db.device_property + ADD COLUMN IF + NOT EXISTS initial_value_fetched boolean NOT NULL DEFAULT false; diff --git a/src/main/resources/db/migration/V0_018__renameDatabaseSchema.sql b/src/main/resources/db/migration/V0_018__renameDatabaseSchema.sql new file mode 100755 index 0000000..c08bedb --- /dev/null +++ b/src/main/resources/db/migration/V0_018__renameDatabaseSchema.sql @@ -0,0 +1,22 @@ +ALTER TABLE IF EXISTS raw_connector_db.device SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.device_property SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.discovery_value SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.discovery_workitem SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.driver_header SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.driver_variable SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.property SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.property_value SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.protocol SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.value_mapping SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.value_mapping_container SET SCHEMA connector_svc; +ALTER TABLE IF EXISTS raw_connector_db.variable SET SCHEMA connector_svc; + +DO $$ +BEGIN + IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.domains WHERE DOMAIN_SCHEMA='raw_connector_db') THEN +ALTER DOMAIN raw_connector_db.d_name SET SCHEMA connector_svc; +END IF; +END $$; + +DROP schema IF EXISTS raw_connector_db CASCADE; + diff --git a/src/main/resources/db/migration/V1.0.0_0001__init_structure.sql b/src/main/resources/db/migration/V1.0.0_0001__init_structure.sql new file mode 100755 index 0000000..f50520b --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0001__init_structure.sql @@ -0,0 +1,231 @@ +CREATE SCHEMA IF NOT EXISTS connector_svc; + +create table if not exists connector_svc.discovery_workitem +( + id uuid not null, + name varchar(255), + created timestamp with time zone not null, + stamp timestamp with time zone not null, + status varchar(50) not null, + plant_id uuid not null, + protocol_id uuid not null, + comm_discovery_id uuid, + constraint id + primary key (id) + ); + +create table if not exists connector_svc.driver_header +( + id uuid not null, + description varchar(255), + name varchar(255), + plant_id uuid, + payload varchar(255), + sys_object_id varchar(255), + bulk_polling boolean, + content varchar(255), + devices varchar(255), + created timestamp(6) with time zone, + stamp timestamp(6) with time zone, + constraint driver_header_pk + primary key (id) + ); + +create table if not exists connector_svc.device +( + id uuid not null, + created timestamp(6) with time zone not null, + stamp timestamp(6) with time zone not null, + name varchar(255) not null, + description varchar(255) not null, + type varchar(255), + parent_id uuid, + deviceurl varchar(255), + plant_id uuid not null, + connector_id uuid not null, + comm_svc_id uuid, + discoveryworkitem_id uuid not null, + driver_header_id uuid, + device_index integer default 0 not null, + mode varchar(255) default 'PAUSE'::character varying not null, + primary key (id), + constraint driver_header_id_fk + foreign key (driver_header_id) references connector_svc.driver_header, + constraint device_mode_check + check ((mode)::text = ANY +(ARRAY [('PAUSE'::character varying)::text, ('SERVICE'::character varying)::text, ('OPERATION'::character varying)::text])) + ); + +create table if not exists connector_svc.protocol +( + id uuid not null, + name varchar(200) not null, + communication_service_id uuid, + deprecated boolean default false, + reserved boolean default false not null, + created timestamp(6) with time zone, + stamp timestamp(6) with time zone, + primary key (id) + ); + +create table if not exists connector_svc.discovery_value +( + id uuid not null, + created timestamp with time zone not null, + stamp timestamp with time zone not null, + property_id uuid not null, + discovery_workitem_id uuid, + property_value varchar(200) not null, + name varchar(255), + constraint discoveryvalue_pkey + primary key (id), + constraint discoveryvalue_discoveryworkitem_id_fkey + foreign key (discovery_workitem_id) references connector_svc.discovery_workitem + ); + +create table if not exists connector_svc.property +( + id uuid not null, + name varchar(200) not null, + protocol_id uuid, + communication_service_id uuid, + created timestamp(6) with time zone, + stamp timestamp(6) with time zone, + primary key (id), + constraint fkow87mlla3s2q3qxay552mkxpq + foreign key (protocol_id) references connector_svc.protocol + ); + +create table if not exists connector_svc.property_value +( + id uuid not null, + name varchar(255), + property_id uuid, + communication_service_id uuid, + created timestamp(6) with time zone, + stamp timestamp(6) with time zone, + constraint propertyvalue_pkey + primary key (id), + constraint fk5cvw89ro04h62e7784b9jy26m + foreign key (property_id) references connector_svc.property + ); + +create table if not exists connector_svc.device_property +( + id uuid not null, + device_id uuid not null, + name varchar(255), + description varchar(255), + created timestamp(6) with time zone not null, + stamp timestamp(6) with time zone not null, + valueasstring varchar(255), + propertyclass varchar(255), + propertygroup varchar(255), + isreadonly boolean not null, + valuechangeoid varchar(255), + valuechangedatatype varchar(255), + comm_svc_id uuid, + subscription_interval integer, + mode varchar(255) default 'PAUSE'::character varying not null, + initial_value_fetched boolean default false not null, + constraint deviceproperty_pkey + primary key (id), + constraint property_mode_check + check ((mode)::text = ANY +(ARRAY [('PAUSE'::character varying)::text, ('SERVICE'::character varying)::text, ('OPERATION'::character varying)::text])) + ); + +create table if not exists connector_svc.value_mapping_container +( + id uuid not null, + created timestamp with time zone, + stamp timestamp with time zone, + primary key (id) + ); + +create table if not exists connector_svc.driver_variable +( + id uuid not null, + description varchar(255), + name varchar(255), + plant_id uuid, + payload varchar(255), + driver_header_id uuid not null, + oid varchar(255), + data_type varchar(255), + display_format varchar(255), + display_factor varchar(255), + isreadonly boolean, + interval_factor varchar(255), + scale_factor varchar(255), + min varchar(255), + max varchar(255), + step varchar(255), + created timestamp(6) with time zone, + stamp timestamp(6) with time zone, + base_oid varchar(200), + value_mapping_container_id uuid, + displayname varchar(255), + function_type varchar(255), + constraint driver_variable_pk + primary key (id), + constraint driver_variable_map_fk + foreign key (driver_header_id) references connector_svc.driver_header, + constraint value_mapping_container_id_pkey + foreign key (value_mapping_container_id) references connector_svc.value_mapping_container, + constraint driver_header_id_pkey + foreign key (driver_header_id) references connector_svc.driver_header, + constraint driver_variable_function_type_check + check ((function_type)::text = ANY +((ARRAY ['UNDEFINED'::character varying, 'STATE'::character varying, 'VALUE'::character varying, 'SETTING'::character varying, 'CONFIGURATION'::character varying, 'SERVICE'::character varying, 'EXECUTE'::character varying])::text[])) + ); + +create table if not exists connector_svc.variable +( + id uuid not null, + device_id uuid not null, + created timestamp(6) with time zone not null, + stamp timestamp(6) with time zone not null, + name varchar(255) not null, + description varchar(255), + min integer, + max integer, + vartype varchar(255) not null, + vardatatype varchar(255) not null, + unit varchar(255), + scale integer, + step integer, + varaccesstype varchar(255) not null, + varqualityoid varchar(255) not null, + valueasintegeroid varchar(255) not null, + valueasstringoid varchar(255) not null, + comm_svc_id uuid, + deployed boolean, + subscription_interval integer, + snmpset_vardatatype varchar(255) default 'INTEGER'::character varying not null, + function_type varchar(255) default 'VALUE'::character varying not null, + driver_variable_id uuid, + mode varchar(255) default 'PAUSE'::character varying not null, + initial_value_fetched boolean default false not null, + variable_constraints varchar(255), + primary key (id), + constraint driver_variable_id_fk + foreign key (driver_variable_id) references connector_svc.driver_variable, + constraint variable_mode_check + check ((mode)::text = ANY +(ARRAY [('PAUSE'::character varying)::text, ('SERVICE'::character varying)::text, ('OPERATION'::character varying)::text])) + ); + +create table if not exists connector_svc.value_mapping +( + id uuid not null, + created timestamp with time zone, + stamp timestamp with time zone, + value_mapping_container_id uuid, + value varchar(255), + mapping varchar(255), + primary key (id), + constraint value_mapping_container_pkey + foreign key (value_mapping_container_id) references connector_svc.value_mapping_container + ); + diff --git a/src/main/resources/db/migration/V1.0.0_0002__align_schema_after_validation_enabled.sql b/src/main/resources/db/migration/V1.0.0_0002__align_schema_after_validation_enabled.sql new file mode 100755 index 0000000..eec7f6c --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0002__align_schema_after_validation_enabled.sql @@ -0,0 +1,35 @@ +ALTER TABLE IF EXISTS connector_svc.discovery_value DROP COLUMN IF EXISTS name; + +ALTER TABLE IF EXISTS connector_svc.driver_variable ADD COLUMN IF NOT EXISTS displayname character varying(255); +ALTER TABLE IF EXISTS connector_svc.driver_variable RENAME COLUMN displayname TO display_name; +ALTER TABLE IF EXISTS connector_svc.driver_variable ADD COLUMN IF NOT EXISTS function_type character varying(255) COLLATE pg_catalog."default"; + +ALTER TABLE IF EXISTS connector_svc.property ADD COLUMN IF NOT EXISTS created timestamp(6) with time zone NOT NULL DEFAULT now(); +UPDATE connector_svc.property SET created=NOW() WHERE created IS NULL; +ALTER TABLE IF EXISTS connector_svc.property ALTER COLUMN created SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.property ALTER COLUMN created SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.property ADD COLUMN IF NOT EXISTS stamp timestamp(6) with time zone NOT NULL DEFAULT now(); +UPDATE connector_svc.property SET stamp=NOW() WHERE stamp IS NULL; +ALTER TABLE IF EXISTS connector_svc.property ALTER COLUMN stamp SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.property ALTER COLUMN stamp SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.property_value ADD COLUMN IF NOT EXISTS created timestamp(6) with time zone NOT NULL DEFAULT now(); +UPDATE connector_svc.property_value SET created=NOW() WHERE created IS NULL; +ALTER TABLE IF EXISTS connector_svc.property_value ALTER COLUMN created SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.property_value ALTER COLUMN created SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.property_value ADD COLUMN IF NOT EXISTS stamp timestamp(6) with time zone NOT NULL DEFAULT now(); +UPDATE connector_svc.property_value SET stamp=NOW() WHERE stamp IS NULL; +ALTER TABLE IF EXISTS connector_svc.property_value ALTER COLUMN stamp SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.property_value ALTER COLUMN stamp SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.protocol ADD COLUMN IF NOT EXISTS created timestamp(6) with time zone NOT NULL DEFAULT now(); +UPDATE connector_svc.protocol SET created=NOW() WHERE created IS NULL; +ALTER TABLE IF EXISTS connector_svc.protocol ALTER COLUMN created SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.protocol ALTER COLUMN created SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.protocol ADD COLUMN IF NOT EXISTS stamp timestamp(6) with time zone NOT NULL DEFAULT now(); +UPDATE connector_svc.protocol SET stamp=NOW() WHERE stamp IS NULL; +ALTER TABLE IF EXISTS connector_svc.protocol ALTER COLUMN stamp SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.protocol ALTER COLUMN stamp SET DEFAULT now(); diff --git a/src/main/resources/db/migration/V1.0.0_0003__update_mode_constraints_for_firmware_update_mode.sql b/src/main/resources/db/migration/V1.0.0_0003__update_mode_constraints_for_firmware_update_mode.sql new file mode 100755 index 0000000..b464394 --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0003__update_mode_constraints_for_firmware_update_mode.sql @@ -0,0 +1,32 @@ +ALTER TABLE IF EXISTS connector_svc.device +DROP CONSTRAINT IF EXISTS device_mode_check; + +ALTER TABLE IF EXISTS connector_svc.device + ADD CONSTRAINT device_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying]::text[])); + + +ALTER TABLE IF EXISTS connector_svc.variable +DROP CONSTRAINT IF EXISTS variable_mode_check; + + +ALTER TABLE IF EXISTS connector_svc.variable + ADD CONSTRAINT variable_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying]::text[])); + +ALTER TABLE IF EXISTS connector_svc.device_property +DROP CONSTRAINT IF EXISTS property_mode_check; + + +ALTER TABLE IF EXISTS connector_svc.device_property + ADD CONSTRAINT property_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying]::text[])); diff --git a/src/main/resources/db/migration/V1.0.0_0004__align_schema_after_panache_entity_removal.sql b/src/main/resources/db/migration/V1.0.0_0004__align_schema_after_panache_entity_removal.sql new file mode 100755 index 0000000..c51b67a --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0004__align_schema_after_panache_entity_removal.sql @@ -0,0 +1,39 @@ +UPDATE connector_svc.value_mapping_container SET created=NOW() WHERE created IS NULL; +ALTER TABLE IF EXISTS connector_svc.value_mapping_container ALTER COLUMN created SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.value_mapping_container ALTER COLUMN created SET DEFAULT now(); + +UPDATE connector_svc.value_mapping_container SET stamp=NOW() WHERE stamp IS NULL; +ALTER TABLE IF EXISTS connector_svc.value_mapping_container ALTER COLUMN stamp SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.value_mapping_container ALTER COLUMN stamp SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.device ALTER COLUMN created SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.device ALTER COLUMN stamp SET DEFAULT now(); + +UPDATE connector_svc.value_mapping SET created=NOW() WHERE created IS NULL; +ALTER TABLE IF EXISTS connector_svc.value_mapping ALTER COLUMN created SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.value_mapping ALTER COLUMN created SET DEFAULT now(); + +UPDATE connector_svc.value_mapping SET stamp=NOW() WHERE stamp IS NULL; +ALTER TABLE IF EXISTS connector_svc.value_mapping ALTER COLUMN stamp SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.value_mapping ALTER COLUMN stamp SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.discovery_workitem ALTER COLUMN created SET DEFAULT now(); + +ALTER TABLE IF EXISTS connector_svc.discovery_workitem ALTER COLUMN stamp SET DEFAULT now(); + +UPDATE connector_svc.driver_variable SET created=NOW() WHERE created IS NULL; +ALTER TABLE IF EXISTS connector_svc.driver_variable ALTER COLUMN created SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.driver_variable ALTER COLUMN created SET DEFAULT now(); + +UPDATE connector_svc.driver_variable SET stamp=NOW() WHERE stamp IS NULL; +ALTER TABLE IF EXISTS connector_svc.driver_variable ALTER COLUMN stamp SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.driver_variable ALTER COLUMN stamp SET DEFAULT now(); + +UPDATE connector_svc.driver_header SET created=NOW() WHERE created IS NULL; +ALTER TABLE IF EXISTS connector_svc.driver_header ALTER COLUMN created SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.driver_header ALTER COLUMN created SET DEFAULT now(); + +UPDATE connector_svc.driver_header SET stamp=NOW() WHERE stamp IS NULL; +ALTER TABLE IF EXISTS connector_svc.driver_header ALTER COLUMN stamp SET NOT NULL; +ALTER TABLE IF EXISTS connector_svc.driver_header ALTER COLUMN stamp SET DEFAULT now(); diff --git a/src/main/resources/db/migration/V1.0.0_0005__add_previou_mode_to_variable_device_properties.sql b/src/main/resources/db/migration/V1.0.0_0005__add_previou_mode_to_variable_device_properties.sql new file mode 100755 index 0000000..37ca1b8 --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0005__add_previou_mode_to_variable_device_properties.sql @@ -0,0 +1,27 @@ +ALTER TABLE connector_svc.device + ADD COLUMN IF + NOT EXISTS restore_mode character varying(255) NOT NULL default 'PAUSE'; + +ALTER TABLE IF EXISTS connector_svc.device + ADD CONSTRAINT device_restore_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'OPERATION'::character varying]::text[])); + + +ALTER TABLE connector_svc.variable + ADD COLUMN IF + NOT EXISTS restore_mode character varying(255) NOT NULL default 'PAUSE'; + +ALTER TABLE IF EXISTS connector_svc.variable + ADD CONSTRAINT variable_restore_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'OPERATION'::character varying]::text[])); + +ALTER TABLE connector_svc.device_property + ADD COLUMN IF + NOT EXISTS restore_mode character varying(255) NOT NULL default 'PAUSE'; + +ALTER TABLE IF EXISTS connector_svc.device_property + ADD CONSTRAINT property_restore_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'OPERATION'::character varying]::text[])); diff --git a/src/main/resources/db/migration/V1.0.0_0006__fix_restore_mode_constraint.sql b/src/main/resources/db/migration/V1.0.0_0006__fix_restore_mode_constraint.sql new file mode 100755 index 0000000..586faea --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0006__fix_restore_mode_constraint.sql @@ -0,0 +1,23 @@ +ALTER TABLE IF EXISTS connector_svc.device + DROP CONSTRAINT IF EXISTS device_restore_mode_check; + +ALTER TABLE IF EXISTS connector_svc.device + ADD CONSTRAINT device_restore_mode_check CHECK (restore_mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'OPERATION'::character varying]::text[])); + +ALTER TABLE IF EXISTS connector_svc.variable + DROP CONSTRAINT IF EXISTS variable_restore_mode_check; + +ALTER TABLE IF EXISTS connector_svc.variable + ADD CONSTRAINT variable_restore_mode_check CHECK (restore_mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'OPERATION'::character varying]::text[])); + +ALTER TABLE IF EXISTS connector_svc.device_property + DROP CONSTRAINT IF EXISTS property_restore_mode_check; + +ALTER TABLE IF EXISTS connector_svc.device_property + ADD CONSTRAINT property_restore_mode_check CHECK (restore_mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'OPERATION'::character varying]::text[])); diff --git a/src/main/resources/db/migration/V1.0.0_0007__migrate_variable_description_to_text.sql b/src/main/resources/db/migration/V1.0.0_0007__migrate_variable_description_to_text.sql new file mode 100755 index 0000000..82f5df6 --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0007__migrate_variable_description_to_text.sql @@ -0,0 +1,5 @@ +ALTER TABLE connector_svc.variable + ALTER COLUMN description TYPE text USING description::text; + +ALTER TABLE connector_svc.driver_variable + ALTER COLUMN description TYPE text USING description::text; diff --git a/src/main/resources/db/migration/V1.0.0_0008__update_mode_constraints_for_firmware_update_mode.sql b/src/main/resources/db/migration/V1.0.0_0008__update_mode_constraints_for_firmware_update_mode.sql new file mode 100755 index 0000000..b464394 --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0008__update_mode_constraints_for_firmware_update_mode.sql @@ -0,0 +1,32 @@ +ALTER TABLE IF EXISTS connector_svc.device +DROP CONSTRAINT IF EXISTS device_mode_check; + +ALTER TABLE IF EXISTS connector_svc.device + ADD CONSTRAINT device_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying]::text[])); + + +ALTER TABLE IF EXISTS connector_svc.variable +DROP CONSTRAINT IF EXISTS variable_mode_check; + + +ALTER TABLE IF EXISTS connector_svc.variable + ADD CONSTRAINT variable_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying]::text[])); + +ALTER TABLE IF EXISTS connector_svc.device_property +DROP CONSTRAINT IF EXISTS property_mode_check; + + +ALTER TABLE IF EXISTS connector_svc.device_property + ADD CONSTRAINT property_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying]::text[])); diff --git a/src/main/resources/db/migration/V1.0.0_0009__addOfflineMode.sql b/src/main/resources/db/migration/V1.0.0_0009__addOfflineMode.sql new file mode 100755 index 0000000..3eb4af9 --- /dev/null +++ b/src/main/resources/db/migration/V1.0.0_0009__addOfflineMode.sql @@ -0,0 +1,35 @@ +ALTER TABLE IF EXISTS connector_svc.device +DROP CONSTRAINT IF EXISTS device_mode_check; + +ALTER TABLE IF EXISTS connector_svc.device + ADD CONSTRAINT device_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying, + 'OFFLINE'::character varying]::text[])); + + +ALTER TABLE IF EXISTS connector_svc.variable +DROP CONSTRAINT IF EXISTS variable_mode_check; + + +ALTER TABLE IF EXISTS connector_svc.variable + ADD CONSTRAINT variable_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying, + 'OFFLINE'::character varying]::text[])); + +ALTER TABLE IF EXISTS connector_svc.device_property +DROP CONSTRAINT IF EXISTS property_mode_check; + + +ALTER TABLE IF EXISTS connector_svc.device_property + ADD CONSTRAINT property_mode_check CHECK (mode::text = ANY (ARRAY [ + 'PAUSE'::character varying, + 'SERVICE'::character varying, + 'OPERATION'::character varying, + 'FIRMWARE_UPDATE'::character varying, + 'OFFLINE'::character varying]::text[])); diff --git a/src/main/resources/db/migration/beforeMigrate.sql b/src/main/resources/db/migration/beforeMigrate.sql new file mode 100755 index 0000000..a96d8ef --- /dev/null +++ b/src/main/resources/db/migration/beforeMigrate.sql @@ -0,0 +1,10 @@ +DO $$ +BEGIN + IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA='raw_connector_db' AND TABLE_NAME='flyway_schema_history') THEN + IF NOT EXISTS (SELECT 1 FROM connector_svc.flyway_schema_history WHERE installed_rank > 0) THEN + INSERT INTO connector_svc.flyway_schema_history +SELECT * FROM raw_connector_db.flyway_schema_history WHERE installed_rank > 0; +END IF; +END IF; +END $$; + diff --git a/src/main/resources/version.properties b/src/main/resources/version.properties new file mode 100755 index 0000000..19c0996 --- /dev/null +++ b/src/main/resources/version.properties @@ -0,0 +1 @@ +version = ${timestamp} \ No newline at end of file diff --git a/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigControllerTest.java b/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigControllerTest.java new file mode 100755 index 0000000..3b839f0 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigControllerTest.java @@ -0,0 +1,133 @@ +package io.gec.raw.connector.access.configworkitem.control; + +import io.gec.raw.connector.access.configworkitem.domain.AccessConfig; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.control.FtpController; +import io.gec.raw.connector.ftp.domain.SftpData; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.BDDMockito.willThrow; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class AccessConfigControllerTest { + @Mock + FtpController ftpController; + @Mock + DeviceController deviceController; + @Mock + AccessConfigProvider accessConfigProvider; + @InjectMocks + AccessConfigController accessConfigController; + + private static final String DEVICE_DESCRIPTION = "V3.17.30_5"; + + @SneakyThrows + @Test + void shouldSendAccessConfig() { + //given + var accessConfigDTO = new AccessConfigDTO(); + var commSvcDeviceId = UUID.randomUUID(); + var accessWorkItemValues = List.of(new ConnectionWorkItemValueDTO()); + var accessConfig = new AccessConfig(); + accessConfig.setContent("access config content"); + //and + SftpData sftpData = new SftpData(); + Device device = new Device(); + device.setDeviceURL("http://192.168.0.1"); + device.setDescription(DEVICE_DESCRIPTION); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(commSvcDeviceId); + willReturn(sftpData).given(ftpController).createSftpData(accessWorkItemValues, device.getDeviceURL()); + willReturn(accessConfig).given(accessConfigProvider).generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //when + accessConfigController.sendAccessConfig(accessConfigDTO, commSvcDeviceId, accessWorkItemValues); + + //then + verify(ftpController, times(1)).putAccessConfigFile(sftpData, accessConfig.getContent()); + verify(ftpController, times(0)).putEmergencyPinFile(any(), any()); + verify(ftpController, times(0)).putOneTimePinFile(any(), any()); + } + + @SneakyThrows + @Test + void shouldSendAccessConfigAndPinConfigFiles() { + //given + var accessConfigDTO = new AccessConfigDTO(); + var commSvcDeviceId = UUID.randomUUID(); + var accessWorkItemValues = List.of(new ConnectionWorkItemValueDTO()); + //and + var accessConfig = new AccessConfig(); + accessConfig.setContent("access config content"); + accessConfig.addEmergencyPinConfig("pinIdentifier_1", "emergency_pin_content"); + accessConfig.addOneTimePinConfig("pinIdentifier_2", "one_time_pin_content"); + //and + SftpData sftpData = new SftpData(); + Device device = new Device(); + device.setDeviceURL("http://192.168.0.1"); + device.setDescription(DEVICE_DESCRIPTION); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(commSvcDeviceId); + willReturn(sftpData).given(ftpController).createSftpData(accessWorkItemValues, device.getDeviceURL()); + willReturn(accessConfig).given(accessConfigProvider).generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //when + accessConfigController.sendAccessConfig(accessConfigDTO, commSvcDeviceId, accessWorkItemValues); + + //then + verify(ftpController, times(1)).putAccessConfigFile(sftpData, accessConfig.getContent()); + verify(ftpController, times(1)).putEmergencyPinFile(eq(sftpData), any()); + verify(ftpController, times(1)).putOneTimePinFile(eq(sftpData), any()); + } + + @SneakyThrows + @Test + void shouldSendAccessConfig_throwSftpException() { + //given + var accessConfigDTO = new AccessConfigDTO(); + var commSvcDeviceId = UUID.randomUUID(); + var accessWorkItemValues = List.of(new ConnectionWorkItemValueDTO()); + var accessConfig = new AccessConfig(); + accessConfig.setContent("access config content"); + //and + SftpData sftpData = new SftpData(); + Device device = new Device(); + device.setDeviceURL("http://192.168.0.1"); + device.setDescription(DEVICE_DESCRIPTION); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(commSvcDeviceId); + willReturn(sftpData).given(ftpController).createSftpData(accessWorkItemValues, device.getDeviceURL()); + willReturn(accessConfig).given(accessConfigProvider).generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + willThrow(new SftpException("exception message")).given(ftpController).putAccessConfigFile(eq(sftpData), any()); + + //when + SftpException exception = assertThrows(SftpException.class, () -> { + accessConfigController.sendAccessConfig(accessConfigDTO, commSvcDeviceId, accessWorkItemValues); + }); + + //then + assertThat(exception.getMessage(), is("exception message")); + //and + verify(ftpController, times(1)).putAccessConfigFile(sftpData, accessConfig.getContent()); + } +} diff --git a/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigProviderTest.java b/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigProviderTest.java new file mode 100755 index 0000000..1c04c5b --- /dev/null +++ b/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessConfigProviderTest.java @@ -0,0 +1,607 @@ +package io.gec.raw.connector.access.configworkitem.control; + +import io.gec.raw.connector.access.configworkitem.domain.AccessConfig; +import io.gec.raw.connector.access.configworkitem.domain.AccessPinConfig; +import io.gec.raw.connector.access.configworkitem.dto.AccessCardCodeDTO; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigDTO; +import io.gec.raw.connector.access.configworkitem.dto.CardCodeType; +import io.gec.raw.connector.access.configworkitem.dto.HandleDTO; +import io.gec.raw.connector.access.configworkitem.dto.KeypadDTO; +import io.gec.raw.connector.access.configworkitem.dto.OptionsDTO; +import io.gec.raw.connector.utils.TestDTOFactory; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.Clock; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class AccessConfigProviderTest { + + @Mock + AccessConfigConverter accessConfigConverter; + @Mock + Clock clock; + @Mock + private Logger logger; + + @InjectMocks + AccessConfigProvider accessConfigProvider; + + private static final String nowMocked = "2024-10-11T08:00:00Z"; + private static final String DEVICE_DESCRIPTION = "V3.17.30_5"; + + @BeforeEach + void setup() { + // real method called on purpose - to make test easier to prepare and test final result + when(accessConfigConverter.convertToAccessCodeEntries(any())).thenCallRealMethod(); + //and + lenient().when(clock.instant()).thenReturn(Instant.parse(nowMocked)); + lenient().when(clock.getZone()).thenReturn(ZoneId.of("UTC")); + } + + @Test + void shouldGenerateFileContent_withHeaderOnly_whenNoKeypads() { + //given + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(Collections.emptyList()); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + """; + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withHeaderOnly_whenNoHandlesInKeypads() { + //given + KeypadDTO keypadDTO = TestDTOFactory.createKeypadDTO("77777777"); + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + """; + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withOptionsAndOneHandle() { + //given + AccessCardCodeDTO accessCardCodeDTO = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"2","AccessUserName"); + //and handles + HandleDTO handleDTO = TestDTOFactory.createHandleDTO("222", accessCardCodeDTO); + //and keypads + KeypadDTO keypadDTO = TestDTOFactory.createKeypadDTO("333", handleDTO); + //and options + OptionsDTO optionsDTO = TestDTOFactory.createOptionsDTO(true, true, 10, 10); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO)); + accessConfigDTO.setOptions(optionsDTO); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + /* + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + 4-Eyes:1,10 + 2-Factor:1,10 + Crd:2; User:AccessUser; Information:AccessUserName; Handle:222 + Keypad:333; Handle:222"""; + */ + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + 4-Eyes:1,10 + 2-Factor:1,10 + Crd:2; User:AccessUser; Information:AccessUserName; Handle:222 + """; + + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withMultipleHandles() { + //given + AccessCardCodeDTO accessCardCodeDTO = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"2","AccessUserName"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("222", accessCardCodeDTO); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("888", accessCardCodeDTO); + //and keypads + KeypadDTO keypadDTO = TestDTOFactory.createKeypadDTO("333", handleDTO_1, handleDTO_2); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Crd:2; User:AccessUser; Information:AccessUserName; Handle:222,888 + """; + //Keypad:333; Handle:222,888"""; + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withMultipleHandlesWithSameSerialNumber() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"2","AccessUserName"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"445","AccessUserName"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("222", accessCardCodeDTO_1, accessCardCodeDTO_2); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("888", accessCardCodeDTO_1); + //and keypads + KeypadDTO keypadDTO = TestDTOFactory.createKeypadDTO("333", handleDTO_1, handleDTO_2); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Crd:2; User:AccessUser; Information:AccessUserName; Handle:222,888 + Crd:445; User:AccessUser; Information:AccessUserName; Handle:222 + """; + //Keypad:333; Handle:222,888"""; + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withMultipleHandlesWithSameSerialNumberHandles() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"2","AccessUserName"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"445","AccessUserName"); + AccessCardCodeDTO accessCardCodeDTO_3 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"789","AccessUserName"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("222", accessCardCodeDTO_1, accessCardCodeDTO_2, accessCardCodeDTO_3); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("888", accessCardCodeDTO_1); + //and keypads + KeypadDTO keypadDTO = TestDTOFactory.createKeypadDTO("333", handleDTO_1, handleDTO_2); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Crd:2; User:AccessUser; Information:AccessUserName; Handle:222,888 + Crd:445; User:AccessUser; Information:AccessUserName; Handle:222 + Crd:789; User:AccessUser; Information:AccessUserName; Handle:222 + """; + //Keypad:333; Handle:222,888"""; + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withMultipleHandlesForEachKeypad() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"1234","AccessUserName1"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CODE,"5678","AccessUserName2"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("11111111", accessCardCodeDTO_1, accessCardCodeDTO_2); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("22222222", accessCardCodeDTO_1); + //and keypads + KeypadDTO keypadDTO_1 = TestDTOFactory.createKeypadDTO("77777777", handleDTO_1, handleDTO_2); + KeypadDTO keypadDTO_2 = TestDTOFactory.createKeypadDTO("88888888", handleDTO_1, handleDTO_2); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO_1, keypadDTO_2)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Crd:1234; User:AccessUser; Information:AccessUserName1; Handle:11111111,22222222 + Key:5678; User:AccessUser; Information:AccessUserName2; Handle:11111111 + """; + //Keypad:77777777; Handle:11111111,22222222 + //Keypad:88888888; Handle:11111111,22222222"""; + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withMultipleHandlesAndKeypads() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"12345678ABCDEFGH","UserName_1"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CODE,"1234","UserName_1"); + AccessCardCodeDTO accessCardCodeDTO_3 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CODE,"5678","UserName_2"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("11111111", accessCardCodeDTO_1, accessCardCodeDTO_2); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("22222222", accessCardCodeDTO_1, accessCardCodeDTO_2); + HandleDTO handleDTO_3 = TestDTOFactory.createHandleDTO("33333333", accessCardCodeDTO_1, accessCardCodeDTO_2, accessCardCodeDTO_3); + //and keypads + KeypadDTO keypadDTO_1 = TestDTOFactory.createKeypadDTO("77777777", handleDTO_1); + KeypadDTO keypadDTO_2 = TestDTOFactory.createKeypadDTO("88888888", handleDTO_2); + KeypadDTO keypadDTO_3 = TestDTOFactory.createKeypadDTO("99999999", handleDTO_3); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO_1, keypadDTO_2, keypadDTO_3)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Crd:12345678ABCDEFGH; User:AccessUser; Information:UserName_1; Handle:11111111,22222222,33333333 + Key:1234; User:AccessUser; Information:UserName_1; Handle:11111111,22222222,33333333 + Key:5678; User:AccessUser; Information:UserName_2; Handle:33333333 + """; + //Keypad:77777777; Handle:11111111 + //Keypad:88888888; Handle:22222222 + //Keypad:99999999; Handle:33333333"""; + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withAccessUserRoles() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"1234","AccessUserName1", null); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"5678","AccessUserName2", ""); + AccessCardCodeDTO accessCardCodeDTO_3 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CODE,"4321","AccessUserName3", "some_role"); + AccessCardCodeDTO accessCardCodeDTO_4 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CODE,"8765","AccessUserName4", "AccessUser"); + AccessCardCodeDTO accessCardCodeDTO_5 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CODE,"1122","AccessUserName5", "AccessAck"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO( + "11111111", + accessCardCodeDTO_1, + accessCardCodeDTO_2, + accessCardCodeDTO_3, + accessCardCodeDTO_4, + accessCardCodeDTO_5); + //and keypads + KeypadDTO keypadDTO_1 = TestDTOFactory.createKeypadDTO("77777777", handleDTO_1); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO_1)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Crd:1234; User:AccessUser; Information:AccessUserName1; Handle:11111111 + Crd:5678; User:AccessUser; Information:AccessUserName2; Handle:11111111 + Key:4321; User:AccessUser; Information:AccessUserName3; Handle:11111111 + Key:8765; User:AccessUser; Information:AccessUserName4; Handle:11111111 + Key:1122; User:AccessAck; Information:AccessUserName5; Handle:11111111 + """; + //Keypad:77777777; Handle:11111111"""; + assertEquals(expectedResult, accessConfig.getContent()); + } + + @Test + void shouldGenerateFileContent_withEmergencyPINs() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.EMERGENCY_PIN,"1234","UserName_1"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.EMERGENCY_PIN,"5678","UserName_2"); + AccessCardCodeDTO accessCardCodeDTO_3 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.EMERGENCY_PIN,"4321","UserName_3"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("11111111", accessCardCodeDTO_1); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("22222222", accessCardCodeDTO_2); + HandleDTO handleDTO_3 = TestDTOFactory.createHandleDTO("33333333", accessCardCodeDTO_3); + HandleDTO handleDTO_4 = TestDTOFactory.createHandleDTO("44444444", accessCardCodeDTO_3); + + //and keypads + KeypadDTO keypadDTO_1 = TestDTOFactory.createKeypadDTO("77777777", handleDTO_1, handleDTO_2, handleDTO_3, handleDTO_4); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO_1)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Key:emgy11111111; User:AccessUser; Information:UserName_1; Handle:11111111 + Key:emgy22222222; User:AccessUser; Information:UserName_2; Handle:22222222 + Key:emgy33333333; User:AccessUser; Information:UserName_3; Handle:33333333,44444444 + Key:emgy44444444; User:AccessUser; Information:UserName_3; Handle:33333333,44444444 + """; + //Keypad:77777777; Handle:11111111,22222222,33333333,44444444"""; + assertEquals(expectedResult, accessConfig.getContent()); + assertEquals(4, accessConfig.getEmergencyPinConfigs().size()); + assertTrue(accessConfig.getEmergencyPinConfigs().stream() + .map(AccessPinConfig::pinIdentifier) + .toList() + .containsAll(List.of("11111111", "22222222", "33333333", "44444444"))); + } + + @Test + void shouldGenerateFileContent_withEmergencyPINs_andWithOnlyFirstUserAssignedToHandle() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.EMERGENCY_PIN,"1234","UserName_1"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.EMERGENCY_PIN,"5678","UserName_2"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("11111111", accessCardCodeDTO_1, accessCardCodeDTO_2); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("22222222", accessCardCodeDTO_1, accessCardCodeDTO_2); + HandleDTO handleDTO_3 = TestDTOFactory.createHandleDTO("33333333", accessCardCodeDTO_2, accessCardCodeDTO_1); + //and keypads + KeypadDTO keypadDTO_1 = TestDTOFactory.createKeypadDTO("77777777", handleDTO_1, handleDTO_2, handleDTO_3); + KeypadDTO keypadDTO_2 = TestDTOFactory.createKeypadDTO("88888888", handleDTO_3); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO_1, keypadDTO_2)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Key:emgy11111111; User:AccessUser; Information:UserName_1; Handle:11111111,22222222 + Key:emgy22222222; User:AccessUser; Information:UserName_1; Handle:11111111,22222222 + Key:emgy33333333; User:AccessUser; Information:UserName_2; Handle:33333333 + """; + //Keypad:77777777; Handle:11111111,22222222,33333333 + //Keypad:88888888; Handle:33333333"""; + assertEquals(expectedResult, accessConfig.getContent()); + assertEquals(3, accessConfig.getEmergencyPinConfigs().size()); + assertTrue(accessConfig.getEmergencyPinConfigs().stream() + .map(AccessPinConfig::pinIdentifier) + .toList() + .containsAll(List.of("11111111", "22222222", "33333333"))); + } + + @Test + void shouldGenerateFileContent_withOneTimePINs() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.ONE_TIME_PIN,"1234","UserName_1"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.ONE_TIME_PIN,"5678","UserName_2"); + AccessCardCodeDTO accessCardCodeDTO_3 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.ONE_TIME_PIN,"4321","UserName_3"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("11111111", accessCardCodeDTO_1); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("22222222", accessCardCodeDTO_2); + HandleDTO handleDTO_3 = TestDTOFactory.createHandleDTO("33333333", accessCardCodeDTO_3); + HandleDTO handleDTO_4 = TestDTOFactory.createHandleDTO("44444444", accessCardCodeDTO_3); + + //and keypads + KeypadDTO keypadDTO_1 = TestDTOFactory.createKeypadDTO("77777777", handleDTO_1, handleDTO_2, handleDTO_3, handleDTO_4); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO_1)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Key:code11111111; User:AccessUser; Information:UserName_1; Handle:11111111 + Key:code22222222; User:AccessUser; Information:UserName_2; Handle:22222222 + Key:code33333333; User:AccessUser; Information:UserName_3; Handle:33333333,44444444 + Key:code44444444; User:AccessUser; Information:UserName_3; Handle:33333333,44444444 + """; + /*Keypad:77777777; Handle:11111111,22222222,33333333,44444444""";*/ + assertEquals(expectedResult, accessConfig.getContent()); + assertEquals(4, accessConfig.getOneTimePinConfigs().size()); + assertTrue(accessConfig.getOneTimePinConfigs().stream() + .map(AccessPinConfig::pinIdentifier) + .toList() + .containsAll(List.of("11111111", "22222222", "33333333", "44444444"))); + } + + @Test + void shouldGenerateFileContent_withOneTimePINs_andWithOnlyFirstUserAssignedToHandle() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.ONE_TIME_PIN,"1234","UserName_1"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.ONE_TIME_PIN,"5678","UserName_2"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO("11111111", accessCardCodeDTO_1, accessCardCodeDTO_2); + HandleDTO handleDTO_2 = TestDTOFactory.createHandleDTO("22222222", accessCardCodeDTO_1, accessCardCodeDTO_2); + HandleDTO handleDTO_3 = TestDTOFactory.createHandleDTO("33333333", accessCardCodeDTO_2, accessCardCodeDTO_1); + //and keypads + KeypadDTO keypadDTO_1 = TestDTOFactory.createKeypadDTO("77777777", handleDTO_1, handleDTO_2, handleDTO_3); + KeypadDTO keypadDTO_2 = TestDTOFactory.createKeypadDTO("88888888", handleDTO_3); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO_1, keypadDTO_2)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Key:code11111111; User:AccessUser; Information:UserName_1; Handle:11111111,22222222 + Key:code22222222; User:AccessUser; Information:UserName_1; Handle:11111111,22222222 + Key:code33333333; User:AccessUser; Information:UserName_2; Handle:33333333 + """; + /*Keypad:77777777; Handle:11111111,22222222,33333333 + Keypad:88888888; Handle:33333333""";*/ + assertEquals(expectedResult, accessConfig.getContent()); + assertEquals(3, accessConfig.getOneTimePinConfigs().size()); + assertTrue(accessConfig.getOneTimePinConfigs().stream() + .map(AccessPinConfig::pinIdentifier) + .toList() + .containsAll(List.of("11111111", "22222222", "33333333"))); + } + + @ParameterizedTest + @MethodSource("getTestDataForOneTimePIN") + void shouldGenerateFileContent_withValidDataForOneTimePIN(OffsetDateTime fromDateTime, + Integer validationPeriod, + int expectedNumberOfConfigs, + boolean expectedHasCodeEntry, + String expectedStartDateTime, + String expectedExpirationTime) { + //given + AccessCardCodeDTO accessCardCodeDTO = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.ONE_TIME_PIN,"1234","UserName"); + accessCardCodeDTO.setFromDatetime(fromDateTime); + accessCardCodeDTO.setValidationPeriod(validationPeriod); + //and handles + HandleDTO handleDTO = TestDTOFactory.createHandleDTO("11111111", accessCardCodeDTO); + //and keypads + KeypadDTO keypadDTO = TestDTOFactory.createKeypadDTO("77777777", handleDTO); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + assertEquals(expectedHasCodeEntry, accessConfig.getContent().contains("Key:code11111111; User:AccessUser; Information:UserName; Handle:11111111")); + assertEquals(expectedNumberOfConfigs, accessConfig.getOneTimePinConfigs().size()); + //and + if (expectedHasCodeEntry) { + String oneTimePinFileContent = accessConfig.getOneTimePinConfigs().getFirst().content(); + assertTrue(oneTimePinFileContent.endsWith("\t%s\t%s".formatted(expectedStartDateTime, expectedExpirationTime))); + } + } + + private static Stream getTestDataForOneTimePIN() { + return Stream.of( + //fromDateTime, validationPeriod (hours), expectedNumberOfConfigs, expectedHasCodeEntry, expectedStartDateTime (seconds), expectedExpirationTime (seconds) + of(null, null, 1, true, "1728633600", "0"), // fromDatetime = nowMocked + of(null, 1, 1, true, "1728633600", "1728637200"), // fromDatetime = nowMocked + of(OffsetDateTime.parse(nowMocked), null, 1, true, "1728633600", "0"), // fromDatetime = nowMocked + of(OffsetDateTime.parse(nowMocked), 0, 1, true, "1728633600", "0"), // fromDatetime = nowMocked + of(OffsetDateTime.parse(nowMocked), 1, 1, true, "1728633600", "1728637200"), // fromDatetime = nowMocked + of(OffsetDateTime.parse(nowMocked).plusDays(3), 1, 1, true, "1728892800", "1728896400"), // fromDatetime > nowMocked + of(OffsetDateTime.parse(nowMocked).minusDays(3), 1, 0, false, null, null), // fromDatetime < nowMocked and PIN expired + of(OffsetDateTime.parse(nowMocked).minusMinutes(30), 1, 1, true, "1728631800", "1728635400") // fromDatetime < nowMocked but PIN not expired + ); + } + + @Test + void shouldGenerateFileContent_withAllCardCodeTypes() { + //given + AccessCardCodeDTO accessCardCodeDTO_1 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CARD,"1234","AccessUserName1"); + AccessCardCodeDTO accessCardCodeDTO_2 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.CODE,"5678","AccessUserName2"); + AccessCardCodeDTO accessCardCodeDTO_3 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.EMERGENCY_PIN,"4321","AccessUserName3"); + AccessCardCodeDTO accessCardCodeDTO_4 = TestDTOFactory.createAccessCardCodeDTO(CardCodeType.ONE_TIME_PIN,"8765","AccessUserName4"); + //and handles + HandleDTO handleDTO_1 = TestDTOFactory.createHandleDTO( + "11111111", + accessCardCodeDTO_1, + accessCardCodeDTO_2, + accessCardCodeDTO_3, + accessCardCodeDTO_4); + //and keypads + KeypadDTO keypadDTO_1 = TestDTOFactory.createKeypadDTO("77777777", handleDTO_1); + //and + AccessConfigDTO accessConfigDTO = TestDTOFactory.createAccessConfigDTO(UUID.randomUUID()); + accessConfigDTO.setKeypads(List.of(keypadDTO_1)); + + //when + AccessConfig accessConfig = accessConfigProvider.generateAccessConfig(accessConfigDTO, DEVICE_DESCRIPTION); + + //then + String expectedResult = """ + #------------- Access-File CMC-III ----------------- + # Name : + # Location : + # Contact : + # IPv4-Address : + Crd:1234; User:AccessUser; Information:AccessUserName1; Handle:11111111 + Key:5678; User:AccessUser; Information:AccessUserName2; Handle:11111111 + Key:emgy11111111; User:AccessUser; Information:AccessUserName3; Handle:11111111 + Key:code11111111; User:AccessUser; Information:AccessUserName4; Handle:11111111 + """; + //Keypad:77777777; Handle:11111111"""; + assertEquals(expectedResult, accessConfig.getContent()); + assertEquals(1, accessConfig.getEmergencyPinConfigs().size()); + assertEquals(1, accessConfig.getOneTimePinConfigs().size()); + } +} diff --git a/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessDbConfigParserTest.java b/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessDbConfigParserTest.java new file mode 100755 index 0000000..b073abf --- /dev/null +++ b/src/test/java/io/gec/raw/connector/access/configworkitem/control/AccessDbConfigParserTest.java @@ -0,0 +1,99 @@ +package io.gec.raw.connector.access.configworkitem.control; + +import io.gec.raw.connector.access.configworkitem.dto.AccessDbDTO; +import io.gec.raw.connector.access.configworkitem.dto.HandleDbDTO; +import io.gec.raw.connector.access.configworkitem.dto.KeypadDbDTO; +import io.gec.raw.connector.access.configworkitem.dto.OptionDbDTO; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.wildfly.common.Assert.assertFalse; +import static org.wildfly.common.Assert.assertTrue; + +@QuarkusTest +class AccessDbConfigParserTest { + private static final String TEST_RESOURCES_BASE_PATH = "src/test/resources/"; + + @Inject + AccessDbConfigParser accessDbConfigParser; + + @Test + void shouldParseFullAccessDbFile() throws IOException { + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "access.db"); + + AccessDbDTO accessDbDTO = accessDbConfigParser.parseFileContent(filePath); + + assertEquals(8, accessDbDTO.getHandles().size()); + assertEquals(4, accessDbDTO.getKeypads().size()); + HandleDbDTO handleDTO = accessDbDTO.getHandles().get(0); + assertEquals("Crd", handleDTO.getType()); + assertEquals("0000000056D71A54", handleDTO.getCode()); + assertEquals("AccessUser", handleDTO.getUser()); + assertEquals("", handleDTO.getInformation()); + assertEquals(4, handleDTO.getHandleList().size()); + assertEquals("39075098", handleDTO.getHandleList().get(0)); + assertEquals("39075250", handleDTO.getHandleList().get(1)); + assertEquals("39075252", handleDTO.getHandleList().get(2)); + assertEquals("39075248", handleDTO.getHandleList().get(3)); + + HandleDbDTO handleDTO1 = accessDbDTO.getHandles().get(7); + assertEquals("000000000000ABCD", handleDTO1.getCode()); + assertEquals("admin", handleDTO1.getUser()); + assertEquals("Info 1", handleDTO1.getInformation()); + assertEquals("39075250", handleDTO1.getHandleList().get(0)); + + KeypadDbDTO keypadDTO = accessDbDTO.getKeypads().get(0); + assertEquals("39075248", keypadDTO.getKeypad()); + assertEquals(4, keypadDTO.getHandleList().size()); + assertEquals("39075098", keypadDTO.getHandleList().get(0)); + assertEquals("39075250", keypadDTO.getHandleList().get(1)); + assertEquals("39075252", keypadDTO.getHandleList().get(2)); + assertEquals("39075248", keypadDTO.getHandleList().get(3)); + + OptionDbDTO optionDTO = accessDbDTO.getOptions(); + assertTrue(optionDTO.isEyes4()); + assertFalse(optionDTO.isWay2()); + assertEquals(10, optionDTO.getTimeout1()); + assertEquals(30, optionDTO.getTimeout2()); + } + + @Test + void shouldParseAccessDbFileWithoutHandles() throws IOException { + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "access1.db"); + + AccessDbDTO accessDbDTO = accessDbConfigParser.parseFileContent(filePath); + + assertEquals(0, accessDbDTO.getHandles().size()); + assertEquals(4, accessDbDTO.getKeypads().size()); + assertNotNull(accessDbDTO.getOptions()); + + KeypadDbDTO keypadDTO = accessDbDTO.getKeypads().get(2); + assertEquals("39075098", keypadDTO.getKeypad()); + assertEquals(1, keypadDTO.getHandleList().size()); + assertEquals("39075250", keypadDTO.getHandleList().get(0)); + + OptionDbDTO optionDTO = accessDbDTO.getOptions(); + assertFalse(optionDTO.isEyes4()); + assertTrue(optionDTO.isWay2()); + assertEquals(100, optionDTO.getTimeout1()); + assertEquals(60, optionDTO.getTimeout2()); + } + + @Test + void shouldParseEmptyDbFile() throws IOException { + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "access2.db"); + + AccessDbDTO accessDbDTO = accessDbConfigParser.parseFileContent(filePath); + + assertEquals(0, accessDbDTO.getHandles().size()); + assertEquals(0, accessDbDTO.getKeypads().size()); + assertNull(accessDbDTO.getOptions()); + } +} diff --git a/src/test/java/io/gec/raw/connector/access/configworkitem/handler/AccessConfigJobHandlerTest.java b/src/test/java/io/gec/raw/connector/access/configworkitem/handler/AccessConfigJobHandlerTest.java new file mode 100755 index 0000000..1fe5938 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/access/configworkitem/handler/AccessConfigJobHandlerTest.java @@ -0,0 +1,216 @@ +package io.gec.raw.connector.access.configworkitem.handler; + +import io.gec.raw.connector.access.configworkitem.control.AccessConfigController; +import io.gec.raw.connector.access.configworkitem.domain.AccessConfigWorkItemResult; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigDTO; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemDTO; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigWorkItemStatus; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemStatus; +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.utils.TestDTOFactory; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.BDDMockito.willDoNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class AccessConfigJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + AccessConfigController accessConfigController; + @InjectMocks + AccessConfigJobHandler accessConfigJobHandler; + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var accessConfigWorkItemDTO = new AccessConfigWorkItemDTO(); + //and + willReturn(Optional.of(accessConfigWorkItemDTO)).given(communicationServiceController).fetchAccessConfigWorkItem(workItemId); + + //when + var result = accessConfigJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(accessConfigWorkItemDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchAccessConfigWorkItem(workItemId); + + //when + var result = accessConfigJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @Test + void shouldStartProcessing_updateAccessConfigWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var accessConfigWorkItemDTO = new AccessConfigWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, accessConfigWorkItemDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updateAccessConfigWorkItem(eq(workItemId), any()); + + //when + accessConfigJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updateAccessConfigWorkItem( + eq(workItemId), + argThat(accessConfigWorkItemUpdateDTO -> accessConfigWorkItemUpdateDTO.getStatus() == AccessConfigWorkItemStatus.IN_PROGRESS + && accessConfigWorkItemUpdateDTO.getMessage() == null)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFinishedResult() { + //given + UUID deviceId = UUID.randomUUID(); + UUID workItemId = UUID.randomUUID(); + //and + var accessConfigWorkItemDTO = new AccessConfigWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, accessConfigWorkItemDTO, () -> false); + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, ConnectionWorkItemStatus.SUCCESS, UUID.randomUUID(), UUID.randomUUID()); + var accessConfigDTO = new AccessConfigDTO(); + accessConfigWorkItemDTO.setConnectionWorkItem(connectionWorkItem); + accessConfigWorkItemDTO.setConfig(accessConfigDTO); + + //when + var result = accessConfigJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(AccessConfigWorkItemStatus.SUCCESS)); + assertThat(result.getMessage(), is(nullValue())); + //and + verify(accessConfigController, times(1)).sendAccessConfig(accessConfigDTO, deviceId, connectionWorkItem.getConnectionPropertyValues()); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResult_whenPutAccessConfigFileThrowsException() { + //given + UUID deviceId = UUID.randomUUID(); + UUID workItemId = UUID.randomUUID(); + //and + var accessConfigWorkItemDTO = new AccessConfigWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, accessConfigWorkItemDTO, () -> false); + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, ConnectionWorkItemStatus.SUCCESS, UUID.randomUUID(), UUID.randomUUID()); + var accessConfigDTO = new AccessConfigDTO(); + accessConfigWorkItemDTO.setConnectionWorkItem(connectionWorkItem); + accessConfigWorkItemDTO.setConfig(accessConfigDTO); + //and + willThrow(new SftpException("exception message")).given(accessConfigController).sendAccessConfig(any(), any(), any()); + + //when + var result = accessConfigJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(AccessConfigWorkItemStatus.DEVICE_CONFIG_FAILURE)); + assertThat(result.getMessage(), is("exception message")); + //and + verify(accessConfigController, times(1)).sendAccessConfig(accessConfigDTO, deviceId, connectionWorkItem.getConnectionPropertyValues()); + } + + @ParameterizedTest + @EnumSource(AccessConfigWorkItemStatus.class) + void shouldFinishProcessing_updateAccessConfigWorkItem(AccessConfigWorkItemStatus accessConfigWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var accessConfigWorkItemDTO = new AccessConfigWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, accessConfigWorkItemDTO, () -> false); + var accessConfigWorkItemResult = new AccessConfigWorkItemResult(accessConfigWorkItemStatus, "result message"); + //and + willDoNothing().given(communicationServiceController).updateAccessConfigWorkItem(eq(workItemId), any()); + + //when + accessConfigJobHandler.finishProcessing(workItemWrapper, accessConfigWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateAccessConfigWorkItem( + eq(workItemId), + argThat(accessConfigWorkItemUpdateDTO -> accessConfigWorkItemUpdateDTO.getStatus() == accessConfigWorkItemStatus + && "result message".equals(accessConfigWorkItemUpdateDTO.getMessage()))); + } + + @ParameterizedTest + @MethodSource("getAccessConfigWorkItemStatusesForMapping") + void shouldMapToJobResult(AccessConfigWorkItemStatus accessConfigWorkItemStatus, JobStatus jobStatus) { + //given + var accessConfigWorkItemResult = new AccessConfigWorkItemResult(accessConfigWorkItemStatus, "message"); + + //when + var result = accessConfigJobHandler.mapToJobResult(accessConfigWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getAccessConfigWorkItemStatusesForMapping() { + return Stream.of( + of(AccessConfigWorkItemStatus.SUCCESS, JobStatus.DONE), + of(AccessConfigWorkItemStatus.DEVICE_CONFIG_FAILURE, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource(value = AccessConfigWorkItemStatus.class, names = {"SUCCESS", "DEVICE_CONFIG_FAILURE"}, mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(AccessConfigWorkItemStatus accessConfigWorkItemStatus) { + //given + var accessConfigWorkItemResult = new AccessConfigWorkItemResult(accessConfigWorkItemStatus, "message"); + + //expect + assertThrows(IllegalStateException.class, () -> { + accessConfigJobHandler.mapToJobResult(accessConfigWorkItemResult); + }); + } + + @Test + void shouldGetJobType() { + //when + var result = accessConfigJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.ACCESS_CONFIG)); + } +} diff --git a/src/test/java/io/gec/raw/connector/access/connectionworkitem/handler/CheckConnectionJobHandlerTest.java b/src/test/java/io/gec/raw/connector/access/connectionworkitem/handler/CheckConnectionJobHandlerTest.java new file mode 100755 index 0000000..64ab98b --- /dev/null +++ b/src/test/java/io/gec/raw/connector/access/connectionworkitem/handler/CheckConnectionJobHandlerTest.java @@ -0,0 +1,252 @@ +package io.gec.raw.connector.access.connectionworkitem.handler; + +import io.gec.raw.connector.access.connectionworkitem.domain.ConnectionWorkItemResult; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemStatus; +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.control.FtpController; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.willDoNothing; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.BDDMockito.willThrow; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class CheckConnectionJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + FtpController ftpController; + @Mock + DeviceController deviceController; + @InjectMocks + CheckConnectionJobHandler checkConnectionJobHandler; + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var connectionWorkItemDTO = new ConnectionWorkItemDTO(); + //and + willReturn(Optional.of(connectionWorkItemDTO)).given(communicationServiceController).fetchAccessConnectionWorkItem(workItemId); + + //when + var result = checkConnectionJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(connectionWorkItemDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchAccessConnectionWorkItem(workItemId); + + //when + var result = checkConnectionJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @Test + void shouldStartProcessing_updateConnectionWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var connectionWorkItemDTO = new ConnectionWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, connectionWorkItemDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updateAccessConnectionWorkItem(eq(workItemId), any()); + + //when + checkConnectionJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updateAccessConnectionWorkItem( + eq(workItemId), + argThat(connectionWorkItemUpdateDTO -> connectionWorkItemUpdateDTO.getStatus() == ConnectionWorkItemStatus.IN_PROGRESS)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withSuccess() { + //given + UUID workItemId = UUID.randomUUID(); + var connectionWorkItemDTO = new ConnectionWorkItemDTO(); + connectionWorkItemDTO.setDeviceId(UUID.randomUUID()); + var workItemWrapper = new WorkItemWrapper<>(workItemId, connectionWorkItemDTO, () -> false); + //and + String deviceUrl = "http://192.168.1.2"; + Device device = new Device(); + device.setDeviceURL(deviceUrl); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(connectionWorkItemDTO.getDeviceId()); + willReturn(true).given(ftpController).checkSftpConnection(connectionWorkItemDTO.getConnectionPropertyValues(), deviceUrl); + + //when + var result = checkConnectionJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(ConnectionWorkItemStatus.SUCCESS)); + assertThat(result.getMessage(), is(nullValue())); + //and + verify(deviceController, times(1)).getDeviceByCommSvcId(connectionWorkItemDTO.getDeviceId()); + verify(ftpController, times(1)).checkSftpConnection(connectionWorkItemDTO.getConnectionPropertyValues(), deviceUrl); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDeviceConnectionFailure() { + //given + UUID workItemId = UUID.randomUUID(); + var connectionWorkItemDTO = new ConnectionWorkItemDTO(); + connectionWorkItemDTO.setDeviceId(UUID.randomUUID()); + var workItemWrapper = new WorkItemWrapper<>(workItemId, connectionWorkItemDTO, () -> false); + //and + String deviceUrl = "http://192.168.1.2"; + Device device = new Device(); + device.setDeviceURL(deviceUrl); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(connectionWorkItemDTO.getDeviceId()); + willReturn(false).given(ftpController).checkSftpConnection(connectionWorkItemDTO.getConnectionPropertyValues(), deviceUrl); + + //when + var result = checkConnectionJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(ConnectionWorkItemStatus.DEVICE_CONNECTION_FAILURE)); + assertThat(result.getMessage(), is(nullValue())); + //and + verify(deviceController, times(1)).getDeviceByCommSvcId(connectionWorkItemDTO.getDeviceId()); + verify(ftpController, times(1)).checkSftpConnection(connectionWorkItemDTO.getConnectionPropertyValues(), deviceUrl); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDeviceConnectionFailure_whenCheckSftpConnectionThrowsException() { + //given + UUID workItemId = UUID.randomUUID(); + var connectionWorkItemDTO = new ConnectionWorkItemDTO(); + connectionWorkItemDTO.setDeviceId(UUID.randomUUID()); + var workItemWrapper = new WorkItemWrapper<>(workItemId, connectionWorkItemDTO, () -> false); + //and + String deviceUrl = "http://192.168.1.2"; + Device device = new Device(); + device.setDeviceURL(deviceUrl); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(connectionWorkItemDTO.getDeviceId()); + willThrow(SftpException.class).given(ftpController).checkSftpConnection(connectionWorkItemDTO.getConnectionPropertyValues(), deviceUrl); + + //when + var result = checkConnectionJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(ConnectionWorkItemStatus.DEVICE_CONNECTION_FAILURE)); + assertThat(result.getMessage(), is(nullValue())); + //and + verify(deviceController, times(1)).getDeviceByCommSvcId(connectionWorkItemDTO.getDeviceId()); + verify(ftpController, times(1)).checkSftpConnection(connectionWorkItemDTO.getConnectionPropertyValues(), deviceUrl); + } + + @ParameterizedTest + @EnumSource(ConnectionWorkItemStatus.class) + void shouldFinishProcessing_updateConnectionWorkItem(ConnectionWorkItemStatus connectionWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var connectionWorkItemDTO = new ConnectionWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, connectionWorkItemDTO, () -> false); + var connectionWorkItemResult = new ConnectionWorkItemResult(connectionWorkItemStatus); + //and + willDoNothing().given(communicationServiceController).updateAccessConnectionWorkItem(eq(workItemId), any()); + + //when + checkConnectionJobHandler.finishProcessing(workItemWrapper, connectionWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateAccessConnectionWorkItem( + eq(workItemId), + argThat(connectionWorkItemUpdateDTO -> connectionWorkItemUpdateDTO.getStatus() == connectionWorkItemStatus)); + } + + @ParameterizedTest + @MethodSource("getConnectionWorkItemStatusesForMapping") + void shouldMapToJobResult(ConnectionWorkItemStatus connectionWorkItemStatus, JobStatus jobStatus) { + //given + var connectionWorkItemResult = new ConnectionWorkItemResult(connectionWorkItemStatus, "message"); + + //when + var result = checkConnectionJobHandler.mapToJobResult(connectionWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getConnectionWorkItemStatusesForMapping() { + return Stream.of( + of(ConnectionWorkItemStatus.SUCCESS, JobStatus.DONE), + of(ConnectionWorkItemStatus.DEVICE_CONNECTION_FAILURE, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource(value = ConnectionWorkItemStatus.class, names = {"SUCCESS", "DEVICE_CONNECTION_FAILURE"}, mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(ConnectionWorkItemStatus connectionWorkItemStatus) { + //given + var connectionWorkItemResult = new ConnectionWorkItemResult(connectionWorkItemStatus); + + //expect + assertThrows(IllegalStateException.class, () -> { + checkConnectionJobHandler.mapToJobResult(connectionWorkItemResult); + }); + } + + @Test + void shouldGetJobType() { + //when + var result = checkConnectionJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.ACCESS_CONNECTION)); + } +} diff --git a/src/test/java/io/gec/raw/connector/access/logworkitem/control/AccessLogParserTest.java b/src/test/java/io/gec/raw/connector/access/logworkitem/control/AccessLogParserTest.java new file mode 100755 index 0000000..940c1c1 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/access/logworkitem/control/AccessLogParserTest.java @@ -0,0 +1,227 @@ +package io.gec.raw.connector.access.logworkitem.control; + +import io.gec.raw.connector.access.logworkitem.dto.AccessLogDTO; +import io.gec.raw.connector.access.logworkitem.dto.AccessLogItemDTO; +import io.gec.raw.connector.access.utils.ParserHelper; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +@QuarkusTest +class AccessLogParserTest { + private static final String TEST_RESOURCES_BASE_PATH = "src/test/resources/"; + + @Inject + AccessLogParser accessLogParser; + + @Inject + ParserHelper parserHelper; + + @Test + void shouldParseCmcFile() throws IOException { + List deviceNumberList = Arrays.asList(3, 4); + OffsetDateTime fromDateTime = parserHelper.getOffsetDateTimeFromString("2024-01-30T09:24:56+01:00"); + + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "syslog.cmc"); + + UUID rootDeviceId = UUID.randomUUID(); + AccessLogDTO accessLogDTO = accessLogParser.parseCmcFileContent(filePath, fromDateTime, rootDeviceId, deviceNumberList); + + assertEquals(36, accessLogDTO.getAccessLogItems().size()); + AccessLogItemDTO accessLogItemDTO = accessLogDTO.getAccessLogItems().get(0); + assertEquals("2024-01-30T09:24:56", accessLogItemDTO.getDateTime().toString().substring(0, 19)); + assertEquals(" RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4'", + accessLogItemDTO.getMessage()); + assertEquals("CMCIII-GRF2-4", accessLogItemDTO.getDeviceDescription()); + assertEquals("Device 3", accessLogItemDTO.getDeviceName()); + assertEquals(3, accessLogItemDTO.getDeviceNumber()); + + AccessLogItemDTO accessLogItemDTO1 = accessLogDTO.getAccessLogItems().get(25); + assertEquals("2024-02-27T09:58:01", accessLogItemDTO1.getDateTime().toString().substring(0, 19)); + assertEquals("Access Configuration changed by user 'admin' [Web]", accessLogItemDTO1.getMessage()); + assertNull(accessLogItemDTO1.getDeviceDescription()); + assertNull(accessLogItemDTO1.getDeviceName()); + assertEquals(0, accessLogItemDTO1.getDeviceNumber()); + } + + @Test + void shouldParseCmcFileWithNoEntriesFromDateTime() throws IOException { + List deviceNumberList = Arrays.asList(3, 4); + OffsetDateTime fromDateTime = parserHelper.getOffsetDateTimeFromString("2024-02-28T09:00:00+01:00"); + + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "syslog.cmc"); + + UUID rootDeviceId = UUID.randomUUID(); + AccessLogDTO accessLogDTO = accessLogParser.parseCmcFileContent(filePath, fromDateTime, rootDeviceId, deviceNumberList); + + assertEquals(0, accessLogDTO.getAccessLogItems().size()); + } + + @Test + void shouldParseCmcFileWithoutDeviceNumbers() throws IOException { + List deviceNumberList = new ArrayList<>(); + OffsetDateTime fromDateTime = parserHelper.getOffsetDateTimeFromString("2024-02-27T09:00:00+01:00"); + + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "syslog.cmc"); + + UUID rootDeviceId = UUID.randomUUID(); + AccessLogDTO accessLogDTO = accessLogParser.parseCmcFileContent(filePath, fromDateTime, rootDeviceId, deviceNumberList); + + assertEquals(2, accessLogDTO.getAccessLogItems().size()); + AccessLogItemDTO accessLogItemDTO = accessLogDTO.getAccessLogItems().get(0); + assertEquals("2024-02-27T09:57:22", accessLogItemDTO.getDateTime().toString().substring(0, 19)); + assertEquals("Access Configuration changed by user 'admin' [Web]", accessLogItemDTO.getMessage()); + assertNull(accessLogItemDTO.getDeviceDescription()); + assertNull(accessLogItemDTO.getDeviceName()); + assertEquals(0, accessLogItemDTO.getDeviceNumber()); + + AccessLogItemDTO accessLogItemDTO1 = accessLogDTO.getAccessLogItems().get(1); + assertEquals("2024-02-27T09:58:01", accessLogItemDTO1.getDateTime().toString().substring(0, 19)); + assertEquals("Access Configuration changed by user 'admin' [Web]", accessLogItemDTO1.getMessage()); + assertNull(accessLogItemDTO1.getDeviceDescription()); + assertNull(accessLogItemDTO1.getDeviceName()); + assertEquals(0, accessLogItemDTO1.getDeviceNumber()); + } + + @Test + void shouldParseCmc3File_withDateTimeFormatWithHyphens() throws IOException { + List deviceNumberList = Arrays.asList(3, 4); + OffsetDateTime fromDateTime = parserHelper.parseDateTime("2023-12-05/10:11:36", ParserHelper.DATETIME_YEAR_MONTH_DAY_WITH_HYPHENS); + + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "Logging.cmc3"); + + UUID rootDeviceId = UUID.randomUUID(); + AccessLogDTO accessLogDTO = accessLogParser.parseCmc3FileContent(filePath, fromDateTime, rootDeviceId, deviceNumberList); + + assertEquals(148, accessLogDTO.getAccessLogItems().size()); + AccessLogItemDTO accessLogItemDTO = accessLogDTO.getAccessLogItems().get(0); + assertEquals("2023-12-05T10:11:36", accessLogItemDTO.getDateTime().toString().substring(0, 19)); + assertEquals("@2.01, Access: Closed (0 )", accessLogItemDTO.getMessage()); + assertEquals("CMCIII-GRF2-4", accessLogItemDTO.getDeviceDescription()); + assertEquals("Device 3", accessLogItemDTO.getDeviceName()); + assertEquals(3, accessLogItemDTO.getDeviceNumber()); + + AccessLogItemDTO accessLogItemDTO1 = accessLogDTO.getAccessLogItems().get(143); + assertEquals("2024-01-30T13:31:39", accessLogItemDTO1.getDateTime().toString().substring(0, 19)); + assertEquals(" RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4'", + accessLogItemDTO1.getMessage()); + assertEquals("CMCIII-GRF2-4", accessLogItemDTO1.getDeviceDescription()); + assertEquals("Device 3", accessLogItemDTO1.getDeviceName()); + assertEquals(3, accessLogItemDTO1.getDeviceNumber()); + + AccessLogItemDTO accessLogItemDTO2 = accessLogDTO.getAccessLogItems().get(46); + assertEquals("2023-12-06T11:30:45", accessLogItemDTO2.getDateTime().toString().substring(0, 19)); + assertEquals("Configuration 'User-Setup' changed by user 'admin' [Web]", accessLogItemDTO2.getMessage()); + assertNull(accessLogItemDTO2.getDeviceDescription()); + assertNull(accessLogItemDTO2.getDeviceName()); + assertEquals(0, accessLogItemDTO2.getDeviceNumber()); + } + + @Test + void shouldParseCmc3File_withNoEntriesFromGivenDateTime_withDateTimeFormatWithHyphens() throws IOException { + List deviceNumberList = Arrays.asList(3, 4); + OffsetDateTime fromDateTime = parserHelper.parseDateTime("2024-02-28/10:00:00", ParserHelper.DATETIME_YEAR_MONTH_DAY_WITH_HYPHENS); + + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "Logging.cmc3"); + + UUID rootDeviceId = UUID.randomUUID(); + AccessLogDTO accessLogDTO = accessLogParser.parseCmc3FileContent(filePath, fromDateTime, rootDeviceId, deviceNumberList); + + assertEquals(0, accessLogDTO.getAccessLogItems().size()); + } + + @Test + void shouldParseCmc3File_withoutDeviceNumbers_withDateTimeFormatWithHyphens() throws IOException { + List deviceNumberList = new ArrayList<>(); + OffsetDateTime fromDateTime = parserHelper.parseDateTime("2024-01-01/10:00:00", ParserHelper.DATETIME_YEAR_MONTH_DAY_WITH_HYPHENS); + + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "Logging.cmc3"); + + UUID rootDeviceId = UUID.randomUUID(); + AccessLogDTO accessLogDTO = accessLogParser.parseCmc3FileContent(filePath, fromDateTime, rootDeviceId, deviceNumberList); + + assertEquals(2, accessLogDTO.getAccessLogItems().size()); + AccessLogItemDTO accessLogItemDTO = accessLogDTO.getAccessLogItems().get(0); + assertEquals("2024-01-26T13:24:24", accessLogItemDTO.getDateTime().toString().substring(0, 19)); + assertEquals("Configuration 'SNMP-Setup' changed by user 'admin' [Web]", accessLogItemDTO.getMessage()); + assertNull(accessLogItemDTO.getDeviceDescription()); + assertNull(accessLogItemDTO.getDeviceName()); + assertEquals(0, accessLogItemDTO.getDeviceNumber()); + + AccessLogItemDTO accessLogItemDTO1 = accessLogDTO.getAccessLogItems().get(1); + assertEquals("2024-01-26T13:26:15", accessLogItemDTO1.getDateTime().toString().substring(0, 19)); + assertEquals("Configuration 'SNMP-Setup' changed by user 'admin' [Web]", accessLogItemDTO1.getMessage()); + assertNull(accessLogItemDTO1.getDeviceDescription()); + assertNull(accessLogItemDTO1.getDeviceName()); + assertEquals(0, accessLogItemDTO1.getDeviceNumber()); + } + + @Test + void shouldParseCmc3File_withDateTimeFormatWithDots() throws IOException { + //given + UUID rootDeviceId = UUID.randomUUID(); + List deviceNumberList = Arrays.asList(3, 4); + OffsetDateTime fromDateTime = parserHelper.parseDateTime("25.03.2024/12:49:41", ParserHelper.DATETIME_DAY_MONTH_YEAR_WITH_DOTS); + //and + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "Logging_v2.cmc3"); + + //when + AccessLogDTO accessLogDTO = accessLogParser.parseCmc3FileContent(filePath, fromDateTime, rootDeviceId, deviceNumberList); + + //then + assertEquals(34, accessLogDTO.getAccessLogItems().size()); + AccessLogItemDTO accessLogItemDTO = accessLogDTO.getAccessLogItems().get(0); + assertEquals("2024-03-25T12:49:41", accessLogItemDTO.getDateTime().toString().substring(0, 19)); + assertEquals("Configuration 'Date / Time' changed by user 'admin' [Web]", accessLogItemDTO.getMessage()); + assertNull(accessLogItemDTO.getDeviceDescription()); + assertNull(accessLogItemDTO.getDeviceName()); + assertEquals(0, accessLogItemDTO.getDeviceNumber()); + //and + AccessLogItemDTO accessLogItemDTO1 = accessLogDTO.getAccessLogItems().get(4); + assertEquals("2024-03-25T13:20:18", accessLogItemDTO1.getDateTime().toString().substring(0, 19)); + assertEquals("@2.01, Door: Open (1 )", accessLogItemDTO1.getMessage()); + assertEquals("CMCIII-ACC", accessLogItemDTO1.getDeviceDescription()); + assertEquals("Device 3", accessLogItemDTO1.getDeviceName()); + assertEquals(3, accessLogItemDTO1.getDeviceNumber()); + } + + @Test + void shouldParseCmc3File_withoutDeviceNumbers_withDateTimeFormatWithDots() throws IOException { + //given + UUID rootDeviceId = UUID.randomUUID(); + List deviceNumberList = new ArrayList<>(); + OffsetDateTime fromDateTime = parserHelper.parseDateTime("25.03.2024/12:49:41", ParserHelper.DATETIME_DAY_MONTH_YEAR_WITH_DOTS); + //and + Path filePath = Path.of(TEST_RESOURCES_BASE_PATH, "Logging_v2.cmc3"); + + //when + AccessLogDTO accessLogDTO = accessLogParser.parseCmc3FileContent(filePath, fromDateTime, rootDeviceId, deviceNumberList); + + //then + assertEquals(13, accessLogDTO.getAccessLogItems().size()); + AccessLogItemDTO accessLogItemDTO = accessLogDTO.getAccessLogItems().get(0); + assertEquals("2024-03-25T12:49:41", accessLogItemDTO.getDateTime().toString().substring(0, 19)); + assertEquals("Configuration 'Date / Time' changed by user 'admin' [Web]", accessLogItemDTO.getMessage()); + assertNull(accessLogItemDTO.getDeviceDescription()); + assertNull(accessLogItemDTO.getDeviceName()); + assertEquals(0, accessLogItemDTO.getDeviceNumber()); + //and + AccessLogItemDTO accessLogItemDTO1 = accessLogDTO.getAccessLogItems().get(1); + assertEquals("2024-03-25T13:20:17", accessLogItemDTO1.getDateTime().toString().substring(0, 19)); + assertEquals("Configuration...", accessLogItemDTO1.getMessage()); + assertNull(accessLogItemDTO1.getDeviceDescription()); + assertNull(accessLogItemDTO1.getDeviceName()); + assertEquals(0, accessLogItemDTO1.getDeviceNumber()); + } +} diff --git a/src/test/java/io/gec/raw/connector/access/logworkitem/handler/AccessLogJobHandlerTest.java b/src/test/java/io/gec/raw/connector/access/logworkitem/handler/AccessLogJobHandlerTest.java new file mode 100755 index 0000000..bc8e41c --- /dev/null +++ b/src/test/java/io/gec/raw/connector/access/logworkitem/handler/AccessLogJobHandlerTest.java @@ -0,0 +1,297 @@ +package io.gec.raw.connector.access.logworkitem.handler; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemStatus; +import io.gec.raw.connector.access.logworkitem.domain.AccessLogWorkItemResult; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemDTO; +import io.gec.raw.connector.access.logworkitem.dto.LogWorkItemStatus; +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.ftp.control.FtpController; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.utils.TestDTOFactory; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.willDoNothing; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.BDDMockito.willThrow; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class AccessLogJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + FtpController ftpController; + @Mock + DeviceController deviceController; + @InjectMocks + AccessLogJobHandler accessLogJobHandler; + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var logWorkItemDTO = new LogWorkItemDTO(); + //and + willReturn(Optional.of(logWorkItemDTO)).given(communicationServiceController).fetchAccessLogWorkItem(workItemId); + + //when + var result = accessLogJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(logWorkItemDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchAccessLogWorkItem(workItemId); + + //when + var result = accessLogJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @Test + void shouldStartProcessing_updateLogWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var logWorkItemDTO = new LogWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, logWorkItemDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updateAccessLogWorkItem(eq(workItemId), any()); + + //when + accessLogJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updateAccessLogWorkItem( + eq(workItemId), + argThat(logWorkItemUpdateDTO -> logWorkItemUpdateDTO.getStatus() == LogWorkItemStatus.IN_PROGRESS + && logWorkItemUpdateDTO.getMessage() == null)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFinishedResult() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID protocolId = UUID.randomUUID(); + UUID protocolPropertyId = UUID.randomUUID(); + ConnectionWorkItemStatus accessWorkItemStatus = ConnectionWorkItemStatus.SUCCESS; + //and + var logWorkItemDTO = new LogWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, logWorkItemDTO, () -> false); + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, accessWorkItemStatus, protocolId, protocolPropertyId); + var sftpData = TestDTOFactory.createSftpData(); + var accessLogItemDTO = TestDTOFactory.createAccessLogItemDTO(); + var accessLogDto = TestDTOFactory.createAccessLogDto(workItemId, List.of(accessLogItemDTO)); + logWorkItemDTO.setConnectionWorkItem(connectionWorkItem); + //and + UUID rootDeviceId = UUID.randomUUID(); + String deviceUrl = "http://192.168.1.2"; + Device device = new Device(); + device.setId(rootDeviceId); + device.setDeviceURL(deviceUrl); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(deviceId); + willReturn(sftpData).given(ftpController).createSftpData(any(), eq(deviceUrl)); + willReturn(accessLogDto).given(ftpController).getLoggingFile(eq(sftpData), any(), eq(rootDeviceId), any()); + + //when + var result = accessLogJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(LogWorkItemStatus.DONE)); + assertThat(result.getMessage(), is("Access log items found: '1'")); + //and + verify(deviceController, times(1)).getDeviceByCommSvcId(deviceId); + verify(ftpController, times(1)).createSftpData(any(), eq(deviceUrl)); + verify(ftpController, times(1)).getLoggingFile(eq(sftpData), any(), eq(rootDeviceId), any()); + + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_whenAccessLogItemIsEmpty() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID protocolId = UUID.randomUUID(); + UUID protocolPropertyId = UUID.randomUUID(); + ConnectionWorkItemStatus accessWorkItemStatus = ConnectionWorkItemStatus.SUCCESS; + //and + var logWorkItemDTO = new LogWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, logWorkItemDTO, () -> false); + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, accessWorkItemStatus, protocolId, protocolPropertyId); + var accessLogDto = TestDTOFactory.createAccessLogDto(workItemId, Collections.emptyList()); + var sftpData = TestDTOFactory.createSftpData(); + logWorkItemDTO.setConnectionWorkItem(connectionWorkItem); + //and + UUID rootDeviceId = UUID.randomUUID(); + String deviceUrl = "http://192.168.1.2"; + Device device = new Device(); + device.setId(rootDeviceId); + device.setDeviceURL(deviceUrl); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(deviceId); + willReturn(sftpData).given(ftpController).createSftpData(any(), eq(deviceUrl)); + willReturn(accessLogDto).given(ftpController).getLoggingFile(eq(sftpData), any(), eq(rootDeviceId), any()); + + //when + var result = accessLogJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(LogWorkItemStatus.DONE)); + assertThat(result.getMessage(), is("Access log items found: '0'")); + //and + verify(deviceController, times(1)).getDeviceByCommSvcId(deviceId); + verify(ftpController, times(1)).createSftpData(any(), eq(deviceUrl)); + verify(ftpController, times(1)).getLoggingFile(eq(sftpData), any(), eq(rootDeviceId), any()); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResult_whenGetLoggingFileThrowsException() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID protocolId = UUID.randomUUID(); + UUID protocolPropertyId = UUID.randomUUID(); + var accessWorkItemStatusEnum = ConnectionWorkItemStatus.SUCCESS; + //and + var logWorkItemDTO = new LogWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, logWorkItemDTO, () -> false); + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, accessWorkItemStatusEnum, protocolId, protocolPropertyId); + var sftpData = TestDTOFactory.createSftpData(); + logWorkItemDTO.setConnectionWorkItem(connectionWorkItem); + //and + UUID rootDeviceId = UUID.randomUUID(); + String deviceUrl = "http://192.168.1.2"; + Device device = new Device(); + device.setId(rootDeviceId); + device.setDeviceURL(deviceUrl); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(deviceId); + willReturn(sftpData).given(ftpController).createSftpData(any(), eq(deviceUrl)); + willThrow(new SftpException("exception message")).given(ftpController).getLoggingFile(eq(sftpData), any(), eq(rootDeviceId), any()); + + //when + var result = accessLogJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(LogWorkItemStatus.LOG_FETCH_FAILURE)); + assertThat(result.getMessage(), is("exception message")); + //and + verify(deviceController, times(1)).getDeviceByCommSvcId(deviceId); + verify(ftpController, times(1)).createSftpData(any(), eq(deviceUrl)); + verify(ftpController, times(1)).getLoggingFile(eq(sftpData), any(), eq(rootDeviceId), any()); + } + + @ParameterizedTest + @EnumSource(LogWorkItemStatus.class) + void shouldFinishProcessing_updateLogWorkItem(LogWorkItemStatus logWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var logWorkItemDTO = new LogWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, logWorkItemDTO, () -> false); + var accessLogWorkItemResult = new AccessLogWorkItemResult(logWorkItemStatus, "result message"); + //and + willDoNothing().given(communicationServiceController).updateAccessLogWorkItem(eq(workItemId), any()); + + //when + accessLogJobHandler.finishProcessing(workItemWrapper, accessLogWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateAccessLogWorkItem( + eq(workItemId), + argThat(logWorkItemUpdateDTO -> logWorkItemUpdateDTO.getStatus() == logWorkItemStatus + && "result message".equals(logWorkItemUpdateDTO.getMessage()))); + } + + @ParameterizedTest + @MethodSource("getAccessLogWorkItemStatusesForMapping") + void shouldMapToJobResult(LogWorkItemStatus logWorkItemStatus, JobStatus jobStatus) { + //given + var accessLogWorkItemResult = new AccessLogWorkItemResult(logWorkItemStatus, "message"); + + //when + var result = accessLogJobHandler.mapToJobResult(accessLogWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getAccessLogWorkItemStatusesForMapping() { + return Stream.of( + of(LogWorkItemStatus.DONE, JobStatus.DONE), + of(LogWorkItemStatus.LOG_PARSE_FAILURE, JobStatus.FAILED), + of(LogWorkItemStatus.LOG_FETCH_FAILURE, JobStatus.FAILED), + of(LogWorkItemStatus.DEVICE_ACCESS_FAILURE, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource(value = LogWorkItemStatus.class, names = {"DONE", "LOG_PARSE_FAILURE", "LOG_FETCH_FAILURE", "DEVICE_ACCESS_FAILURE"}, mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(LogWorkItemStatus logWorkItemStatus) { + //given + var accessLogWorkItemResult = new AccessLogWorkItemResult(logWorkItemStatus, "message"); + + //expect + assertThrows(IllegalStateException.class, () -> { + accessLogJobHandler.mapToJobResult(accessLogWorkItemResult); + }); + } + + @Test + void shouldGetJobType() { + //when + var result = accessLogJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.ACCESS_LOG)); + } + +} diff --git a/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceControllerTest.java b/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceControllerTest.java new file mode 100755 index 0000000..14fc849 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceControllerTest.java @@ -0,0 +1,124 @@ +package io.gec.raw.connector.communicationservice.control; + +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.gec.raw.connector.communicationservice.exception.CommunicationServiceException; +import io.gec.raw.connector.communicationservice.exception.FailureType; +import io.gec.raw.connector.deviceproperty.dto.PropertyValueRequestDTO; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class CommunicationServiceControllerTest { + + @Mock + Logger logger; + @Mock + CommunicationServiceRequestErrorHandler communicationServiceRequestErrorHandler; + + @Mock + @RestClient + CommunicationService communicationService; + + @InjectMocks + CommunicationServiceController controller; + + @Test + void shouldCallRestServiceUpdateSubscribedPropertyValues() { + // given + var dto = PropertyValueRequestDTO.builder().build(); + + // when + controller.updateDeviceProperty(dto); + + // then + verify(communicationService, times(1)).updateDeviceProperty(dto); + } + + @Test + void shouldCallRestServiceUpdateSubscribedVariable() { + // given + var dto = new UpdateVariableRequestDTO(); + + // when + controller.updateVariableValue(dto); + + // then + verify(communicationService, times(1)).updateSubscribedVariable(dto); + } + + @Test + void shouldCallRestServiceUpdateVariableValues() { + // given + var dto = new UpdateVariableRequestDTO(); + var dtos = List.of(dto); + + // when + controller.updateVariableValues(dtos); + + // then + verify(communicationService, times(1)).updateSubscribedVariables(dtos); + } + + @Test + void updateVariableValueShouldLogErrorOnException() { + // given + var dto = new UpdateVariableRequestDTO(); + doThrow(new CommunicationServiceException(new FailureType(Response.Status.BAD_REQUEST, "FailureType"), + "Error message")).when( + communicationService) + .updateSubscribedVariable(dto); + + // when + controller.updateVariableValue(dto); + + // then + verify(logger, times(1)).errorf(any(CommunicationServiceException.class), + contains("Comm.Svc. - Update VariableValue (ID:'%s') to:'%s', quality:'%s' - FAILED"), eq(dto.getVariableId()), eq(dto.getValue()), eq(dto.getQualityType())); + } + + @Test + void updateDevicePropertyShouldLogErrorOnException() { + var dto = PropertyValueRequestDTO.builder().build(); + doThrow(new CommunicationServiceException(new FailureType(Response.Status.BAD_REQUEST, "FailureType"), + "Error message")).when(communicationService) + .updateDeviceProperty(dto); + + controller.updateDeviceProperty(dto); + + // Verify that an error log is written when an exception occurs + verify(logger, times(1)).errorf(any(CommunicationServiceException.class), + contains("Comm.Svc. - Update PropertyValue (ID:'%s') to:'%s' - FAILED"), eq(dto.getPropertyId()), eq(dto.getValueAsString())); + } + + @Test + void updateVariableValues_shouldHandleAndLogException() { + // given + var dto1 = new UpdateVariableRequestDTO(); + dto1.setVariableId(UUID.randomUUID()); + var dto2 = new UpdateVariableRequestDTO(); + dto2.setVariableId(UUID.randomUUID()); + var dtos = List.of(dto1, dto2); + //and + doThrow(new CommunicationServiceException(new FailureType(Response.Status.INTERNAL_SERVER_ERROR, "FailureType"), + "Error message")).when(communicationService).updateSubscribedVariables(dtos); + + // when + controller.updateVariableValues(dtos); + + // then + verify(communicationServiceRequestErrorHandler, times(1)).handleErrorOfUpdateSubscribedVariables(dtos); + verify(logger, times(1)).errorf(any(CommunicationServiceException.class), + contains("Comm.Svc. - Sending Variable Values - FAILED")); + } +} diff --git a/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceRequestErrorHandlerTest.java b/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceRequestErrorHandlerTest.java new file mode 100755 index 0000000..6651dd7 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceRequestErrorHandlerTest.java @@ -0,0 +1,44 @@ +package io.gec.raw.connector.communicationservice.control; + +import io.gec.raw.connector.variable.control.VariableValueCacheHandler; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class CommunicationServiceRequestErrorHandlerTest { + + @Mock + Logger logger; + @Mock + VariableValueCacheHandler variableValueCacheHandler; + + @InjectMocks + CommunicationServiceRequestErrorHandler handler; + + @Test + void handleErrorOfUpdateSubscribedVariables_shouldLogError_whenVariableValuesDTOsProvided() { + // given + var dto1 = new UpdateVariableRequestDTO(); + dto1.setVariableId(UUID.randomUUID()); + var dto2 = new UpdateVariableRequestDTO(); + dto2.setVariableId(UUID.randomUUID()); + var updateVariableRequestDTOs = List.of(dto1, dto2); + + // when + handler.handleErrorOfUpdateSubscribedVariables(updateVariableRequestDTOs); + + // then + verify(variableValueCacheHandler, times(1)).removeFromCache(List.of(dto1.getVariableId(), dto2.getVariableId())); + } +} diff --git a/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceResponseExceptionMapperTest.java b/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceResponseExceptionMapperTest.java new file mode 100755 index 0000000..fd33284 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/communicationservice/control/CommunicationServiceResponseExceptionMapperTest.java @@ -0,0 +1,104 @@ +package io.gec.raw.connector.communicationservice.control; + +import io.gec.raw.connector.communicationservice.exception.CommunicationServiceException; +import io.gec.raw.connector.communicationservice.exception.CommunicationServiceResponseExceptionMapper; +import jakarta.ws.rs.core.Response; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class CommunicationServiceResponseExceptionMapperTest { + + @Mock + private Logger logger; + + @Mock + private Response response; + + @InjectMocks + private CommunicationServiceResponseExceptionMapper exceptionMapper; + + @Test + void shouldMapValidJsonResponseToCommunicationServiceException() { + // given + var jsonResponse = "{\"object\":\"SomeModel\",\"failure\":\"SomeFailure\",\"message\":\"Some message\"}"; + when(response.readEntity(String.class)).thenReturn(jsonResponse); + // and + var statusType = mock(Response.StatusType.class); + when(statusType.toEnum()).thenReturn(Response.Status.BAD_REQUEST); + when(response.getStatusInfo()).thenReturn(statusType); + + // when + var result = exceptionMapper.toThrowable(response); + + // then + assertNotNull(result); + assertInstanceOf(CommunicationServiceException.class, result); + var commSvcException = (CommunicationServiceException) result; + assertEquals("Some message", commSvcException.getMessage()); + assertEquals( + "CommunicationServiceException{model=ModelType{name=SomeModel}, failure=FailureType{status=Bad Request, name=SomeFailure}, msg:Some message}", + commSvcException.toString()); + verify(response, times(1)).readEntity(String.class); + verify(statusType, times(1)).toEnum(); + } + + @Test + void shouldMapInvalidJsonResponseToCommunicationServiceException() { + // given + String invalidJsonResponse = "{\"object\": \"SomeModel\", \"failure\": "; + when(response.readEntity(String.class)).thenReturn(invalidJsonResponse); + // and + var statusType = mock(Response.StatusType.class); + when(statusType.toEnum()).thenReturn(Response.Status.BAD_REQUEST); + when(response.getStatusInfo()).thenReturn(statusType); + + // when + var result = exceptionMapper.toThrowable(response); + + // then + assertNotNull(result); + assertInstanceOf(CommunicationServiceException.class, result); + var commSvcException = (CommunicationServiceException) result; + assertEquals("Unable to extract CommunicationService response body as CommunicationServiceException", + commSvcException.getMessage()); + assertEquals( + "CommunicationServiceException{model=ModelType{name=unknown}, failure=FailureType{status=Bad Request, name=unknown}, msg:Unable to extract CommunicationService response body as CommunicationServiceException}", + commSvcException.toString()); + verify(response, times(1)).readEntity(String.class); + verify(statusType, times(1)).toEnum(); + } + + + @Test + void shouldLogAndThrowRuntimeExceptionWhenReadingResponseFails() { + // given + when(response.readEntity(String.class)).thenThrow(new RuntimeException("Failed to read entity")); + when(response.getStatusInfo()).thenReturn(mock(Response.StatusType.class)); + + // when + RuntimeException result = exceptionMapper.toThrowable(response); + + // then + assertEquals("Unable to extract CommunicationService response body as CommunicationServiceException", + result.getMessage()); + verify(logger, times(1)).warn( + eq("Unable to extract CommunicationService response body as CommunicationServiceException"), + any(RuntimeException.class)); + } + +} diff --git a/src/test/java/io/gec/raw/connector/componentmode/control/ComponentModeControllerTest.java b/src/test/java/io/gec/raw/connector/componentmode/control/ComponentModeControllerTest.java new file mode 100755 index 0000000..cdd3ddd --- /dev/null +++ b/src/test/java/io/gec/raw/connector/componentmode/control/ComponentModeControllerTest.java @@ -0,0 +1,363 @@ +package io.gec.raw.connector.componentmode.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.componentmode.dto.ChangeModeRequestDTO; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class ComponentModeControllerTest { + + @Mock + DeviceController deviceController; + + @Mock + VariableController variableController; + + @Mock + DevicePropertyController devicePropertyController; + + @Mock + Logger logger; + + @InjectMocks + ComponentModeController componentModeController; + + @Test + void shouldCreateChangeModeRequestDTO() { + // given + UUID commDeviceId = UUID.randomUUID(); + UUID rootDeviceId = UUID.randomUUID(); + + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + + when(deviceController.getDeviceByCommSvcId(commDeviceId)).thenReturn(rootDevice); + when(deviceController.getSubDevices(rootDeviceId)).thenReturn(Collections.emptyList()); + + // when + ChangeModeRequestDTO result = componentModeController.createChangeModeRequestDTO(commDeviceId); + + // then + assertEquals(1, result.getDeviceModes().size()); + assertEquals(ComponentMode.OPERATION, result.getDeviceModes().get(rootDevice.getCommServiceId())); + verify(deviceController, times(1)).getDeviceByCommSvcId(commDeviceId); + verify(deviceController, times(1)).getSubDevices(rootDeviceId); + } + + @Test + void shouldCreateDeviceModeMapWithSubDevices() { + // given + UUID rootDeviceId = UUID.randomUUID(); + UUID subDeviceId = UUID.randomUUID(); + + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + + Device subDevice = TestEntityFactory.createDevice(subDeviceId); + subDevice.setMode(ComponentMode.PAUSE); + subDevice.setParentId(rootDeviceId); + + when(deviceController.getDeviceByCommSvcId(rootDeviceId)).thenReturn(rootDevice); + when(deviceController.getSubDevices(rootDeviceId)).thenReturn(List.of(subDevice)); + when(deviceController.getSubDevices(subDeviceId)).thenReturn(Collections.emptyList()); + + // when + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(rootDeviceId); + + // then + assertEquals(2, changeModeRequestDTO.getDeviceModes().size()); + assertEquals(ComponentMode.OPERATION, changeModeRequestDTO.getDeviceModes().get(rootDevice.getCommServiceId())); + assertEquals(ComponentMode.PAUSE, changeModeRequestDTO.getDeviceModes().get(subDevice.getCommServiceId())); + verify(deviceController, times(1)).getSubDevices(rootDeviceId); + verify(deviceController, times(1)).getSubDevices(subDeviceId); + } + + @Test + void shouldCreateVariableModeMap() { + // given + UUID rootDeviceId = UUID.randomUUID(); + + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + + Variable variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setMode(ComponentMode.OPERATION); + + when(variableController.getVariablesByDeviceId(rootDeviceId)).thenReturn(List.of(variable)); + when(deviceController.getDeviceByCommSvcId(rootDeviceId)).thenReturn(rootDevice); + + // when + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(rootDeviceId); + + // then + assertEquals(1, changeModeRequestDTO.getVariableModes().size()); + assertEquals(ComponentMode.OPERATION, changeModeRequestDTO.getVariableModes().get(variable.getCommServiceId())); + verify(variableController, times(1)).getVariablesByDeviceId(rootDeviceId); + } + + @Test + void shouldCreatePropertyModeMap() { + // given + UUID rootDeviceId = UUID.randomUUID(); + //and + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + //and + DeviceProperty property = TestEntityFactory.createProperty(); + property.setMode(ComponentMode.PAUSE); + //and + when(devicePropertyController.findByDeviceId(rootDeviceId)).thenReturn(List.of(property)); + when(deviceController.getDeviceByCommSvcId(rootDeviceId)).thenReturn(rootDevice); + + // when + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(rootDeviceId); + + // then + assertEquals(1, changeModeRequestDTO.getPropertyModes().size()); + assertEquals(ComponentMode.PAUSE, changeModeRequestDTO.getPropertyModes().get(property.getCommServiceId())); + verify(devicePropertyController, times(1)).findByDeviceId(rootDeviceId); + } + + @Test + void shouldCreateDeviceModeMapWithSubDevices2() { + // given + UUID rootDeviceId = UUID.randomUUID(); + UUID subDeviceId = UUID.randomUUID(); + UUID subSubDeviceId = UUID.randomUUID(); + + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + + Device subDevice = TestEntityFactory.createDevice(subDeviceId); + subDevice.setMode(ComponentMode.PAUSE); + subDevice.setParentId(rootDeviceId); + + Device subSubDevice = TestEntityFactory.createDevice(subSubDeviceId); + subSubDevice.setMode(ComponentMode.FIRMWARE_UPDATE); + subSubDevice.setParentId(subDeviceId); + + when(deviceController.getDeviceByCommSvcId(rootDeviceId)).thenReturn(rootDevice); + when(deviceController.getSubDevices(rootDeviceId)).thenReturn(List.of(subDevice)); + when(deviceController.getSubDevices(subDeviceId)).thenReturn(List.of(subSubDevice)); + when(deviceController.getSubDevices(subSubDeviceId)).thenReturn(Collections.emptyList()); + + // when + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(rootDeviceId); + + // then + assertEquals(3, changeModeRequestDTO.getDeviceModes().size()); + assertEquals(ComponentMode.OPERATION, changeModeRequestDTO.getDeviceModes().get(rootDevice.getCommServiceId())); + assertEquals(ComponentMode.PAUSE, changeModeRequestDTO.getDeviceModes().get(subDevice.getCommServiceId())); + assertEquals(ComponentMode.FIRMWARE_UPDATE, changeModeRequestDTO.getDeviceModes().get(subSubDevice.getCommServiceId())); + verify(deviceController, times(1)).getSubDevices(rootDeviceId); + verify(deviceController, times(1)).getSubDevices(subDeviceId); + verify(deviceController, times(1)).getSubDevices(subSubDeviceId); + } + + @Test + void shouldCreateVariableModeMapWithSubDevices() { + // given + UUID rootDeviceId = UUID.randomUUID(); + UUID subDeviceId = UUID.randomUUID(); + UUID subSubDeviceId = UUID.randomUUID(); + + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + + Device subDevice = TestEntityFactory.createDevice(subDeviceId); + subDevice.setParentId(rootDeviceId); + + Device subSubDevice = TestEntityFactory.createDevice(subSubDeviceId); + subSubDevice.setParentId(subDeviceId); + + Variable rootVariable = TestEntityFactory.createVariableWithoutConstraints(); + rootVariable.setMode(ComponentMode.OPERATION); + rootVariable.setId(UUID.randomUUID()); + + Variable subVariable = TestEntityFactory.createVariableWithoutConstraints(); + subVariable.setMode(ComponentMode.PAUSE); + subVariable.setId(UUID.randomUUID()); + + Variable subSubVariable = TestEntityFactory.createVariableWithoutConstraints(); + subSubVariable.setMode(ComponentMode.FIRMWARE_UPDATE); + subSubVariable.setId(UUID.randomUUID()); + + when(variableController.getVariablesByDeviceId(rootDeviceId)).thenReturn(List.of(rootVariable)); + when(variableController.getVariablesByDeviceId(subDeviceId)).thenReturn(List.of(subVariable)); + when(variableController.getVariablesByDeviceId(subSubDeviceId)).thenReturn(List.of(subSubVariable)); + + when(deviceController.getDeviceByCommSvcId(rootDeviceId)).thenReturn(rootDevice); + when(deviceController.getSubDevices(rootDeviceId)).thenReturn(List.of(subDevice)); + when(deviceController.getSubDevices(subDeviceId)).thenReturn(List.of(subSubDevice)); + when(deviceController.getSubDevices(subSubDeviceId)).thenReturn(Collections.emptyList()); + + // when + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(rootDeviceId); + + // then + assertEquals(3, changeModeRequestDTO.getVariableModes().size()); + assertEquals(ComponentMode.OPERATION, changeModeRequestDTO.getVariableModes().get(rootVariable.getCommServiceId())); + assertEquals(ComponentMode.PAUSE, changeModeRequestDTO.getVariableModes().get(subVariable.getCommServiceId())); + assertEquals(ComponentMode.FIRMWARE_UPDATE, changeModeRequestDTO.getVariableModes().get(subSubVariable.getCommServiceId())); + verify(variableController, times(1)).getVariablesByDeviceId(rootDeviceId); + verify(variableController, times(1)).getVariablesByDeviceId(subDeviceId); + verify(variableController, times(1)).getVariablesByDeviceId(subSubDeviceId); + } + + @Test + void shouldCreatePropertyModeMapWithSubDevices() { + // given + UUID rootDeviceId = UUID.randomUUID(); + UUID subDeviceId = UUID.randomUUID(); + UUID subSubDeviceId = UUID.randomUUID(); + + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + + Device subDevice = TestEntityFactory.createDevice(subDeviceId); + subDevice.setParentId(rootDeviceId); + + Device subSubDevice = TestEntityFactory.createDevice(subSubDeviceId); + subSubDevice.setParentId(subDeviceId); + + DeviceProperty rootProperty = TestEntityFactory.createProperty(); + rootProperty.setMode(ComponentMode.OPERATION); + rootProperty.setId(UUID.randomUUID()); + + DeviceProperty subProperty = TestEntityFactory.createProperty(); + subProperty.setMode(ComponentMode.PAUSE); + subProperty.setId(UUID.randomUUID()); + + DeviceProperty subSubProperty = TestEntityFactory.createProperty(); + subSubProperty.setMode(ComponentMode.FIRMWARE_UPDATE); + subSubProperty.setId(UUID.randomUUID()); + + when(devicePropertyController.findByDeviceId(rootDeviceId)).thenReturn(List.of(rootProperty)); + when(devicePropertyController.findByDeviceId(subDeviceId)).thenReturn(List.of(subProperty)); + when(devicePropertyController.findByDeviceId(subSubDeviceId)).thenReturn(List.of(subSubProperty)); + + when(deviceController.getDeviceByCommSvcId(rootDeviceId)).thenReturn(rootDevice); + when(deviceController.getSubDevices(rootDeviceId)).thenReturn(List.of(subDevice)); + when(deviceController.getSubDevices(subDeviceId)).thenReturn(List.of(subSubDevice)); + when(deviceController.getSubDevices(subSubDeviceId)).thenReturn(Collections.emptyList()); + + // when + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(rootDeviceId); + + // then + assertEquals(3, changeModeRequestDTO.getPropertyModes().size()); + assertEquals(ComponentMode.OPERATION, changeModeRequestDTO.getPropertyModes().get(rootProperty.getCommServiceId())); + assertEquals(ComponentMode.PAUSE, changeModeRequestDTO.getPropertyModes().get(subProperty.getCommServiceId())); + assertEquals(ComponentMode.FIRMWARE_UPDATE, changeModeRequestDTO.getPropertyModes().get(subSubProperty.getCommServiceId())); + verify(devicePropertyController, times(1)).findByDeviceId(rootDeviceId); + verify(devicePropertyController, times(1)).findByDeviceId(subDeviceId); + verify(devicePropertyController, times(1)).findByDeviceId(subSubDeviceId); + } + + @Test + void shouldCreateChangeModeRequestDTOWithDeviceHierarchy() { + // given + UUID rootDeviceId = UUID.randomUUID(); + UUID subDeviceId = UUID.randomUUID(); + UUID subSubDeviceId = UUID.randomUUID(); + + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + + Device subDevice = TestEntityFactory.createDevice(subDeviceId); + subDevice.setMode(ComponentMode.PAUSE); + subDevice.setParentId(rootDeviceId); + + Device subSubDevice = TestEntityFactory.createDevice(subSubDeviceId); + subSubDevice.setMode(ComponentMode.FIRMWARE_UPDATE); + subSubDevice.setParentId(subDeviceId); + + Variable rootVariable = TestEntityFactory.createVariableWithoutConstraints(); + rootVariable.setId(UUID.randomUUID()); + rootVariable.setMode(ComponentMode.OPERATION); + + Variable subVariable = TestEntityFactory.createVariableWithoutConstraints(); + subVariable.setId(UUID.randomUUID()); + subVariable.setMode(ComponentMode.PAUSE); + + Variable subSubVariable = TestEntityFactory.createVariableWithoutConstraints(); + subSubVariable.setId(UUID.randomUUID()); + subSubVariable.setMode(ComponentMode.FIRMWARE_UPDATE); + + DeviceProperty rootProperty = TestEntityFactory.createProperty(); + rootProperty.setId(UUID.randomUUID()); + rootProperty.setMode(ComponentMode.OPERATION); + + DeviceProperty subProperty = TestEntityFactory.createProperty(); + subProperty.setId(UUID.randomUUID()); + subProperty.setMode(ComponentMode.PAUSE); + + DeviceProperty subSubProperty = TestEntityFactory.createProperty(); + subSubProperty.setId(UUID.randomUUID()); + subSubProperty.setMode(ComponentMode.FIRMWARE_UPDATE); + + when(deviceController.getDeviceByCommSvcId(rootDeviceId)).thenReturn(rootDevice); + when(deviceController.getSubDevices(rootDeviceId)).thenReturn(List.of(subDevice)); + when(deviceController.getSubDevices(subDeviceId)).thenReturn(List.of(subSubDevice)); + when(deviceController.getSubDevices(subSubDeviceId)).thenReturn(List.of()); + + when(variableController.getVariablesByDeviceId(rootDeviceId)).thenReturn(List.of(rootVariable)); + when(variableController.getVariablesByDeviceId(subDeviceId)).thenReturn(List.of(subVariable)); + when(variableController.getVariablesByDeviceId(subSubDeviceId)).thenReturn(List.of(subSubVariable)); + + when(devicePropertyController.findByDeviceId(rootDeviceId)).thenReturn(List.of(rootProperty)); + when(devicePropertyController.findByDeviceId(subDeviceId)).thenReturn(List.of(subProperty)); + when(devicePropertyController.findByDeviceId(subSubDeviceId)).thenReturn(List.of(subSubProperty)); + + // when + ChangeModeRequestDTO changeModeRequestDTO = componentModeController.createChangeModeRequestDTO(rootDeviceId); + + // then + assertEquals(3, changeModeRequestDTO.getDeviceModes().size()); + assertEquals(ComponentMode.OPERATION, changeModeRequestDTO.getDeviceModes().get(rootDevice.getCommServiceId())); + assertEquals(ComponentMode.PAUSE, changeModeRequestDTO.getDeviceModes().get(subDevice.getCommServiceId())); + assertEquals(ComponentMode.FIRMWARE_UPDATE, changeModeRequestDTO.getDeviceModes().get(subSubDevice.getCommServiceId())); + + assertEquals(3, changeModeRequestDTO.getVariableModes().size()); + assertEquals(ComponentMode.OPERATION, changeModeRequestDTO.getVariableModes().get(rootVariable.getCommServiceId())); + assertEquals(ComponentMode.PAUSE, changeModeRequestDTO.getVariableModes().get(subVariable.getCommServiceId())); + assertEquals(ComponentMode.FIRMWARE_UPDATE, changeModeRequestDTO.getVariableModes().get(subSubVariable.getCommServiceId())); + + assertEquals(3, changeModeRequestDTO.getPropertyModes().size()); + assertEquals(ComponentMode.OPERATION, changeModeRequestDTO.getPropertyModes().get(rootProperty.getCommServiceId())); + assertEquals(ComponentMode.PAUSE, changeModeRequestDTO.getPropertyModes().get(subProperty.getCommServiceId())); + assertEquals(ComponentMode.FIRMWARE_UPDATE, changeModeRequestDTO.getPropertyModes().get(subSubProperty.getCommServiceId())); + + verify(deviceController, times(1)).getDeviceByCommSvcId(rootDeviceId); + verify(deviceController, times(1)).getSubDevices(rootDeviceId); + verify(deviceController, times(1)).getSubDevices(subDeviceId); + verify(deviceController, times(1)).getSubDevices(subSubDeviceId); + + verify(variableController, times(1)).getVariablesByDeviceId(rootDeviceId); + verify(variableController, times(1)).getVariablesByDeviceId(subDeviceId); + verify(variableController, times(1)).getVariablesByDeviceId(subSubDeviceId); + + verify(devicePropertyController, times(1)).findByDeviceId(rootDeviceId); + verify(devicePropertyController, times(1)).findByDeviceId(subDeviceId); + verify(devicePropertyController, times(1)).findByDeviceId(subSubDeviceId); + } +} diff --git a/src/test/java/io/gec/raw/connector/componentmode/control/ComponentModeHandlerTest.java b/src/test/java/io/gec/raw/connector/componentmode/control/ComponentModeHandlerTest.java new file mode 100755 index 0000000..b4017af --- /dev/null +++ b/src/test/java/io/gec/raw/connector/componentmode/control/ComponentModeHandlerTest.java @@ -0,0 +1,76 @@ +package io.gec.raw.connector.componentmode.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.componentmode.dto.ChangeModeRequestDTO; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.control.DeviceController; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.UUID; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ComponentModeHandlerTest { + @Mock + DeviceController deviceController; + @Mock + ComponentModeController componentModeController; + @Mock + CommunicationServiceController communicationServiceController; + + @InjectMocks + ComponentModeHandler componentModeHandler; + + @Test + void shouldChangeComponentModeForDeviceTree() { + //given + UUID commDeviceId = UUID.randomUUID(); + ComponentMode componentMode = ComponentMode.PAUSE; + + //when + componentModeHandler.changeComponentModeForDeviceTree(commDeviceId, componentMode); + + //then + verify(deviceController).updateModeByCommSvcId(commDeviceId, componentMode); + verify(communicationServiceController).changeComponentModeForDeviceTree(commDeviceId, componentMode); + } + + @Test + void shouldChangeComponentMode() { + //given + UUID commDeviceId = UUID.randomUUID(); + ComponentMode componentMode = ComponentMode.PAUSE; + ChangeModeRequestDTO changeModeRequestDTO = new ChangeModeRequestDTO(); + //and + when(componentModeController.createChangeModeRequestDTO(commDeviceId)).thenReturn(changeModeRequestDTO); + + //when + componentModeHandler.changeComponentMode(commDeviceId, componentMode); + + //then + verify(deviceController).updateModeByCommSvcId(commDeviceId, componentMode); + verify(communicationServiceController).changeComponentMode(changeModeRequestDTO); + } + + @Test + void shouldRestoreComponentMode() { + //given + UUID commDeviceId = UUID.randomUUID(); + ChangeModeRequestDTO changeModeRequestDTO = new ChangeModeRequestDTO(); + //and + when(componentModeController.createChangeModeRequestDTO(commDeviceId)).thenReturn(changeModeRequestDTO); + + //when + componentModeHandler.restoreComponentMode(commDeviceId); + + //then + verify(deviceController).restoreModeByCommSvcId(commDeviceId); + verify(communicationServiceController).changeComponentMode(changeModeRequestDTO); + } +} diff --git a/src/test/java/io/gec/raw/connector/config/control/ConnectorConfigControllerTest.java b/src/test/java/io/gec/raw/connector/config/control/ConnectorConfigControllerTest.java new file mode 100755 index 0000000..c958204 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/config/control/ConnectorConfigControllerTest.java @@ -0,0 +1,87 @@ +package io.gec.raw.connector.config.control; + +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EmptySource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ConnectorConfigControllerTest { + + private static final String CORRECT_VERSION_VALUE = "202309240900"; + private static final String VERSION_PROPERTY_NAME = "version"; + + @Mock + Logger logger; + @Mock + PropertyFileHandler propertyFileHandler; + @InjectMocks + ConnectorConfigController connectorConfigController; + + @Test + void shouldGetTimestampReturnExpectedResult() { + // given + when(propertyFileHandler.getProperty(VERSION_PROPERTY_NAME)).thenReturn(Optional.of(CORRECT_VERSION_VALUE)); + + // when + String result = connectorConfigController.getTimestamp(); + + // then + assertEquals("24.09.2023 09:00", result); + } + + @ParameterizedTest + @ValueSource(strings = {" ", "\t", "\n"}) + @NullSource + @EmptySource + void shouldGetTimestampThrowRuntimeExceptionWhenPropertyIsNotAvailable(String versionPropertyValue) { + // given + when(propertyFileHandler.getProperty(VERSION_PROPERTY_NAME)).thenReturn(Optional.ofNullable(versionPropertyValue)); + + // when & then + assertThrows(RuntimeException.class, () -> connectorConfigController.getTimestamp()); + } + + @ParameterizedTest + @ValueSource(strings = { + "20230924 0900", + "20230924 091", + }) + void shouldGetTimestampUseRawVersionPropertyOnFormattingErrors(String versionPropertyValue) { + // given + when(propertyFileHandler.getProperty(VERSION_PROPERTY_NAME)).thenReturn(Optional.of(versionPropertyValue)); + + // when + String result = connectorConfigController.getTimestamp(); + + // then + assertEquals(versionPropertyValue, result); + verify(logger).error(anyString()); + } + + @Test + void shouldGetVersionReturnExpectedValue() { + // given + when(propertyFileHandler.getProperty(VERSION_PROPERTY_NAME)).thenReturn(Optional.of(CORRECT_VERSION_VALUE)); + + // when + String version = connectorConfigController.getConnectorVersion(); + + // then + assertEquals("null (24.09.2023 09:00)", version); + } +} diff --git a/src/test/java/io/gec/raw/connector/config/control/PropertyFileHandlerTest.java b/src/test/java/io/gec/raw/connector/config/control/PropertyFileHandlerTest.java new file mode 100755 index 0000000..7fc4c8f --- /dev/null +++ b/src/test/java/io/gec/raw/connector/config/control/PropertyFileHandlerTest.java @@ -0,0 +1,23 @@ +package io.gec.raw.connector.config.control; + +import org.junit.jupiter.api.Test; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PropertyFileHandlerTest { + + PropertyFileHandler propertyFileHandler = new PropertyFileHandler(); + + @Test + void shouldGetPropertyReturnValidValue() { + // given + Optional version = propertyFileHandler.getProperty("version"); + + // when & then + assertTrue(version.isPresent()); + assertFalse(version.get().isBlank()); + } +} diff --git a/src/test/java/io/gec/raw/connector/connector/control/ConnectorControllerTest.java b/src/test/java/io/gec/raw/connector/connector/control/ConnectorControllerTest.java new file mode 100755 index 0000000..ba677fe --- /dev/null +++ b/src/test/java/io/gec/raw/connector/connector/control/ConnectorControllerTest.java @@ -0,0 +1,256 @@ +package io.gec.raw.connector.connector.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.config.control.ConnectorConfigController; +import io.gec.raw.connector.config.entity.ConnectorConfig; +import io.gec.raw.connector.connector.dto.ConnectorRequestDTO; +import io.gec.raw.connector.connector.dto.ConnectorResponseDTO; +import io.gec.raw.connector.driver.control.DeviceDriverController; +import io.gec.raw.connector.protocol.control.ProtocolMapper; +import io.gec.raw.connector.protocol.control.ProtocolService; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class ConnectorControllerTest { + + @Mock + ConnectorConfig connectorConfig; + @Mock + CommunicationServiceController communicationServiceController; + @Mock + ProtocolService protocolService; + @Mock + ConnectorUtils connectorUtils; + @Mock + ProtocolMapper protocolMapper; + @Mock + Logger logger; + @Mock + ConnectorConfigController connectorConfigController; + @Mock + DeviceDriverController deviceDriverController; + @InjectMocks + ConnectorController connectorController; + + /** + * Method under test: {@link ConnectorController#buildConnector()} + */ + @Test + void testBuildConnector() { + // given + UUID randomUUIDResult = UUID.randomUUID(); + when(connectorConfig.getConnectorDescription()).thenReturn("Connector Description"); + when(connectorConfig.getConnectorName()).thenReturn("Connector Name"); + when(connectorConfig.getConnectorId()).thenReturn(randomUUIDResult); + when(protocolMapper.getProtocols(anyList())).thenReturn(List.of()); + when(connectorConfigController.getConnectorVersion()).thenReturn("testString"); + + // when + ConnectorRequestDTO connectorRequestDTO = connectorController.buildConnector(); + + // then + assertEquals("testString", connectorRequestDTO.getVersion()); + verify(connectorConfig).getConnectorDescription(); + verify(connectorConfig, atLeast(1)).getConnectorName(); + verify(connectorConfig).getConnectorId(); + } + + /** + * Method under test: {@link ConnectorController#buildConnector()} + */ + @Test + void testBuildConnector2() { + // given + when(connectorConfig.getConnectorDescription()).thenThrow(new NullPointerException("version.properties")); + when(connectorConfig.getConnectorName()).thenReturn("Connector Name"); + UUID randomUUIDResult = UUID.randomUUID(); + when(connectorConfig.getConnectorId()).thenReturn(randomUUIDResult); + + // when + ConnectorRequestDTO actualBuildConnectorResult = connectorController.buildConnector(); + + // then + assertEquals("Connector Name", actualBuildConnectorResult.getName()); + assertSame(randomUUIDResult, actualBuildConnectorResult.getId()); + verify(connectorConfig).getConnectorDescription(); + verify(connectorConfig, atLeast(1)).getConnectorName(); + verify(connectorConfig).getConnectorId(); + } + + /** + * Method under test: {@link ConnectorController#buildConnector()} + */ + @Test + void testBuildConnector3() { + // given + when(connectorConfig.getConnectorName()).thenReturn(null); + UUID randomUUIDResult = UUID.randomUUID(); + when(connectorConfig.getConnectorId()).thenReturn(randomUUIDResult); + + // when & then + assertSame(randomUUIDResult, connectorController.buildConnector().getId()); + verify(connectorConfig).getConnectorName(); + verify(connectorConfig).getConnectorId(); + } + + /** + * Method under test: {@link ConnectorController#buildConnector()} + */ + @Test + void testBuildConnector4() { + // given + when(connectorConfig.getConnectorName()).thenReturn(""); + UUID randomUUIDResult = UUID.randomUUID(); + when(connectorConfig.getConnectorId()).thenReturn(randomUUIDResult); + when(connectorConfigController.getConnectorVersion()).thenReturn("testString"); + + // when & then + assertSame(randomUUIDResult, connectorController.buildConnector().getId()); + verify(connectorConfig).getConnectorName(); + verify(connectorConfig).getConnectorId(); + } + + /** + * Method under test: {@link ConnectorController#registerOnServer()} + */ + @Test + void testRegisterOnServer() { + // given + ConnectorResponseDTO connectorResponseDTO = createConnectorResponseDTO(); + when(communicationServiceController.registerConnector(Mockito.any())).thenReturn(Optional.of(connectorResponseDTO)); + when(connectorConfig.getConnectorDescription()).thenReturn("Connector Description"); + when(connectorConfig.getConnectorName()).thenReturn("Connector Name"); + when(connectorConfig.getConnectorId()).thenReturn(UUID.randomUUID()); + when(connectorConfigController.getConnectorVersion()).thenReturn("testString"); + + // when + Optional registeredConnector = connectorController.registerOnServer(); + + // then + assertTrue(registeredConnector.isPresent()); + assertSame(connectorResponseDTO, registeredConnector.get()); + verify(communicationServiceController).registerConnector(Mockito.any()); + verify(connectorConfig).getConnectorDescription(); + verify(connectorConfig, atLeast(1)).getConnectorName(); + verify(connectorConfig).getConnectorId(); + } + + /** + * Method under test: {@link ConnectorController#registerOnServer()} + */ + @Test + void testRegisterOnServer2() { + // given + ConnectorResponseDTO connectorResponseDTO = createConnectorResponseDTO(); + when(communicationServiceController.registerConnector(Mockito.any())).thenReturn(Optional.of(connectorResponseDTO)); + when(connectorConfig.getConnectorDescription()).thenThrow(new NullPointerException("version.properties")); + when(connectorConfig.getConnectorName()).thenReturn("Connector Name"); + when(connectorConfig.getConnectorId()).thenReturn(UUID.randomUUID()); + + // when + Optional registeredConnector = connectorController.registerOnServer(); + + //then + assertTrue(registeredConnector.isPresent()); + assertSame(connectorResponseDTO, registeredConnector.get()); + verify(communicationServiceController).registerConnector(Mockito.any()); + verify(connectorConfig).getConnectorDescription(); + verify(connectorConfig, atLeast(1)).getConnectorName(); + verify(connectorConfig).getConnectorId(); + } + + /** + * Method under test: {@link ConnectorController#registerOnServer()} + */ + @Test + void testRegisterOnServer3() { + // given + ConnectorResponseDTO connectorResponseDTO = createConnectorResponseDTO(); + when(communicationServiceController.registerConnector(Mockito.any())).thenReturn(Optional.of(connectorResponseDTO)); + when(connectorConfig.getConnectorName()).thenReturn(null); + when(connectorConfig.getConnectorId()).thenReturn(UUID.randomUUID()); + + // when + Optional registeredConnector = connectorController.registerOnServer(); + + // then + assertTrue(registeredConnector.isPresent()); + assertSame(connectorResponseDTO, registeredConnector.get()); + verify(communicationServiceController).registerConnector(Mockito.any()); + verify(connectorConfig).getConnectorName(); + verify(connectorConfig).getConnectorId(); + } + + /** + * Method under test: {@link ConnectorController#registerOnServer()} + */ + @Test + void testRegisterOnServer4() { + // given + ConnectorResponseDTO connectorResponseDTO = createConnectorResponseDTO(); + when(communicationServiceController.registerConnector(Mockito.any())).thenReturn(Optional.of(connectorResponseDTO)); + when(connectorConfig.getConnectorName()).thenReturn(""); + when(connectorConfig.getConnectorId()).thenReturn(UUID.randomUUID()); + when(connectorConfigController.getConnectorVersion()).thenReturn("testString"); + + // when + Optional registeredConnector = connectorController.registerOnServer(); + + // then + assertTrue(registeredConnector.isPresent()); + assertSame(connectorResponseDTO, registeredConnector.get()); + verify(communicationServiceController).registerConnector(Mockito.any()); + verify(connectorConfig).getConnectorName(); + verify(connectorConfig).getConnectorId(); + } + + @Test + void testRegisterOnServer_callSynchronizeDriversAndUpdateProtocols_validResponse() { + // given + ConnectorResponseDTO connectorResponseDTO = createConnectorResponseDTO(); + when(communicationServiceController.registerConnector(Mockito.any())).thenReturn(Optional.of(connectorResponseDTO)); + + // when + Optional registeredConnector = connectorController.registerOnServer(); + + // then + assertTrue(registeredConnector.isPresent()); + verify(protocolService, times(1)).createOrUpdateProtocols(any()); + verify(deviceDriverController, times(1)).synchronizeDrivers(); + } + + @Test + void testRegisterOnServer_notCallSynchronizeDriversAndUpdateProtocols_emptyResponse() { + // given + when(communicationServiceController.registerConnector(Mockito.any())).thenReturn(Optional.empty()); + + // when + Optional registeredConnector = connectorController.registerOnServer(); + + // then + assertTrue(registeredConnector.isEmpty()); + verify(protocolService, times(0)).createOrUpdateProtocols(any()); + verify(deviceDriverController, times(0)).synchronizeDrivers(); + } + + private ConnectorResponseDTO createConnectorResponseDTO() { + return ConnectorResponseDTO.builder() + .id(UUID.randomUUID()) + .ipAddress("Ip Adresse") + .name("Name") + .build(); + } +} diff --git a/src/test/java/io/gec/raw/connector/device/control/DeviceControllerTest.java b/src/test/java/io/gec/raw/connector/device/control/DeviceControllerTest.java new file mode 100755 index 0000000..4c35bd6 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/device/control/DeviceControllerTest.java @@ -0,0 +1,482 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationService; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyRepository; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.entity.Variable; +import jakarta.persistence.EntityManager; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class DeviceControllerTest { + + @Mock + EntityManager em; + @Mock + VariableController variableController; + @Mock + DevicePropertyController devicePropertyController; + @Mock + Logger logger; + @Mock + DevicePropertyRepository devicePropertyRepository; + @Mock + CommunicationService communicationService; + @Mock + DeviceRepository deviceRepository; + @InjectMocks + DeviceController deviceController; + + private static Stream shouldGetRootDeviceThrowException() { + return Stream.of( + null, + new Device() + ); + } + + @ParameterizedTest + @MethodSource + void shouldGetRootDeviceThrowException(Device device) { + assertThrows(IllegalArgumentException.class, () -> deviceController.getRootDevice(device)); + } + + @Test + void shouldGetRootDeviceReturnSameDevice() { + // given + Device device = new Device(); + device.setId(UUID.randomUUID()); + device.setParentId(null); + + // when + Device result = deviceController.getRootDevice(device); + + // then + assertNotNull(result); + assertEquals(device, result); + } + + @Test + void shouldGetRootDeviceReturnParentDevice() { + // given + UUID parentDeviceId = UUID.randomUUID(); + Device parentDevice = new Device(); + parentDevice.setId(parentDeviceId); + parentDevice.setParentId(null); + Device childDevice = new Device(); + childDevice.setId(UUID.randomUUID()); + childDevice.setParentId(parentDeviceId); + when(deviceRepository.findById(parentDeviceId)).thenReturn(parentDevice); + + // when + Device result = deviceController.getRootDevice(childDevice); + + // then + assertNotNull(result); + assertEquals(parentDevice, result); + } + + @Test + void shouldGetSubDeviceByDeviceIndexThrowAnException() { + // given + UUID uuid = UUID.randomUUID(); + + // when & then + assertThrows(IllegalArgumentException.class, () -> deviceController.getDeviceByDeviceIndex(uuid, null)); + } + + @Test + void shouldGetSubDeviceByDeviceIndexReturnNullWhenRootDeviceNotExist() { + // given + when(deviceRepository.findByIdOptional(Mockito.any(UUID.class))).thenReturn(Optional.empty()); + + // when + Device subDeviceByDeviceIndex = deviceController.getDeviceByDeviceIndex(UUID.randomUUID(), 0); + + // then + assertNull(subDeviceByDeviceIndex); + } + + @Test + void shouldGetSubDeviceByDeviceIndexReturnNull() { + // given + when(deviceRepository.getSubDevices(Mockito.any())).thenReturn(List.of()); + when(deviceRepository.findByIdOptional(Mockito.any(UUID.class))).thenReturn(Optional.of(new Device())); + + // when + Device subDeviceByDeviceIndex = deviceController.getDeviceByDeviceIndex(UUID.randomUUID(), 0); + + // then + assertNull(subDeviceByDeviceIndex); + } + + @Test + void shouldGetSubDeviceByDeviceIndexReturnExpectedDevice() { + // given + Device rootDevice = new Device(); + UUID rootDeviceId = UUID.randomUUID(); + rootDevice.setId(rootDeviceId); + Device subDevice = new Device(); + UUID subDeviceId = UUID.randomUUID(); + subDevice.setId(subDeviceId); + subDevice.setParentId(rootDeviceId); + Device subSubDevice = new Device(); + subSubDevice.setParentId(subDeviceId); + subSubDevice.setDeviceIndex(7); + when(deviceRepository.getSubDevices(rootDeviceId)).thenReturn(List.of(subDevice)); + when(deviceRepository.getSubDevices(subDeviceId)).thenReturn(List.of(subSubDevice)); + when(deviceRepository.findByIdOptional(rootDeviceId)).thenReturn(Optional.of(rootDevice)); + + // when + Device subDeviceByDeviceIndex = deviceController.getDeviceByDeviceIndex(rootDeviceId, 7); + + // then + assertNotNull(subDeviceByDeviceIndex); + assertEquals(subSubDevice, subDeviceByDeviceIndex); + } + + @ParameterizedTest + @MethodSource("getModesForUpdateMode") + void shouldUpdateModeSetExpectedModes(ComponentMode currentMode, ComponentMode currentRestoreMode, ComponentMode updateMode, ComponentMode expectedMode, + ComponentMode expectedRestoreMode) { + // given + UUID deviceId = UUID.randomUUID(); + var device = TestEntityFactory.createDevice(deviceId); + device.setMode(currentMode); + device.setRestoreMode(currentRestoreMode); + + // when + deviceController.updateMode(device, updateMode); + + // then + assertEquals(expectedMode, device.getMode()); + assertEquals(expectedRestoreMode, device.getRestoreMode()); + } + + private static Stream getModesForUpdateMode() { + return Stream.of( + of(ComponentMode.PAUSE, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.PAUSE), + of(ComponentMode.FIRMWARE_UPDATE, ComponentMode.PAUSE, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.PAUSE), + of(ComponentMode.OPERATION, ComponentMode.PAUSE, ComponentMode.FIRMWARE_UPDATE, ComponentMode.FIRMWARE_UPDATE, ComponentMode.OPERATION) + ); + } + + @Test + void shouldRestoreModeByCommSvcIdThrowEntityNotFoundException() { + // given + UUID commSvcId = UUID.randomUUID(); + when(deviceRepository.getDeviceByCommSvcId(commSvcId)).thenReturn(null); + + // when & then + assertThrows(NullPointerException.class, () -> deviceController.restoreModeByCommSvcId(commSvcId)); + } + + @Test + void shouldRestoreModeByCommSvcIdRestoreDeviceAndSubDevices() { + // given + UUID commSvcId = UUID.randomUUID(); + + UUID rootDeviceId = UUID.randomUUID(); + Device rootDevice = new Device(); + rootDevice.setRestoreMode(ComponentMode.PAUSE); + rootDevice.setId(rootDeviceId); + + UUID subDevice1Id = UUID.randomUUID(); + Device subDevice1 = new Device(); + subDevice1.setRestoreMode(ComponentMode.PAUSE); + subDevice1.setId(subDevice1Id); + subDevice1.setParentId(rootDeviceId); + + UUID subDevice2Id = UUID.randomUUID(); + Device subDevice2 = new Device(); + subDevice2.setRestoreMode(ComponentMode.PAUSE); + subDevice2.setId(subDevice2Id); + subDevice2.setParentId(rootDeviceId); + + UUID subSubDevice1Id = UUID.randomUUID(); + Device subSubDevice1 = new Device(); + subSubDevice1.setRestoreMode(ComponentMode.PAUSE); + subSubDevice1.setId(subSubDevice1Id); + subSubDevice1.setParentId(subDevice1Id); + + UUID subSubDevice2Id = UUID.randomUUID(); + Device subSubDevice2 = new Device(); + subSubDevice2.setRestoreMode(ComponentMode.PAUSE); + subSubDevice2.setId(subSubDevice2Id); + subSubDevice2.setParentId(subDevice1Id); + + when(deviceRepository.getDeviceByCommSvcId(commSvcId)).thenReturn(rootDevice); + when(deviceRepository.getSubDevices(rootDeviceId)).thenReturn(List.of(subDevice1, subDevice2)); + when(deviceRepository.getSubDevices(subDevice1Id)).thenReturn(List.of(subSubDevice1, subSubDevice2)); + when(deviceRepository.getSubDevices(subDevice2Id)).thenReturn(Collections.emptyList()); + when(deviceRepository.getSubDevices(subSubDevice1Id)).thenReturn(Collections.emptyList()); + when(deviceRepository.getSubDevices(subSubDevice2Id)).thenReturn(Collections.emptyList()); + //and + when(variableController.getVariablesByDeviceId(any(UUID.class))).thenReturn(List.of(new Variable())); + when(devicePropertyController.findByDeviceId(any(UUID.class))).thenReturn(List.of(new DeviceProperty())); + + // when + deviceController.restoreModeByCommSvcId(commSvcId); + + // then + assertEquals(ComponentMode.PAUSE, rootDevice.getMode()); + assertEquals(ComponentMode.PAUSE, subDevice1.getMode()); + assertEquals(ComponentMode.PAUSE, subDevice2.getMode()); + assertEquals(ComponentMode.PAUSE, subSubDevice1.getMode()); + assertEquals(ComponentMode.PAUSE, subSubDevice2.getMode()); + + verify(variableController, times(5)).restoreMode(any(Variable.class)); + verify(devicePropertyController, times(5)).restoreMode(any(DeviceProperty.class)); + } + + + + @Test + void shouldRestoreModeThrowIllegalArgumentException() { + // when & then + assertThrows(NullPointerException.class, () -> deviceController.restoreMode(null)); + } + + @Test + void shouldRestoreModeCallRestoreMethods() { + // given + Device device = new Device(); + device.setId(UUID.randomUUID()); + var variable = TestEntityFactory.createVariableWithoutConstraints(); + var property = TestEntityFactory.createProperty(); + + when(variableController.getVariablesByDeviceId(device.getId())).thenReturn(List.of(variable)); + when(devicePropertyController.findByDeviceId(device.getId())).thenReturn(List.of(property)); + + // when + deviceController.restoreMode(device); + + // then + verify(variableController, times(1)).restoreMode(any()); + verify(devicePropertyController, times(1)).restoreMode(any()); + } + + @Test + void shouldRestoreDeviceModeThrowIllegalStateException() { + // when & then + assertThrows(NullPointerException.class, () -> deviceController.restoreDeviceMode(null)); + } + + @Test + void shouldRestoreDeviceModeUpdateModeAndLog() { + // given + Device device = new Device(); + device.setId(UUID.randomUUID()); + device.setRestoreMode(ComponentMode.PAUSE); + + // when + deviceController.restoreDeviceMode(device); + + // then + assertEquals(ComponentMode.PAUSE, device.getMode()); + } + + @Test + void shouldUpdateModeForFirmwareUpdateAndCallExternalControllers() { + // given + UUID rootDeviceId = UUID.randomUUID(); + UUID subDevice1Id = UUID.randomUUID(); + UUID subDevice2Id = UUID.randomUUID(); + UUID subSubDevice1Id = UUID.randomUUID(); + UUID subSubDevice2Id = UUID.randomUUID(); + //and + Device rootDevice = TestEntityFactory.createDevice(rootDeviceId); + rootDevice.setMode(ComponentMode.OPERATION); + + Device subDevice1 = TestEntityFactory.createDevice(subDevice1Id); + subDevice1.setMode(ComponentMode.OPERATION); + subDevice1.setParentId(rootDeviceId); + + Device subDevice2 = TestEntityFactory.createDevice(subDevice2Id); + subDevice2.setMode(ComponentMode.OPERATION); + subDevice2.setParentId(rootDeviceId); + + Device subSubDevice1 = TestEntityFactory.createDevice(subSubDevice1Id); + subSubDevice1.setMode(ComponentMode.OPERATION); + subSubDevice1.setParentId(subDevice1Id); + + Device subSubDevice2 = TestEntityFactory.createDevice(subSubDevice2Id); + subSubDevice2.setMode(ComponentMode.OPERATION); + subSubDevice2.setParentId(subDevice1Id); + //and + when(deviceRepository.getSubDevices(rootDeviceId)).thenReturn(List.of(subDevice1, subDevice2)); + when(deviceRepository.getSubDevices(subDevice1Id)).thenReturn(List.of(subSubDevice1, subSubDevice2)); + when(deviceRepository.getSubDevices(subDevice2Id)).thenReturn(Collections.emptyList()); + when(deviceRepository.getSubDevices(subSubDevice1Id)).thenReturn(Collections.emptyList()); + when(deviceRepository.getSubDevices(subSubDevice2Id)).thenReturn(Collections.emptyList()); + //and + when(variableController.getVariablesByDeviceId(any(UUID.class))).thenReturn(List.of(new Variable())); + when(devicePropertyController.findByDeviceId(any(UUID.class))).thenReturn(List.of(new DeviceProperty())); + + // when + deviceController.updateMode(rootDevice, ComponentMode.FIRMWARE_UPDATE); + + // then + assertEquals(ComponentMode.FIRMWARE_UPDATE, rootDevice.getMode()); + assertEquals(ComponentMode.FIRMWARE_UPDATE, subDevice1.getMode()); + assertEquals(ComponentMode.FIRMWARE_UPDATE, subDevice2.getMode()); + assertEquals(ComponentMode.FIRMWARE_UPDATE, subSubDevice1.getMode()); + assertEquals(ComponentMode.FIRMWARE_UPDATE, subSubDevice2.getMode()); + + verify(variableController, times(5)).updateMode(any(Variable.class), eq(ComponentMode.FIRMWARE_UPDATE)); + verify(devicePropertyController, times(5)).updateMode(any(DeviceProperty.class), eq(ComponentMode.FIRMWARE_UPDATE)); + } + + @Test + void shouldGetRootDevices() { + // given + UUID deviceId = UUID.randomUUID(); + Device rootDevice = TestEntityFactory.createDevice(deviceId); + when(deviceRepository.findAllRootDevices()).thenReturn(List.of(rootDevice)); + + // when + List rootDevices = deviceController.findAllRootDevices(); + + // then + assertNotNull(rootDevices); + assertEquals(1, rootDevices.size()); + Device device = rootDevices.get(0); + assertEquals(deviceId, device.getId()); + } + + @Test + void shouldGetRootDevices_returnEmptyList() { + // given + when(deviceRepository.findAllRootDevices()).thenReturn(List.of()); + + // when + List rootDevices = deviceController.findAllRootDevices(); + + // then + assertNotNull(rootDevices); + assertTrue(rootDevices.isEmpty()); + } + + @Test + void shouldFindUniqueDeviceBySerialNumber() { + // given + UUID deviceId = UUID.randomUUID(); + Device device = TestEntityFactory.createDevice(deviceId); + when(deviceRepository.findBySerialNumber(eq("serial"), eq(true), any(UUID.class))).thenReturn(List.of(device)); + + // when + Optional deviceOptional = deviceController.findUniqueDeviceBySerialNumber("serial", true, UUID.randomUUID()); + + // then + assertTrue(deviceOptional.isPresent()); + assertEquals(deviceId, deviceOptional.get().getId()); + } + + @Test + void shouldFindUniqueDeviceBySerialNumber_throwException() { + // given + UUID deviceId = UUID.randomUUID(); + Device device = TestEntityFactory.createDevice(deviceId); + when(deviceRepository.findBySerialNumber(eq("serial"), eq(true), any(UUID.class))).thenReturn(List.of(device, device)); + + // when & then + assertThrows(IllegalStateException.class, () -> deviceController.findUniqueDeviceBySerialNumber("serial", true, UUID.randomUUID())); + } + + @Test + void shouldFindUniqueDeviceBySerialNumber_returnEmpty() { + // given + when(deviceRepository.findBySerialNumber(eq("serial"), eq(true), any(UUID.class))).thenReturn(List.of()); + + // when + Optional optionalDevice = deviceController.findUniqueDeviceBySerialNumber("serial", true, UUID.randomUUID()); + + // then + assertTrue(optionalDevice.isEmpty()); + } + + @Test + void shouldHandleDeviceWithoutSerialNumber_update_whenDeviceExists() { + // given + UUID plantId = UUID.randomUUID(); + UUID parentDeviceId = UUID.randomUUID(); + Device parentDevice = TestEntityFactory.createDevice(parentDeviceId); + when(deviceRepository.findByIdOptional(parentDeviceId)).thenReturn(Optional.of(parentDevice)); + + UUID subDeviceId = UUID.randomUUID(); + Device subDevice = TestEntityFactory.createDevice(subDeviceId); + subDevice.setDescription("description"); + subDevice.setPlantId(plantId); + when(deviceRepository.findByParentId(parentDeviceId)).thenReturn(List.of(subDevice)); + + DeviceMapping deviceMapping = new DeviceMapping(); + deviceMapping.setDescription("description"); + + when(em.merge(subDevice)).thenReturn(subDevice); + + // when + Device handledDevice = deviceController.handleDeviceWithoutSerialNumber(deviceMapping, plantId, parentDeviceId); + + // then + assertEquals(subDevice, handledDevice); + verify(variableController).createVariablesIfNotExistByName(any(), eq(subDeviceId)); + verify(devicePropertyController).createPropertiesIfNotExistByName(any(), eq(subDeviceId)); + verify(em).merge(subDevice); + verify(communicationService).addLatestDeviceDiscoveryAndArchiveOldDeviceDiscovery(any(), eq(subDeviceId)); + } + + @Test + void shouldHandleDeviceWithoutSerialNumber_create_whenPlantIdIsDifferent() { + // given + UUID plantId = UUID.randomUUID(); + UUID parentDeviceId = UUID.randomUUID(); + Device parentDevice = TestEntityFactory.createDevice(parentDeviceId); + when(deviceRepository.findByIdOptional(parentDeviceId)).thenReturn(Optional.of(parentDevice)); + + UUID subDeviceId = UUID.randomUUID(); + Device subDevice = TestEntityFactory.createDevice(subDeviceId); + subDevice.setDescription("description"); + subDevice.setPlantId(UUID.randomUUID()); + when(deviceRepository.findByParentId(parentDeviceId)).thenReturn(List.of(subDevice)); + + DeviceMapping deviceMapping = new DeviceMapping(); + deviceMapping.setDescription("description"); + + // when + Device handledDevice = deviceController.handleDeviceWithoutSerialNumber(deviceMapping, plantId, parentDeviceId); + + // then + assertNotEquals(subDevice, handledDevice); + verify(variableController, times(0)).createVariablesIfNotExistByName(any(), eq(null)); + verify(devicePropertyController, times(0)).createPropertiesIfNotExistByName(any(), eq(subDeviceId)); + verify(em, times(0)).merge(subDevice); + verify(communicationService, times(0)).addLatestDeviceDiscoveryAndArchiveOldDeviceDiscovery(any(), eq(subDeviceId)); + verify(em).persist(handledDevice); + verify(variableController).createVariables(any(), any()); + verify(devicePropertyController).createProperties(any(), any()); + } +} diff --git a/src/test/java/io/gec/raw/connector/device/control/DeviceStructureServiceTest.java b/src/test/java/io/gec/raw/connector/device/control/DeviceStructureServiceTest.java new file mode 100755 index 0000000..a22252b --- /dev/null +++ b/src/test/java/io/gec/raw/connector/device/control/DeviceStructureServiceTest.java @@ -0,0 +1,128 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.device.enums.RittalDevicePropertyNameEnum; +import io.gec.raw.connector.deviceproperty.control.DeviceTypeProvider; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import io.gec.raw.connector.variable.entity.Variable; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class DeviceStructureServiceTest { + + @Mock + ExternalDeviceBuilder externalDeviceBuilder; + @Mock + RittalDeviceBuilder rittalDeviceBuilder; + @Mock + DeviceTypeProvider deviceTypeProvider; + @InjectMocks + DeviceStructureService deviceStructureService; + + @Test + void shouldCreateRittalDeviceStructureCreateExpectedStructure() { + // given + DeviceMapping deviceMapping = DeviceMapping.builder() + .name("rootDevice") + .subDevices(List.of( + DeviceMapping.builder() + .properties(List.of( + DevicePropertyMapping.builder() + .name(RittalDevicePropertyNameEnum.POSITION.getLabel()) + .value(String.valueOf(1)) + .build(), + DevicePropertyMapping.builder() + .name(RittalDevicePropertyNameEnum.BUS.getLabel()) + .value(String.valueOf(1)) + .build() + )) + .variables(List.of( + Variable.builder() + .name("fistSubSubDeviceToCreate.withDot") + .build(), + Variable.builder() + .name("secondSubSubDeviceToCreate.withDot") + .build(), + Variable.builder() + .name("variableToCreate") + .build())) + .build() + )) + .build(); + when(rittalDeviceBuilder.buildDeviceTree(any(), any(), any(), any())).thenReturn(deviceMapping); + + // when + DeviceMapping rittalDeviceStructure = deviceStructureService.createRittalDeviceStructure( + new DeviceOidValueMap(), UUID.randomUUID(), UUID.randomUUID(), "someKey"); + + // then + assertNotNull(rittalDeviceStructure); + assertEquals("rootDevice", rittalDeviceStructure.getName()); + + List subDevices = rittalDeviceStructure.getSubDevices(); + assertEquals(1, subDevices.size()); + + DeviceMapping subDeviceMapping = subDevices.get(0); + List variables = subDeviceMapping.getVariables(); + assertEquals(1, variables.size()); + assertEquals("variableToCreate", variables.get(0).getName()); + + List subSubDevices = subDeviceMapping.getSubDevices(); + assertEquals(2, subSubDevices.size()); + + DeviceMapping firstDeviceMapping = subSubDevices.get(0); + assertEquals("fistSubSubDeviceToCreate", firstDeviceMapping.getName()); + assertEquals(2, firstDeviceMapping.getProperties().size()); + Optional firstDeviceBus = deviceStructureService.findPropertyMapping(firstDeviceMapping.getProperties(), RittalDevicePropertyNameEnum.BUS); + assertTrue(firstDeviceBus.isPresent()); + assertEquals("1", firstDeviceBus.get().getValue()); + Optional firstDevicePosition = deviceStructureService.findPropertyMapping(firstDeviceMapping.getProperties(), RittalDevicePropertyNameEnum.POSITION); + assertTrue(firstDevicePosition.isPresent()); + assertEquals("1", firstDevicePosition.get().getValue()); + + List subSubVariables = firstDeviceMapping.getVariables(); + assertEquals(1, subSubVariables.size()); + assertEquals("fistSubSubDeviceToCreate.withDot", subSubVariables.get(0).getName()); + + DeviceMapping secondDeviceMapping = subSubDevices.get(1); + assertEquals("secondSubSubDeviceToCreate", secondDeviceMapping.getName()); + assertEquals(2, secondDeviceMapping.getProperties().size()); + Optional secondDeviceBus = deviceStructureService.findPropertyMapping(secondDeviceMapping.getProperties(), RittalDevicePropertyNameEnum.BUS); + assertTrue(secondDeviceBus.isPresent()); + assertEquals("1", secondDeviceBus.get().getValue()); + Optional secondDevicePosition = + deviceStructureService.findPropertyMapping(secondDeviceMapping.getProperties(), RittalDevicePropertyNameEnum.POSITION); + assertTrue(secondDevicePosition.isPresent()); + assertEquals("2", secondDevicePosition.get().getValue()); + } + + @Test + void shouldCreateExternalDeviceStructureRunExpectedMethod() { + // given + DeviceOidValueMap oidValueMap = new DeviceOidValueMap(); + UUID connectorId = UUID.randomUUID(); + UUID discoveryWorkItemId = UUID.randomUUID(); + UUID driverHeaderId = UUID.randomUUID(); + String key = "someKey"; + + // when + deviceStructureService.createExternalDeviceStructure( + oidValueMap, connectorId, discoveryWorkItemId, driverHeaderId, key); + + // then + verify(externalDeviceBuilder, times(1)) + .buildDeviceTree(oidValueMap, connectorId, discoveryWorkItemId, driverHeaderId, key); + } +} diff --git a/src/test/java/io/gec/raw/connector/device/control/ExternalDeviceBuilderTest.java b/src/test/java/io/gec/raw/connector/device/control/ExternalDeviceBuilderTest.java new file mode 100755 index 0000000..e1e6fdf --- /dev/null +++ b/src/test/java/io/gec/raw/connector/device/control/ExternalDeviceBuilderTest.java @@ -0,0 +1,149 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.gec.raw.connector.driver.control.DriverVariableRepository; +import io.gec.raw.connector.variable.entity.Variable; +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.device.enums.ExternalDeviceConstants; +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import io.gec.raw.connector.utils.TestEntityFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ExternalDeviceBuilderTest { + + @Mock + DriverVariableRepository driverVariableRepository; + @InjectMocks + ExternalDeviceBuilder externalDeviceBuilder; + + @Test + void shouldBuildDeviceTreeCreateDeviceMapping() { + // given + DeviceOidValueMap oidValueMap = new DeviceOidValueMap(); + UUID connectorId = UUID.randomUUID(); + UUID discoveryWorkItemId = UUID.randomUUID(); + UUID driverHeaderId = UUID.randomUUID(); + String key = "127.0.0.1"; + + // when + DeviceMapping device = externalDeviceBuilder.buildDeviceTree(oidValueMap, connectorId, discoveryWorkItemId, driverHeaderId, key); + + // then + assertNotNull(device); + assertTrue(device.getName().isEmpty()); + assertTrue(device.getDescription().isEmpty()); + assertEquals(connectorId, device.getConnectorId()); + assertEquals("https://127.0.0.1", device.getDeviceURL()); + assertEquals(discoveryWorkItemId, device.getDiscoveryWorkItemId()); + assertTrue(device.getVariables().isEmpty()); + assertEquals(5, device.getProperties().size()); + assertEquals(driverHeaderId, device.getDriverHeaderId()); + assertTrue(device.getSubDevices().isEmpty()); + assertEquals(0, device.getDeviceIndex()); + assertNull(device.getType()); + assertNull(device.getParentId()); + assertNull(device.getId()); + assertFalse(device.isRoot()); + assertNull(device.getMode()); + } + + @Test + void shouldBuildDeviceTreeCreateDeviceMappingWithProperties() { + // given + DeviceOidValueMap oidValueMap = new DeviceOidValueMap(); + oidValueMap.put(ExternalDeviceConstants.OID_DESCRIPTION, "someDescription"); + oidValueMap.put(ExternalDeviceConstants.OID_SYS_OBJECT_ID, "someSysObjectId"); + oidValueMap.put(ExternalDeviceConstants.OID_SYS_UP_TIME, "someSysUpTime"); + oidValueMap.put(ExternalDeviceConstants.OID_SYS_CONTACT, "someSysContact"); + oidValueMap.put(ExternalDeviceConstants.OID_SYS_NAME, "someSysName"); + oidValueMap.put(ExternalDeviceConstants.OID_SYS_LOCATION, "someSysLocation"); + oidValueMap.put(ExternalDeviceConstants.OID_SYS_SERVICES, "someSysServices"); + oidValueMap.put(ExternalDeviceConstants.OID_MIB_2_PREFIX + "5", "someEnterprise"); + + // when + DeviceMapping device = externalDeviceBuilder.buildDeviceTree(oidValueMap, null, null, null, null); + + // then + assertNotNull(device); + assertEquals("someSysName", device.getName()); + assertEquals("someDescription", device.getDescription()); + assertEquals(5, device.getProperties().size()); + + DevicePropertyMapping descriptionDevicePropertyMapping = device.getProperties().get(0); + assertEquals(ExternalDeviceConstants.OID_DESCRIPTION, descriptionDevicePropertyMapping.getOid()); + assertEquals("Description", descriptionDevicePropertyMapping.getName()); + assertNull(descriptionDevicePropertyMapping.getDescription()); + assertEquals("someDescription", descriptionDevicePropertyMapping.getValue()); + assertNull(descriptionDevicePropertyMapping.getValueChangeOid()); + assertEquals("STRING", descriptionDevicePropertyMapping.getValueDatatype()); + assertNull(descriptionDevicePropertyMapping.getPropertyClass()); + assertNull(descriptionDevicePropertyMapping.getPropertyGroup()); + assertNull(descriptionDevicePropertyMapping.getMode()); + assertTrue(descriptionDevicePropertyMapping.isReadOnly()); + + assertEquals("someSysName", device.getProperties().get(1).getValue()); + assertEquals("someSysLocation", device.getProperties().get(2).getValue()); + assertEquals("someSysContact", device.getProperties().get(3).getValue()); + assertEquals("someDescription", device.getProperties().get(4).getValue()); + } + + @Test + void shouldBuildDeviceTreeCreateDeviceMappingWithVariable() { + // given + DeviceOidValueMap oidValueMap = new DeviceOidValueMap(); + DriverVariable driverVariable = TestEntityFactory.createDriverVariable(DataTypeEnum.INTEGER); + when(driverVariableRepository.findByDriverHeaderId(any(UUID.class))).thenReturn(List.of(driverVariable)); + + // when + DeviceMapping device = externalDeviceBuilder.buildDeviceTree(oidValueMap, null, null, UUID.randomUUID(), null); + + // then + assertNotNull(device); + assertFalse(device.getVariables().isEmpty()); + assertEquals(1, device.getVariables().size()); + + Variable variable = device.getVariables().get(0); + assertEquals("Name", variable.getName()); + assertEquals("Description", variable.getDescription()); + assertEquals(10, variable.getMin()); + assertEquals(10, variable.getMax()); + assertEquals(VarTypeEnum.VALUE, variable.getVarType()); + assertEquals(DataTypeEnum.INTEGER, variable.getVarDataType()); + assertEquals(DataTypeEnum.INTEGER, variable.getSnmpSetVarDataType()); + assertEquals(10, variable.getScale()); + assertEquals(10, variable.getStep()); + assertEquals(AccessTypeEnum.READONLY, variable.getVarAccessType()); + assertEquals("NO_QUALITY_OID", variable.getVarQualityOid()); + assertEquals(".1.2.3", variable.getValueAsIntegerOid()); + assertTrue(variable.getValueAsStringOid().isEmpty()); + assertEquals(10, variable.getSubscriptionInterval()); + assertNotNull(variable.getDriverVariableId()); + assertEquals(FunctionTypeEnum.VALUE, variable.getFunctionType()); + assertNull(variable.getId()); + assertNull(variable.getDeviceId()); + assertNull(variable.getCreated()); + assertNull(variable.getStamp()); + assertNull(variable.getUnit()); + assertNull(variable.getConstraints()); + assertNull(variable.getCommServiceId()); + assertNull(variable.getMode()); + assertFalse(variable.isInitialValueFetched()); + } +} diff --git a/src/test/java/io/gec/raw/connector/device/control/RittalDeviceBuilderTest.java b/src/test/java/io/gec/raw/connector/device/control/RittalDeviceBuilderTest.java new file mode 100755 index 0000000..3e3d4e4 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/device/control/RittalDeviceBuilderTest.java @@ -0,0 +1,1618 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.enums.*; +import io.gec.raw.connector.deviceproperty.control.DeviceTypeProvider; +import io.gec.raw.connector.deviceproperty.entity.DevicePropertyMapping; +import io.gec.raw.connector.utils.DeviceOidValueMapProvider; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.variable.control.VariableConstraintParser; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.variable.entity.Variable; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class RittalDeviceBuilderTest { + + private final DeviceOidValueMap sharedOidValueMap = DeviceOidValueMapProvider.RITTAL_PDU_OID_MAP; + @Mock + VariableConstraintParser constraintParser; + @Mock + DeviceTypeProvider deviceTypeProvider; + @InjectMocks + RittalDeviceBuilder rittalDeviceBuilder; + + private static Stream getOidValueTestData() { + return Stream.of( + //VariableFieldName, subDeviceIndex, varStartIndex, expectedOid + of(VariableFieldName.VARTYPE, 0, 0, ".1.3.6.1.4.1.2606.7.4.2.2.1.4.0.0"), + of(VariableFieldName.VARTYPE, 1000, 0, ".1.3.6.1.4.1.2606.7.4.2.2.1.4.1000.0"), + of(VariableFieldName.VARTYPE, 0, 1000, ".1.3.6.1.4.1.2606.7.4.2.2.1.4.0.1000"), + of(VariableFieldName.VARTYPE, 1000, 1000, ".1.3.6.1.4.1.2606.7.4.2.2.1.4.1000.1000"), + of(VariableFieldName.QUALITY, 0, 1000, ".1.3.6.1.4.1.2606.7.4.2.2.1.14.0.1000"), + of(VariableFieldName.QUALITY, Integer.MAX_VALUE, Integer.MAX_VALUE, ".1.3.6.1.4.1.2606.7.4.2.2.1.14.2147483647.2147483647") + ); + } + + + + private static Stream shouldGetTypeReturnExpectedType() { + return Stream.of( + of("name.Status", DataTypeEnum.INTEGER, -1, DataTypeEnum.STATUSINT), + of("name.status", DataTypeEnum.INTEGER, -1, DataTypeEnum.STATUSINT), + of(".status", DataTypeEnum.INTEGER, -1, DataTypeEnum.STATUSINT), + of(".status2", DataTypeEnum.INTEGER, 2, DataTypeEnum.FLOAT), + of("any", DataTypeEnum.INTEGER, -1, DataTypeEnum.FLOAT), + of("any", DataTypeEnum.INTEGER, 0, DataTypeEnum.NUMERIC), + of("any", DataTypeEnum.INTEGER, 1, DataTypeEnum.NUMERIC), + + of("any", DataTypeEnum.STRING, 1, DataTypeEnum.STRING), + of("any", DataTypeEnum.ENUM, 1, DataTypeEnum.STATUSINT), + of("any", DataTypeEnum.ANALOGINT, 1, DataTypeEnum.STRING), + of("any", DataTypeEnum.STATUSINT, 1, DataTypeEnum.STRING), + of("any", DataTypeEnum.NUMERIC, 1, DataTypeEnum.STRING), + of("any", DataTypeEnum.FLOAT, 1, DataTypeEnum.STRING) + ); + } + + @Test + void shouldBuildDeviceTreeReturnExpectedStructure() { + // given + UUID connectorId = UUID.randomUUID(); + UUID dwiId = UUID.randomUUID(); + String someKey = "someKey"; + + // when + DeviceMapping deviceMapping = rittalDeviceBuilder.buildDeviceTree(sharedOidValueMap, connectorId, dwiId, someKey); + + // then + assertNotNull(deviceMapping); + assertEquals("https://someKey", deviceMapping.getDeviceURL()); + assertEquals("PDU Controllers Name", deviceMapping.getName()); + assertTrue(deviceMapping.getDescription().isEmpty()); + assertEquals(connectorId, deviceMapping.getConnectorId()); + assertEquals(dwiId, deviceMapping.getDiscoveryWorkItemId()); + assertEquals(7, deviceMapping.getProperties().size()); + assertEquals(ComponentMode.PAUSE, deviceMapping.getMode()); + assertTrue(deviceMapping.isRoot()); + assertEquals(0, deviceMapping.getDeviceIndex()); + assertNull(deviceMapping.getType()); + assertNull(deviceMapping.getParentId()); + assertNull(deviceMapping.getId()); + assertNull(deviceMapping.getDriverHeaderId()); + assertTrue(deviceMapping.getVariables().isEmpty()); + assertEquals(7, deviceMapping.getSubDevices().size()); + } + + @Test + void shouldGetDeviceIndexesReturnExpectedIndexes() { + // given & when + int[] deviceIndexes = rittalDeviceBuilder.getDeviceIndexes(sharedOidValueMap, 10); + + // then + assertEquals(10, deviceIndexes.length); + assertArrayEquals(new int[] {1, 2, 3, 4, 5, 6, 7, 0, 0, 0}, deviceIndexes); + } + + @Test + void shouldBuildSubDeviceReturnExpectedDeviceMapping() { + // given + UUID connectorId = UUID.randomUUID(); + UUID dwiId = UUID.randomUUID(); + + // when + DeviceMapping deviceMapping = rittalDeviceBuilder.buildSubDevice(sharedOidValueMap, 3, connectorId, dwiId); + + // then + assertNotNull(deviceMapping); + assertNull(deviceMapping.getDeviceURL()); + assertEquals("CMCIII-GRF2-3", deviceMapping.getName()); + assertEquals("CMCIII-GRF2", deviceMapping.getDescription()); + assertEquals(connectorId, deviceMapping.getConnectorId()); + assertEquals(dwiId, deviceMapping.getDiscoveryWorkItemId()); + assertEquals(15, deviceMapping.getProperties().size()); + assertEquals(ComponentMode.PAUSE, deviceMapping.getMode()); + assertFalse(deviceMapping.isRoot()); + assertEquals(3, deviceMapping.getDeviceIndex()); + assertEquals("1.3.6.1.4.1.2606.7.7.4.6144", deviceMapping.getType()); // todo: hardcode + assertNull(deviceMapping.getParentId()); + assertNull(deviceMapping.getId()); + assertNull(deviceMapping.getDriverHeaderId()); + assertEquals(19, deviceMapping.getVariables().size()); + assertEquals(0, deviceMapping.getSubDevices().size()); + } + + @Test + void shouldBuildVariablesReturnExpectedVariables() { + //given + Mockito.when(constraintParser.parseConstraints(anyString())) + .thenReturn("min 0, max 255, scale *1, step 1"); + + //when + List variables = rittalDeviceBuilder.buildVariables(24, 3, sharedOidValueMap); + + // then + assertNotNull(variables); + assertEquals(19, variables.size()); + Optional ledGreenOptional = variables.stream() + .filter(variable -> variable.getName().equals("LED.Green")) + .findFirst(); + assertTrue(ledGreenOptional.isPresent()); + Variable ledGreen = ledGreenOptional.get(); + assertNull(ledGreen.getId()); + assertNull(ledGreen.getDeviceId()); + assertNull(ledGreen.getDescription()); + assertNull(ledGreen.getCreated()); + assertNull(ledGreen.getStamp()); + assertNull(ledGreen.getMin()); + assertNull(ledGreen.getMax()); + assertEquals(VarTypeEnum.VALUE, ledGreen.getVarType()); + assertEquals(DataTypeEnum.NUMERIC, ledGreen.getVarDataType()); + assertEquals(DataTypeEnum.INTEGER, ledGreen.getSnmpSetVarDataType()); + assertTrue(ledGreen.getUnit().isEmpty()); + assertEquals(1, ledGreen.getScale()); + verify(constraintParser, times(24)).parseConstraints(any()); + assertEquals("min 0, max 255, scale *1, step 1", ledGreen.getConstraints()); + assertEquals(1, ledGreen.getStep()); + assertEquals(AccessTypeEnum.READWRITE, ledGreen.getVarAccessType()); + assertEquals(".1.3.6.1.4.1.2606.7.4.2.2.1.14.3.23", ledGreen.getVarQualityOid()); + assertEquals(".1.3.6.1.4.1.2606.7.4.2.2.1.11.3.23", ledGreen.getValueAsIntegerOid()); + assertEquals(".1.3.6.1.4.1.2606.7.4.2.2.1.10.3.23", ledGreen.getValueAsStringOid()); + assertNull(ledGreen.getCommServiceId()); + assertEquals(300, ledGreen.getSubscriptionInterval()); + assertNull(ledGreen.getDriverVariableId()); + assertEquals(FunctionTypeEnum.EXECUTE, ledGreen.getFunctionType()); + assertEquals(ComponentMode.PAUSE, ledGreen.getMode()); + assertFalse(ledGreen.isInitialValueFetched()); + } + + @Test + void shouldBuildVariables_withExcludedVariables() { + //given + List excludedVariables = List.of("KeyPad.KeyCommand", "KeyPad.KeyCode", + "Access.Category", "KeyPad.Category", "Handle.Category"); + + //when + List variables = rittalDeviceBuilder.buildVariables(24, 3, sharedOidValueMap); + var hasExcludedVars = variables.stream() + .anyMatch(variable -> excludedVariables.contains(variable.getName())); + + // then + assertEquals(19, variables.size()); + assertFalse(hasExcludedVars); + assertNotNull(variables); + } + + @Test + void shouldReturnCorrectIntervalForValues() { + //given + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setName("Circuit.Value"); + + //when + variable.setSubscriptionInterval(rittalDeviceBuilder.getInterval(variable)); + + //then + assertEquals(10, variable.getSubscriptionInterval()); + } + + @Test + void shouldReturnCorrectIntervalForCircuit() { + //given + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setName("Test.Circuit"); + + //when + variable.setSubscriptionInterval(rittalDeviceBuilder.getInterval(variable)); + + //then + assertEquals(300, variable.getSubscriptionInterval()); + } + + @Test + void shouldReturnAccessDeviceTypePropertyWhenTypeMatches() { + // given + var deviceIndex = 1; + var oidValueMap = new DeviceOidValueMap(); + oidValueMap.put(RittalDevicePropertyNameEnum.TYPE.getIndexedOid(deviceIndex), RittalDeviceConstants.ACCESS_DEVICE_TYPE_OID); + + // when + Optional result = rittalDeviceBuilder.getAccessDeviceTypeProperty(oidValueMap, deviceIndex); + + // then + assertTrue(result.isPresent()); + DevicePropertyMapping devicePropertyMapping = result.get(); + assertNull(devicePropertyMapping.getOid()); + assertEquals(AccessDeviceTypeEnum.ACCESS_DEVICE.name(), devicePropertyMapping.getValue()); + } + + @Test + void shouldReturnEmptyWhenTypeDoesNotMatch() { + // given + var deviceIndex = 1; + var oidValueMap = new DeviceOidValueMap(); + oidValueMap.put(RittalDevicePropertyNameEnum.TYPE.getIndexedOid(deviceIndex), "NonMatchingValue"); + + // when + Optional result = rittalDeviceBuilder.getAccessDeviceTypeProperty(oidValueMap, deviceIndex); + + // then + assertFalse(result.isPresent()); + } + + @Test + void shouldCreatePropertyMapping_forRootDevice() { + // given + var property = RittalDevicePropertyNameEnum.ROOT_SERIAL_NUMBER; + var oidValueMap = new DeviceOidValueMap(); + oidValueMap.put(property.getBaseOid(), "SERIAL_NUMBER_VALUE"); + + // when + var result = rittalDeviceBuilder.createPropertyMapping(property, oidValueMap, null); + + // then + assertEquals(property.getBaseOid(), result.getOid()); + assertEquals("SERIAL_NUMBER_VALUE", result.getValue()); + assertEquals(property.getLabel(), result.getName()); + assertEquals(property.getDataType().name(), result.getValueDatatype()); + assertEquals(property.isReadOnly(), result.isReadOnly()); + } + + @Test + void shouldCreatePropertyMapping_forSubDevice() { + // given + var deviceIndex = 1; + var property = RittalDevicePropertyNameEnum.DEVICE_ALIAS; + var oidValueMap = new DeviceOidValueMap(); + var propertyOid = property.getIndexedOid(deviceIndex); + oidValueMap.put(propertyOid, "DEVICE_ALIAS_VALUE"); + + // when + var result = rittalDeviceBuilder.createPropertyMapping(property, oidValueMap, deviceIndex); + + // then + assertEquals(propertyOid, result.getOid()); + assertEquals("DEVICE_ALIAS_VALUE", result.getValue()); + assertEquals(property.getLabel(), result.getName()); + assertEquals(property.getDataType().name(), result.getValueDatatype()); + } + + @Test + void shouldCreatePropertyMapping_withNoValue() { + // given + var deviceIndex = 1; + var property = RittalDevicePropertyNameEnum.MODEL_NUMBER; + var oidValueMap = new DeviceOidValueMap(); + + // when + var result = rittalDeviceBuilder.createPropertyMapping(property, oidValueMap, deviceIndex); + + // then + assertEquals(RittalDeviceConstants.PROPERTY_NO_VALUE, result.getValue()); + } + + @Test + void shouldCreateCorrectPropertyMappings_forRootDevice() { + // when + String hostname = "127.0.0.1"; + List properties = rittalDeviceBuilder.buildRootDeviceProperties(sharedOidValueMap, hostname); + + // then + assertNotNull(properties); + assertEquals(7, properties.size()); + var accessDeviceTypeProperty = properties.stream() + .filter(prop -> prop.getName().equals(RittalDevicePropertyNameEnum.ACCESS_DEVICE_TYPE.getLabel())) + .findFirst(); + assertTrue(accessDeviceTypeProperty.isPresent()); + assertNull(accessDeviceTypeProperty.get().getOid()); + //and + var ipAddressProperty = properties.stream() + .filter(prop -> prop.getName().equals(RittalDevicePropertyNameEnum.ROOT_IP_ADDRESS.getLabel())) + .findFirst(); + assertTrue(ipAddressProperty.isPresent()); + assertEquals(ipAddressProperty.get().getValue(), hostname); + } + + @Test + void shouldCreateCorrectPropertyMappings_forSubDevice_withoutAccessDeviceType() { + // given + var deviceIndex = 1; + + // when + var propertyMappings = rittalDeviceBuilder.buildSubDeviceProperties(deviceIndex, sharedOidValueMap); + + // then + assertNotNull(propertyMappings); + assertEquals(14, propertyMappings.size()); + assertFalse(propertyMappings.stream() + .anyMatch(prop -> prop.getName().equals(RittalDevicePropertyNameEnum.ACCESS_DEVICE_TYPE.getLabel())) + ); + } + + @Test + void shouldCreateCorrectPropertyMappings_forSubDevice_withAccessDeviceType() { + // given + var deviceIndex = 1; + var oidValueMap = new DeviceOidValueMap(); + oidValueMap.put(RittalDevicePropertyNameEnum.TYPE.getIndexedOid(deviceIndex), RittalDeviceConstants.ACCESS_DEVICE_TYPE_OID); + + // when + List devicePropertyMappings = rittalDeviceBuilder.buildSubDeviceProperties(deviceIndex, oidValueMap); + + // then + assertNotNull(devicePropertyMappings); + assertEquals(15, devicePropertyMappings.size()); + assertTrue(devicePropertyMappings.stream() + .anyMatch(prop -> prop.getName().equals(RittalDevicePropertyNameEnum.ACCESS_DEVICE_TYPE.getLabel())) + ); + } + + @ParameterizedTest + @MethodSource("getOidValueTestData") + void shouldGetOidValue(VariableFieldName variableFieldName, + int subDeviceIndex, + int varStartIndex, + String expectedOid) { + //given + var oidValueMap = new DeviceOidValueMap(); + oidValueMap.put(expectedOid, "testValue"); + + //when + var result = rittalDeviceBuilder.getOidValue(oidValueMap, variableFieldName, subDeviceIndex, varStartIndex); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.length, is(2)); + assertThat(result[0], is(expectedOid)); + assertThat(result[1], is("testValue")); + } + + @Test + void shouldGetOidValue_throwNoSuchElementException() { + //given + var wrongVarStartIndex = 0; + //and + var oidValueMap = new DeviceOidValueMap(); + oidValueMap.put(".1.3.6.1.4.1.2606.7.4.2.2.1.3.2.1", "testValue"); + + //expect + assertThrows(NoSuchElementException.class, () -> rittalDeviceBuilder.getOidValue(oidValueMap, VariableFieldName.NAME, 2, wrongVarStartIndex)); + } + + @Test + void shouldGetDeviceAliasPropertyByVariablesReturnPropertyMapping() { + // given + Variable variable = new Variable(); + variable.setName("name.descname"); + variable.setValueAsStringOid("1.4.28.4"); + + // when + Optional optionalPropertyMapping = rittalDeviceBuilder.getDeviceAliasPropertyByVariables(List.of(variable), new DeviceOidValueMap()); + + // then + assertTrue(optionalPropertyMapping.isPresent()); + DevicePropertyMapping devicePropertyMapping = optionalPropertyMapping.get(); + assertEquals("1.4.28.4", devicePropertyMapping.getOid()); + assertEquals("Device alias", devicePropertyMapping.getName()); + assertEquals("No value", devicePropertyMapping.getValue()); + assertEquals("STRING", devicePropertyMapping.getValueDatatype()); + assertEquals(ComponentMode.PAUSE, devicePropertyMapping.getMode()); + assertFalse(devicePropertyMapping.isReadOnly()); + } + + @ParameterizedTest + @MethodSource + void shouldGetFunctionTypeReturnExpectedValue(String variableName, FunctionTypeEnum expectedFunctionType) { + // given + Variable variable = new Variable(); + variable.setName(variableName); + + // when + FunctionTypeEnum functionType = rittalDeviceBuilder.getFunctionType(variable); + + // then + assertEquals(expectedFunctionType, functionType); + } + + @ParameterizedTest + @MethodSource + void shouldGetTypeReturnExpectedType(String variableName, DataTypeEnum dataTypeEnum, Integer scale, DataTypeEnum expectedDataTypeEnum) { + // given + Variable variable = new Variable(); + variable.setName(variableName); + variable.setVarDataType(dataTypeEnum); + variable.setScale(String.valueOf(scale)); + + // when + DataTypeEnum dataType = rittalDeviceBuilder.getType(variable); + + // then + assertEquals(expectedDataTypeEnum, dataType); + } + + private static Stream shouldGetFunctionTypeReturnExpectedValue() { + return Stream.of( + // Status functionType + of("name.status", FunctionTypeEnum.STATE), + of("device.status", FunctionTypeEnum.STATE), + of("variable.status", FunctionTypeEnum.STATE), + + // Setting functionType + of("name.setpt", FunctionTypeEnum.SETTING), + of("name.setptHighAlarm", FunctionTypeEnum.SETTING), + of("device.setpt", FunctionTypeEnum.SETTING), + of("variable.setpt", FunctionTypeEnum.SETTING), + of("name.sensitivity", FunctionTypeEnum.SETTING), + of("device.sensitivity", FunctionTypeEnum.SETTING), + of("variable.sensitivity", FunctionTypeEnum.SETTING), + of("name.grouping", FunctionTypeEnum.SETTING), + of("device.grouping", FunctionTypeEnum.SETTING), + of("variable.grouping", FunctionTypeEnum.SETTING), + of("name.hysteresis", FunctionTypeEnum.SETTING), + of("device.hysteresis", FunctionTypeEnum.SETTING), + of("variable.hysteresis", FunctionTypeEnum.SETTING), + of("name.setpoint", FunctionTypeEnum.SETTING), + of("device.setpoint", FunctionTypeEnum.SETTING), + of("variable.setpoint", FunctionTypeEnum.SETTING), + of("name.average", FunctionTypeEnum.SETTING), + of("device.average", FunctionTypeEnum.SETTING), + of("variable.average", FunctionTypeEnum.SETTING), + of("name.logic", FunctionTypeEnum.SETTING), + of("device.logic", FunctionTypeEnum.SETTING), + of("variable.logic", FunctionTypeEnum.SETTING), + of("name.start", FunctionTypeEnum.SETTING), + of("device.start", FunctionTypeEnum.SETTING), + of("variable.start", FunctionTypeEnum.SETTING), + of("name.end", FunctionTypeEnum.SETTING), + of("device.end", FunctionTypeEnum.SETTING), + of("variable.end", FunctionTypeEnum.SETTING), + of("Interface.Input 2.Config", FunctionTypeEnum.SETTING), + of("name.unit", FunctionTypeEnum.SETTING), + of("device.unit", FunctionTypeEnum.SETTING), + of("variable.unit", FunctionTypeEnum.SETTING), + of("name.factor", FunctionTypeEnum.SETTING), + of("device.factor", FunctionTypeEnum.SETTING), + of("variable.factor", FunctionTypeEnum.SETTING), + of("name.power on delay", FunctionTypeEnum.SETTING), + of("device.power on delay", FunctionTypeEnum.SETTING), + of("variable.power on delay", FunctionTypeEnum.SETTING), + of("name.min.value", FunctionTypeEnum.SETTING), + of("device.min.value", FunctionTypeEnum.SETTING), + of("variable.min.value", FunctionTypeEnum.SETTING), + of("name.max.value", FunctionTypeEnum.SETTING), + of("device.max.value", FunctionTypeEnum.SETTING), + of("variable.max.value", FunctionTypeEnum.SETTING), + of("name.manual.value", FunctionTypeEnum.SETTING), + of("device.manual.value", FunctionTypeEnum.SETTING), + of("variable.manual.value", FunctionTypeEnum.SETTING), + of("name.activecustomenergy.value", FunctionTypeEnum.SETTING), + of("device.activecustomenergy.value", FunctionTypeEnum.SETTING), + of("variable.activecustomenergy.value", FunctionTypeEnum.SETTING), + + // Execute functionType + of("name.relay", FunctionTypeEnum.EXECUTE), + of("device.relay", FunctionTypeEnum.EXECUTE), + of("variable.relay", FunctionTypeEnum.EXECUTE), + of("name.command", FunctionTypeEnum.EXECUTE), + of("device.command", FunctionTypeEnum.EXECUTE), + of("variable.command", FunctionTypeEnum.EXECUTE), + of("name.attempts", FunctionTypeEnum.EXECUTE), + of("device.attempts", FunctionTypeEnum.EXECUTE), + of("variable.attempts", FunctionTypeEnum.EXECUTE), + of("name.red", FunctionTypeEnum.EXECUTE), + of("device.red", FunctionTypeEnum.EXECUTE), + of("variable.red", FunctionTypeEnum.EXECUTE), + of("name.green", FunctionTypeEnum.EXECUTE), + of("device.green", FunctionTypeEnum.EXECUTE), + of("variable.green", FunctionTypeEnum.EXECUTE), + of("name.blue", FunctionTypeEnum.EXECUTE), + of("device.blue", FunctionTypeEnum.EXECUTE), + of("variable.blue", FunctionTypeEnum.EXECUTE), + of("name.general.grouping", FunctionTypeEnum.EXECUTE), + of("device.general.grouping", FunctionTypeEnum.EXECUTE), + of("variable.general.grouping", FunctionTypeEnum.EXECUTE), + + // Configuration functionType + of("name.descname", FunctionTypeEnum.CONFIGURATION), + of("device.descname", FunctionTypeEnum.CONFIGURATION), + of("variable.descname", FunctionTypeEnum.CONFIGURATION), + of("name.type", FunctionTypeEnum.CONFIGURATION), + of("device.type", FunctionTypeEnum.CONFIGURATION), + of("variable.type", FunctionTypeEnum.CONFIGURATION), + of("name.circuit", FunctionTypeEnum.CONFIGURATION), + of("device.circuit", FunctionTypeEnum.CONFIGURATION), + of("variable.circuit", FunctionTypeEnum.CONFIGURATION), + of("name.socket type", FunctionTypeEnum.CONFIGURATION), + of("device.socket type", FunctionTypeEnum.CONFIGURATION), + of("variable.socket type", FunctionTypeEnum.CONFIGURATION), + of("name.mode", FunctionTypeEnum.CONFIGURATION), + of("device.mode", FunctionTypeEnum.CONFIGURATION), + of("variable.mode", FunctionTypeEnum.CONFIGURATION), + of("name.led.command", FunctionTypeEnum.CONFIGURATION), + of("device.led.command", FunctionTypeEnum.CONFIGURATION), + of("variable.led.command", FunctionTypeEnum.CONFIGURATION), + of("name.sequence mode", FunctionTypeEnum.CONFIGURATION), + of("device.sequence mode", FunctionTypeEnum.CONFIGURATION), + of("variable.sequence mode", FunctionTypeEnum.CONFIGURATION), + of("custom.value", FunctionTypeEnum.CONFIGURATION), + of("factor.value", FunctionTypeEnum.VALUE), + of("Energy Meter 2.S0 Factor", FunctionTypeEnum.SETTING), + of("device. custom.value", FunctionTypeEnum.CONFIGURATION), + of("variable. custom.value", FunctionTypeEnum.CONFIGURATION), + of("name.error info", FunctionTypeEnum.CONFIGURATION), + of("device.error info", FunctionTypeEnum.CONFIGURATION), + of("variable.error info", FunctionTypeEnum.CONFIGURATION), + of("name.position", FunctionTypeEnum.CONFIGURATION), + of("device.position", FunctionTypeEnum.CONFIGURATION), + of("variable.position", FunctionTypeEnum.CONFIGURATION), + of("name.runtime.value", FunctionTypeEnum.VALUE), + of("device.runtime.value", FunctionTypeEnum.VALUE), + of("variable.runtime.value", FunctionTypeEnum.VALUE), + of("name.message", FunctionTypeEnum.CONFIGURATION), + of("device.message", FunctionTypeEnum.CONFIGURATION), + of("variable.message", FunctionTypeEnum.CONFIGURATION), + + // Service functionType + of("name.service", FunctionTypeEnum.SERVICE), + of("device.service", FunctionTypeEnum.SERVICE), + of("variable.service", FunctionTypeEnum.SERVICE), + + // Default value case + of("any", FunctionTypeEnum.VALUE), + of("", FunctionTypeEnum.VALUE), + // Status functionType + of("name.status", FunctionTypeEnum.STATE), + of("device.status", FunctionTypeEnum.STATE), + of("variable.status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L2_F2.Current.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L1_F1.Current.Status", FunctionTypeEnum.STATE), + of("Webcam.Status", FunctionTypeEnum.STATE), + of("Login.Status", FunctionTypeEnum.STATE), + of("System Health.Current.Status", FunctionTypeEnum.STATE), + of("System Health.Supply.Status", FunctionTypeEnum.STATE), + of("System Health.Temperature.Status", FunctionTypeEnum.STATE), + of("Phase L1.Current.Status", FunctionTypeEnum.STATE), + of("Phase L2.Current.Status", FunctionTypeEnum.STATE), + of("Phase L1.Voltage.Status", FunctionTypeEnum.STATE), + of("Phase L2.Voltage.Status", FunctionTypeEnum.STATE), + of("Input 1.Status", FunctionTypeEnum.STATE), + of("Handle.Status", FunctionTypeEnum.STATE), + of("Humidity.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 13.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 19.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 05.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 21.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 14.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 30.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 26.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 11.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 06.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 22.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 27.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 08.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 04.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 10.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 24.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 12.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 17.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 09.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 18.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 16.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 20.General.Status", FunctionTypeEnum.STATE), + of("System.V24 Port.Status", FunctionTypeEnum.STATE), + of("System.PoE.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 29.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 15.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 28.General.Status", FunctionTypeEnum.STATE), + of("Memory.USB-Stick.Status", FunctionTypeEnum.STATE), + of("Energy Meter 1.Status", FunctionTypeEnum.STATE), + of("Energy Meter 2.Status", FunctionTypeEnum.STATE), + of("Analog.Status", FunctionTypeEnum.STATE), + of("Temperature.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L3_F1.Power.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L1_F2.Power.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L3_F2.Current.Status", FunctionTypeEnum.STATE), + + // Setting functionType + of("name.setpt", FunctionTypeEnum.SETTING), + of("name.setptHighAlarm", FunctionTypeEnum.SETTING), + of("device.setpt", FunctionTypeEnum.SETTING), + of("variable.setpt", FunctionTypeEnum.SETTING), + of("name.sensitivity", FunctionTypeEnum.SETTING), + of("device.sensitivity", FunctionTypeEnum.SETTING), + of("variable.sensitivity", FunctionTypeEnum.SETTING), + of("name.grouping", FunctionTypeEnum.SETTING), + of("device.grouping", FunctionTypeEnum.SETTING), + of("variable.grouping", FunctionTypeEnum.SETTING), + of("name.hysteresis", FunctionTypeEnum.SETTING), + of("device.hysteresis", FunctionTypeEnum.SETTING), + of("variable.hysteresis", FunctionTypeEnum.SETTING), + of("name.setpoint", FunctionTypeEnum.SETTING), + of("device.setpoint", FunctionTypeEnum.SETTING), + of("variable.setpoint", FunctionTypeEnum.SETTING), + of("name.average", FunctionTypeEnum.SETTING), + of("device.average", FunctionTypeEnum.SETTING), + of("variable.average", FunctionTypeEnum.SETTING), + of("name.logic", FunctionTypeEnum.SETTING), + of("device.logic", FunctionTypeEnum.SETTING), + of("variable.logic", FunctionTypeEnum.SETTING), + of("name.start", FunctionTypeEnum.SETTING), + of("device.start", FunctionTypeEnum.SETTING), + of("variable.start", FunctionTypeEnum.SETTING), + of("name.end", FunctionTypeEnum.SETTING), + of("device.end", FunctionTypeEnum.SETTING), + of("variable.end", FunctionTypeEnum.SETTING), + of("Interface.Input 2.Config", FunctionTypeEnum.SETTING), + of("name.unit", FunctionTypeEnum.SETTING), + of("device.unit", FunctionTypeEnum.SETTING), + of("variable.unit", FunctionTypeEnum.SETTING), + of("name.factor", FunctionTypeEnum.SETTING), + of("device.factor", FunctionTypeEnum.SETTING), + of("variable.factor", FunctionTypeEnum.SETTING), + of("name.power on delay", FunctionTypeEnum.SETTING), + of("device.power on delay", FunctionTypeEnum.SETTING), + of("variable.power on delay", FunctionTypeEnum.SETTING), + of("name.min.value", FunctionTypeEnum.SETTING), + of("device.min.value", FunctionTypeEnum.SETTING), + of("variable.min.value", FunctionTypeEnum.SETTING), + of("name.max.value", FunctionTypeEnum.SETTING), + of("device.max.value", FunctionTypeEnum.SETTING), + of("variable.max.value", FunctionTypeEnum.SETTING), + of("name.manual.value", FunctionTypeEnum.SETTING), + of("device.manual.value", FunctionTypeEnum.SETTING), + of("variable.manual.value", FunctionTypeEnum.SETTING), + of("name.config", FunctionTypeEnum.SETTING), + of("device.config", FunctionTypeEnum.SETTING), + of("variable.config", FunctionTypeEnum.SETTING), + + // Additional names for Setting functionType + of("Fuses.Fuse L1_F1.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F2.Power.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2_F2.Power.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F1.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F1.Power.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F1.Power.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F2.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F2.Power.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1_F1.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F2.Power.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F1.Power.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1_F2.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1_F2.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2_F1.Power.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2_F2.Power.Hysteresis", FunctionTypeEnum.SETTING), + of("Temperature.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F2.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F2.Power.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Temperature.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L1.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Total.Neutral Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2_F1.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1_F2.Power.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F1.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1_F2.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F1.Power.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2_F1.Power.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F1.Power.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2_F2.Power.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2_F1.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1_F2.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L3_F2.Power.SetPtLowAlarm", FunctionTypeEnum.SETTING), + + // Execute functionType + of("name.relay", FunctionTypeEnum.EXECUTE), + of("device.relay", FunctionTypeEnum.EXECUTE), + of("variable.relay", FunctionTypeEnum.EXECUTE), + of("name.command", FunctionTypeEnum.EXECUTE), + of("device.command", FunctionTypeEnum.EXECUTE), + of("variable.command", FunctionTypeEnum.EXECUTE), + of("name.attempts", FunctionTypeEnum.EXECUTE), + of("device.attempts", FunctionTypeEnum.EXECUTE), + of("variable.attempts", FunctionTypeEnum.EXECUTE), + of("name.red", FunctionTypeEnum.EXECUTE), + of("device.red", FunctionTypeEnum.EXECUTE), + of("variable.red", FunctionTypeEnum.EXECUTE), + of("name.green", FunctionTypeEnum.EXECUTE), + of("device.green", FunctionTypeEnum.EXECUTE), + of("variable.green", FunctionTypeEnum.EXECUTE), + of("name.blue", FunctionTypeEnum.EXECUTE), + of("device.blue", FunctionTypeEnum.EXECUTE), + of("variable.blue", FunctionTypeEnum.EXECUTE), + of("name.general.grouping", FunctionTypeEnum.EXECUTE), + of("device.general.grouping", FunctionTypeEnum.EXECUTE), + of("variable.general.grouping", FunctionTypeEnum.EXECUTE), + + // Additional names for Execute functionType + of("Webcam.Command", FunctionTypeEnum.EXECUTE), + of("Login.Command", FunctionTypeEnum.EXECUTE), + of("System Health.Current.Command", FunctionTypeEnum.EXECUTE), + of("KeyPad.Command", FunctionTypeEnum.EXECUTE), + of("Handle.Command", FunctionTypeEnum.EXECUTE), + of("Input 1.Command", FunctionTypeEnum.EXECUTE), + of("Output.Command", FunctionTypeEnum.EXECUTE), + of("Energy Meter 1.Command", FunctionTypeEnum.EXECUTE), + of("Memory.USB-Stick.Command", FunctionTypeEnum.EXECUTE), + of("Phase L2.Current.Command", FunctionTypeEnum.EXECUTE), + of("Fuses.Fuse L3_F1.Command", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 30.Command", FunctionTypeEnum.EXECUTE), + of("Phase L1.Command", FunctionTypeEnum.EXECUTE), + of("Fuses.Fuse L1_F2.Command", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 12.Command", FunctionTypeEnum.EXECUTE), + of("Phase L1.Voltage.Command", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 08.Command", FunctionTypeEnum.EXECUTE), + + // Configuration functionType + of("name.descname", FunctionTypeEnum.CONFIGURATION), + of("device.descname", FunctionTypeEnum.CONFIGURATION), + of("variable.descname", FunctionTypeEnum.CONFIGURATION), + of("name.type", FunctionTypeEnum.CONFIGURATION), + of("device.type", FunctionTypeEnum.CONFIGURATION), + of("variable.type", FunctionTypeEnum.CONFIGURATION), + of("name.circuit", FunctionTypeEnum.CONFIGURATION), + of("device.circuit", FunctionTypeEnum.CONFIGURATION), + of("variable.circuit", FunctionTypeEnum.CONFIGURATION), + of("name.socket type", FunctionTypeEnum.CONFIGURATION), + of("device.socket type", FunctionTypeEnum.CONFIGURATION), + of("variable.socket type", FunctionTypeEnum.CONFIGURATION), + of("name.mode", FunctionTypeEnum.CONFIGURATION), + of("device.mode", FunctionTypeEnum.CONFIGURATION), + of("variable.mode", FunctionTypeEnum.CONFIGURATION), + of("name.led.command", FunctionTypeEnum.CONFIGURATION), + of("device.led.command", FunctionTypeEnum.CONFIGURATION), + of("variable.led.command", FunctionTypeEnum.CONFIGURATION), + of("name.sequence mode", FunctionTypeEnum.CONFIGURATION), + of("device.sequence mode", FunctionTypeEnum.CONFIGURATION), + of("variable.sequence mode", FunctionTypeEnum.CONFIGURATION), + of("name.custom.value", FunctionTypeEnum.CONFIGURATION), + of("device.custom.value", FunctionTypeEnum.CONFIGURATION), + of("variable.custom.value", FunctionTypeEnum.CONFIGURATION), + of("name.error info", FunctionTypeEnum.CONFIGURATION), + of("device.error info", FunctionTypeEnum.CONFIGURATION), + of("variable.error info", FunctionTypeEnum.CONFIGURATION), + of("name.message", FunctionTypeEnum.CONFIGURATION), + of("device.message", FunctionTypeEnum.CONFIGURATION), + of("variable.message", FunctionTypeEnum.CONFIGURATION), + of("name.custom.runtime.value", FunctionTypeEnum.CONFIGURATION), + of("device.custom.runtime.value", FunctionTypeEnum.CONFIGURATION), + of("variable.custom.runtime.value", FunctionTypeEnum.CONFIGURATION), + + // Additional names for Configuration functionType + of("System.V24 Port.DescName", FunctionTypeEnum.CONFIGURATION), + of("System.PoE.DescName", FunctionTypeEnum.CONFIGURATION), + of("System.V24 Port.Signal", FunctionTypeEnum.VALUE), + of("System.V24 Port.Message", FunctionTypeEnum.CONFIGURATION), + of("Webcam.DescName", FunctionTypeEnum.CONFIGURATION), + of("Login.DescName", FunctionTypeEnum.CONFIGURATION), + of("System Health.Current.Error Info", FunctionTypeEnum.CONFIGURATION), + of("System Health.Supply.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 29.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Humidity.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 09.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("KeyPad.DescName", FunctionTypeEnum.CONFIGURATION), + of("Dew Point.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 17.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 06.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 12.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 08.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 15.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Phase L1.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Temperature.DescName", FunctionTypeEnum.CONFIGURATION), + + // Service functionType + of("name.service", FunctionTypeEnum.SERVICE), + of("device.service", FunctionTypeEnum.SERVICE), + of("variable.service", FunctionTypeEnum.SERVICE), + of("trapreceiver1", FunctionTypeEnum.SERVICE), + of("trapreceiver2", FunctionTypeEnum.SERVICE), + of("trapreceiver3", FunctionTypeEnum.SERVICE), + of("trapreceiver4", FunctionTypeEnum.SERVICE), + of("trapreceiver5", FunctionTypeEnum.SERVICE), + of("trapreceiver6", FunctionTypeEnum.SERVICE), + of("trapreceiver7", FunctionTypeEnum.SERVICE), + of("trapreceiver8", FunctionTypeEnum.SERVICE), + of("trapreceiver9", FunctionTypeEnum.SERVICE), + of("trapreceiver10", FunctionTypeEnum.SERVICE), + of("trapreceiver11", FunctionTypeEnum.SERVICE), + of("trapreceiver12", FunctionTypeEnum.SERVICE), + of("trapreceiver13", FunctionTypeEnum.SERVICE), + of("trapreceiver14", FunctionTypeEnum.SERVICE), + of("trapreceiver15", FunctionTypeEnum.SERVICE), + of("trapreceiver16", FunctionTypeEnum.SERVICE), + of("trapenable1", FunctionTypeEnum.SERVICE), + of("trapenable2", FunctionTypeEnum.SERVICE), + of("trapenable3", FunctionTypeEnum.SERVICE), + of("trapenable4", FunctionTypeEnum.SERVICE), + of("trapenable5", FunctionTypeEnum.SERVICE), + of("trapenable6", FunctionTypeEnum.SERVICE), + of("trapenable7", FunctionTypeEnum.SERVICE), + of("trapenable8", FunctionTypeEnum.SERVICE), + of("trapenable9", FunctionTypeEnum.SERVICE), + of("trapenable10", FunctionTypeEnum.SERVICE), + of("trapenable11", FunctionTypeEnum.SERVICE), + of("trapenable12", FunctionTypeEnum.SERVICE), + of("trapenable13", FunctionTypeEnum.SERVICE), + of("trapenable14", FunctionTypeEnum.SERVICE), + of("trapenable15", FunctionTypeEnum.SERVICE), + of("trapenable16", FunctionTypeEnum.SERVICE), + of("system.v24 port.descname", FunctionTypeEnum.CONFIGURATION), + of("system.v24 port.message", FunctionTypeEnum.CONFIGURATION), + of("system.v24 port.signal", FunctionTypeEnum.VALUE), + of("system.v24 port.status", FunctionTypeEnum.STATE), + of("system.poe.descname", FunctionTypeEnum.CONFIGURATION), + of("system.poe.status", FunctionTypeEnum.STATE), + of("system health.temperature.descname", FunctionTypeEnum.CONFIGURATION), + of("system health.temperature.error info", FunctionTypeEnum.CONFIGURATION), + of("system health.temperature.status", FunctionTypeEnum.STATE), + of("system health.current.descname", FunctionTypeEnum.CONFIGURATION), + of("system health.current.command", FunctionTypeEnum.EXECUTE), + of("system health.current.error info", FunctionTypeEnum.CONFIGURATION), + of("system health.current.status", FunctionTypeEnum.STATE), + of("system health.supply.descname", FunctionTypeEnum.CONFIGURATION), + of("system health.supply.error info", FunctionTypeEnum.CONFIGURATION), + of("system health.supply.status", FunctionTypeEnum.STATE), + of("memory.usb-stick.descname", FunctionTypeEnum.CONFIGURATION), + of("memory.usb-stick.size", FunctionTypeEnum.VALUE), + of("memory.usb-stick.usage", FunctionTypeEnum.VALUE), + of("memory.usb-stick.command", FunctionTypeEnum.EXECUTE), + of("memory.usb-stick.status", FunctionTypeEnum.STATE), + + of("service", FunctionTypeEnum.SERVICE), + of("input.descname", FunctionTypeEnum.CONFIGURATION), + of("input.value", FunctionTypeEnum.VALUE), + of("input.logic", FunctionTypeEnum.SETTING), + of("input.delay", FunctionTypeEnum.SETTING), + of("input.status", FunctionTypeEnum.STATE), + of("service", FunctionTypeEnum.SERVICE), + of("output.descname", FunctionTypeEnum.CONFIGURATION), + of("output.relay", FunctionTypeEnum.EXECUTE), + of("output.logic", FunctionTypeEnum.SETTING), + of("output.status", FunctionTypeEnum.STATE), + of("service", FunctionTypeEnum.SERVICE), + of("webcam.descname", FunctionTypeEnum.CONFIGURATION), + of("webcam.command", FunctionTypeEnum.EXECUTE), + of("webcam.status", FunctionTypeEnum.STATE), + of("service", FunctionTypeEnum.SERVICE), + of("login.descname", FunctionTypeEnum.CONFIGURATION), + of("login.attempts", FunctionTypeEnum.EXECUTE), + of("login.user count", FunctionTypeEnum.EXECUTE), + of("login.delay", FunctionTypeEnum.EXECUTE), + of("login.status", FunctionTypeEnum.STATE), + of("total.frequency.value", FunctionTypeEnum.VALUE), + of("total.neutral.current.descname", FunctionTypeEnum.CONFIGURATION), + of("total.neutral.current.value", FunctionTypeEnum.VALUE), + of("total.neutral.current.setpthighalarm", FunctionTypeEnum.SETTING), + of("total.neutral.current.setptlowwarning", FunctionTypeEnum.SETTING), + of("total.neutral.current.setptlowalarm", FunctionTypeEnum.SETTING), + of("total.neutral.current.hysteresis", FunctionTypeEnum.SETTING), + of("total.neutral.current.status", FunctionTypeEnum.STATE), + of("total.power.active.descname", FunctionTypeEnum.CONFIGURATION), + of("total.power.active.value", FunctionTypeEnum.VALUE), + of("total.power.active.setpthighalarm", FunctionTypeEnum.SETTING), + of("total.power.active.setptlowwarning", FunctionTypeEnum.SETTING), + of("total.power.active.setptlowalarm", FunctionTypeEnum.SETTING), + of("total.power.active.hysteresis", FunctionTypeEnum.SETTING), + of("total.power.active.status", FunctionTypeEnum.STATE), + of("total.energy.active.value", FunctionTypeEnum.VALUE), + of("total.energy.active.runtime.value", FunctionTypeEnum.VALUE), + of("total.energy.active.custom.runtime.value", FunctionTypeEnum.CONFIGURATION), + of("total.mounting.position", FunctionTypeEnum.CONFIGURATION), + of("phase l1.voltage.value", FunctionTypeEnum.VALUE), + of("phase l1.voltage.setpthighalarm", FunctionTypeEnum.SETTING), + of("phase l1.voltage.setptlowwarning", FunctionTypeEnum.SETTING), + of("phase l1.voltage.setptlowalarm", FunctionTypeEnum.SETTING), + of("phase l1.voltage.hysteresis", FunctionTypeEnum.SETTING), + of("phase l1.voltage.status", FunctionTypeEnum.STATE), + of("phase l1.current.value", FunctionTypeEnum.VALUE), + of("phase l1.current.descname", FunctionTypeEnum.CONFIGURATION), + of("phase l1.current.setpthighalarm", FunctionTypeEnum.SETTING), + of("phase l1.current.setptlowwarning", FunctionTypeEnum.SETTING), + of("phase l1.current.setpthighwarning", FunctionTypeEnum.SETTING), + of("phase l1.current.setptlowwarning", FunctionTypeEnum.SETTING), + of("phase l1.current.setptlowalarm", FunctionTypeEnum.SETTING), + of("phase l1.current.hysteresis", FunctionTypeEnum.SETTING), + of("phase l1.current.status", FunctionTypeEnum.STATE), + of("phase l1.power.factor.value", FunctionTypeEnum.VALUE), + of("phase l1.power.active.descname", FunctionTypeEnum.CONFIGURATION), + of("phase l1.power.active.value", FunctionTypeEnum.VALUE), + of("phase l1.power.active.setpthighalarm", FunctionTypeEnum.SETTING), + of("phase l1.power.active.setptlowwarning", FunctionTypeEnum.SETTING), + of("phase l1.power.active.setptlowalarm", FunctionTypeEnum.SETTING), + of("phase l1.power.active.hysteresis", FunctionTypeEnum.SETTING), + of("phase l1.power.active.status", FunctionTypeEnum.STATE), + of("phase l1.power.reactive.value", FunctionTypeEnum.VALUE), + of("phase l1.power.apparent.value", FunctionTypeEnum.VALUE), + of("phase l1.energy.active.value", FunctionTypeEnum.VALUE), + of("phase l1.energy.active.custom.value", FunctionTypeEnum.CONFIGURATION), + of("phase l1.energy.apparent.value", FunctionTypeEnum.VALUE), + of("sockets.socket 01.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 01.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 01.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 01.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 02.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 02.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 02.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 02.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 03.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 03.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 03.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 03.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 04.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 04.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 04.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 04.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 05.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 05.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 05.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 05.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 06.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 06.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 06.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 06.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 07.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 08.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 08.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 08.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 08.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 09.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 09.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 09.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 09.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 10.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 10.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 10.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 10.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 11.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 11.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 11.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 11.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 12.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 12.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 12.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 12.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 13.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 13.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 13.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 13.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 14.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 14.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 14.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 14.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 15.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 15.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 15.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 15.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 16.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 16.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 16.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 16.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 17.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 17.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 17.general.socket type", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 17.general.status", FunctionTypeEnum.STATE), + of("sockets.socket 18.general.descname", FunctionTypeEnum.CONFIGURATION), + of("sockets.socket 18.general.circuit", FunctionTypeEnum.CONFIGURATION), + of("service", FunctionTypeEnum.SERVICE), + of("service", FunctionTypeEnum.SERVICE), + of("access.descname", FunctionTypeEnum.CONFIGURATION), + of("access.command", FunctionTypeEnum.EXECUTE), + of("access.value", FunctionTypeEnum.VALUE), + of("access.sensitivity", FunctionTypeEnum.SETTING), + of("access.delay", FunctionTypeEnum.SETTING), + of("access.status", FunctionTypeEnum.STATE), + of("Service", FunctionTypeEnum.SERVICE), + of("Handle.DescName", FunctionTypeEnum.CONFIGURATION), + of("Handle.Command", FunctionTypeEnum.EXECUTE), + of("Handle.Value", FunctionTypeEnum.VALUE), + of("Handle.Delay", FunctionTypeEnum.SETTING), + of("Handle.Status", FunctionTypeEnum.STATE), + of("Service", FunctionTypeEnum.SERVICE), + of("LED.Mode", FunctionTypeEnum.CONFIGURATION), + of("LED.Command", FunctionTypeEnum.CONFIGURATION), + of("LED.Red", FunctionTypeEnum.EXECUTE), + of("LED.Green", FunctionTypeEnum.EXECUTE), + of("LED.Blue", FunctionTypeEnum.EXECUTE), + of("Service", FunctionTypeEnum.SERVICE), + of("Interface.Input 1.Config", FunctionTypeEnum.SETTING), + of("Interface.Input 2.Config", FunctionTypeEnum.SETTING), + of("Service", FunctionTypeEnum.SERVICE), + of("Input 1.DescName", FunctionTypeEnum.CONFIGURATION), + of("Input 1.Value", FunctionTypeEnum.VALUE), + of("Input 1.Logic", FunctionTypeEnum.SETTING), + of("Input 1.Delay", FunctionTypeEnum.SETTING), + of("Input 1.Status", FunctionTypeEnum.STATE), + of("Service", FunctionTypeEnum.SERVICE), + of("Input 2.DescName", FunctionTypeEnum.CONFIGURATION), + of("Input 2.Value", FunctionTypeEnum.VALUE), + of("Input 2.Logic", FunctionTypeEnum.SETTING), + of("Input 2.Delay", FunctionTypeEnum.SETTING), + of("Input 2.Status", FunctionTypeEnum.STATE), + of("Service", FunctionTypeEnum.SERVICE), + of("Energy Meter 1.DescName", FunctionTypeEnum.CONFIGURATION), + of("Energy Meter 1.Value", FunctionTypeEnum.VALUE), + of("Energy Meter 1.S0 Factor", FunctionTypeEnum.SETTING), + of("Energy Meter 1.Status", FunctionTypeEnum.STATE), + of("Service", FunctionTypeEnum.SERVICE), + of("Energy Meter 2.DescName", FunctionTypeEnum.CONFIGURATION), + of("Energy Meter 2.Value", FunctionTypeEnum.VALUE), + of("Energy Meter 2.S0 Factor", FunctionTypeEnum.SETTING), + of("Energy Meter 2.Status", FunctionTypeEnum.STATE), + of("Service", FunctionTypeEnum.SERVICE), + of("Dew Point.DescName", FunctionTypeEnum.CONFIGURATION), + of("Dew Point.Value", FunctionTypeEnum.VALUE), + of("Service", FunctionTypeEnum.SERVICE), + of("Temperature.DescName", FunctionTypeEnum.CONFIGURATION), + of("Temperature.Value", FunctionTypeEnum.VALUE), + of("Temperature.Offset", FunctionTypeEnum.SETTING), + of("Temperature.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Temperature.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Temperature.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Temperature.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Temperature.Hysteresis", FunctionTypeEnum.SETTING), + of("Temperature.Status", FunctionTypeEnum.STATE), + of("Service", FunctionTypeEnum.SERVICE), + of("Humidity.DescName", FunctionTypeEnum.CONFIGURATION), + of("Humidity.Value", FunctionTypeEnum.VALUE), + of("Humidity.Offset", FunctionTypeEnum.SETTING), + of("Humidity.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Humidity.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Humidity.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Humidity.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Humidity.Hysteresis", FunctionTypeEnum.SETTING), + of("Humidity.Status", FunctionTypeEnum.STATE), + of("Temperature.DescName", FunctionTypeEnum.CONFIGURATION), + of("Temperature.Value", FunctionTypeEnum.VALUE), + of("Temperature.Offset", FunctionTypeEnum.SETTING), + of("Temperature.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Temperature.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Temperature.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Temperature.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Temperature.Hysteresis", FunctionTypeEnum.SETTING), + of("Temperature.Status", FunctionTypeEnum.STATE), + of("Service", FunctionTypeEnum.SERVICE), + of("Total.Frequency.Value", FunctionTypeEnum.VALUE), + of("Total.Neutral Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Total.Neutral Current.Value", FunctionTypeEnum.VALUE), + of("Total.Neutral Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Total.Neutral Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Total.Neutral Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Total.Neutral Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Total.Neutral Current.Status", FunctionTypeEnum.STATE), + of("Total.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Total.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Total.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Total.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Total.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Total.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Total.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Total.Power.Active.Status", FunctionTypeEnum.STATE), + of("Total.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Total.Energy.Active.Runtime.Value", FunctionTypeEnum.VALUE), + of("Total.Energy.Active.Custom.Runtime.Value", FunctionTypeEnum.CONFIGURATION), + of("Total.Mounting Position", FunctionTypeEnum.CONFIGURATION), + of("Phase L1.Voltage.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L1.Voltage.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Voltage.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Phase L1.Voltage.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L1.Voltage.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L1.Voltage.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L1.Voltage.Status", FunctionTypeEnum.STATE), + of("Phase L1.Voltage.THD.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L1.Current.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Phase L1.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L1.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L1.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L1.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L1.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L1.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Phase L1.Current.Status", FunctionTypeEnum.STATE), + of("Phase L1.Current.THD.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L1.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Phase L1.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L1.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L1.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L1.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Phase L1.Power.Active.Status", FunctionTypeEnum.STATE), + of("Phase L1.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Energy.Active.Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Phase L1.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Phase L1.Fuses.Fuse 1.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L1.Fuses.Fuse 1.Status", FunctionTypeEnum.STATE), + of("Phase L1.Fuses.Fuse 2.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L1.Fuses.Fuse 2.Status", FunctionTypeEnum.STATE), + of("Phase L2.Voltage.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L2.Voltage.Value", FunctionTypeEnum.VALUE), + of("Phase L2.Voltage.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Phase L2.Voltage.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L2.Voltage.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L2.Voltage.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L2.Voltage.Status", FunctionTypeEnum.STATE), + of("Phase L2.Voltage.THD.Value", FunctionTypeEnum.VALUE), + of("Phase L2.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L2.Current.Value", FunctionTypeEnum.VALUE), + of("Phase L2.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Phase L2.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L2.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L2.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L2.Current.Status", FunctionTypeEnum.STATE), + of("Phase L2.Current.THD.Value", FunctionTypeEnum.VALUE), + of("Phase L2.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Phase L2.Fuses.Fuse 1.Type", FunctionTypeEnum.CONFIGURATION), + of("Phase L2.Fuses.Fuse 1.Status", FunctionTypeEnum.STATE), + of("Phase L2.Fuses.Fuse 2.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L2.Fuses.Fuse 2.Status", FunctionTypeEnum.STATE), + of("Phase L3.Voltage.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L3.Voltage.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Voltage.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Phase L3.Voltage.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L3.Voltage.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L3.Voltage.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L3.Voltage.Hysteresis", FunctionTypeEnum.SETTING), + of("Phase L3.Voltage.Status", FunctionTypeEnum.STATE), + of("Phase L3.Voltage.THD.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L3.Current.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Phase L3.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L3.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L3.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L3.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Phase L3.Current.Status", FunctionTypeEnum.STATE), + of("Phase L3.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L3.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Phase L3.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Phase L3.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Phase L3.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Phase L3.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Phase L3.Power.Active.Status", FunctionTypeEnum.STATE), + of("Phase L3.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Energy.Active.Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Phase L3.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Phase L3.Fuses.Fuse 1.Type", FunctionTypeEnum.CONFIGURATION), + of("Phase L3.Fuses.Fuse 1.Status", FunctionTypeEnum.STATE), + of("Phase L3.Fuses.Fuse 2.DescName", FunctionTypeEnum.CONFIGURATION), + of("Phase L3.Fuses.Fuse 2.Status", FunctionTypeEnum.STATE), + of("Sockets.General.Power ON Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 01.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 01.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 01.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 01.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 01.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 01.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 01.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 01.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 01.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 01.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 01.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 01.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 01.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 01.Energy.Active.Custom", FunctionTypeEnum.VALUE), + of("Sockets.Socket 01.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 02.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 02.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 02.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 02.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 02.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 02.General.Error Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 02.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 02.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 02.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 02.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 02.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 02.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 02.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 02.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 02.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 02.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 02.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 02.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 02.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 04.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 04.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 04.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 04.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 04.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 04.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 04.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 04.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 04.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 04.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 04.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 04.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 04.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 04.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 04.Energy.Active.Custom", FunctionTypeEnum.VALUE), + of("Sockets.Socket 04.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 05.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 05.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 05.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 05.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 05.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 05.General.Error Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 05.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 05.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 05.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 05.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 05.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 05.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 05.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 05.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 05.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 05.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 05.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 05.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 05.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 06.Energy.Active Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 06.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 07.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 07.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 07.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 07.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 07.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 07.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 07.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 07.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 07.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 07.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 07.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 07.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 07.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 07.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 07.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 07.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 07.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 07.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 07.Energy.Active Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 07.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 08.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 08.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 08.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 08.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 08.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 08.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 08.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 08.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 08.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 08.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 08.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 08.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 08.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 08.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 08.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 08.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 08.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 08.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 08.Energy.Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 08.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 09.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 09.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 09.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 09.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 09.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 09.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 09.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 09.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 09.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 09.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 09.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 09.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 09.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 09.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 09.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 09.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 09.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 09.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 11.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 11.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 11.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 11.Energy.Active Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 11.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 12.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 12.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 12.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 12.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 12.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 12.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 12.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 12.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 12.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 12.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 12.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 12.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 12.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 12.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 12.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 12.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 12.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 12.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 12.Energy.Active Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 12.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 13.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 13.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 13.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 13.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 13.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 13.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 13.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 13.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 13.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 13.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 13.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 13.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 13.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 13.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 13.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 13.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 13.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 13.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 13.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 13.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 13.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 13.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 14.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 14.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 14.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 14.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 14.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 14.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 14.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 14.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 14.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 14.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 14.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 14.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 14.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 14.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 14.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 14.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 15.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 15.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 15.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 15.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 15.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 15.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 15.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 15.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 15.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 15.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 15.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 15.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 15.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 15.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 15.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 15.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 15.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 15.Energy.Active Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 15.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 16.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 16.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 16.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 16.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 16.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 16.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 16.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 16.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 16.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 16.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 16.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 16.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 16.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 16.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 16.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 16.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 16.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 16.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 16.Energy.Active Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 16.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 19.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 19.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 19.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 19.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 19.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 19.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 19.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 19.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 19.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 19.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 19.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 19.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 19.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 19.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 19.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 19.Energy.Active Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 19.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 20.General.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 20.General.Circuit", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 20.General.Socket Type", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 20.General.Relay", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 20.General.On Delay", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.General.Sequence Mode", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 20.General.Grouping", FunctionTypeEnum.EXECUTE), + of("Sockets.Socket 20.General.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 20.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 20.Current.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 20.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Current.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 20.Power.Factor.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 20.Power.Active.DescName", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 20.Power.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 20.Power.Active.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Power.Active.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Power.Active.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Power.Active.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Power.Active.Hysteresis", FunctionTypeEnum.SETTING), + of("Sockets.Socket 20.Power.Active.Status", FunctionTypeEnum.STATE), + of("Sockets.Socket 20.Power.Reactive.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 20.Power.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 20.Energy.Active.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 20.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Sockets.Socket 20.Energy.Active.Custom.Value", FunctionTypeEnum.CONFIGURATION), + of("Sockets.Socket 20.Energy.Apparent.Value", FunctionTypeEnum.VALUE), + of("Fuses.Fuse L1.F1.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F1.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F1.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F1.Current.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L1.F1.Power.DescName", FunctionTypeEnum.CONFIGURATION), + of("Fuses.Fuse L1.F1.Power.Value", FunctionTypeEnum.VALUE), + of("Fuses.Fuse L1.F1.Power.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F1.Power.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F1.Power.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F1.Power.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F1.Power.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F1.Power.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L1.F2.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Fuses.Fuse L1.F2.Current.Value", FunctionTypeEnum.VALUE), + of("Fuses.Fuse L1.F2.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Current.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L1.F2.Power.DescName", FunctionTypeEnum.CONFIGURATION), + of("Fuses.Fuse L1.F2.Power.Value", FunctionTypeEnum.VALUE), + of("Fuses.Fuse L1.F2.Power.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Power.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Power.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Power.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Power.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L1.F2.Power.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L2.F1.Current.DescName", FunctionTypeEnum.CONFIGURATION), + of("Fuses.Fuse L2.F1.Current.Value", FunctionTypeEnum.VALUE), + of("Fuses.Fuse L2.F1.Current.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Current.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Current.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Current.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Current.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Current.Status", FunctionTypeEnum.STATE), + of("Fuses.Fuse L2.F1.Power.DescName", FunctionTypeEnum.CONFIGURATION), + of("Fuses.Fuse L2.F1.Power.Value", FunctionTypeEnum.VALUE), + of("Fuses.Fuse L2.F1.Power.SetPtHighAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Power.SetPtHighWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Power.SetPtLowWarning", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Power.SetPtLowAlarm", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Power.Hysteresis", FunctionTypeEnum.SETTING), + of("Fuses.Fuse L2.F1.Power.Status", FunctionTypeEnum.STATE) + ); + } + +} diff --git a/src/test/java/io/gec/raw/connector/device/control/ValueScalingHelperTest.java b/src/test/java/io/gec/raw/connector/device/control/ValueScalingHelperTest.java new file mode 100755 index 0000000..bb701ee --- /dev/null +++ b/src/test/java/io/gec/raw/connector/device/control/ValueScalingHelperTest.java @@ -0,0 +1,249 @@ +package io.gec.raw.connector.device.control; + +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.utils.control.ValueScalingHelper; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.of; + + +@ExtendWith(MockitoExtension.class) +class ValueScalingHelperTest { + @InjectMocks + ValueScalingHelper valueScalingHelper; + @Mock + Logger logger; + + @Test + public void testPositiveScaleFactor() { + // given + int value = 3500; + int scaleFactor = 100; + int expected = 350000; + + // when + int result = valueScalingHelper.scaleNumericValueFromDevice(value, scaleFactor); + + // then + assertEquals(expected, result); + } + + @Test + public void testNegativeScaleFactor() { + // given + int value = 3500; + int scaleFactor = -100; + int expected = 35; + + // when + int result = valueScalingHelper.scaleNumericValueFromDevice(value, scaleFactor); + + // then + assertEquals(expected, result); + } + + @Test + public void testZeroValue() { + // given + int value = 0; + int scaleFactor = 100; + int expected = 0; + + // when + int result = valueScalingHelper.scaleNumericValueFromDevice(value, scaleFactor); + + // then + assertEquals(expected, result); + } + + @Test + public void testZeroScaleFactor() { + // given + int value = 3500; + int scaleFactor = 0; + int expected = 3500; + + // when + int result = valueScalingHelper.scaleNumericValueFromDevice(value, scaleFactor); + + // then + assertEquals(expected, result); + } + + @ParameterizedTest + @MethodSource("getVarDataTypesForNotScalingValue") + void shouldGetScaledVariableValue_returnNotScaledValueForDevice(DataTypeEnum dataType) { + //given + var value = "value"; + //and + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setVarDataType(dataType); + + //when + var result = valueScalingHelper.getScaledVariableValueForDevice(variable.getVarDataType(), value, variable.getScale()); + //then + assertThat(result, is(value)); + } + + @ParameterizedTest + @MethodSource("getTestDataForConvertingValueToStringOfFloat") + void shouldGetScaledVariableValue_returnStringOfFloatValue_ForDevice_forScaleEqualsToZero(DataTypeEnum dataType, + String inputValue, + String expectedValue) { + //given + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setVarDataType(dataType); + variable.setScale("0"); + + //when + var result = valueScalingHelper.getScaledVariableValueForDevice(variable.getVarDataType(), inputValue, variable.getScale()); + + //then + assertThat(result, is(expectedValue)); + } + + @ParameterizedTest + @MethodSource("getTestDataForConvertingValueToStringOfFloat") + void shouldGetScaledVariableValue_returnStringOfFloatValue_ForDevice_forScaleEqualsToOne(DataTypeEnum dataType, + String inputValue, + String expectedValue) { + //given + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setVarDataType(dataType); + variable.setScale("1"); + + //when + var result = valueScalingHelper.getScaledVariableValueForDevice(variable.getVarDataType(), inputValue, variable.getScale()); + + //then + assertThat(result, is(expectedValue)); + } + + @ParameterizedTest + @MethodSource("getTestDataForScalingValue") + void shouldGetScaledVariableValue_returnStringOfIntegerValueForDevice(DataTypeEnum dataType, + int scale, + String inputValue, + String expectedValue) { + //given + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setVarDataType(dataType); + variable.setScale(String.valueOf(scale)); + + //when + var result = valueScalingHelper.getScaledVariableValueForDevice(variable.getVarDataType(), inputValue, variable.getScale()); + + //then + assertThat(result, is(expectedValue)); + } + + private static Stream getVarDataTypesForNotScalingValue() { + return Arrays.stream(DataTypeEnum.values()) + .filter(typeEnum -> !DataTypeEnum.ANALOGINT.equals(typeEnum)) + .filter(typeEnum -> !DataTypeEnum.FLOAT.equals(typeEnum)) + .filter(typeEnum -> !DataTypeEnum.NUMERIC.equals(typeEnum)); + } + + private static Stream getTestDataForConvertingValueToStringOfFloat() { + return Stream.of( + of(DataTypeEnum.ANALOGINT, "10", "10.0"), + of(DataTypeEnum.ANALOGINT, "10.0", "10.0"), + of(DataTypeEnum.ANALOGINT, "10.1", "10.1"), + of(DataTypeEnum.ANALOGINT, "10.01", "10.01"), + of(DataTypeEnum.ANALOGINT, "10.010", "10.01"), + of(DataTypeEnum.ANALOGINT, "10.000001", "10.000001"), + of(DataTypeEnum.ANALOGINT, "10.0000001", "10.0"), + of(DataTypeEnum.ANALOGINT, "10.999999", "10.999999"), + of(DataTypeEnum.ANALOGINT, "10.9999995", "10.999999"), + of(DataTypeEnum.ANALOGINT, "10.9999996", "11.0"), + of(DataTypeEnum.ANALOGINT, "10d", "10.0"), + of(DataTypeEnum.ANALOGINT, "10.1d", "10.1"), + of(DataTypeEnum.ANALOGINT, "10f", "10.0"), + of(DataTypeEnum.ANALOGINT, "10.1f", "10.1"), + + of(DataTypeEnum.FLOAT, "10", "10.0"), + of(DataTypeEnum.FLOAT, "10.0", "10.0"), + of(DataTypeEnum.FLOAT, "10.1", "10.1"), + of(DataTypeEnum.FLOAT, "10.01", "10.01"), + of(DataTypeEnum.FLOAT, "10.010", "10.01"), + of(DataTypeEnum.FLOAT, "10.000001", "10.000001"), + of(DataTypeEnum.FLOAT, "10.0000001", "10.0"), + of(DataTypeEnum.FLOAT, "10.999999", "10.999999"), + of(DataTypeEnum.FLOAT, "10.9999995", "10.999999"), + of(DataTypeEnum.FLOAT, "10.9999996", "11.0"), + of(DataTypeEnum.FLOAT, "10d", "10.0"), + of(DataTypeEnum.FLOAT, "10.1d", "10.1"), + of(DataTypeEnum.FLOAT, "10f", "10.0"), + of(DataTypeEnum.FLOAT, "10.1f", "10.1"), + + of(DataTypeEnum.NUMERIC, "10", "10")); + } + + private static Stream getTestDataForScalingValue() { + return Stream.of( + of(DataTypeEnum.ANALOGINT, -3, "10", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.0", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.1", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.01", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.010", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.000001", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.0000001", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.999999", "32"), + of(DataTypeEnum.ANALOGINT, -3, "10.9999995", "32"), + of(DataTypeEnum.ANALOGINT, -3, "10.9999996", "33"), + of(DataTypeEnum.ANALOGINT, -3, "10d", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.1d", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10f", "30"), + of(DataTypeEnum.ANALOGINT, -3, "10.1f", "30"), + of(DataTypeEnum.ANALOGINT, 3, "10", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.0", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.1", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.01", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.010", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.000001", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.0000001", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.999999", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.9999995", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.9999996", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10d", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.1d", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10f", "3"), + of(DataTypeEnum.ANALOGINT, 3, "10.1f", "3"), + of(DataTypeEnum.ANALOGINT, 3, "8.999999f", "2"), + of(DataTypeEnum.ANALOGINT, 3, "2.999999f", "0"), + of(DataTypeEnum.ANALOGINT, 3, "1.0f", "0"), + + of(DataTypeEnum.FLOAT, -1, "10", "10"), + of(DataTypeEnum.FLOAT, -1, "10.1", "10"), + of(DataTypeEnum.FLOAT, -1, "10.1f", "10"), + of(DataTypeEnum.FLOAT, -1, "10.1d", "10"), + of(DataTypeEnum.FLOAT, -3, "10", "30"), + of(DataTypeEnum.FLOAT, -3, "10.1", "30"), + of(DataTypeEnum.FLOAT, -3, "10.1f", "30"), + of(DataTypeEnum.FLOAT, -3, "10.1d", "30"), + of(DataTypeEnum.FLOAT, 3, "10", "3"), + of(DataTypeEnum.FLOAT, 3, "10.1", "3"), + of(DataTypeEnum.FLOAT, 3, "10.1f", "3"), + of(DataTypeEnum.FLOAT, 3, "10.1d", "3"), + + of(DataTypeEnum.NUMERIC, -3, "10", "30"), + of(DataTypeEnum.NUMERIC, -2, "10", "20"), + of(DataTypeEnum.NUMERIC, 2, "10", "5")); + } + +} diff --git a/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyCachedServiceTest.java b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyCachedServiceTest.java new file mode 100755 index 0000000..13a6d7b --- /dev/null +++ b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyCachedServiceTest.java @@ -0,0 +1,96 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationService; +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.deviceproperty.dto.PropertyValueRequestDTO; +import io.gec.raw.connector.statistic.control.StatisticCollectorController; +import io.gec.raw.connector.variable.dto.VarQuality; +import io.quarkus.cache.CaffeineCache; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class DevicePropertyCachedServiceTest { + + @Mock + CaffeineCache cache; + @Mock + CommunicationService communicationService; + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + StatisticCollectorController statisticCollectorController; + @InjectMocks + DevicePropertyCachedService cachedService; + + @Test + void shouldReturnNullObject() { + // given + doReturn(cache).when(cache).as(any()); + when(cache.getIfPresent(any())).thenReturn(CompletableFuture.completedFuture(null)); + + // when + Object result = cachedService.getCachedValue(UUID.randomUUID()); + + // then + assertNull(result); + } + + @Test + void shouldUpdatePropertyValue() { + // given + UUID commServiceId = UUID.randomUUID(); + UUID propertyId = UUID.randomUUID(); + Map map = new HashMap<>(Map.of(propertyId, PropertyValueRequestDTO.builder() + .propertyId(propertyId) + .valueAsString("original") + .varQuality(VarQuality.UNDEFINED) + .commSvcId(commServiceId) + .build())); + doReturn(cache).when(cache).as(any()); + doAnswer(invocationOnMock -> { + UUID id = invocationOnMock.getArgument(0); + return CompletableFuture.completedFuture(map.get(id)); + }).when(cache).getIfPresent(any()); + doAnswer(invocationOnMock -> { + UUID id = invocationOnMock.getArgument(0); + CompletableFuture completableFuture = invocationOnMock.getArgument(1); + PropertyValueRequestDTO propertyValueRequestDTO = completableFuture.get(); + map.put(id, propertyValueRequestDTO); + return null; + }).when(cache).put(any(), any()); + + // when + PropertyValueRequestDTO propertyValueRequestDTO = PropertyValueRequestDTO.builder() + .propertyId(propertyId) + .valueAsString("newValue") + .varQuality(VarQuality.OK) + .commSvcId(commServiceId) + .build(); + cachedService.updateDeviceProperty(propertyId, propertyValueRequestDTO); + Object result = cachedService.getCachedValue(propertyId); + + // then + assertNotNull(result); + assertEquals(propertyValueRequestDTO, result); + } +} diff --git a/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyControllerTest.java b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyControllerTest.java new file mode 100755 index 0000000..7074f01 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyControllerTest.java @@ -0,0 +1,136 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.quarkus.test.TestTransaction; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.UUID; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class DevicePropertyControllerTest { + + @Mock + Logger logger; + @Mock + DevicePropertyRepository devicePropertyRepository; + @Mock + DevicePropertyTaskScheduler devicePropertyTaskScheduler; + @InjectMocks + DevicePropertyController devicePropertyController; + + @Test + @TestTransaction + void shouldUpdatePropertyIntervalThrowException() { + assertThrows(IllegalStateException.class, () -> devicePropertyController.updatePropertyInterval(null, "10")); + } + + @Test + @TestTransaction + void shouldUpdatePropertyIntervalSetExpectedValue() { + // given + UUID devicePropertyId = UUID.randomUUID(); + DeviceProperty deviceProperty = DeviceProperty.builder() + .id(devicePropertyId) + .build(); + when(devicePropertyRepository.findById(devicePropertyId)).thenReturn(deviceProperty); + + // when + devicePropertyController.updatePropertyInterval(devicePropertyId, "10"); + + // then + assertEquals(10, deviceProperty.getSubscriptionInterval()); + } + + private static Stream shouldUpdateModeCallExecuteTaskExpectedTimes() { + return Stream.of( + of(ComponentMode.OPERATION, null, 0), + of(ComponentMode.OPERATION, ".1.2.3", 0), + of(ComponentMode.PAUSE, null, 0), + of(ComponentMode.PAUSE, ".1.2.3", 1), + of(ComponentMode.FIRMWARE_UPDATE, null, 0), + of(ComponentMode.FIRMWARE_UPDATE, ".1.2.3", 0) + ); + } + + @ParameterizedTest + @MethodSource + @TestTransaction + void shouldUpdateModeCallExecuteTaskExpectedTimes(ComponentMode mode, String valueChangeOid, int expectedUpdateCalls) { + // given + UUID devicePropertyId = UUID.randomUUID(); + DeviceProperty deviceProperty = DeviceProperty.builder() + .id(devicePropertyId) + .mode(mode) + .valueChangeOid(valueChangeOid) + .build(); + + // when + devicePropertyController.updateMode(deviceProperty, mode); + + // then + verify(devicePropertyTaskScheduler, times(expectedUpdateCalls)).executeTask(deviceProperty); + } + + @ParameterizedTest + @MethodSource("getModesForUpdateMode") + void shouldUpdateModeSetExpectedModes(ComponentMode currentMode, ComponentMode currentRestoreMode, ComponentMode updateMode, ComponentMode expectedMode, + ComponentMode expectedRestoreMode) { + // given + DeviceProperty deviceProperty = DeviceProperty.builder() + .mode(currentMode) + .restoreMode(currentRestoreMode) + .build(); + + // when + devicePropertyController.updateMode(deviceProperty, updateMode); + + // then + assertEquals(expectedMode, deviceProperty.getMode()); + assertEquals(expectedRestoreMode, deviceProperty.getRestoreMode()); + } + + private static Stream getModesForUpdateMode() { + return Stream.of( + of(ComponentMode.PAUSE, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.PAUSE), + of(ComponentMode.FIRMWARE_UPDATE, ComponentMode.PAUSE, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.PAUSE), + of(ComponentMode.OPERATION, ComponentMode.PAUSE, ComponentMode.FIRMWARE_UPDATE, ComponentMode.FIRMWARE_UPDATE, ComponentMode.OPERATION) + ); + } + + @Test + void shouldRestoreModeThrowIllegalStateExceptionWhenPropertyIsNull() { + // when & then + assertThrows(NullPointerException.class, () -> devicePropertyController.restoreMode(null)); + } + + @Test + void shouldRestoreModeUpdateModeAndLog() { + // given + DeviceProperty property = DeviceProperty.builder() + .id(UUID.randomUUID()) + .mode(ComponentMode.OPERATION) + .restoreMode(ComponentMode.PAUSE) + .build(); + + // when + devicePropertyController.restoreMode(property); + + // then + assertEquals(ComponentMode.PAUSE, property.getMode()); + } +} diff --git a/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyHandlerTest.java b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyHandlerTest.java new file mode 100755 index 0000000..c668061 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyHandlerTest.java @@ -0,0 +1,81 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.deviceproperty.dto.PropertyValueRequestDTO; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.variable.dto.VarQuality; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.UUID; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class DevicePropertyHandlerTest { + + @Mock + DevicePropertyCachedService cachedService; + @Mock + Logger logger; + @InjectMocks + DevicePropertyHandler devicePropertyHandler; + + private static Stream shouldUpdateDevicePropertyThrowAnException() { + return Stream.of( + of(DeviceProperty.builder() + .build()), + of(DeviceProperty.builder() + .subscriptionInterval(0) + .build()) + ); + } + + @Test + void shouldHandleDevicePropertyValue() { + // given + UUID devicePropertyId = UUID.randomUUID(); + UUID commServiceId = UUID.randomUUID(); + DeviceProperty deviceProperty = DeviceProperty.builder() + .id(devicePropertyId) + .commServiceId(commServiceId) + .subscriptionInterval(1000) + .build(); + String newValue = "newValue"; + + // when + devicePropertyHandler.handleDevicePropertyValue(deviceProperty, newValue); + + // then + PropertyValueRequestDTO propertyValueRequestDTO = PropertyValueRequestDTO.builder() + .propertyId(devicePropertyId) + .commSvcId(commServiceId) + .valueAsString("newValue") + .varQuality(VarQuality.OK) + .build(); + verify(cachedService).updateDeviceProperty(devicePropertyId, propertyValueRequestDTO); + assertTrue(deviceProperty.isInitialValueFetched()); + } + + @ParameterizedTest + @MethodSource + @NullSource + void shouldUpdateDevicePropertyThrowAnException(DeviceProperty deviceProperty) { + // given + String value = "someValue"; + + // when & then + assertThrows(IllegalArgumentException.class, () -> devicePropertyHandler.handleDevicePropertyValue(deviceProperty, value)); + } +} diff --git a/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskSchedulerIT.java b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskSchedulerIT.java new file mode 100755 index 0000000..9240b3f --- /dev/null +++ b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskSchedulerIT.java @@ -0,0 +1,116 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationService; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.enums.RittalDevicePropertyNameEnum; +import io.gec.raw.connector.deviceproperty.domain.DevicePropertyScheduledTask; +import io.gec.raw.connector.deviceproperty.dto.PropertyValueRequestDTO; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.driver.control.DeviceDriverServiceClient; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.subscription.control.ScheduledTaskService; +import io.gec.raw.connector.utils.IntegrationTestHelper; +import io.gec.raw.connector.utils.TestClassUtil; +import io.gec.raw.connector.variable.dto.VarQuality; +import io.quarkus.test.InjectMock; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; + +import java.util.Optional; +import java.util.concurrent.ScheduledExecutorService; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@QuarkusTest +class DevicePropertyTaskSchedulerIT { + + @Inject + IntegrationTestHelper integrationTestHelper; + @Inject + DevicePropertyRepository devicePropertyRepository; + @Inject + DevicePropertyTaskScheduler devicePropertyTaskScheduler; + @InjectMock + ScheduledTaskService scheduledTaskService; + @InjectMock + SnmpService snmpService; + @Mock + ScheduledExecutorService scheduledExecutor; + @InjectMock + @RestClient + CommunicationService communicationService; + @InjectMock + @RestClient + DeviceDriverServiceClient deviceDriverServiceClient; + + @BeforeEach + void beforeEach() { + TestClassUtil.setPrivateField(ScheduledTaskService.class, scheduledTaskService, "scheduledExecutor", scheduledExecutor); + integrationTestHelper.setupTestEnvironment(); + } + + @AfterEach + void afterEach() { + integrationTestHelper.cleanupTestEnvironment(); + } + + @ParameterizedTest + @MethodSource("getExecuteTaskDevicePropertyExpectedData") + void shouldExecuteTask_runTask_devicePropertyExpectedResult(String propertyName, ComponentMode mode, String snmpGetValue, VarQuality expectedQuality, String expectedValue) { + // given + var property = setupDeviceProperty(propertyName, mode); + // and + when(snmpService.snmpGet(any())).thenReturn(Optional.ofNullable(snmpGetValue)); + when(snmpService.snmpGetPDU(any())).thenReturn(null); + + // when + devicePropertyTaskScheduler.executeTask(property); + + // then + var taskCaptor = ArgumentCaptor.forClass(DevicePropertyScheduledTask.class); + verify(scheduledTaskService).executeTaskOnce(taskCaptor.capture()); + var task = taskCaptor.getValue(); + assertDoesNotThrow(task::run); + var dtoCaptor = ArgumentCaptor.forClass(PropertyValueRequestDTO.class); + verify(communicationService).updateDeviceProperty(dtoCaptor.capture()); + var requestDTO = dtoCaptor.getValue(); + assertEquals(property.getId(), requestDTO.getPropertyId()); + assertEquals(expectedValue, requestDTO.getValueAsString()); + assertEquals(expectedQuality, requestDTO.getVarQuality()); + assertEquals(property.getCommServiceId(), requestDTO.getCommSvcId()); + } + + @Transactional + DeviceProperty setupDeviceProperty(String propertyName, ComponentMode mode) { + var property = devicePropertyRepository.find("name = ?1", propertyName).firstResult(); + property.setMode(mode); + return property; + } + + private static Stream getExecuteTaskDevicePropertyExpectedData() { + var rittalPropertyName = RittalDevicePropertyNameEnum.ROOT_SOFTWARE_VERSION.getLabel(); + + return Stream.of( + of(rittalPropertyName, ComponentMode.PAUSE, "V7.19.00", VarQuality.OK, "V7.19.00"), + of(rittalPropertyName, ComponentMode.PAUSE, null, VarQuality.WARNINGNOVALUE, ""), + of(rittalPropertyName, ComponentMode.OPERATION, "V7.19.00", VarQuality.OK, "V7.19.00"), + of(rittalPropertyName, ComponentMode.OPERATION, null, VarQuality.WARNINGNOVALUE, "") + ); + } + +} diff --git a/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskSchedulerTest.java b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskSchedulerTest.java new file mode 100755 index 0000000..7308bfd --- /dev/null +++ b/src/test/java/io/gec/raw/connector/deviceproperty/control/DevicePropertyTaskSchedulerTest.java @@ -0,0 +1,161 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.deviceproperty.domain.DevicePropertyScheduledTask; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.subscription.control.ScheduledTaskService; +import io.gec.raw.connector.utils.TestDTOFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class DevicePropertyTaskSchedulerTest { + + @Mock + ScheduledTaskService scheduledTaskService; + @Mock + DevicePropertyValueProvider devicePropertyValueProvider; + @Mock + DevicePropertyController devicePropertyController; + @Mock + DevicePropertyHandler devicePropertyHandler; + @InjectMocks + DevicePropertyTaskScheduler devicePropertyTaskScheduler; + + @Test + void shouldScheduleTask_subscribedEntity_schedulesTask() { + // given + var devicePropertyId = UUID.randomUUID(); + var deviceProperty = DeviceProperty.builder() + .id(devicePropertyId) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + + // when + devicePropertyTaskScheduler.scheduleTask(deviceProperty); + + // then + verify(scheduledTaskService, times(1)).scheduleTask(any(DevicePropertyScheduledTask.class)); + } + + @Test + void shouldScheduleTask_unsubscribedEntity_executesActionAndRemovesTask() { + // given + var devicePropertyId = UUID.randomUUID(); + var deviceProperty = DeviceProperty.builder() + .id(devicePropertyId) + .subscriptionInterval(10) + .initialValueFetched(true) + .mode(ComponentMode.PAUSE) + .build(); + + // when + devicePropertyTaskScheduler.scheduleTask(deviceProperty); + + // then + verify(scheduledTaskService, times(1)).executeActionAndRemoveTaskIfExists(any(DevicePropertyScheduledTask.class)); + } + + @Test + void shouldScheduleTasks_schedulesEachTask() { + // given + var deviceProperty1 = DeviceProperty.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var deviceProperty2 = DeviceProperty.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + + var deviceProperties = List.of(deviceProperty1, deviceProperty2); + + // when + devicePropertyTaskScheduler.scheduleTasks(deviceProperties); + + // then + verify(scheduledTaskService, times(2)).scheduleTask(any(DevicePropertyScheduledTask.class)); + } + + @Test + void shouldExecuteTask_executesScheduledTaskOnce() { + // given + var deviceProperty = DeviceProperty.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.PAUSE) + .build(); + + // when + devicePropertyTaskScheduler.executeTask(deviceProperty); + + // then + verify(scheduledTaskService, times(1)).executeTaskOnce(any(DevicePropertyScheduledTask.class)); + } + + @Test + void shouldResetNextExecutionInterval_resetsInterval() { + // given + var deviceProperty = DeviceProperty.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + + // when + devicePropertyTaskScheduler.resetNextExecutionInterval(deviceProperty); + + // then + verify(scheduledTaskService, times(1)).resetNextExecutionInterval(deviceProperty); + } + + @Test + void shouldCreateTaskData() { + // given + var devicePropertyId = UUID.randomUUID(); + var deviceProperty = DeviceProperty.builder() + .id(devicePropertyId) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + when(devicePropertyController.findById(devicePropertyId)).thenReturn(deviceProperty); + + // when + devicePropertyTaskScheduler.createTaskData(devicePropertyId); + + // then + verify(devicePropertyController, times(1)).findById(devicePropertyId); + verify(devicePropertyValueProvider, times(1)).createSnmpMessageTaskData(deviceProperty); + } + + @Test + void shouldRunTaskAction() { + // given + var deviceProperty = DeviceProperty.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var taskData = TestDTOFactory.createDevicePropertySnmpMessageTaskData(deviceProperty); + when(devicePropertyValueProvider.executeSnmpMessageTask(taskData)).thenReturn("PropertyValue"); + + // when + devicePropertyTaskScheduler.runTask(taskData); + + // then + verify(devicePropertyValueProvider, times(1)).executeSnmpMessageTask(taskData); + verify(devicePropertyHandler, times(1)).handleDevicePropertyValue(deviceProperty, "PropertyValue"); + } +} diff --git a/src/test/java/io/gec/raw/connector/deviceproperty/control/DeviceTypeProviderTest.java b/src/test/java/io/gec/raw/connector/deviceproperty/control/DeviceTypeProviderTest.java new file mode 100755 index 0000000..d909f06 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/deviceproperty/control/DeviceTypeProviderTest.java @@ -0,0 +1,110 @@ +package io.gec.raw.connector.deviceproperty.control; + +import io.gec.raw.connector.deviceproperty.entity.DevTypeEnum; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +@ExtendWith(MockitoExtension.class) +class DeviceTypeProviderTest { + @InjectMocks + DeviceTypeProvider deviceTypeProvider; + + // Test for a valid OID that matches ACCESSDEVICE + @Test + public void testAccessDeviceEnum() { + String devTypeOid = "1.3.6.1.4.1.2606.7.7.4.6144"; + DevTypeEnum result = deviceTypeProvider.getEnumFromOid(devTypeOid); + assertEquals(DevTypeEnum.ACCESSDEVICE, result); + } + + // Test for a valid OID that matches CMCIIIPRODUCTCHASSISCIOC + @Test + public void testCMCIIOid() { + String devTypeOid = "1.3.6.1.4.1.2606.7.7.4.34048"; + DevTypeEnum result = deviceTypeProvider.getEnumFromOid(devTypeOid); + assertEquals(DevTypeEnum.CMCIIIPRODUCTCHASSISCIOC, result); + } + + // Test for a valid OID that matches CMCIIIPRODUCTCHASSISLCPCW + @Test + public void testLCPCWOid() { + String devTypeOid = "1.3.6.1.4.1.2606.7.7.4.9648"; + DevTypeEnum result = deviceTypeProvider.getEnumFromOid(devTypeOid); + assertEquals(DevTypeEnum.CMCIIIPRODUCTCHASSISLCPCW, result); + } + + // Test for an invalid OID format (no number after the last dot) + @Test + public void testInvalidOidFormat() { + String devTypeOid = "1.3.6.1.4.1.2606.7.7.4."; + DevTypeEnum result = deviceTypeProvider.getEnumFromOid(devTypeOid); + assertEquals(DevTypeEnum.CMCIIIPRODUCTCHASSIS_INVALID_OID, result); + } + + // Test for an OID that does not match any enum (returns NOTFOUND) + @Test + public void testNonMatchingOid() { + String devTypeOid = "1.3.6.1.4.1.2606.7.7.4.99999"; + DevTypeEnum result = deviceTypeProvider.getEnumFromOid(devTypeOid); + assertEquals(DevTypeEnum.CMCIIIPRODUCTCHASSIS_NOTFOUND, result); + } + + // Test to ensure the OID parsing returns different results for different OIDs + @Test + public void testDifferentOids() { + String devTypeOid1 = "1.3.6.1.4.1.2606.7.7.4.6144"; + String devTypeOid2 = "1.3.6.1.4.1.2606.7.7.4.34048"; + DevTypeEnum result1 = deviceTypeProvider.getEnumFromOid(devTypeOid1); + DevTypeEnum result2 = deviceTypeProvider.getEnumFromOid(devTypeOid2); + assertNotEquals(result1, result2); + } + + @ParameterizedTest + @MethodSource("provideOidsAndExpectedEnums") + public void testGetEnumFromOid(String oid, DevTypeEnum expectedEnum) { + DevTypeEnum result = deviceTypeProvider.getEnumFromOid(oid); + assertEquals(expectedEnum, result); + } + + static Stream provideOidsAndExpectedEnums() { + return Stream.of( + Arguments.of("1.3.6.1.4.1.2606.7.7.4.256", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORUNKNOWN), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.273", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORACCESS), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.277", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORMOTION), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.279", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORSMOKE), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.281", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORAIRFLOW), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.289", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORINPUTNO), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.290", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORINPUTNC), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.297", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORVOLTAGE), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.305", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORTEMP), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.307", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSOR4TO20MA), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.337", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORFIREERROR), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.338", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORFIREPRE), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.339", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORFIREMAIN), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.345", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORLEAKAGE), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.401", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSOROUTPUT), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.402", DevTypeEnum.CMCIIIPRODUCTCHASSISGATESENSORDOORMAG), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.512", DevTypeEnum.CMCIIIPRODUCTCHASSISGATELOCK), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.768", DevTypeEnum.CMCIIIPRODUCTCHASSISTEMPERATURE), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.1024", DevTypeEnum.CMCIIIPRODUCTCHASSISTEMPHUMI), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.1280", DevTypeEnum.CMCIIIPRODUCTCHASSISVANDALISM), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.1536", DevTypeEnum.CMCIIIPRODUCTCHASSISPRESSURE), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.1792", DevTypeEnum.CMCIIIPRODUCTCHASSISACCESS), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.2048", DevTypeEnum.CMCIIIPRODUCTCHASSISIOINPUT), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.6144", DevTypeEnum.ACCESSDEVICE), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.34048", DevTypeEnum.CMCIIIPRODUCTCHASSISCIOC), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.9648", DevTypeEnum.CMCIIIPRODUCTCHASSISLCPCW), + Arguments.of("1.3.6.1.4.1.2606.7.7.4.99999", DevTypeEnum.CMCIIIPRODUCTCHASSIS_NOTFOUND) // Beispiel für nicht gefundene OID + ); + } +} diff --git a/src/test/java/io/gec/raw/connector/deviceproperty/entity/DevTypeEnumTest.java b/src/test/java/io/gec/raw/connector/deviceproperty/entity/DevTypeEnumTest.java new file mode 100755 index 0000000..964d5c0 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/deviceproperty/entity/DevTypeEnumTest.java @@ -0,0 +1,10 @@ +package io.gec.raw.connector.deviceproperty.entity; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class DevTypeEnumTest { + + +} diff --git a/src/test/java/io/gec/raw/connector/discovery/control/CheckDriverHeaderTest.java b/src/test/java/io/gec/raw/connector/discovery/control/CheckDriverHeaderTest.java new file mode 100755 index 0000000..0d31a49 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/discovery/control/CheckDriverHeaderTest.java @@ -0,0 +1,189 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.driver.control.DeviceDriverController; +import io.gec.raw.connector.driver.control.DeviceDriverServiceClient; +import io.gec.raw.connector.driver.domain.DeviceDriverDTO; +import io.gec.raw.connector.driver.domain.DriverHeaderDTO; +import io.gec.raw.connector.driver.domain.DriverVariableDTO; +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.quarkus.test.InjectMock; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@QuarkusTest +class CheckDriverHeaderTest { + + @Inject + EntityManager entityManager; + @Inject + DeviceDriverService deviceDriverService; + @Inject + DeviceDriverController deviceDriverController; + @InjectMock + @RestClient + DeviceDriverServiceClient deviceDriverServiceClient; + + @BeforeEach + @Transactional + void setup() { + entityManager.createNativeQuery("TRUNCATE connector_svc.driver_header CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.driver_variable CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.value_mapping_container CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.value_mapping CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.variable CASCADE") + .executeUpdate(); + } + + @Test + void shouldFindMatching3rdPartyDriver() { + // given + List deviceDriverDTOs = setUpCompleteTestDriver(); + + // when + deviceDriverController.createDrivers(deviceDriverDTOs); + List result = deviceDriverService.findMatchingDriver("1.3.6.1.4.1.8072.3.2.10", ".*Pruefi.*"); + + // then + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals("bf8157c3-4ca3-489f-aef0-9f76ffbbd5a7", result.get(0).getId().toString()); + } + + @Test + void shouldFindNoMatching3rdPartyDriverWithWrongDescription() { + // given + List deviceDriverDTOs = setUpCompleteTestDriver(); + + // when + deviceDriverController.createDrivers(deviceDriverDTOs); + List result = deviceDriverService.findMatchingDriver("1.3.6.1.4.1.8072.3.2.10", ".*EintrachtWirdImmerSiegen.*"); + + // then + assertEquals(0, result.size()); + } + + @Test + void shouldFindNoMatching3rdPartyDriverWithWrongSysObjectId() { + // given + List deviceDriverDTOs = setUpCompleteTestDriver(); + + // when + deviceDriverController.createDrivers(deviceDriverDTOs); + List result = deviceDriverService.findMatchingDriver("1.2.3.4.5.6.7", ".*Pruefi.*"); + + // then + assertEquals(0, result.size()); + } + + @Test + void shouldFindNoMatching3rdPartyDriverWithMissingField() { + // given + List deviceDriverDTOs = setUpWrongTestDriver(); + + // when + deviceDriverController.createDrivers(deviceDriverDTOs); + List result = deviceDriverService.findMatchingDriver("1.3.6.1.4.1.8072.3.2.10", ".*Pruefi.*"); + + // then + assertEquals(0, result.size()); + } + + private List setUpCompleteTestDriver() { + UUID driverHeader1Id = UUID.fromString("bf8157c3-4ca3-489f-aef0-9f76ffbbd5a7"); + UUID driverHeader2Id = UUID.fromString("91f8c6d2-120c-4810-ba1d-f53f55fe7563"); + + return List.of(DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeader1Id) + .description("Linux Pruefinas 4.4.302+ #69057 SMP Mon Nov 13 14:19:59 CST 2023 aarch64") + .name("SYNOLOGY-DISK.mib") + .sysObjectId("1.3.6.1.4.1.8072.3.2.10") + .bulkPolling(false) + .content("Devices") + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of(DriverVariableDTO.builder() + .id(UUID.fromString("e78f77e4-c4de-4663-b0ed-f80217177f0f")) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeader1Id) + .build())).build(), + DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeader2Id) + .description("tesr") + .name("testmbu") + .sysObjectId("abc") + .bulkPolling(true) + .content("sfds") + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of(DriverVariableDTO.builder() + .id(UUID.fromString("e78f77e4-c4de-4663-b0ed-f80217177f0a")) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeader2Id) + .build() + )).build()); + } + + private List setUpWrongTestDriver() { + UUID driverHeader1Id = UUID.fromString("bf8157c3-4ca3-489f-aef0-9f76ffbbd5a7"); + UUID driverHeader2Id = UUID.fromString("91f8c6d2-120c-4810-ba1d-f53f55fe7563"); + + return List.of(DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeader1Id) + .description(null) + .name("SYNOLOGY-DISK.mib") + .sysObjectId("1.3.6.1.4.1.8072.3.2.10") + .bulkPolling(false) + .content("Devices") + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of(DriverVariableDTO.builder() + .id(UUID.fromString("e78f77e4-c4de-4663-b0ed-f80217177f0f")) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeader1Id) + .build())).build(), + DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeader2Id) + .description("tesr") + .name("testmbu") + .sysObjectId("abc") + .bulkPolling(true) + .content("sfds") + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of(DriverVariableDTO.builder() + .id(UUID.fromString("e78f77e4-c4de-4663-b0ed-f80217177f0a")) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeader2Id) + .build())) + .build()); + } +} + diff --git a/src/test/java/io/gec/raw/connector/discovery/control/DeviceDiscoveryProtocolServiceTest.java b/src/test/java/io/gec/raw/connector/discovery/control/DeviceDiscoveryProtocolServiceTest.java new file mode 100755 index 0000000..9f9dabf --- /dev/null +++ b/src/test/java/io/gec/raw/connector/discovery/control/DeviceDiscoveryProtocolServiceTest.java @@ -0,0 +1,114 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.entity.DiscoveryWorkItem; +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class DeviceDiscoveryProtocolServiceTest { + + @Mock + Logger logger; + @Mock + DeviceController deviceController; + @Mock + DiscoveryController discoveryController; + @Mock + DiscoveryMapper discoveryMapper; + @Mock + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + @Mock + IPAddressHelper ipAddressHelper; + @InjectMocks + DeviceDiscoveryProtocolService deviceDiscoveryProtocolService; + + private UUID deviceId; + private Device device; + private Device rootDevice; + private DiscoveryWorkItem discoveryWorkItem; + private DiscoveryWorkItemDTO discoveryWorkItemDTO; + private String ipAddress; + private SnmpProtocolData snmpProtocolData; + + @BeforeEach + void setUp() { + deviceId = UUID.randomUUID(); + device = mock(Device.class); + rootDevice = mock(Device.class); + discoveryWorkItem = mock(DiscoveryWorkItem.class); + discoveryWorkItemDTO = mock(DiscoveryWorkItemDTO.class); + ipAddress = "192.168.0.1"; + snmpProtocolData = mock(SnmpProtocolData.class); + } + + @Test + void shouldFindDeviceDiscoveryProtocolData_success() { + // given + when(deviceController.getDeviceById(any())).thenReturn(device); + when(deviceController.getRootDevice(any())).thenReturn(rootDevice); + when(rootDevice.getDeviceURL()).thenReturn("http://192.168.0.1"); + when(ipAddressHelper.removeHttpFromIpAddress(any())).thenReturn(ipAddress); + when(discoveryController.findByCommunicationServiceId(any())).thenReturn(discoveryWorkItem); + when(discoveryMapper.createDiscoveryWorkItemDTO(any())).thenReturn(discoveryWorkItemDTO); + when(discoveryWorkItemToDiscoveryDataMapper.toSnmpProtocolData(any())).thenReturn(snmpProtocolData); + + // when + var result = deviceDiscoveryProtocolService.findDeviceDiscoveryProtocolData(deviceId); + + // then + assertNotNull(result); + assertEquals(ipAddress, result.deviceIP()); + assertEquals(snmpProtocolData, result.snmpProtocolData()); + verify(logger, times(1)).debugf("[CACHE:MISS] DeviceDiscoveryProtocolData for Device(ID=%s)", deviceId); + verify(deviceController, times(1)).getRootDevice(any()); + verify(ipAddressHelper, times(1)).removeHttpFromIpAddress(any()); + verify(discoveryController, times(1)).findByCommunicationServiceId(any()); + verify(discoveryMapper, times(1)).createDiscoveryWorkItemDTO(any()); + verify(discoveryWorkItemToDiscoveryDataMapper, times(1)).toSnmpProtocolData(any()); + } + + @Test + void shouldFindDeviceDiscoveryProtocolData_fail_deviceIdIsNull() { + // given + UUID deviceId = null; + + // when&then + var exception = assertThrows( + IllegalArgumentException.class, + () -> deviceDiscoveryProtocolService.findDeviceDiscoveryProtocolData(deviceId) + ); + + assertEquals("deviceId is null", exception.getMessage()); + } + + @Test + void shouldInvalidateCacheDeviceDiscoveryProtocolData_success() { + // when + deviceDiscoveryProtocolService.invalidateCacheDeviceDiscoveryProtocolData(); + + // then + verify(logger, times(1)).debug("[CACHE:INVALIDATE] DeviceDiscoveryProtocolData"); + } +} diff --git a/src/test/java/io/gec/raw/connector/discovery/control/DiscoveryControllerTest.java b/src/test/java/io/gec/raw/connector/discovery/control/DiscoveryControllerTest.java new file mode 100755 index 0000000..200e0e2 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/discovery/control/DiscoveryControllerTest.java @@ -0,0 +1,114 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.communicationservice.control.CommunicationService; +import io.gec.raw.connector.device.dto.DeviceResponseDTO; +import io.gec.raw.connector.config.entity.ConnectorConfig; +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemUpdateDTO; +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.gec.raw.connector.device.control.DeviceStructureService; +import io.gec.raw.connector.device.control.ExternalDeviceBuilder; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.snmp.common.control.SnmpWalk; +import io.gec.raw.connector.utils.TestDTOFactory; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class DiscoveryControllerTest { + + @Mock + CommunicationService communicationService; + @Mock + ConnectorConfig connectorConfig; + @Mock + Logger logger; + @Mock + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + @Mock + SnmpWalk snmpWalk; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + SnmpConfig snmpConfig; + @Mock + DeviceDriverService deviceDriverService; + @Mock + DeviceController deviceController; + @Mock + ExternalDeviceBuilder externalDeviceBuilder; + @Mock + DeviceStructureService deviceStructureService; + @Mock + SnmpDiscoveryAsyncRunner snmpDiscoveryAsyncRunner; + @Mock + DiscoveryWorkItemRepository discoveryWorkItemRepository; + @Mock + DeviceDiscoveryProtocolService deviceDiscoveryProtocolService; + @InjectMocks + DiscoveryController discoveryController; + + @Test + void shouldMethodsBeCalledExpectedNumberOfTimes() { + // given + DiscoveryWorkItemDTO dwi = TestDTOFactory.createDiscoveryWorkItemDTO(DiscoveryWorkItemStatus.INSERTED); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + //and + when(snmpConfig.getDiscoveryRootOid()).thenReturn("1.2"); + when(discoveryWorkItemToDiscoveryDataMapper.toSnmpMessageDataList(any(), any())).thenReturn(List.of()); + when(snmpDiscoveryAsyncRunner.startParallelDiscovery(any(), any())).thenReturn(List.of()); + when(snmpDiscoveryAsyncRunner.checkIfFinished(any(), anyInt())).thenReturn(true); + + // when + discoveryController.performDiscovery(dwi, processingCancellationCheckerMock); + + // then + verify(communicationService, times(0)) + .updateDiscoveryWorkItem(any(UUID.class), any(DiscoveryWorkItemUpdateDTO.class)); + verify(snmpDiscoveryAsyncRunner, times(1)).startParallelDiscovery(any(), any()); + verify(snmpDiscoveryAsyncRunner, times(1)).checkIfFinished(any(), anyInt()); + verify(snmpDiscoveryAsyncRunner, times(1)).cleanup(); + verify(deviceDiscoveryProtocolService, times(1)).invalidateCacheDeviceDiscoveryProtocolData(); + } + + @Test + void shouldCallCreateExternalDeviceBuilderMethodOnce() throws Exception { + // given + when(deviceController.storeDevice(any(), any(), any())).thenReturn(new Device()); + lenient().when(communicationService.createOrUpdateDevicesWithSubDevices(any())).thenReturn(new DeviceResponseDTO()); + lenient().doNothing() + .when(deviceController).updateCommSvcId(any()); + when(deviceDriverService.findMatchingDriver(any(), any())).thenReturn(createTwoDriverHeaders()); + lenient().when(externalDeviceBuilder.buildDeviceTree(any(), any(), any(), any(), any())).thenReturn(new DeviceMapping()); + + // when + discoveryController.evaluateOidValueMap(TestDTOFactory.createDiscoveryWorkItemDTO(DiscoveryWorkItemStatus.RUNNING), new DeviceOidValueMap(), ""); + + // then + verify(deviceStructureService, times(1)) + .createExternalDeviceStructure(any(), any(), any(), any(), any()); + } + + private List createTwoDriverHeaders() { + DriverHeader first = new DriverHeader(); + first.setId(UUID.randomUUID()); + DriverHeader second = new DriverHeader(); + second.setId(UUID.randomUUID()); + return List.of(first, second); + } +} diff --git a/src/test/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryAsyncRunnerTest.java b/src/test/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryAsyncRunnerTest.java new file mode 100755 index 0000000..f6c270d --- /dev/null +++ b/src/test/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryAsyncRunnerTest.java @@ -0,0 +1,150 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.discovery.entity.SnmpDiscoveryData; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; +import io.gec.raw.connector.utils.TestDTOFactory; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class SnmpDiscoveryAsyncRunnerTest { + + private static final int HOSTS_TO_DISCOVER = 100; + + @Mock + SnmpDiscoveryThreadPool snmpDiscoveryThreadPool; + @Mock + Logger logger; + @InjectMocks + SnmpDiscoveryAsyncRunner snmpDiscoveryAsyncRunner; + + @Test + void shouldStartParallelDiscovery_finishWithAllFinished() { + // given + DiscoveryWorkItemDTO dwiDTO = TestDTOFactory.createDiscoveryWorkItemDTO(DiscoveryWorkItemStatus.RUNNING); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + List snmpDiscoveryData = createSnmpMessageData().stream() + .map(snmpMessageData -> SnmpDiscoveryData.of(dwiDTO, snmpMessageData, processingCancellationCheckerMock)) + .toList(); + // and + ThreadPoolExecutor threadPoolExecutor = createThreadPool(); + when(snmpDiscoveryThreadPool.getThreadPool()).thenReturn(threadPoolExecutor); + + // when + List results = snmpDiscoveryAsyncRunner.startParallelDiscovery( + data -> DiscoveryWorkItemStatus.FINISHED, + snmpDiscoveryData); + + // then + assertNotNull(results); + assertEquals(HOSTS_TO_DISCOVER, results.size()); + assertTrue(allResultsWithGivenStatus(results, DiscoveryWorkItemStatus.FINISHED)); + } + + @Test + void shouldStartParallelDiscovery_finishWithAllCanceled() { + // given + DiscoveryWorkItemDTO dwiDTO = TestDTOFactory.createDiscoveryWorkItemDTO(DiscoveryWorkItemStatus.RUNNING); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + List snmpDiscoveryData = createSnmpMessageData().stream() + .map(snmpMessageData -> SnmpDiscoveryData.of(dwiDTO, snmpMessageData, processingCancellationCheckerMock)) + .toList(); + // and + ThreadPoolExecutor threadPoolExecutor = createThreadPool(); + when(snmpDiscoveryThreadPool.getThreadPool()).thenReturn(threadPoolExecutor); + + // when + List results = snmpDiscoveryAsyncRunner.startParallelDiscovery( + data -> DiscoveryWorkItemStatus.CANCELED, + snmpDiscoveryData); + + // then + assertNotNull(results); + assertEquals(HOSTS_TO_DISCOVER, results.size()); + assertTrue(allResultsWithGivenStatus(results, DiscoveryWorkItemStatus.CANCELED)); + } + + @Test + void shouldStartParallelDiscovery_finishWithFinishedAndCanceled() { + // given + DiscoveryWorkItemDTO dwiDTO = TestDTOFactory.createDiscoveryWorkItemDTO(DiscoveryWorkItemStatus.RUNNING); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + List snmpDiscoveryData = createSnmpMessageData().stream() + .map(snmpMessageData -> SnmpDiscoveryData.of(dwiDTO, snmpMessageData, processingCancellationCheckerMock)) + .toList(); + // and + ThreadPoolExecutor threadPoolExecutor = createThreadPool(); + when(snmpDiscoveryThreadPool.getThreadPool()).thenReturn(threadPoolExecutor); + when(processingCancellationCheckerMock.isProcessingCanceled()).thenReturn(true); + + // when + List results = snmpDiscoveryAsyncRunner.startParallelDiscovery( + data -> { + try { + Thread.sleep(1000); // used on purpose to simulate blocking task execution + } catch (InterruptedException e) { + // empty on purpose + } + return DiscoveryWorkItemStatus.FINISHED;}, + snmpDiscoveryData); + + // then + assertNotNull(results); + assertEquals(HOSTS_TO_DISCOVER, results.size()); + assertTrue(someResultsWithGivenStatus(results, DiscoveryWorkItemStatus.FINISHED)); + assertTrue(someResultsWithGivenStatus(results, DiscoveryWorkItemStatus.CANCELED)); + // and + verify(snmpDiscoveryThreadPool, times(HOSTS_TO_DISCOVER)).getThreadPool(); + } + + private List createSnmpMessageData() { + return IntStream.range(0, HOSTS_TO_DISCOVER) + .mapToObj(this::prepareHost) + .toList(); + } + + private SnmpMessageData prepareHost(int index) { + return SnmpMessageData.builder() + .hostname(String.format("192.168.1.%d", index)) + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .build(); + } + + private ThreadPoolExecutor createThreadPool() { + return new ThreadPoolExecutor( + 2, + 2, + 0L, + TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(HOSTS_TO_DISCOVER)); + } + + private boolean allResultsWithGivenStatus(List discoveryResults, DiscoveryWorkItemStatus expectedStatus) { + return discoveryResults.stream().allMatch(expectedStatus::equals); + } + + private boolean someResultsWithGivenStatus(List discoveryResults, DiscoveryWorkItemStatus expectedStatus) { + return discoveryResults.stream().anyMatch(expectedStatus::equals); + } +} diff --git a/src/test/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryThreadPoolTest.java b/src/test/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryThreadPoolTest.java new file mode 100755 index 0000000..7c34e66 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/discovery/control/SnmpDiscoveryThreadPoolTest.java @@ -0,0 +1,49 @@ +package io.gec.raw.connector.discovery.control; + +import io.gec.raw.connector.config.entity.SnmpConfig; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.concurrent.ExecutorService; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +@ExtendWith(MockitoExtension.class) +class SnmpDiscoveryThreadPoolTest { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + SnmpConfig snmpConfig; + @InjectMocks + SnmpDiscoveryThreadPool snmpDiscoveryThreadPool; + + @Test + void shouldReturnThreadPool() { + // given + Mockito.when(snmpConfig.getDiscoveryPoolSize()).thenReturn(2); + + // when + ExecutorService threadPool = snmpDiscoveryThreadPool.getThreadPool(); + + // then + Assertions.assertNotNull(threadPool); + } + + @Test + void shouldCleanUpThreadPool() { + // given + Mockito.when(snmpConfig.getDiscoveryPoolSize()).thenReturn(2); + snmpDiscoveryThreadPool.getThreadPool(); + + // when + snmpDiscoveryThreadPool.cleanup(); + + // then + assertFalse(snmpDiscoveryThreadPool.isPoolInitialized()); + } +} diff --git a/src/test/java/io/gec/raw/connector/discovery/handler/DiscoveryJobHandlerTest.java b/src/test/java/io/gec/raw/connector/discovery/handler/DiscoveryJobHandlerTest.java new file mode 100755 index 0000000..33ae6bc --- /dev/null +++ b/src/test/java/io/gec/raw/connector/discovery/handler/DiscoveryJobHandlerTest.java @@ -0,0 +1,221 @@ +package io.gec.raw.connector.discovery.handler; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.domain.DiscoveryWorkItemResult; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class DiscoveryJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + DiscoveryController discoveryController; + @InjectMocks + DiscoveryJobHandler discoveryJobHandler; + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var dwiDTO = new DiscoveryWorkItemDTO(); + //and + willReturn(Optional.of(dwiDTO)).given(communicationServiceController).fetchDiscoveryWorkItem(workItemId); + + //when + var result = discoveryJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(dwiDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchDiscoveryWorkItem(workItemId); + + //when + var result = discoveryJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @Test + void shouldStartProcessing_updateDiscoveryWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var dwiDTO = new DiscoveryWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, dwiDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updateDiscoveryWorkItem(eq(workItemId), any()); + + //when + discoveryJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updateDiscoveryWorkItem( + eq(workItemId), + argThat(discoveryWorkItemUpdateDTO -> discoveryWorkItemUpdateDTO.getDiscoveryStatusEnum() == DiscoveryWorkItemStatus.RUNNING + && discoveryWorkItemUpdateDTO.getMessage() == null)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFinishedResult() { + //given + UUID workItemId = UUID.randomUUID(); + var dwiDTO = new DiscoveryWorkItemDTO(); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + var workItemWrapper = new WorkItemWrapper<>(workItemId, dwiDTO, processingCancellationCheckerMock); + //and + willReturn(DiscoveryWorkItemStatus.FINISHED).given(discoveryController).performDiscovery(dwiDTO, processingCancellationCheckerMock); + + //when + var result = discoveryJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(DiscoveryWorkItemStatus.FINISHED)); + assertThat(result.getMessage(), is(nullValue())); + verify(discoveryController, times(1)).performDiscovery(dwiDTO, processingCancellationCheckerMock); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withCanceledResult() { + //given + UUID workItemId = UUID.randomUUID(); + var dwiDTO = new DiscoveryWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, dwiDTO, () -> true); + + //when + var result = discoveryJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(DiscoveryWorkItemStatus.CANCELED)); + assertThat(result.getMessage(), is(nullValue())); + verify(discoveryController, times(0)).performDiscovery(any(), any()); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResult_whenPerformDiscoveryThrowsException() { + //given + UUID workItemId = UUID.randomUUID(); + var dwiDTO = new DiscoveryWorkItemDTO(); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + var workItemWrapper = new WorkItemWrapper<>(workItemId, dwiDTO, processingCancellationCheckerMock); + //and + willThrow(new RuntimeException("exception message")).given(discoveryController).performDiscovery(dwiDTO, processingCancellationCheckerMock); + + //when + var result = discoveryJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(DiscoveryWorkItemStatus.FAILED)); + assertThat(result.getMessage(), is("exception message")); + verify(discoveryController, times(1)).performDiscovery(dwiDTO, processingCancellationCheckerMock); + } + + @ParameterizedTest + @EnumSource(DiscoveryWorkItemStatus.class) + void shouldFinishProcessing_updateDiscoveryWorkItem(DiscoveryWorkItemStatus discoveryWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var dwiDTO = new DiscoveryWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, dwiDTO, () -> false); + var discoveryWorkItemResult = new DiscoveryWorkItemResult(discoveryWorkItemStatus, "result message"); + //and + willDoNothing().given(communicationServiceController).updateDiscoveryWorkItem(eq(workItemId), any()); + + //when + discoveryJobHandler.finishProcessing(workItemWrapper, discoveryWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateDiscoveryWorkItem( + eq(workItemId), + argThat(discoveryWorkItemUpdateDTO -> discoveryWorkItemUpdateDTO.getDiscoveryStatusEnum() == discoveryWorkItemStatus + && "result message".equals(discoveryWorkItemUpdateDTO.getMessage()))); + } + + @ParameterizedTest + @MethodSource("getDiscoveryWorkItemStatusesForMapping") + void shouldMapToJobResult(DiscoveryWorkItemStatus discoveryWorkItemStatus, JobStatus jobStatus) { + //given + var discoveryWorkItemResult = new DiscoveryWorkItemResult(discoveryWorkItemStatus, "message"); + + //when + var result = discoveryJobHandler.mapToJobResult(discoveryWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getDiscoveryWorkItemStatusesForMapping() { + return Stream.of( + of(DiscoveryWorkItemStatus.FINISHED, JobStatus.DONE), + of(DiscoveryWorkItemStatus.FAILED, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource(value = DiscoveryWorkItemStatus.class, names = {"FINISHED", "FAILED", "CANCELED"}, mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(DiscoveryWorkItemStatus discoveryWorkItemStatus) { + //given + var discoveryWorkItemResult = new DiscoveryWorkItemResult(discoveryWorkItemStatus); + + //expect + assertThrows(IllegalStateException.class, () -> { + discoveryJobHandler.mapToJobResult(discoveryWorkItemResult); + }); + } + + @Test + void shouldGetJobType() { + //when + var result = discoveryJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.DISCOVERY)); + } +} diff --git a/src/test/java/io/gec/raw/connector/driver/control/DeviceDriverControllerIT.java b/src/test/java/io/gec/raw/connector/driver/control/DeviceDriverControllerIT.java new file mode 100755 index 0000000..130d292 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/driver/control/DeviceDriverControllerIT.java @@ -0,0 +1,1102 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import io.gec.raw.connector.driver.domain.*; +import io.gec.raw.connector.driver.entity.DriverHeader; +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.gec.raw.connector.driver.entity.ValueMapping; +import io.gec.raw.connector.driver.entity.ValueMappingContainer; +import io.gec.raw.connector.variable.control.VariableRepository; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.variable.entity.Variable; +import io.quarkus.test.InjectMock; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityNotFoundException; +import jakarta.transaction.Transactional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.OffsetDateTime; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +@QuarkusTest +class DeviceDriverControllerIT { + + @Inject + EntityManager entityManager; + @Inject + DriverHeaderRepository driverHeaderRepository; + @Inject + DriverVariableRepository driverVariableRepository; + @Inject + ValueMappingContainerRepository valueMappingContainerRepository; + @Inject + ValueMappingRepository valueMappingRepository; + @Inject + VariableRepository variableRepository; + @Inject + DeviceDriverController deviceDriverController; + @InjectMock + @RestClient + DeviceDriverServiceClient deviceDriverServiceClient; + + @BeforeEach + @Transactional + void setup() { + entityManager.createNativeQuery("TRUNCATE connector_svc.driver_header CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.driver_variable CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.value_mapping_container CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.value_mapping CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.variable CASCADE") + .executeUpdate(); + } + + @Test + void shouldProcessDeviceDriversCreateHeaderWithAllHierarchy() { + // given + UUID driverHeaderId = UUID.randomUUID(); + UUID driverVariableId = UUID.randomUUID(); + UUID valueMappingContainerId = UUID.randomUUID(); + UUID valueMappingId = UUID.randomUUID(); + + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(driverVariableId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(valueMappingContainerId) + .build())) + .valueMappingContainerDTOs(List.of(ValueMappingContainerDTO.builder() + .id(valueMappingContainerId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(driverVariableId)) + .valueMappingIds(List.of(valueMappingId)) + .build())) + .valueMappingDTOs(List.of(ValueMappingDTO.builder() + .id(valueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(valueMappingContainerId) + .build())) + .build(); + + // when + deviceDriverController.processDeviceDrivers(List.of(deviceDriverDTO)); + + // then + DriverHeader driverHeader = driverHeaderRepository.findById(driverHeaderId); + assertNotNull(driverHeader); + DriverVariable driverVariable = driverHeader.getDriverVariables().get(0); + assertNotNull(driverVariable); + ValueMappingContainer valueMappingContainer = driverVariable.getValueMappingContainer(); + assertNotNull(valueMappingContainer); + ValueMapping valueMapping = valueMappingContainer.getValueMappings().get(0); + assertNotNull(valueMapping); + } + + @Test + void shouldProcessDeviceDriversDoNothingWhenListIsEmpty() { + // given + deviceDriverController.processDeviceDrivers(List.of()); + + // when + List driverHeaders = driverHeaderRepository.listAll(); + List driverVariables = driverVariableRepository.listAll(); + List valueMappingContainers = valueMappingContainerRepository.listAll(); + List valueMappings = valueMappingRepository.listAll(); + + // then + assertNotNull(driverHeaders); + assertEquals(0, driverHeaders.size()); + assertNotNull(driverVariables); + assertEquals(0, driverVariables.size()); + assertNotNull(valueMappingContainers); + assertEquals(0, valueMappingContainers.size()); + assertNotNull(valueMappings); + assertEquals(0, valueMappings.size()); + } + + @Test + void shouldProcessDeviceDriversUpdateHeaderWithAllHierarchy() { + // given + UUID driverHeaderId = UUID.randomUUID(); + UUID driverVariableId = UUID.randomUUID(); + UUID valueMappingContainerId = UUID.randomUUID(); + UUID valueMappingId = UUID.randomUUID(); + + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .payload("somePayload") + .name("someName") + .description("someDescription") + .sysObjectId("someSysObjectId") + .bulkPolling(true) + .content("someContent") + .devices("someDevices") + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(driverVariableId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .payload("somePayload") + .name("someName") + .description("someDescription") + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(valueMappingContainerId) + .oid("someOid") + .dataType(DataTypeEnum.STRING) + .displayFormat("someDisplayFormat") + .displayFactor("someDisplayFactor") + .isReadOnly(true) + .min("someMin") + .max("someMax") + .step("someStep") + .intervalFactor("someIntervalFactor") + .displayName("someDisplayName") + .functionType(FunctionTypeEnum.VALUE) + .baseOid("someBaseOid") + .build())) + .valueMappingContainerDTOs(List.of(ValueMappingContainerDTO.builder() + .id(valueMappingContainerId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(driverVariableId)) + .valueMappingIds(List.of(valueMappingId)) + .build())) + .valueMappingDTOs(List.of(ValueMappingDTO.builder() + .id(valueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .value("someValue") + .mapping("someMapping") + .valueMappingContainerId(valueMappingContainerId) + .build())) + .build(); + deviceDriverController.processDeviceDrivers(List.of(deviceDriverDTO)); + + // when + UUID newValueMappingId = UUID.randomUUID(); + DeviceDriverDTO updatedDeviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .payload("newPayload") + .name("newName") + .description("newDescription") + .sysObjectId("newSysObjectId") + .bulkPolling(false) + .content("newContent") + .devices("newDevices") + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(driverVariableId) + .payload("newPayload") + .name("newName") + .description("newDescription") + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(valueMappingContainerId) + .oid("newOid") + .dataType(DataTypeEnum.STATUSINT) + .displayFormat("newDisplayFormat") + .displayFactor("newDisplayFactor") + .isReadOnly(false) + .min("newMin") + .max("newMax") + .step("newStep") + .intervalFactor("newIntervalFactor") + .displayName("newDisplayName") + .functionType(FunctionTypeEnum.UNDEFINED) + .baseOid("newBaseOid") + .build())) + .valueMappingContainerDTOs(List.of(ValueMappingContainerDTO.builder() + .id(valueMappingContainerId) + .driverVariableIds(List.of(driverVariableId)) + .valueMappingIds(List.of(newValueMappingId)) + .build())) + .valueMappingDTOs(List.of(ValueMappingDTO.builder() + .id(newValueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .value("newValue") + .mapping("newMapping") + .valueMappingContainerId(valueMappingContainerId) + .build())) + .build(); + deviceDriverController.processDeviceDrivers(List.of(updatedDeviceDriverDTO)); + + // then + DriverHeader driverHeader = driverHeaderRepository.findById(driverHeaderId); + assertNotNull(driverHeader); + assertEquals(driverHeaderId, driverHeader.getId()); + assertNotNull(driverHeader.getCreated()); + assertNotNull(driverHeader.getStamp()); + assertTrue(driverHeader.getStamp().isAfter(driverHeader.getCreated())); + assertEquals("newPayload", driverHeader.getPayload()); + assertEquals("newName", driverHeader.getName()); + assertEquals("newDescription", driverHeader.getDescription()); + assertEquals("newSysObjectId", driverHeader.getSysObjectId()); + assertFalse(driverHeader.getBulkPolling()); + assertEquals("newContent", driverHeader.getContent()); + assertEquals("newDevices", driverHeader.getDevices()); + + assertNotNull(driverHeader.getDriverVariables()); + assertFalse(driverHeader.getDriverVariables().isEmpty()); + assertEquals(1, driverHeader.getDriverVariables().size()); + Optional optionalDriverVariable = driverHeader.getDriverVariables().stream() + .filter(dv -> driverVariableId.equals(dv.getId())) + .findFirst(); + assertTrue(optionalDriverVariable.isPresent()); + DriverVariable driverVariable = optionalDriverVariable.get(); + assertNotNull(driverVariable.getCreated()); + assertNotNull(driverVariable.getStamp()); + assertTrue(driverVariable.getStamp().isAfter(driverVariable.getCreated())); + assertEquals("newPayload", driverVariable.getPayload()); + assertEquals("newName", driverVariable.getName()); + assertEquals("newDescription", driverVariable.getDescription()); + assertEquals("newOid", driverVariable.getOid()); + assertEquals(DataTypeEnum.STATUSINT, driverVariable.getDataType()); + assertEquals("newDisplayFormat", driverVariable.getDisplayFormat()); + assertEquals("newDisplayFactor", driverVariable.getDisplayFactor()); + assertFalse(driverVariable.getIsReadOnly()); + assertEquals("newMin", driverVariable.getMin()); + assertEquals("newMax", driverVariable.getMax()); + assertEquals("newStep", driverVariable.getStep()); + assertEquals("newIntervalFactor", driverVariable.getIntervalFactor()); + assertEquals("newDisplayName", driverVariable.getDisplayName()); + assertEquals(FunctionTypeEnum.UNDEFINED, driverVariable.getFunctionType()); + assertEquals("newBaseOid", driverVariable.getBaseOid()); + + ValueMappingContainer valueMappingContainer = driverVariable.getValueMappingContainer(); + assertNotNull(valueMappingContainer); + assertEquals(valueMappingContainerId, valueMappingContainer.getId()); + assertNotNull(valueMappingContainer.getCreated()); + assertNotNull(valueMappingContainer.getStamp()); + assertTrue(valueMappingContainer.getStamp().isEqual(valueMappingContainer.getCreated()) + || valueMappingContainer.getStamp().isAfter(valueMappingContainer.getCreated())); + + assertNotNull(valueMappingContainer.getValueMappings()); + assertEquals(1, valueMappingContainer.getValueMappings().size()); + Optional optionalValueMapping = valueMappingContainer.getValueMappings().stream() + .filter(vm -> newValueMappingId.equals(vm.getId())) + .findFirst(); + assertTrue(optionalValueMapping.isPresent()); + ValueMapping valueMapping = optionalValueMapping.get(); + assertNotNull(valueMapping.getCreated()); + assertNotNull(valueMapping.getStamp()); + assertEquals("newValue", valueMapping.getValue()); + assertEquals("newMapping", valueMapping.getMapping()); + } + + @Test + void shouldProcessDeviceDriversDeleteUnusedDriverVariablesWithSubsquentContainersAndUpdateAndCreate() { + // given + UUID driverHeaderId = UUID.randomUUID(); + + UUID dv1Id = UUID.randomUUID(); // to be updated + UUID dv2WithRelationToVariableId = UUID.randomUUID(); // to be not removed due to relation to existing variable + UUID dv3WithRelationToVmc1Id = UUID.randomUUID(); // to be removed + UUID dv4 = UUID.randomUUID(); // to be removed + UUID dv5 = UUID.randomUUID(); // to be removed but the assigned value mappings container should be preserved + UUID dv6 = UUID.randomUUID(); // to be created with new value mappings container + UUID dv7 = UUID.randomUUID(); // to be created with value mappings container of removed driver variable (vmc5) + + UUID vmc1Id = UUID.randomUUID(); + UUID vmc2Id = UUID.randomUUID(); + UUID vmc4Id = UUID.randomUUID(); + UUID vmc5Id = UUID.randomUUID(); + UUID vmc6Id = UUID.randomUUID(); + + UUID vm1Id = UUID.randomUUID(); + UUID vm2Id = UUID.randomUUID(); + UUID vm4Id = UUID.randomUUID(); + UUID vm5Id = UUID.randomUUID(); + UUID vm6Id = UUID.randomUUID(); + UUID newVm5Id = UUID.randomUUID(); + + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(dv1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(vmc1Id) + .build(), + DriverVariableDTO.builder() + .id(dv2WithRelationToVariableId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(vmc2Id) + .build(), + DriverVariableDTO.builder() + .id(dv3WithRelationToVmc1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(vmc1Id) + .build(), + DriverVariableDTO.builder() + .id(dv4) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(vmc4Id) + .build(), + DriverVariableDTO.builder() + .id(dv5) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(vmc5Id) + .build())) + .valueMappingContainerDTOs(List.of( + ValueMappingContainerDTO.builder() + .id(vmc1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv1Id, dv3WithRelationToVmc1Id)) + .valueMappingIds(List.of(vm1Id)) + .build(), + ValueMappingContainerDTO.builder() + .id(vmc2Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv2WithRelationToVariableId)) + .valueMappingIds(List.of(vm2Id)) + .build(), + ValueMappingContainerDTO.builder() + .id(vmc4Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv4)) + .valueMappingIds(List.of(vm4Id)) + .build(), + ValueMappingContainerDTO.builder() + .id(vmc5Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv5)) + .valueMappingIds(List.of(vm5Id)) + .build())) + .valueMappingDTOs(List.of( + ValueMappingDTO.builder() + .id(vm1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc1Id) + .build(), + ValueMappingDTO.builder() + .id(vm2Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc2Id) + .build(), + ValueMappingDTO.builder() + .id(vm4Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc4Id) + .build(), + ValueMappingDTO.builder() + .id(vm5Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc5Id) + .build(), + ValueMappingDTO.builder() + .id(vm6Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc6Id) + .build())) + .build(); + deviceDriverController.processDeviceDrivers(List.of(deviceDriverDTO)); + createVariable(dv2WithRelationToVariableId); + + // when + UUID newValueMappingId = UUID.randomUUID(); + DeviceDriverDTO updatedDeviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO( + DriverHeaderDTO.builder() + .id(driverHeaderId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(dv1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(vmc1Id) + .build(), + DriverVariableDTO.builder() + .id(dv6) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(vmc6Id) + .build(), + DriverVariableDTO.builder() + .id(dv7) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(vmc5Id) + .build())) + .valueMappingContainerDTOs(List.of( + ValueMappingContainerDTO.builder() + .id(vmc1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv1Id)) + .valueMappingIds(List.of(newValueMappingId)) + .build(), + ValueMappingContainerDTO.builder() + .id(vmc5Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv7)) + .valueMappingIds(List.of(newVm5Id)) + .build(), + ValueMappingContainerDTO.builder() + .id(vmc6Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv6)) + .valueMappingIds(List.of(vm6Id)) + .build())) + .valueMappingDTOs(List.of( + ValueMappingDTO.builder() + .id(newValueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc1Id) + .build(), + ValueMappingDTO.builder() + .id(newVm5Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc5Id) + .build(), + ValueMappingDTO.builder() + .id(vm6Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc6Id) + .build())) + .build(); + deviceDriverController.processDeviceDrivers(List.of(updatedDeviceDriverDTO)); + + // then + DriverHeader driverHeader = driverHeaderRepository.findById(driverHeaderId); + assertNotNull(driverHeader); + + List finalDriverVariables = driverHeader.getDriverVariables(); + assertNotNull(finalDriverVariables); + assertEquals(4, finalDriverVariables.size()); + assertTrue(finalDriverVariables.stream() + .map(DriverVariable::getId) + .toList() + .containsAll(List.of(dv1Id, dv2WithRelationToVariableId, dv6, dv7))); + + List valueMappingContainers = finalDriverVariables.stream() + .map(DriverVariable::getValueMappingContainer) + .toList(); + List valueMappingContainerIds = valueMappingContainers.stream() + .map(ValueMappingContainer::getId) + .toList(); + assertEquals(4, valueMappingContainerIds.size()); + assertTrue(valueMappingContainerIds.containsAll(List.of(vmc1Id, vmc2Id, vmc5Id, vmc6Id))); + + List valueMappingIds = valueMappingContainers.stream() + .map(ValueMappingContainer::getValueMappings) + .flatMap(Collection::stream) + .map(ValueMapping::getId) + .toList(); + assertEquals(4, valueMappingIds.size()); + assertTrue(valueMappingIds.containsAll(List.of(newValueMappingId, vm2Id, newVm5Id, vm6Id))); + } + + @Test + void shouldProcessDeviceDriversDeleteUnusedDriverAndLeaveDriverWithDriverVariableRefferingVariable() { + // given + UUID dh1Id = UUID.randomUUID(); // to be removed completely + UUID dh2Id = UUID.randomUUID(); // can not remove this because one of driverVariables has relation to variable + + UUID dv1Id = UUID.randomUUID(); + UUID dv2WithRelationToVariableId = UUID.randomUUID(); // to be not removed due to relation to existing variable + + UUID vmc1Id = UUID.randomUUID(); + UUID vmc2Id = UUID.randomUUID(); + + UUID vm1Id = UUID.randomUUID(); + UUID vm2Id = UUID.randomUUID(); + + List deviceDriverDTOs = List.of( + DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(dh1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(dv1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(dh1Id) + .valueMappingContainerId(vmc1Id) + .build())) + .valueMappingContainerDTOs(List.of( + ValueMappingContainerDTO.builder() + .id(vmc1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv1Id)) + .valueMappingIds(List.of(vm1Id)) + .build())) + .valueMappingDTOs(List.of( + ValueMappingDTO.builder() + .id(vm1Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc1Id) + .build())) + .build(), + DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(dh2Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(dv2WithRelationToVariableId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(dh2Id) + .valueMappingContainerId(vmc2Id) + .build())) + .valueMappingContainerDTOs(List.of( + ValueMappingContainerDTO.builder() + .id(vmc2Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(dv2WithRelationToVariableId)) + .valueMappingIds(List.of(vm2Id)) + .build())) + .valueMappingDTOs(List.of( + ValueMappingDTO.builder() + .id(vm2Id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(vmc2Id) + .build())) + .build()); + deviceDriverController.processDeviceDrivers(deviceDriverDTOs); + createVariable(dv2WithRelationToVariableId); + + // when + DeviceDriverDTO updatedDeviceDriverDTO = DeviceDriverDTO.builder().build(); + deviceDriverController.processDeviceDrivers(List.of(updatedDeviceDriverDTO)); + + // then + DriverHeader driverHeader1 = driverHeaderRepository.findById(dh1Id); + assertNull(driverHeader1); + DriverHeader driverHeader2 = driverHeaderRepository.findById(dh2Id); + assertNotNull(driverHeader2); + + List finalDriverVariables = driverHeader2.getDriverVariables(); + assertNotNull(finalDriverVariables); + assertEquals(1, finalDriverVariables.size()); + assertTrue(finalDriverVariables.stream() + .map(DriverVariable::getId) + .toList() + .contains(dv2WithRelationToVariableId)); + + List valueMappingContainers = finalDriverVariables.stream() + .map(DriverVariable::getValueMappingContainer) + .toList(); + List valueMappingContainerIds = valueMappingContainers.stream() + .map(ValueMappingContainer::getId) + .toList(); + assertEquals(1, valueMappingContainerIds.size()); + assertTrue(valueMappingContainerIds.contains(vmc2Id)); + + List valueMappingIds = valueMappingContainers.stream() + .map(ValueMappingContainer::getValueMappings) + .flatMap(Collection::stream) + .map(ValueMapping::getId) + .toList(); + assertEquals(1, valueMappingIds.size()); + assertTrue(valueMappingIds.contains(vm2Id)); + } + + @Test + void shouldCreateDeviceDriverThrowAnExceptionWhenAlreadyExists() { + // given + UUID driverHeaderId = UUID.randomUUID(); + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .build()) + .build(); + deviceDriverController.createDriver(deviceDriverDTO); + + // when & then + assertThrows(Exception.class, () -> deviceDriverController.createDriver(deviceDriverDTO)); + } + + @Test + void shouldCreateDeviceDriversCreateHeaderWithAllHierarchy() { + // given + UUID driverHeaderId = UUID.randomUUID(); + UUID driverVariableId = UUID.randomUUID(); + UUID valueMappingContainerId = UUID.randomUUID(); + UUID valueMappingId = UUID.randomUUID(); + + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(driverVariableId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(valueMappingContainerId) + .build())) + .valueMappingContainerDTOs(List.of(ValueMappingContainerDTO.builder() + .id(valueMappingContainerId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(driverVariableId)) + .valueMappingIds(List.of(valueMappingId)) + .build())) + .valueMappingDTOs(List.of(ValueMappingDTO.builder() + .id(valueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(valueMappingContainerId) + .build())) + .build(); + + // when + deviceDriverController.createDrivers(List.of(deviceDriverDTO)); + + // then + DriverHeader driverHeader = driverHeaderRepository.findById(driverHeaderId); + assertNotNull(driverHeader); + DriverVariable driverVariable = driverHeader.getDriverVariables().get(0); + assertNotNull(driverVariable); + ValueMappingContainer valueMappingContainer = driverVariable.getValueMappingContainer(); + assertNotNull(valueMappingContainer); + ValueMapping valueMapping = valueMappingContainer.getValueMappings().get(0); + assertNotNull(valueMapping); + } + + @Test + void shouldCreateDeviceDriversDoNothingWhenListIsEmpty() { + // given + deviceDriverController.createDrivers(List.of()); + + // when + List driverHeaders = driverHeaderRepository.listAll(); + List driverVariables = driverVariableRepository.listAll(); + List valueMappingContainers = valueMappingContainerRepository.listAll(); + List valueMappings = valueMappingRepository.listAll(); + + // then + assertNotNull(driverHeaders); + assertEquals(0, driverHeaders.size()); + assertNotNull(driverVariables); + assertEquals(0, driverVariables.size()); + assertNotNull(valueMappingContainers); + assertEquals(0, valueMappingContainers.size()); + assertNotNull(valueMappings); + assertEquals(0, valueMappings.size()); + } + + @Test + void shouldUpdateDeviceDriversUpdateHeaderWithAllHierarchy() { + // given + UUID driverHeaderId = UUID.randomUUID(); + UUID driverVariableId = UUID.randomUUID(); + UUID valueMappingContainerId = UUID.randomUUID(); + UUID valueMappingId = UUID.randomUUID(); + + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .payload("somePayload") + .name("someName") + .description("someDescription") + .sysObjectId("someSysObjectId") + .bulkPolling(true) + .content("someContent") + .devices("someDevices") + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(driverVariableId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .payload("somePayload") + .name("someName") + .description("someDescription") + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(valueMappingContainerId) + .oid("someOid") + .dataType(DataTypeEnum.STRING) + .displayFormat("someDisplayFormat") + .displayFactor("someDisplayFactor") + .isReadOnly(true) + .min("someMin") + .max("someMax") + .step("someStep") + .intervalFactor("someIntervalFactor") + .displayName("someDisplayName") + .functionType(FunctionTypeEnum.VALUE) + .baseOid("someBaseOid") + .build())) + .valueMappingContainerDTOs(List.of(ValueMappingContainerDTO.builder() + .id(valueMappingContainerId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(driverVariableId)) + .valueMappingIds(List.of(valueMappingId)) + .build())) + .valueMappingDTOs(List.of(ValueMappingDTO.builder() + .id(valueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .value("someValue") + .mapping("someMapping") + .valueMappingContainerId(valueMappingContainerId) + .build())) + .build(); + deviceDriverController.createDriver(deviceDriverDTO); + + // when + UUID newValueMappingId = UUID.randomUUID(); + DeviceDriverDTO updatedDeviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .payload("newPayload") + .name("newName") + .description("newDescription") + .sysObjectId("newSysObjectId") + .bulkPolling(false) + .content("newContent") + .devices("newDevices") + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(driverVariableId) + .payload("newPayload") + .name("newName") + .description("newDescription") + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(valueMappingContainerId) + .oid("newOid") + .dataType(DataTypeEnum.STATUSINT) + .displayFormat("newDisplayFormat") + .displayFactor("newDisplayFactor") + .isReadOnly(false) + .min("newMin") + .max("newMax") + .step("newStep") + .intervalFactor("newIntervalFactor") + .displayName("newDisplayName") + .functionType(FunctionTypeEnum.UNDEFINED) + .baseOid("newBaseOid") + .build())) + .valueMappingContainerDTOs(List.of(ValueMappingContainerDTO.builder() + .id(valueMappingContainerId) + .driverVariableIds(List.of(driverVariableId)) + .valueMappingIds(List.of(newValueMappingId)) + .build())) + .valueMappingDTOs(List.of(ValueMappingDTO.builder() + .id(newValueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .value("newValue") + .mapping("newMapping") + .valueMappingContainerId(valueMappingContainerId) + .build())) + .build(); + deviceDriverController.updateDrivers(List.of(updatedDeviceDriverDTO)); + + // then + DriverHeader driverHeader = driverHeaderRepository.findById(driverHeaderId); + assertNotNull(driverHeader); + assertEquals(driverHeaderId, driverHeader.getId()); + assertNotNull(driverHeader.getCreated()); + assertNotNull(driverHeader.getStamp()); + assertTrue(driverHeader.getStamp().isAfter(driverHeader.getCreated())); + assertEquals("newPayload", driverHeader.getPayload()); + assertEquals("newName", driverHeader.getName()); + assertEquals("newDescription", driverHeader.getDescription()); + assertEquals("newSysObjectId", driverHeader.getSysObjectId()); + assertFalse(driverHeader.getBulkPolling()); + assertEquals("newContent", driverHeader.getContent()); + assertEquals("newDevices", driverHeader.getDevices()); + + assertNotNull(driverHeader.getDriverVariables()); + assertFalse(driverHeader.getDriverVariables().isEmpty()); + assertEquals(1, driverHeader.getDriverVariables().size()); + Optional optionalDriverVariable = driverHeader.getDriverVariables().stream() + .filter(dv -> driverVariableId.equals(dv.getId())) + .findFirst(); + assertTrue(optionalDriverVariable.isPresent()); + DriverVariable driverVariable = optionalDriverVariable.get(); + assertNotNull(driverVariable.getCreated()); + assertNotNull(driverVariable.getStamp()); + assertTrue(driverVariable.getStamp().isAfter(driverVariable.getCreated())); + assertEquals("newPayload", driverVariable.getPayload()); + assertEquals("newName", driverVariable.getName()); + assertEquals("newDescription", driverVariable.getDescription()); + assertEquals("newOid", driverVariable.getOid()); + assertEquals(DataTypeEnum.STATUSINT, driverVariable.getDataType()); + assertEquals("newDisplayFormat", driverVariable.getDisplayFormat()); + assertEquals("newDisplayFactor", driverVariable.getDisplayFactor()); + assertFalse(driverVariable.getIsReadOnly()); + assertEquals("newMin", driverVariable.getMin()); + assertEquals("newMax", driverVariable.getMax()); + assertEquals("newStep", driverVariable.getStep()); + assertEquals("newIntervalFactor", driverVariable.getIntervalFactor()); + assertEquals("newDisplayName", driverVariable.getDisplayName()); + assertEquals(FunctionTypeEnum.UNDEFINED, driverVariable.getFunctionType()); + assertEquals("newBaseOid", driverVariable.getBaseOid()); + + ValueMappingContainer valueMappingContainer = driverVariable.getValueMappingContainer(); + assertNotNull(valueMappingContainer); + assertEquals(valueMappingContainerId, valueMappingContainer.getId()); + assertNotNull(valueMappingContainer.getCreated()); + assertNotNull(valueMappingContainer.getStamp()); + assertTrue(valueMappingContainer.getStamp().isEqual(valueMappingContainer.getCreated()) + || valueMappingContainer.getStamp().isAfter(valueMappingContainer.getCreated())); + + assertNotNull(valueMappingContainer.getValueMappings()); + assertEquals(1, valueMappingContainer.getValueMappings().size()); + Optional optionalValueMapping = valueMappingContainer.getValueMappings().stream() + .filter(vm -> newValueMappingId.equals(vm.getId())) + .findFirst(); + assertTrue(optionalValueMapping.isPresent()); + ValueMapping valueMapping = optionalValueMapping.get(); + assertNotNull(valueMapping.getCreated()); + assertNotNull(valueMapping.getStamp()); + assertEquals("newValue", valueMapping.getValue()); + assertEquals("newMapping", valueMapping.getMapping()); + } + + @Test + void shouldUpdateDeviceDriverThrowWhenNotFound() { + // given + DeviceDriverDTO device = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(UUID.randomUUID()) + .build()) + .build(); + + // when & then + assertThrows(EntityNotFoundException.class, () -> deviceDriverController.updateDriver(device)); + } + + @Test + void shouldDeleteDeviceDriversDeleteUnusedDriverVariablesWithSubsequentContainers() { + // given + UUID driverHeaderId = UUID.randomUUID(); + UUID driverVariableId = UUID.randomUUID(); + UUID valueMappingContainerId = UUID.randomUUID(); + UUID valueMappingId = UUID.randomUUID(); + + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(driverVariableId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(valueMappingContainerId) + .build())) + .valueMappingContainerDTOs(List.of( + ValueMappingContainerDTO.builder() + .id(valueMappingContainerId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(driverVariableId)) + .valueMappingIds(List.of(valueMappingId)) + .build())) + .valueMappingDTOs(List.of( + ValueMappingDTO.builder() + .id(valueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(valueMappingContainerId) + .build())) + .build(); + deviceDriverController.createDriver(deviceDriverDTO); + + // when + deviceDriverController.deleteDriver(driverHeaderId); + + // then + List driverHeader = driverHeaderRepository.listAll(); + assertEquals(0, driverHeader.size()); + List driverVariables = driverVariableRepository.listAll(); + assertEquals(0, driverVariables.size()); + List valueMappingContainers = valueMappingContainerRepository.listAll(); + assertEquals(1, valueMappingContainers.size()); + List valueMappings = valueMappingRepository.listAll(); + assertEquals(1, valueMappings.size()); + } + + @Test + void shouldDeleteDeviceDriversLeaveDriverWithDriverVariableReferringVariable() { + // given + UUID driverHeaderId = UUID.randomUUID(); + UUID driverVariableWithRelationToVariableId = UUID.randomUUID(); + UUID valueMappingContinerId = UUID.randomUUID(); + UUID valueMappingId = UUID.randomUUID(); + + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build()) + .driverVariableDTOs(List.of( + DriverVariableDTO.builder() + .id(driverVariableWithRelationToVariableId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverHeaderId(driverHeaderId) + .valueMappingContainerId(valueMappingContinerId) + .build())) + .valueMappingContainerDTOs(List.of( + ValueMappingContainerDTO.builder() + .id(valueMappingContinerId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(driverVariableWithRelationToVariableId)) + .valueMappingIds(List.of(valueMappingId)) + .build())) + .valueMappingDTOs(List.of( + ValueMappingDTO.builder() + .id(valueMappingId) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(valueMappingContinerId) + .build())) + .build(); + deviceDriverController.createDriver(deviceDriverDTO); + createVariable(driverVariableWithRelationToVariableId); + + // when + deviceDriverController.deleteDriver(driverHeaderId); + + // then + DriverHeader driverHeader2 = driverHeaderRepository.findById(driverHeaderId); + assertNotNull(driverHeader2); + + List finalDriverVariables = driverHeader2.getDriverVariables(); + assertNotNull(finalDriverVariables); + assertEquals(1, finalDriverVariables.size()); + assertTrue(finalDriverVariables.stream() + .map(DriverVariable::getId) + .toList() + .contains(driverVariableWithRelationToVariableId)); + + List valueMappingContainers = finalDriverVariables.stream() + .map(DriverVariable::getValueMappingContainer) + .toList(); + List valueMappingContainerIds = valueMappingContainers.stream() + .map(ValueMappingContainer::getId) + .toList(); + assertEquals(1, valueMappingContainerIds.size()); + assertTrue(valueMappingContainerIds.contains(valueMappingContinerId)); + + List valueMappingIds = valueMappingContainers.stream() + .map(ValueMappingContainer::getValueMappings) + .flatMap(Collection::stream) + .map(ValueMapping::getId) + .toList(); + assertEquals(1, valueMappingIds.size()); + assertTrue(valueMappingIds.contains(valueMappingId)); + } + + @Test + void shouldDeleteDeviceDriverThrowWhenNotFound() { + // given + UUID driverHeaderId = UUID.randomUUID(); + + // when & then + assertThrows(EntityNotFoundException.class, () -> deviceDriverController.deleteDriver(driverHeaderId)); + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) + void createVariable(UUID driverVariableToDeleteWitRelationToVariableId) { + Variable variable = new Variable(); + variable.setDeviceId(UUID.randomUUID()); + variable.setCreated(OffsetDateTime.now()); + variable.setStamp(OffsetDateTime.now()); + variable.setName("someName"); + variable.setVarType(VarTypeEnum.VALUE); + variable.setVarDataType(DataTypeEnum.STRING); + variable.setVarAccessType(AccessTypeEnum.NONE); + variable.setMode(ComponentMode.PAUSE); + variable.setVarQualityOid("someVarQualityOid"); + variable.setValueAsIntegerOid("someValueAsIntegerOid"); + variable.setValueAsStringOid("someValueAsStringOid"); + variable.setDriverVariableId(driverVariableToDeleteWitRelationToVariableId); + variable.setFunctionType(FunctionTypeEnum.VALUE); + variable.setRestoreMode(ComponentMode.PAUSE); + variable.setSnmpSetVarDataType(DataTypeEnum.STRING); + variableRepository.persist(variable); + } +} diff --git a/src/test/java/io/gec/raw/connector/driver/control/DeviceDriverControllerTest.java b/src/test/java/io/gec/raw/connector/driver/control/DeviceDriverControllerTest.java new file mode 100755 index 0000000..572fc11 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/driver/control/DeviceDriverControllerTest.java @@ -0,0 +1,185 @@ +package io.gec.raw.connector.driver.control; + +import io.gec.raw.connector.driver.domain.DeviceDriverDTO; +import io.gec.raw.connector.driver.domain.DriverHeaderDTO; +import io.gec.raw.connector.driver.mapper.DataMapper; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(MockitoExtension.class) +class DeviceDriverControllerTest { + + @Inject + DataMapper dataMapper; + @InjectMocks + DeviceDriverController deviceDriverController; + + @Test + void shouldPartitionByExistenceReturnOneToCreateZeroToUpdate() { + // given + UUID driverHeaderId = UUID.randomUUID(); + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .build()) + .build(); + + // when + Map> incomingByExistence = deviceDriverController.partitionByExistence(List.of(deviceDriverDTO), List.of()); + List driversToCreate = incomingByExistence.get(false); + List driversToUpdate = incomingByExistence.get(true); + + // then + assertNotNull(driversToCreate); + assertFalse(driversToCreate.isEmpty()); + assertEquals(1, driversToCreate.size()); + assertEquals(driverHeaderId, driversToCreate.get(0).getDriverHeaderDTO().getId()); + assertNotNull(driversToUpdate); + assertTrue(driversToUpdate.isEmpty()); + + } + + @Test + void shouldPartitionByExistenceReturnZeroToCreateOneToUpdate() { + // given + UUID driverHeaderId = UUID.randomUUID(); + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .build()) + .build(); + + // when + Map> incomingByExistence = deviceDriverController.partitionByExistence(List.of(deviceDriverDTO), List.of(driverHeaderId)); + List driversToCreate = incomingByExistence.get(false); + List driversToUpdate = incomingByExistence.get(true); + + + // then + assertNotNull(driversToCreate); + assertTrue(driversToCreate.isEmpty()); + assertNotNull(driversToUpdate); + assertFalse(driversToUpdate.isEmpty()); + assertEquals(1, driversToUpdate.size()); + assertEquals(driverHeaderId, driversToUpdate.get(0).getDriverHeaderDTO().getId()); + } + + @Test + void shouldPartitionByExistenceReturnZeroToCreateZeroToUpdate() { + // given + UUID driverHeaderId = UUID.randomUUID(); + + // when + Map> incomingByExistence = deviceDriverController.partitionByExistence(List.of(), List.of(driverHeaderId)); + List driversToCreate = incomingByExistence.get(false); + List driversToUpdate = incomingByExistence.get(true); + + + // then + assertNotNull(driversToCreate); + assertTrue(driversToCreate.isEmpty()); + assertNotNull(driversToUpdate); + assertTrue(driversToUpdate.isEmpty()); + } + + @Test + void shouldPartitionByExistenceReturnZeroToCreateZeroToUpdateWhenNothingProvided() { + // given & when + Map> incomingByExistence = deviceDriverController.partitionByExistence(List.of(), List.of()); + List driversToCreate = incomingByExistence.get(false); + List driversToUpdate = incomingByExistence.get(true); + + + // then + assertNotNull(driversToCreate); + assertTrue(driversToCreate.isEmpty()); + assertNotNull(driversToUpdate); + assertTrue(driversToUpdate.isEmpty()); + } + + @Test + void shouldPartitionByExistenceReturnOneToCreateZeroToUpdateWhenRandomIdProvided() { + // given + UUID driverHeaderId = UUID.randomUUID(); + DeviceDriverDTO deviceDriverDTO = DeviceDriverDTO.builder() + .driverHeaderDTO(DriverHeaderDTO.builder() + .id(driverHeaderId) + .build()) + .build(); + + // when + Map> incomingByExistence = deviceDriverController.partitionByExistence(List.of(deviceDriverDTO), List.of(UUID.randomUUID())); + List driversToCreate = incomingByExistence.get(false); + List driversToUpdate = incomingByExistence.get(true); + + + // then + assertNotNull(driversToCreate); + assertFalse(driversToCreate.isEmpty()); + assertEquals(1, driversToCreate.size()); + assertEquals(driverHeaderId, driversToCreate.get(0).getDriverHeaderDTO().getId()); + assertNotNull(driversToUpdate); + assertTrue(driversToUpdate.isEmpty()); + } + + + @Test + void shouldGetDriverToDeleteIdsNotReturnIdWhenIsNotOnExistingList() { + // given + UUID incomingDriverHeaderId = UUID.randomUUID(); + + // when + List toDeleteIds = deviceDriverController.getDriverHeaderToDeleteIds(List.of(), List.of(incomingDriverHeaderId)); + + // then + assertNotNull(toDeleteIds); + assertTrue(toDeleteIds.isEmpty()); + } + + @Test + void shouldGetDriverToDeleteIdsNotReturnIdWhenIsOnIncomingList() { + // given + UUID existingDriverHeaderId = UUID.randomUUID(); + + // when + List toDeleteIds = deviceDriverController.getDriverHeaderToDeleteIds(List.of(existingDriverHeaderId), List.of(existingDriverHeaderId)); + + // then + assertNotNull(toDeleteIds); + assertTrue(toDeleteIds.isEmpty()); + } + + @Test + void shouldGetDriverToDeleteIdsNotReturnIdWhenNothingProvided() { + // given & when + List toDeleteIds = deviceDriverController.getDriverHeaderToDeleteIds(List.of(), List.of()); + + // then + assertNotNull(toDeleteIds); + assertTrue(toDeleteIds.isEmpty()); + } + + @Test + void shouldGetDriverToDeleteIdsReturnIdWhenIncomingListIsEmpty() { + // given + UUID existingDriverHeaderId = UUID.randomUUID(); + + // when + List toDeleteIds = deviceDriverController.getDriverHeaderToDeleteIds(List.of(existingDriverHeaderId), List.of()); + + // then + assertNotNull(toDeleteIds); + assertFalse(toDeleteIds.isEmpty()); + assertEquals(1, toDeleteIds.size()); + assertEquals(existingDriverHeaderId, toDeleteIds.get(0)); + } +} diff --git a/src/test/java/io/gec/raw/connector/driver/handler/CreateDriverWorkItemJobHandlerTest.java b/src/test/java/io/gec/raw/connector/driver/handler/CreateDriverWorkItemJobHandlerTest.java new file mode 100755 index 0000000..e9b8df9 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/driver/handler/CreateDriverWorkItemJobHandlerTest.java @@ -0,0 +1,196 @@ +package io.gec.raw.connector.driver.handler; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.driver.control.DeviceDriverController; +import io.gec.raw.connector.driver.domain.DriverWorkItemResult; +import io.gec.raw.connector.driver.dto.DriverWorkItemDTO; +import io.gec.raw.connector.driver.dto.DriverWorkItemStatus; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.utils.TestDTOFactory; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.willDoNothing; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class CreateDriverWorkItemJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + DeviceDriverController deviceDriverController; + @Mock + Logger logger; + @InjectMocks + CreateDriverWorkItemJobHandler createDriverWorkItemJobHandler; + + private static Stream getDriverWorkItemStatusesForMapping() { + return Stream.of( + of(DriverWorkItemStatus.DONE, JobStatus.DONE), + of(DriverWorkItemStatus.FAILED, JobStatus.FAILED) + ); + } + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var driverWorkItemDTO = new DriverWorkItemDTO(); + //and + willReturn(Optional.of(driverWorkItemDTO)).given(communicationServiceController).fetchDriverWorkItem(workItemId); + + //when + var result = createDriverWorkItemJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(driverWorkItemDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchDriverWorkItem(workItemId); + + //when + var result = createDriverWorkItemJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResult_whenDriverWorkItemDTOIsNull() { + //given + UUID workItemId = UUID.fromString("f8bdd340-57ca-4a89-b881-091d56a55419"); + var workItemWrapper = new WorkItemWrapper(workItemId, null, () -> false); + + //when + var result = createDriverWorkItemJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(DriverWorkItemStatus.FAILED)); + assertThat(result.getMessage(), is("DriverWorkItemDTO is required but not provided for work item Id: f8bdd340-57ca-4a89-b881-091d56a55419")); + } + + @Test + void shouldStartProcessing_updateDriverWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var driverWorkItemDTO = new DriverWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, driverWorkItemDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updateDriverWorkItem(eq(workItemId), any()); + + //when + createDriverWorkItemJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updateDriverWorkItem( + eq(workItemId), + argThat(driverWorkItemUpdateDTO -> driverWorkItemUpdateDTO.getStatus() == DriverWorkItemStatus.IN_PROGRESS)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDoneResult() { + //given + UUID workItemId = UUID.randomUUID(); + UUID driverId = UUID.randomUUID(); + var driverWorkItemDTO = TestDTOFactory.createDriverWorkItem(driverId); + var workItemWrapper = new WorkItemWrapper<>(workItemId, driverWorkItemDTO, () -> false); + //and + willDoNothing().given(deviceDriverController).createDriver(driverId); + + //when + var result = createDriverWorkItemJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(DriverWorkItemStatus.DONE)); + assertThat(result.getMessage(), is(nullValue())); + } + + @ParameterizedTest + @EnumSource(DriverWorkItemStatus.class) + void shouldFinishProcessing_updateDriverWorkItem(DriverWorkItemStatus driverWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var driverWorkItemDTO = new DriverWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, driverWorkItemDTO, () -> false); + var driverWorkItemResult = new DriverWorkItemResult(driverWorkItemStatus); + //and + willDoNothing().given(communicationServiceController).updateDriverWorkItem(eq(workItemId), any()); + + //when + createDriverWorkItemJobHandler.finishProcessing(workItemWrapper, driverWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateDriverWorkItem( + eq(workItemId), + argThat(driverWorkItemUpdateDto -> driverWorkItemUpdateDto.getStatus() == driverWorkItemStatus)); + } + + @ParameterizedTest + @MethodSource("getDriverWorkItemStatusesForMapping") + void shouldMapToJobResult(DriverWorkItemStatus driverWorkItemStatus, JobStatus jobStatus) { + //given + var driverWorkItemResult = new DriverWorkItemResult(driverWorkItemStatus, "message"); + + //when + var result = createDriverWorkItemJobHandler.mapToJobResult(driverWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + @ParameterizedTest + @EnumSource(value = DriverWorkItemStatus.class, names = {"DONE", "FAILED"}, mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(DriverWorkItemStatus driverWorkItemStatus) { + //given + var DriverWorkItemResult = new DriverWorkItemResult(driverWorkItemStatus); + + //expect + assertThrows(IllegalStateException.class, () -> { + createDriverWorkItemJobHandler.mapToJobResult(DriverWorkItemResult); + }); + } + + @Test + void shouldGetJobType() { + //when + var result = createDriverWorkItemJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.DRIVER)); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/control/FirmwareDownloadControllerTest.java b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareDownloadControllerTest.java new file mode 100755 index 0000000..312cc39 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareDownloadControllerTest.java @@ -0,0 +1,217 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.firmware.domain.FirmwareDownloadException; +import io.gec.raw.connector.firmware.domain.FirmwareFileNotFoundException; +import io.gec.raw.connector.firmware.domain.TooManyFirmwareFilesException; +import io.gec.raw.connector.firmware.dto.FirmwareFileMetadataDTO; +import io.gec.raw.connector.job.domain.ProcessingCanceledException; +import io.gec.raw.connector.utils.control.ChecksumController; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; +import java.io.InputStream; +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class FirmwareDownloadControllerTest { + @Mock + FirmwareStorageController firmwareStorageController; + @Mock + FirmwareFileConfigProvider firmwareFileConfigProvider; + @Mock + CommunicationServiceController communicationServiceController; + @Mock + ChecksumController checksumController; + @Mock + Logger logger; + + @InjectMocks + FirmwareDownloadController firmwareDownloadController; + + @SneakyThrows + @Test + void shouldDownloadFirmwareFile_doNothing_forExistingFile() { + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + UUID workItemId = UUID.randomUUID(); + //and + willReturn("fileName.ext").given(firmwareStorageController).findFirmwareFileName(firmwareId); + + //expect + assertDoesNotThrow(() -> firmwareDownloadController.downloadFirmwareFile(firmwareId, workItemId, () -> false)); + //and + verify(firmwareStorageController, times(0)).removeAllFiles(any()); + verify(communicationServiceController, times(0)).fetchFirmwareFileMetadata(any(), any()); + } + + @SneakyThrows + @Test + void shouldDownloadFirmwareFile_downloadFile_ifFileDoesNotExist() { + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + UUID workItemId = UUID.randomUUID(); + FirmwareFileMetadataDTO firmwareFileMetadataDTO = new FirmwareFileMetadataDTO(); + firmwareFileMetadataDTO.setFileName("fileName"); + firmwareFileMetadataDTO.setSha1("sha1"); + InputStream inputStreamMock = mock(InputStream.class); + //and + willThrow(new FirmwareFileNotFoundException("exception message")).given(firmwareStorageController).findFirmwareFileName(firmwareId); + willReturn(firmwareFileMetadataDTO).given(communicationServiceController).fetchFirmwareFileMetadata(firmwareId, workItemId); + willReturn(inputStreamMock).given(communicationServiceController).fetchFirmwareFileStream(firmwareId, workItemId); + willReturn("firmwareFilePath").given(firmwareFileConfigProvider).getFirmwareFileDownloadPath(firmwareId, "fileName"); + willReturn(true).given(checksumController).verifySha1("firmwareFilePath", "sha1"); + + //expect + assertDoesNotThrow(() -> firmwareDownloadController.downloadFirmwareFile(firmwareId, workItemId, () -> false)); + //and + verify(firmwareStorageController, times(0)).removeAllFiles(any()); + verify(communicationServiceController, times(1)).fetchFirmwareFileMetadata(firmwareId, workItemId); + verify(firmwareStorageController, times(1)).storeFirmwareFile(firmwareId, "fileName", inputStreamMock); + verify(checksumController, times(1)).verifySha1("firmwareFilePath", "sha1"); + } + + @SneakyThrows + @Test + void shouldDownloadFirmwareFile_removeAllExistingFilesAndDownloadFile_ifTooManyFilesFound() { + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + UUID workItemId = UUID.randomUUID(); + FirmwareFileMetadataDTO firmwareFileMetadataDTO = new FirmwareFileMetadataDTO(); + firmwareFileMetadataDTO.setFileName("fileName"); + firmwareFileMetadataDTO.setSha1("sha1"); + InputStream inputStreamMock = mock(InputStream.class); + //and + willThrow(new TooManyFirmwareFilesException("exception message")).given(firmwareStorageController).findFirmwareFileName(firmwareId); + willReturn(firmwareFileMetadataDTO).given(communicationServiceController).fetchFirmwareFileMetadata(firmwareId, workItemId); + willReturn(inputStreamMock).given(communicationServiceController).fetchFirmwareFileStream(firmwareId, workItemId); + willReturn("firmwareFilePath").given(firmwareFileConfigProvider).getFirmwareFileDownloadPath(firmwareId, "fileName"); + willReturn(true).given(checksumController).verifySha1("firmwareFilePath", "sha1"); + + //expect + assertDoesNotThrow(() -> firmwareDownloadController.downloadFirmwareFile(firmwareId, workItemId, () -> false)); + //and + verify(firmwareStorageController, times(1)).removeAllFiles(firmwareId); + verify(communicationServiceController, times(1)).fetchFirmwareFileMetadata(firmwareId, workItemId); + verify(firmwareStorageController, times(1)).storeFirmwareFile(firmwareId, "fileName", inputStreamMock); + verify(checksumController, times(1)).verifySha1("firmwareFilePath", "sha1"); + } + + @SneakyThrows + @Test + void shouldDownloadFirmwareFile_throwFirmwareDownloadException_ifCannotRemoveAllFiles() { + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + UUID workItemId = UUID.randomUUID(); + //and + willThrow(new TooManyFirmwareFilesException("exception message")).given(firmwareStorageController).findFirmwareFileName(firmwareId); + willThrow(new IOException("IO exception message")).given(firmwareStorageController).removeAllFiles(firmwareId); + + //expect + FirmwareDownloadException exception = assertThrows( + FirmwareDownloadException.class, + () -> firmwareDownloadController.downloadFirmwareFile(firmwareId, workItemId, () -> false)); + //and + assertThat(exception.getMessage(), is("Cannot remove all files related to firmware ID: '45be0206-3534-46ff-8a63-44a8dcfa3f57'")); + verify(firmwareStorageController, times(1)).removeAllFiles(firmwareId); + verify(communicationServiceController, times(0)).fetchFirmwareFileMetadata(any(), any()); + } + + @SneakyThrows + @Test + void shouldDownloadFirmwareFile_removeDownloadedFile_andThrowFirmwareDownloadException_ifChecksumDoesNotMatch() { + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + UUID workItemId = UUID.randomUUID(); + FirmwareFileMetadataDTO firmwareFileMetadataDTO = new FirmwareFileMetadataDTO(); + firmwareFileMetadataDTO.setFileName("fileName"); + firmwareFileMetadataDTO.setSha1("sha1"); + InputStream inputStreamMock = mock(InputStream.class); + //and + willThrow(new FirmwareFileNotFoundException("exception message")).given(firmwareStorageController).findFirmwareFileName(firmwareId); + willReturn(firmwareFileMetadataDTO).given(communicationServiceController).fetchFirmwareFileMetadata(firmwareId, workItemId); + willReturn(inputStreamMock).given(communicationServiceController).fetchFirmwareFileStream(firmwareId, workItemId); + willReturn("firmwareFilePath").given(firmwareFileConfigProvider).getFirmwareFileDownloadPath(firmwareId, "fileName"); + willReturn(false).given(checksumController).verifySha1("firmwareFilePath", "sha1"); + + //expect + FirmwareDownloadException exception = assertThrows( + FirmwareDownloadException.class, + () -> firmwareDownloadController.downloadFirmwareFile(firmwareId, workItemId, () -> false)); + //and + assertThat(exception.getMessage(), is("Checksum of downloaded file does not match for firmware ID: '45be0206-3534-46ff-8a63-44a8dcfa3f57'")); + verify(communicationServiceController, times(1)).fetchFirmwareFileMetadata(firmwareId, workItemId); + verify(firmwareStorageController, times(1)).storeFirmwareFile(firmwareId, "fileName", inputStreamMock); + verify(checksumController, times(1)).verifySha1("firmwareFilePath", "sha1"); + verify(firmwareStorageController, times(1)).removeAllFiles(firmwareId); + } + + @SneakyThrows + @Test + void shouldDownloadFirmwareFile_throwProcessingCanceledException() { + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + UUID workItemId = UUID.randomUUID(); + boolean isProcessingCanceled = true; + //and + willThrow(new FirmwareFileNotFoundException("exception message")).given(firmwareStorageController).findFirmwareFileName(firmwareId); + willReturn(new FirmwareFileMetadataDTO()).given(communicationServiceController).fetchFirmwareFileMetadata(firmwareId, workItemId); + willReturn(mock(InputStream.class)).given(communicationServiceController).fetchFirmwareFileStream(firmwareId, workItemId); + + //expect + assertThrows( + ProcessingCanceledException.class, + () -> firmwareDownloadController.downloadFirmwareFile(firmwareId, workItemId, () -> isProcessingCanceled)); + //and + verify(firmwareStorageController, times(0)).removeAllFiles(any()); + verify(communicationServiceController, times(1)).fetchFirmwareFileMetadata(firmwareId, workItemId); + verify(communicationServiceController, times(1)).fetchFirmwareFileStream(firmwareId, workItemId); + verify(firmwareStorageController, times(0)).storeFirmwareFile(any(), any(), any()); + } + + @SneakyThrows + @Test + void shouldRemoveStoredFiles() { + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + //and + willDoNothing().given(firmwareStorageController).removeAllFiles(firmwareId); + + //expect + assertDoesNotThrow(() -> firmwareDownloadController.removeStoredFiles(firmwareId)); + //and + verify(firmwareStorageController, times(1)).removeAllFiles(firmwareId); + } + + @SneakyThrows + @Test + void shouldRemoveStoredFiles_throwFirmwareDownloadException() { + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + //and + willThrow(new IOException("IO exception message")).given(firmwareStorageController).removeAllFiles(firmwareId); + + //expect + FirmwareDownloadException exception = assertThrows( + FirmwareDownloadException.class, + () -> firmwareDownloadController.removeStoredFiles(firmwareId)); + //and + assertThat(exception.getMessage(), is("Cannot remove all files related to firmware ID: '45be0206-3534-46ff-8a63-44a8dcfa3f57'")); + verify(firmwareStorageController, times(1)).removeAllFiles(firmwareId); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/control/FirmwareFileConfigProviderTest.java b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareFileConfigProviderTest.java new file mode 100755 index 0000000..c807138 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareFileConfigProviderTest.java @@ -0,0 +1,60 @@ +package io.gec.raw.connector.firmware.control; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +class FirmwareFileConfigProviderTest { + private FirmwareFileConfigProvider firmwareFileConfigProvider; + + @BeforeEach + void setup() { + firmwareFileConfigProvider = new FirmwareFileConfigProvider(); + } + + @Test + void shouldGetFirmwareDownloadDir() { + //given + UUID firmwareId = UUID.fromString("43a3abd2-e9b0-4912-a282-779e477f8645"); + + //when + var result = firmwareFileConfigProvider.getFirmwareDownloadDir(firmwareId); + + //then + assertThat(result, is("./firmware/43a3abd2-e9b0-4912-a282-779e477f8645/")); + } + + @Test + void shouldGetFirmwareFileDownloadPath() { + //given + UUID firmwareId = UUID.fromString("43a3abd2-e9b0-4912-a282-779e477f8645"); + + //when + var result = firmwareFileConfigProvider.getFirmwareFileDownloadPath(firmwareId, "fileName.ext"); + + //then + assertThat(result, is("./firmware/43a3abd2-e9b0-4912-a282-779e477f8645/fileName.ext")); + } + + @Test + void shouldGetUploadDir() { + //when + var result = firmwareFileConfigProvider.getUploadDir(); + + //then + assertThat(result, is("./update/")); + } + + @Test + void shouldGetFirmwareFileExtension() { + //when + var result = firmwareFileConfigProvider.getFirmwareFileExtension(); + + //then + assertThat(result, is(".tar")); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/control/FirmwareFileUploaderTest.java b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareFileUploaderTest.java new file mode 100755 index 0000000..3c4fffa --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareFileUploaderTest.java @@ -0,0 +1,165 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.firmware.domain.FirmwareUploadException; +import io.gec.raw.connector.ftp.control.SSHClientProvider; +import io.gec.raw.connector.ftp.control.SftpDirectoryCleaner; +import io.gec.raw.connector.ftp.control.SftpUploader; +import io.gec.raw.connector.ftp.domain.FileItem; +import io.gec.raw.connector.ftp.domain.SftpData; +import lombok.SneakyThrows; +import net.schmizz.sshj.SSHClient; +import net.schmizz.sshj.sftp.SFTPClient; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class FirmwareFileUploaderTest { + @Mock + SSHClientProvider sshClientProvider; + @Mock + SftpUploader sftpUploader; + @Mock + SftpDirectoryCleaner sftpDirectoryCleaner; + @Mock + Logger logger; + @InjectMocks + FirmwareFileUploader firmwareFileUploader; + + @SneakyThrows + @Test + void uploadFirmwareFile_success() { + //given + String ipAddress = "192.168.0.1"; + SftpData sftpDataMock = mock(SftpData.class); + SSHClient sshClientMock = mock(SSHClient.class); + SFTPClient sftpClientMock = mock(SFTPClient.class); + String firmwareDestFilePath = "firmware/upload/dir/firmware.tar"; + FileItem fileItemMock = mock(FileItem.class); + //and + willReturn(ipAddress).given(sftpDataMock).getIpAddress(); + willReturn(firmwareDestFilePath).given(fileItemMock).destFilePath(); + //and + willReturn(sshClientMock).given(sshClientProvider).setupSsh(sftpDataMock, false); + willReturn(sftpClientMock).given(sshClientMock).newSFTPClient(); + willDoNothing().given(sftpDirectoryCleaner).removeFilesFromDirectory(sftpClientMock, "firmware/upload/dir/"); + willDoNothing().given(sftpUploader).uploadFile(sftpClientMock, fileItemMock); + + //expect + assertDoesNotThrow(() -> firmwareFileUploader.uploadFirmwareFile(sftpDataMock, fileItemMock)); + //and + verify(sftpUploader, times(1)).uploadFile(sftpClientMock, fileItemMock); + } + + @SneakyThrows + @Test + void shouldUploadFirmwareFile_throwFirmwareUploadException_whenSftpExceptionThrownBySftpUploader() { + //given + String ipAddress = "192.168.0.1"; + SftpData sftpDataMock = mock(SftpData.class); + SSHClient sshClientMock = mock(SSHClient.class); + SFTPClient sftpClientMock = mock(SFTPClient.class); + String firmwareDestFilePath = "firmware/upload/dir/firmware.tar"; + FileItem fileItemMock = mock(FileItem.class); + //and + willReturn(ipAddress).given(sftpDataMock).getIpAddress(); + willReturn(firmwareDestFilePath).given(fileItemMock).destFilePath(); + //and + willReturn(sshClientMock).given(sshClientProvider).setupSsh(sftpDataMock, false); + willReturn(sftpClientMock).given(sshClientMock).newSFTPClient(); + willDoNothing().given(sftpDirectoryCleaner).removeFilesFromDirectory(sftpClientMock, "firmware/upload/dir/"); + willThrow(new SftpException("exception message")).given(sftpUploader).uploadFile(sftpClientMock, fileItemMock); + + //expect + FirmwareUploadException exception = assertThrows( + FirmwareUploadException.class, + () -> firmwareFileUploader.uploadFirmwareFile(sftpDataMock, fileItemMock)); + //and + assertThat(exception.getMessage(), is("Cannot upload firmware file: 'firmware/upload/dir/firmware.tar' to device with IP: '192.168.0.1'")); + } + + @SneakyThrows + @Test + void shouldUploadFirmwareFile_throwFirmwareUploadException_whenSftpExceptionThrownBySftpDirectoryCleaner() { + //given + String ipAddress = "192.168.0.1"; + SftpData sftpDataMock = mock(SftpData.class); + SSHClient sshClientMock = mock(SSHClient.class); + SFTPClient sftpClientMock = mock(SFTPClient.class); + String firmwareDestFilePath = "firmware/upload/dir/firmware.tar"; + FileItem fileItemMock = mock(FileItem.class); + //and + willReturn(ipAddress).given(sftpDataMock).getIpAddress(); + willReturn(firmwareDestFilePath).given(fileItemMock).destFilePath(); + //and + willReturn(sshClientMock).given(sshClientProvider).setupSsh(sftpDataMock, false); + willReturn(sftpClientMock).given(sshClientMock).newSFTPClient(); + willThrow(new SftpException("exception message")).given(sftpDirectoryCleaner).removeFilesFromDirectory(sftpClientMock, "firmware/upload/dir/"); + + //expect + FirmwareUploadException exception = assertThrows( + FirmwareUploadException.class, + () -> firmwareFileUploader.uploadFirmwareFile(sftpDataMock, fileItemMock)); + //and + assertThat(exception.getMessage(), is("Cannot upload firmware file: 'firmware/upload/dir/firmware.tar' to device with IP: '192.168.0.1'")); + } + + @SneakyThrows + @Test + void shouldUploadFirmwareFile_throwFirmwareUploadException_whenIOExceptionThrownByNewSFTPClient() { + //given + String ipAddress = "192.168.0.1"; + SftpData sftpDataMock = mock(SftpData.class); + SSHClient sshClientMock = mock(SSHClient.class); + String firmwareDestFilePath = "firmware/upload/dir/firmware.tar"; + FileItem fileItemMock = mock(FileItem.class); + //and + willReturn(ipAddress).given(sftpDataMock).getIpAddress(); + willReturn(firmwareDestFilePath).given(fileItemMock).destFilePath(); + //and + willReturn(sshClientMock).given(sshClientProvider).setupSsh(sftpDataMock, false); + willThrow(new IOException("exception message")).given(sshClientMock).newSFTPClient(); + + //expect + FirmwareUploadException exception = assertThrows( + FirmwareUploadException.class, + () -> firmwareFileUploader.uploadFirmwareFile(sftpDataMock, fileItemMock)); + //and + assertThat(exception.getMessage(), is("Cannot upload firmware file: 'firmware/upload/dir/firmware.tar' to device with IP: '192.168.0.1'")); + } + + @SneakyThrows + @Test + void shouldUploadFirmwareFile_throwFirmwareUploadException_whenIOExceptionThrownBySetupSsh() { + //given + String ipAddress = "192.168.0.1"; + SftpData sftpDataMock = mock(SftpData.class); + String firmwareDestFilePath = "firmware/upload/dir/firmware.tar"; + FileItem fileItemMock = mock(FileItem.class); + //and + willReturn(ipAddress).given(sftpDataMock).getIpAddress(); + willReturn(firmwareDestFilePath).given(fileItemMock).destFilePath(); + //and + willThrow(new IOException("exception message")).given(sshClientProvider).setupSsh(sftpDataMock, false); + + //expect + FirmwareUploadException exception = assertThrows( + FirmwareUploadException.class, + () -> firmwareFileUploader.uploadFirmwareFile(sftpDataMock, fileItemMock)); + //and + assertThat(exception.getMessage(), is("Cannot upload firmware file: 'firmware/upload/dir/firmware.tar' to device with IP: '192.168.0.1'")); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/control/FirmwareStorageControllerTest.java b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareStorageControllerTest.java new file mode 100755 index 0000000..be06395 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareStorageControllerTest.java @@ -0,0 +1,98 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.firmware.domain.FirmwareFileNotFoundException; +import io.gec.raw.connector.firmware.domain.TooManyFirmwareFilesException; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.BDDMockito.willReturn; + +@ExtendWith(MockitoExtension.class) +class FirmwareStorageControllerTest { + private static final String TEST_RESOURCES_BASE_PATH = "src/test/resources/firmware/"; + @Mock + FirmwareFileConfigProvider firmwareFileConfigProvider; + @Mock + Logger logger; + + @InjectMocks + FirmwareStorageController firmwareStorageController; + + @Test + void shouldFindFirmwareFileName() { + //given + UUID firmwareId = UUID.fromString("11111111-3534-46ff-8a63-44a8dcfa3f57"); + String downloadDir = TEST_RESOURCES_BASE_PATH + firmwareId; + //and + willReturn(downloadDir).given(firmwareFileConfigProvider).getFirmwareDownloadDir(firmwareId); + willReturn(".tar").given(firmwareFileConfigProvider).getFirmwareFileExtension(); + + //when + var result = firmwareStorageController.findFirmwareFileName(firmwareId); + + //then + assertThat(result, is("example.tar")); + } + + @Test + void shouldFindFirmwareFileName_throwFirmwareFileNotFoundException_ifNoDirectory() { + //given + UUID firmwareId = UUID.fromString("00000000-3534-46ff-8a63-44a8dcfa3f57"); + String downloadDir = TEST_RESOURCES_BASE_PATH + firmwareId; + //and + willReturn(downloadDir).given(firmwareFileConfigProvider).getFirmwareDownloadDir(firmwareId); + + //when + FirmwareFileNotFoundException exception = assertThrows( + FirmwareFileNotFoundException.class, + () -> firmwareStorageController.findFirmwareFileName(firmwareId)); + + //then + assertThat(exception.getMessage(), is("No such directory found: 'src/test/resources/firmware/00000000-3534-46ff-8a63-44a8dcfa3f57'")); + } + + @Test + void shouldFindFirmwareFileName_throwFirmwareFileNotFoundException_ifDirectoryIsEmpty() { + //given + UUID firmwareId = UUID.fromString("22222222-3534-46ff-8a63-44a8dcfa3f57"); + String downloadDir = TEST_RESOURCES_BASE_PATH + firmwareId; + //and + willReturn(downloadDir).given(firmwareFileConfigProvider).getFirmwareDownloadDir(firmwareId); + willReturn(".tar").given(firmwareFileConfigProvider).getFirmwareFileExtension(); + + //when + FirmwareFileNotFoundException exception = assertThrows( + FirmwareFileNotFoundException.class, + () -> firmwareStorageController.findFirmwareFileName(firmwareId)); + + //then + assertThat(exception.getMessage(), is("No files found in directory: 'src/test/resources/firmware/22222222-3534-46ff-8a63-44a8dcfa3f57'")); + } + + @Test + void shouldFindFirmwareFileName_throwTooManyFirmwareFilesException() { + //given + UUID firmwareId = UUID.fromString("33333333-3534-46ff-8a63-44a8dcfa3f57"); + String downloadDir = TEST_RESOURCES_BASE_PATH + firmwareId; + //and + willReturn(downloadDir).given(firmwareFileConfigProvider).getFirmwareDownloadDir(firmwareId); + willReturn(".tar").given(firmwareFileConfigProvider).getFirmwareFileExtension(); + + //when + TooManyFirmwareFilesException exception = assertThrows( + TooManyFirmwareFilesException.class, + () -> firmwareStorageController.findFirmwareFileName(firmwareId)); + + //then + assertThat(exception.getMessage(), is("More than one firmware file found in directory: 'src/test/resources/firmware/33333333-3534-46ff-8a63-44a8dcfa3f57'")); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/control/FirmwareUpdateStatusControllerTest.java b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareUpdateStatusControllerTest.java new file mode 100755 index 0000000..ea5fbf2 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareUpdateStatusControllerTest.java @@ -0,0 +1,109 @@ +package io.gec.raw.connector.firmware.control; + +import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.*; + +import io.gec.raw.connector.firmware.domain.FirmwareUpdateStatus; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateStatusResult; +import io.gec.raw.connector.ftp.domain.SftpData; +import jakarta.enterprise.context.ApplicationScoped; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.junit.jupiter.api.extension.ExtendWith; +import org.jboss.logging.Logger; + +import java.util.Optional; +import java.util.UUID; + +@ExtendWith(MockitoExtension.class) +class FirmwareUpdateStatusControllerTest { + + //WARN: do not change LOG_MESSAGE_SUCCESS and LOG_MESSAGE_ERROR values - they come from analysis of real status files + private static final String LOG_MESSAGE_SUCCESS = "info - successful"; + private static final String LOG_MESSAGE_ERROR = "error - "; + + @Mock + StatusFileContentProvider statusFileContentProvider; + + @Mock + Logger logger; + + @InjectMocks + FirmwareUpdateStatusController firmwareUpdateStatusController; + + @Test + void getFirmwareUpdateStatus_shouldReturnInProgress_whenNoStatusFileContent() { + // given + UUID firmwareId = UUID.randomUUID(); + SftpData sftpData = new SftpData(); + sftpData.setIpAddress("192.168.0.1"); + + when(statusFileContentProvider.readStatusFileContent(eq(sftpData), eq(firmwareId))).thenReturn(Optional.empty()); + + // when + FirmwareUpdateStatusResult result = firmwareUpdateStatusController.getFirmwareUpdateStatus(firmwareId, sftpData); + + // then + assertEquals(FirmwareUpdateStatus.IN_PROGRESS, result.getStatus()); + verify(logger, times(1)).infof("Getting the firmware (ID: '%s') update status - started", firmwareId); + verify(logger, times(1)).infof("Getting the firmware (ID: '%s') update status - finished with status: '%s'", firmwareId, FirmwareUpdateStatus.IN_PROGRESS); + } + + @Test + void getFirmwareUpdateStatus_shouldReturnError_whenStatusFileContainsErrorMessage() { + // given + UUID firmwareId = UUID.randomUUID(); + SftpData sftpData = new SftpData(); + sftpData.setIpAddress("192.168.0.1"); + + when(statusFileContentProvider.readStatusFileContent(sftpData, firmwareId)).thenReturn(Optional.of(LOG_MESSAGE_ERROR)); + + // when + FirmwareUpdateStatusResult result = firmwareUpdateStatusController.getFirmwareUpdateStatus(firmwareId, sftpData); + + // then + assertEquals(FirmwareUpdateStatus.ERROR, result.getStatus()); + assertEquals(LOG_MESSAGE_ERROR, result.getStatusMessage()); + verify(logger, times(1)).infof("Getting the firmware (ID: '%s') update status - started", firmwareId); + verify(logger, times(1)).infof("Getting the firmware (ID: '%s') update status - finished with status: '%s'", firmwareId, FirmwareUpdateStatus.ERROR); + } + + @Test + void getFirmwareUpdateStatus_shouldReturnSuccess_whenStatusFileContainsSuccessMessage() { + // given + UUID firmwareId = UUID.randomUUID(); + SftpData sftpData = new SftpData(); + sftpData.setIpAddress("192.168.0.1"); + + when(statusFileContentProvider.readStatusFileContent(sftpData, firmwareId)).thenReturn(Optional.of(LOG_MESSAGE_SUCCESS)); + + // when + FirmwareUpdateStatusResult result = firmwareUpdateStatusController.getFirmwareUpdateStatus(firmwareId, sftpData); + + // then + assertEquals(FirmwareUpdateStatus.SUCCESS, result.getStatus()); + assertEquals(LOG_MESSAGE_SUCCESS, result.getStatusMessage()); + verify(logger, times(1)).infof("Getting the firmware (ID: '%s') update status - started", firmwareId); + verify(logger, times(1)).infof("Getting the firmware (ID: '%s') update status - finished with status: '%s'", firmwareId, FirmwareUpdateStatus.SUCCESS); + } + + @Test + void getFirmwareUpdateStatus_shouldReturnError_whenExceptionThrown() { + // given + UUID firmwareId = UUID.randomUUID(); + SftpData sftpData = new SftpData(); + sftpData.setIpAddress("192.168.0.1"); + + when(statusFileContentProvider.readStatusFileContent(sftpData, firmwareId)).thenThrow(new RuntimeException("Unexpected error")); + + // when + FirmwareUpdateStatusResult result = firmwareUpdateStatusController.getFirmwareUpdateStatus(firmwareId, sftpData); + + // then + assertEquals(FirmwareUpdateStatus.ERROR, result.getStatus()); + verify(logger, times(1)).infof("Getting the firmware (ID: '%s') update status - started", firmwareId); + verify(logger, times(1)).errorf(any(RuntimeException.class), eq("Error while getting the firmware (ID: '%s') update status"), eq(firmwareId)); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/control/FirmwareUploadControllerTest.java b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareUploadControllerTest.java new file mode 100755 index 0000000..6c7d258 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/control/FirmwareUploadControllerTest.java @@ -0,0 +1,118 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.firmware.domain.FirmwareFileNotFoundException; +import io.gec.raw.connector.firmware.domain.FirmwareUploadException; +import io.gec.raw.connector.firmware.domain.TooManyFirmwareFilesException; +import io.gec.raw.connector.ftp.control.SftpDataProvider; +import io.gec.raw.connector.ftp.domain.FileItem; +import io.gec.raw.connector.ftp.domain.SftpData; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class FirmwareUploadControllerTest { + @Mock + SftpDataProvider sftpDataProvider; + @Mock + FirmwareStorageController firmwareStorageController; + @Mock + FirmwareFileConfigProvider firmwareFileConfigProvider; + @Mock + FirmwareFileUploader firmwareFileUploader; + @Mock + Logger logger; + + @InjectMocks + FirmwareUploadController firmwareUploadController; + + @Captor + ArgumentCaptor fileItemCaptor; + + @SneakyThrows + @Test + void shouldUploadFirmwareFileToDevice_success(){ + //given + UUID firmwareId = UUID.randomUUID(); + UUID commSvcDeviceId = UUID.randomUUID(); + List connectionWorkItemValues = new ArrayList<>(); + //and + SftpData sftpDataMock = mock(SftpData.class); + //and + String firmwareFileName = "firmware.tar"; + String firmwareSourceDir = "firmware/source/dir/"; + String firmwareUploadDir = "firmware/upload/dir/"; + String firmwareSourceFilePath = firmwareSourceDir + firmwareFileName; + String firmwareDestFilePath = firmwareUploadDir + firmwareFileName; + //and + willReturn(firmwareFileName).given(firmwareStorageController).findFirmwareFileName(firmwareId); + willReturn(firmwareSourceFilePath).given(firmwareFileConfigProvider).getFirmwareFileDownloadPath(firmwareId, firmwareFileName); + willReturn(firmwareUploadDir).given(firmwareFileConfigProvider).getUploadDir(); + willReturn(sftpDataMock).given(sftpDataProvider).createSftpData(commSvcDeviceId, connectionWorkItemValues); + willDoNothing().given(firmwareFileUploader).uploadFirmwareFile(eq(sftpDataMock), fileItemCaptor.capture()); + + //expect + assertDoesNotThrow(() -> firmwareUploadController.uploadFirmwareFileToDevice(firmwareId, commSvcDeviceId, connectionWorkItemValues)); + //and + FileItem fileItem = fileItemCaptor.getValue(); + assertThat(fileItem, is(notNullValue())); + assertThat(fileItem.sourceFilePath(), is(firmwareSourceFilePath)); + assertThat(fileItem.destFilePath(), is(firmwareDestFilePath)); + } + + @SneakyThrows + @Test + void shouldUploadFirmwareFileToDevice_throwFirmwareUploadException_whenFirmwareFileNotFoundException(){ + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + UUID commSvcDeviceId = UUID.randomUUID(); + List connectionWorkItemValues = new ArrayList<>(); + //and + willThrow(new FirmwareFileNotFoundException("exception message")).given(firmwareStorageController).findFirmwareFileName(firmwareId); + + //expect + FirmwareUploadException exception = assertThrows( + FirmwareUploadException.class, + () -> firmwareUploadController.uploadFirmwareFileToDevice(firmwareId, commSvcDeviceId, connectionWorkItemValues)); + //and + assertThat(exception.getMessage(), is("Cannot get file with ID: '45be0206-3534-46ff-8a63-44a8dcfa3f57'")); + } + + @SneakyThrows + @Test + void shouldUploadFirmwareFileToDevice_throwFirmwareUploadException_whenTooManyFirmwareFilesException(){ + //given + UUID firmwareId = UUID.fromString("45be0206-3534-46ff-8a63-44a8dcfa3f57"); + UUID commSvcDeviceId = UUID.randomUUID(); + List connectionWorkItemValues = new ArrayList<>(); + //and + willThrow(new TooManyFirmwareFilesException("exception message")).given(firmwareStorageController).findFirmwareFileName(firmwareId); + + //expect + FirmwareUploadException exception = assertThrows( + FirmwareUploadException.class, + () -> firmwareUploadController.uploadFirmwareFileToDevice(firmwareId, commSvcDeviceId, connectionWorkItemValues)); + //and + assertThat(exception.getMessage(), is("Cannot get file with ID: '45be0206-3534-46ff-8a63-44a8dcfa3f57'")); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/control/StatusFileContentProviderTest.java b/src/test/java/io/gec/raw/connector/firmware/control/StatusFileContentProviderTest.java new file mode 100755 index 0000000..8fd0728 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/control/StatusFileContentProviderTest.java @@ -0,0 +1,278 @@ +package io.gec.raw.connector.firmware.control; + +import io.gec.raw.connector.exception.entity.SftpException; +import io.gec.raw.connector.firmware.domain.FirmwareFileNotFoundException; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateVerificationException; +import io.gec.raw.connector.firmware.domain.TooManyFirmwareFilesException; +import io.gec.raw.connector.ftp.control.SftpDownloader; +import io.gec.raw.connector.ftp.domain.SftpData; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.*; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Files; +import java.util.Optional; +import java.util.UUID; + +import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; + +@ExtendWith(MockitoExtension.class) +class StatusFileContentProviderTest { + + @Mock + SftpDownloader sftpDownloader; + + @Mock + FirmwareStorageController firmwareStorageController; + + @Mock + FirmwareFileConfigProvider firmwareFileConfigProvider; + + @Mock + TempFileProvider tempFileProvider; + + @Mock + Logger logger; + + @InjectMocks + StatusFileContentProvider statusFileContentProvider; + + private final static String UPLOAD_DIR = "/upload/dir/"; + private Path tempFile; + + @BeforeEach + void setup() throws IOException { + tempFile = Files.createTempFile("statusFile", ".tmp"); + } + + @AfterEach + void cleanup() throws IOException { + Files.deleteIfExists(tempFile); + } + + @Test + void readStatusFileContent_shouldReturnContent_whenDownloadIsSuccessful() throws IOException, SftpException { + // given + UUID firmwareId = UUID.randomUUID(); + SftpData sftpData = new SftpData(); + sftpData.setIpAddress("192.168.0.1"); + + String firmwareFileName = "firmware"; + String statusFileExtension = ".status"; + String statusFilePathStr = UPLOAD_DIR + firmwareFileName + statusFileExtension; + + when(firmwareStorageController.findFirmwareFileName(firmwareId)).thenReturn(firmwareFileName); + when(firmwareFileConfigProvider.getFirmwareUpdateStatusFileExtension()).thenReturn(statusFileExtension); + when(firmwareFileConfigProvider.getUploadDir()).thenReturn(UPLOAD_DIR); + when(tempFileProvider.createTemporaryStatusFile()).thenReturn(tempFile); + + // Mock the download to succeed + doNothing().when(sftpDownloader).downloadFileFromDevice(sftpData, statusFilePathStr, tempFile); + + // Mocking the Files.readString method to return the content + String expectedContent = "Success"; + try (MockedStatic mockedFiles = Mockito.mockStatic(Files.class)) { + mockedFiles.when(() -> Files.readString(tempFile)).thenReturn(expectedContent); + + // when + Optional content = statusFileContentProvider.readStatusFileContent(sftpData, firmwareId); + + // then + assertTrue(content.isPresent()); + assertEquals(expectedContent, content.get()); + + // Capture logger interactions + ArgumentCaptor loggerCaptor = ArgumentCaptor.forClass(String.class); + + // Verifying the logger interactions + verify(logger, times(2)).infof(loggerCaptor.capture(), any(), any(), any()); + assertEquals("Downloading the firmware status file from device started with source file: '%s', dest file: '%s', device IP: '%s'", loggerCaptor.getAllValues().get(0)); + assertEquals("Downloading the firmware status file from device finished with source file: '%s', dest file: '%s', device IP: '%s'", loggerCaptor.getAllValues().get(1)); + } + } + + @Test + void readStatusFileContent_shouldReturnEmpty_whenDownloadFails() throws IOException, SftpException { + // given + UUID firmwareId = UUID.randomUUID(); + SftpData sftpData = new SftpData(); + sftpData.setIpAddress("192.168.0.1"); + + String firmwareFileName = "firmware"; + String statusFileExtension = ".status"; + String statusFilePathStr = UPLOAD_DIR + firmwareFileName + statusFileExtension; + + when(firmwareStorageController.findFirmwareFileName(firmwareId)).thenReturn(firmwareFileName); + when(firmwareFileConfigProvider.getFirmwareUpdateStatusFileExtension()).thenReturn(statusFileExtension); + when(firmwareFileConfigProvider.getUploadDir()).thenReturn(UPLOAD_DIR); + when(tempFileProvider.createTemporaryStatusFile()).thenReturn(tempFile); + + // Mock the download to fail + SftpException sftpException = new SftpException("Download failed"); + doThrow(sftpException).when(sftpDownloader).downloadFileFromDevice(sftpData, statusFilePathStr, tempFile); + + // when + Optional content = statusFileContentProvider.readStatusFileContent(sftpData, firmwareId); + + // then + assertFalse(content.isPresent()); + + // Capture logger interactions + ArgumentCaptor logMessageCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor argCaptor = ArgumentCaptor.forClass(Object.class); + ArgumentCaptor throwableCaptor = ArgumentCaptor.forClass(Throwable.class); + + // Verify that logger.infof was called correctly + verify(logger).infof( + eq("Downloading the firmware status file from device started with source file: '%s', dest file: '%s', device IP: '%s'"), + eq(statusFilePathStr), eq(tempFile.toString()), eq(sftpData.getIpAddress()) + ); + + // Verify that logger.debugf was called correctly with exception and message + verify(logger).debugf( + throwableCaptor.capture(), + logMessageCaptor.capture(), + argCaptor.capture(), + argCaptor.capture() + ); + + assertEquals("Cannot read status file '%s' from device IP: '%s'", logMessageCaptor.getValue()); + assertEquals(statusFilePathStr, argCaptor.getAllValues().get(0).toString()); + assertEquals(sftpData.getIpAddress(), argCaptor.getAllValues().get(1)); + assertInstanceOf(SftpException.class, throwableCaptor.getValue()); + } + + @Test + void readStatusFileContent_shouldReturnEmpty_whenIOExceptionOccurs() throws IOException, SftpException { + // given + UUID firmwareId = UUID.randomUUID(); + SftpData sftpData = new SftpData(); + sftpData.setIpAddress("192.168.0.1"); + + String firmwareFileName = "firmware"; + String statusFileExtension = ".status"; + String statusFilePathStr = UPLOAD_DIR + firmwareFileName + statusFileExtension; + + when(firmwareStorageController.findFirmwareFileName(firmwareId)).thenReturn(firmwareFileName); + when(firmwareFileConfigProvider.getFirmwareUpdateStatusFileExtension()).thenReturn(statusFileExtension); + when(firmwareFileConfigProvider.getUploadDir()).thenReturn(UPLOAD_DIR); + when(tempFileProvider.createTemporaryStatusFile()).thenReturn(tempFile); + + // Mock the download to succeed + doNothing().when(sftpDownloader).downloadFileFromDevice(sftpData, statusFilePathStr, tempFile); + + // Mocking the Files.readString method to throw IOException + IOException ioException = new IOException("IO error"); + try (MockedStatic mockedFiles = Mockito.mockStatic(Files.class)) { + mockedFiles.when(() -> Files.readString(tempFile)).thenThrow(ioException); + + // when + Optional content = statusFileContentProvider.readStatusFileContent(sftpData, firmwareId); + + // then + assertFalse(content.isPresent()); + // Capture logger interactions + ArgumentCaptor logMessageCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor argCaptor = ArgumentCaptor.forClass(Object.class); + ArgumentCaptor throwableCaptor = ArgumentCaptor.forClass(Throwable.class); + + // Verify that logger.infof was called correctly + verify(logger).infof( + eq("Downloading the firmware status file from device started with source file: '%s', dest file: '%s', device IP: '%s'"), + eq(statusFilePathStr), eq(tempFile.toString()), eq(sftpData.getIpAddress()) + ); + + // Verify that logger.debugf was called correctly with exception and message + verify(logger).debugf( + throwableCaptor.capture(), + logMessageCaptor.capture(), + argCaptor.capture(), + argCaptor.capture() + ); + + assertEquals("Cannot read status file '%s' from device IP: '%s'", logMessageCaptor.getValue()); + assertEquals(statusFilePathStr, argCaptor.getAllValues().get(0).toString()); + assertEquals(sftpData.getIpAddress(), argCaptor.getAllValues().get(1)); + assertInstanceOf(IOException.class, throwableCaptor.getValue()); + } + } + + @Test + void readStatusFileContent_shouldCleanupTemporaryFile() throws IOException, SftpException { + // given + UUID firmwareId = UUID.randomUUID(); + SftpData sftpData = new SftpData(); + sftpData.setIpAddress("192.168.0.1"); + + String firmwareFileName = "firmware"; + String statusFileExtension = ".status"; + String statusFilePathStr = UPLOAD_DIR + firmwareFileName + statusFileExtension; + String expectedContent = "Some status content"; + + when(firmwareStorageController.findFirmwareFileName(firmwareId)).thenReturn(firmwareFileName); + when(firmwareFileConfigProvider.getFirmwareUpdateStatusFileExtension()).thenReturn(statusFileExtension); + when(firmwareFileConfigProvider.getUploadDir()).thenReturn(UPLOAD_DIR); + when(tempFileProvider.createTemporaryStatusFile()).thenReturn(tempFile); + + // Using doAnswer to simulate the downloadFileFromDevice behavior by writing expectedContent to tempFile + doAnswer(invocation -> { + Path destinationPath = invocation.getArgument(2, Path.class); + Files.writeString(destinationPath, expectedContent); + return null; + }).when(sftpDownloader).downloadFileFromDevice(sftpData, statusFilePathStr, tempFile); + + // when + statusFileContentProvider.readStatusFileContent(sftpData, firmwareId); + + // then + assertFalse(Files.exists(tempFile)); + } + + @Test + void constructStatusFilePath_shouldReturnSuccessPath() throws FirmwareFileNotFoundException, TooManyFirmwareFilesException { + // given + UUID firmwareId = UUID.randomUUID(); + String firmwareFileName = "firmware"; + String statusFileExtension = ".status"; + String uploadDir = "/upload/dir/"; + + when(firmwareFileConfigProvider.getFirmwareUpdateStatusFileExtension()).thenReturn(statusFileExtension); + when(firmwareFileConfigProvider.getUploadDir()).thenReturn(uploadDir); + when(firmwareStorageController.findFirmwareFileName(firmwareId)).thenReturn(firmwareFileName); + + String expectedPath = uploadDir + firmwareFileName + statusFileExtension; + + // when + String actualPath = statusFileContentProvider.constructStatusFilePath(firmwareId); + + // then + assertEquals(expectedPath, actualPath); + } + + @Test + void constructStatusFilePath_shouldThrowFirmwareFileNotFoundException() throws FirmwareFileNotFoundException, TooManyFirmwareFilesException { + // given + UUID firmwareId = UUID.randomUUID(); + + when(firmwareStorageController.findFirmwareFileName(firmwareId)).thenThrow(new FirmwareFileNotFoundException("exception msg")); + + // when and then + assertThrows(FirmwareUpdateVerificationException.class, () -> statusFileContentProvider.constructStatusFilePath(firmwareId)); + } + + @Test + void constructStatusFilePath_shouldThrowTooManyFirmwareFilesException() throws FirmwareFileNotFoundException, TooManyFirmwareFilesException { + // given + UUID firmwareId = UUID.randomUUID(); + when(firmwareStorageController.findFirmwareFileName(firmwareId)).thenThrow(new TooManyFirmwareFilesException("exception msg")); + + // when and then + assertThrows(FirmwareUpdateVerificationException.class, () -> statusFileContentProvider.constructStatusFilePath(firmwareId)); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/control/TempFileProviderTest.java b/src/test/java/io/gec/raw/connector/firmware/control/TempFileProviderTest.java new file mode 100755 index 0000000..535cbdc --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/control/TempFileProviderTest.java @@ -0,0 +1,59 @@ +package io.gec.raw.connector.firmware.control; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +class TempFileProviderTest { + + @Test + void createTemporaryStatusFilePath_shouldCreateTempFileWithCorrectPrefixAndSuffix() throws IOException { + // given + TempFileProvider tempFileProvider = new TempFileProvider(); + + // when + Path tempFilePath = tempFileProvider.createTemporaryStatusFile(); + + // then + assertNotNull(tempFilePath, "The created temporary file path should not be null"); + assertTrue(Files.exists(tempFilePath), "The temporary file should exist"); + assertTrue(tempFilePath.getFileName().toString().startsWith("statusFile"), "The file should start with 'statusFile'"); + assertTrue(tempFilePath.getFileName().toString().endsWith(".tmp"), "The file should end with '.tmp'"); + + // Clean up + Files.deleteIfExists(tempFilePath); + } + + @Test + void createTemporaryStatusFilePath_shouldCreateTwoTempFilesWithDifferentNames() throws IOException { + // given + TempFileProvider tempFileProvider = new TempFileProvider(); + + // when + Path tempFilePath1 = tempFileProvider.createTemporaryStatusFile(); + Path tempFilePath2 = tempFileProvider.createTemporaryStatusFile(); + + // then + // Assertions for the first temporary file + assertNotNull(tempFilePath1, "The created temporary file path 1 should not be null"); + assertTrue(Files.exists(tempFilePath1), "The temporary file 1 should exist"); + assertTrue(tempFilePath1.getFileName().toString().startsWith("statusFile"), "The file 1 should start with 'statusFile'"); + assertTrue(tempFilePath1.getFileName().toString().endsWith(".tmp"), "The file 1 should end with '.tmp'"); + + // Assertions for the second temporary file + assertNotNull(tempFilePath2, "The created temporary file path 2 should not be null"); + assertTrue(Files.exists(tempFilePath2), "The temporary file 2 should exist"); + assertTrue(tempFilePath2.getFileName().toString().startsWith("statusFile"), "The file 2 should start with 'statusFile'"); + assertTrue(tempFilePath2.getFileName().toString().endsWith(".tmp"), "The file 2 should end with '.tmp'"); + + // Ensure the two files are different + assertNotEquals(tempFilePath1, tempFilePath2, "The two temporary files should have different paths"); + + // Clean up + Files.deleteIfExists(tempFilePath1); + Files.deleteIfExists(tempFilePath2); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareDownloadJobHandlerTest.java b/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareDownloadJobHandlerTest.java new file mode 100755 index 0000000..b57c308 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareDownloadJobHandlerTest.java @@ -0,0 +1,255 @@ +package io.gec.raw.connector.firmware.handler; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.firmware.control.FirmwareDownloadController; +import io.gec.raw.connector.firmware.domain.FirmwareDownloadException; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemResult; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemStatus; +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class FirmwareDownloadJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + FirmwareDownloadController firmwareDownloadController; + @InjectMocks + FirmwareDownloadJobHandler firmwareDownloadJobHandler; + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + //and + willReturn(Optional.of(fwiDTO)).given(communicationServiceController).fetchFirmwareWorkItem(workItemId); + + //when + var result = firmwareDownloadJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(fwiDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchFirmwareWorkItem(workItemId); + + //when + var result = firmwareDownloadJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @Test + void shouldStartProcessing_updateFirmwareWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updateFirmwareWorkItem(eq(workItemId), any()); + + //when + firmwareDownloadJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updateFirmwareWorkItem( + eq(workItemId), + argThat(firmwareWorkItemUpdateDTO -> firmwareWorkItemUpdateDTO.getStatus() == FirmwareWorkItemStatus.PREPARING_TO_DOWNLOAD + && firmwareWorkItemUpdateDTO.getMessage() == null)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFinishedResult() { + //given + UUID workItemId = UUID.randomUUID(); + UUID firmwareId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + fwiDTO.setFirmwareId(firmwareId); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, processingCancellationCheckerMock); + //and + willDoNothing().given(firmwareDownloadController).downloadFirmwareFile(firmwareId, workItemId, processingCancellationCheckerMock); + + //when + var result = firmwareDownloadJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(FirmwareWorkItemStatus.DOWNLOAD_FINISHED)); + assertThat(result.getMessage(), is(nullValue())); + verify(firmwareDownloadController, times(1)).downloadFirmwareFile(firmwareId, workItemId, processingCancellationCheckerMock); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withCanceledResult() { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> true); + + //when + var result = firmwareDownloadJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(FirmwareWorkItemStatus.DOWNLOAD_CANCELED)); + assertThat(result.getMessage(), is(nullValue())); + verify(firmwareDownloadController, times(0)).downloadFirmwareFile(any(), any(), any()); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResult_whenDownloadFirmwareThrowsException() { + //given + UUID workItemId = UUID.randomUUID(); + UUID firmwareId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + fwiDTO.setFirmwareId(firmwareId); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, processingCancellationCheckerMock); + //and + willThrow(new FirmwareDownloadException("exception message", new Throwable())) + .given(firmwareDownloadController) + .downloadFirmwareFile(firmwareId, workItemId, processingCancellationCheckerMock); + + //when + var result = firmwareDownloadJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(FirmwareWorkItemStatus.DOWNLOAD_FAILED)); + assertThat(result.getMessage(), is("exception message")); + verify(firmwareDownloadController, times(1)).downloadFirmwareFile(firmwareId, workItemId, processingCancellationCheckerMock); + } + + @ParameterizedTest + @EnumSource(FirmwareWorkItemStatus.class) + void shouldFinishProcessing_updateFirmwareWorkItem(FirmwareWorkItemStatus firmwareWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus, "result message"); + //and + willDoNothing().given(communicationServiceController).updateFirmwareWorkItem(eq(workItemId), any()); + + //when + firmwareDownloadJobHandler.finishProcessing(workItemWrapper, firmwareWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateFirmwareWorkItem( + eq(workItemId), + argThat(firmwareWorkItemUpdateRequestDTO -> firmwareWorkItemUpdateRequestDTO.getStatus() == firmwareWorkItemStatus + && "result message".equals(firmwareWorkItemUpdateRequestDTO.getMessage()))); + } + + @ParameterizedTest + @MethodSource("getFirmwareWorkItemStatusesForMapping") + void shouldMapToJobResult(FirmwareWorkItemStatus firmwareWorkItemStatus, JobStatus jobStatus) { + //given + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus, "message"); + + //when + var result = firmwareDownloadJobHandler.mapToJobResult(firmwareWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getFirmwareWorkItemStatusesForMapping() { + return Stream.of( + of(FirmwareWorkItemStatus.DOWNLOAD_FINISHED, JobStatus.DONE), + of(FirmwareWorkItemStatus.DOWNLOAD_FAILED, JobStatus.FAILED), + of(FirmwareWorkItemStatus.DOWNLOAD_FAILED_WRONG_CHECKSUM, JobStatus.FAILED), + of(FirmwareWorkItemStatus.DOWNLOAD_CANCELED, JobStatus.CANCELED) + ); + } + + @ParameterizedTest + @EnumSource( + value = FirmwareWorkItemStatus.class, + names = { + "DOWNLOAD_FINISHED", + "DOWNLOAD_FAILED", + "DOWNLOAD_FAILED_WRONG_CHECKSUM", + "DOWNLOAD_CANCELED"}, + mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(FirmwareWorkItemStatus firmwareWorkItemStatus) { + //given + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus); + + //expect + assertThrows(IllegalStateException.class, () -> firmwareDownloadJobHandler.mapToJobResult(firmwareWorkItemResult)); + } + + @Test + void shouldGetJobType() { + //when + var result = firmwareDownloadJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.FIRMWARE)); + } + + @Test + void shouldGetJobAction() { + //when + var result = firmwareDownloadJobHandler.getJobAction(); + + //then + assertThat(result, is(JobAction.UPDATE)); + } + + @Test + void shouldGetJobHandlerGroup() { + //when + var result = firmwareDownloadJobHandler.getJobHandlerGroup(); + + //then + assertThat(result, is(JobHandlerGroup.FIRMWARE_DOWNLOAD)); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareUpdateVerificationJobHandlerTest.java b/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareUpdateVerificationJobHandlerTest.java new file mode 100755 index 0000000..f92d514 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareUpdateVerificationJobHandlerTest.java @@ -0,0 +1,278 @@ +package io.gec.raw.connector.firmware.handler; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemStatus; +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.componentmode.control.ComponentModeHandler; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.firmware.control.FirmwareUpdateVerificationController; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateVerificationException; +import io.gec.raw.connector.firmware.domain.FirmwareUpdateVerificationTimeoutException; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemResult; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemStatus; +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.utils.TestDTOFactory; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class FirmwareUpdateVerificationJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + ComponentModeHandler componentModeHandler; + @Mock + FirmwareUpdateVerificationController firmwareUpdateVerificationController; + @InjectMocks + FirmwareUpdateVerificationJobHandler firmwareUpdateVerificationJobHandler; + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + //and + willReturn(Optional.of(fwiDTO)).given(communicationServiceController).fetchFirmwareWorkItem(workItemId); + + //when + var result = firmwareUpdateVerificationJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(fwiDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchFirmwareWorkItem(workItemId); + + //when + var result = firmwareUpdateVerificationJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @Test + void shouldStartProcessing_updateFirmwareWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updateFirmwareWorkItem(eq(workItemId), any()); + + //when + firmwareUpdateVerificationJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updateFirmwareWorkItem( + eq(workItemId), + argThat(firmwareWorkItemUpdateDTO -> firmwareWorkItemUpdateDTO.getStatus() == FirmwareWorkItemStatus.DEVICE_VERIFICATION_IN_PROGRESS + && firmwareWorkItemUpdateDTO.getMessage() == null)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFinishedResult() { + //given + UUID workItemId = UUID.randomUUID(); + UUID firmwareId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + //and + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, ConnectionWorkItemStatus.SUCCESS, UUID.randomUUID(), UUID.randomUUID()); + var fwiDTO = new FirmwareWorkItemDTO(); + fwiDTO.setFirmwareId(firmwareId); + fwiDTO.setConnectionWorkItem(connectionWorkItem); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + //and + willDoNothing().given(firmwareUpdateVerificationController).verifyFirmwareUpdate(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + + //when + var result = firmwareUpdateVerificationJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FINISHED)); + assertThat(result.getMessage(), is(nullValue())); + verify(firmwareUpdateVerificationController, times(1)).verifyFirmwareUpdate(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + verify(componentModeHandler, times(1)).restoreComponentMode(deviceId); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResult_whenFirmwareUpdateVerificationException() { + //given + UUID workItemId = UUID.randomUUID(); + UUID firmwareId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + //and + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, ConnectionWorkItemStatus.SUCCESS, UUID.randomUUID(), UUID.randomUUID()); + var fwiDTO = new FirmwareWorkItemDTO(); + fwiDTO.setFirmwareId(firmwareId); + fwiDTO.setConnectionWorkItem(connectionWorkItem); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + //and + willThrow(new FirmwareUpdateVerificationException("exception message", new Throwable())) + .given(firmwareUpdateVerificationController) + .verifyFirmwareUpdate(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + + //when + var result = firmwareUpdateVerificationJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FAILED)); + assertThat(result.getMessage(), is("exception message")); + verify(firmwareUpdateVerificationController, times(1)).verifyFirmwareUpdate(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + verify(componentModeHandler, times(1)).restoreComponentMode(deviceId); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResult_whenFirmwareUpdateVerificationTimeoutException() { + //given + UUID workItemId = UUID.randomUUID(); + UUID firmwareId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + //and + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, ConnectionWorkItemStatus.SUCCESS, UUID.randomUUID(), UUID.randomUUID()); + var fwiDTO = new FirmwareWorkItemDTO(); + fwiDTO.setFirmwareId(firmwareId); + fwiDTO.setConnectionWorkItem(connectionWorkItem); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + //and + willThrow(new FirmwareUpdateVerificationTimeoutException("exception message")) + .given(firmwareUpdateVerificationController) + .verifyFirmwareUpdate(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + + //when + var result = firmwareUpdateVerificationJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FAILED_WITH_TIMEOUT)); + assertThat(result.getMessage(), is("exception message")); + verify(firmwareUpdateVerificationController, times(1)).verifyFirmwareUpdate(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + verify(componentModeHandler, times(1)).changeComponentModeForDeviceTree(deviceId, ComponentMode.PAUSE); + } + + @ParameterizedTest + @EnumSource(FirmwareWorkItemStatus.class) + void shouldFinishProcessing_updateFirmwareWorkItem(FirmwareWorkItemStatus firmwareWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus, "result message"); + //and + willDoNothing().given(communicationServiceController).updateFirmwareWorkItem(eq(workItemId), any()); + + //when + firmwareUpdateVerificationJobHandler.finishProcessing(workItemWrapper, firmwareWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateFirmwareWorkItem( + eq(workItemId), + argThat(firmwareWorkItemUpdateRequestDTO -> firmwareWorkItemUpdateRequestDTO.getStatus() == firmwareWorkItemStatus + && "result message".equals(firmwareWorkItemUpdateRequestDTO.getMessage()))); + } + + @ParameterizedTest + @MethodSource("getFirmwareWorkItemStatusesForMapping") + void shouldMapToJobResult(FirmwareWorkItemStatus firmwareWorkItemStatus, JobStatus jobStatus) { + //given + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus, "message"); + + //when + var result = firmwareUpdateVerificationJobHandler.mapToJobResult(firmwareWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getFirmwareWorkItemStatusesForMapping() { + return Stream.of( + of(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FINISHED, JobStatus.DONE), + of(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FAILED, JobStatus.FAILED), + of(FirmwareWorkItemStatus.DEVICE_VERIFICATION_FAILED_WITH_TIMEOUT, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource( + value = FirmwareWorkItemStatus.class, + names = { + "DEVICE_VERIFICATION_FINISHED", + "DEVICE_VERIFICATION_FAILED", + "DEVICE_VERIFICATION_FAILED_WITH_TIMEOUT"}, + mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(FirmwareWorkItemStatus firmwareWorkItemStatus) { + //given + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus); + + //expect + assertThrows(IllegalStateException.class, () -> firmwareUpdateVerificationJobHandler.mapToJobResult(firmwareWorkItemResult)); + } + + @Test + void shouldGetJobType() { + //when + var result = firmwareUpdateVerificationJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.FIRMWARE)); + } + + @Test + void shouldGetJobAction() { + //when + var result = firmwareUpdateVerificationJobHandler.getJobAction(); + + //then + assertThat(result, is(JobAction.UPDATE)); + } + + @Test + void shouldGetJobHandlerGroup() { + //when + var result = firmwareUpdateVerificationJobHandler.getJobHandlerGroup(); + + //then + assertThat(result, is(JobHandlerGroup.FIRMWARE_UPDATE_VERIFICATION)); + } +} diff --git a/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareUploadJobHandlerTest.java b/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareUploadJobHandlerTest.java new file mode 100755 index 0000000..c680355 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/firmware/handler/FirmwareUploadJobHandlerTest.java @@ -0,0 +1,247 @@ +package io.gec.raw.connector.firmware.handler; + +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemStatus; +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.componentmode.control.ComponentModeHandler; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.firmware.control.FirmwareUploadController; +import io.gec.raw.connector.firmware.domain.FirmwareUploadException; +import io.gec.raw.connector.firmware.domain.FirmwareWorkItemResult; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemDTO; +import io.gec.raw.connector.firmware.dto.FirmwareWorkItemStatus; +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.utils.TestDTOFactory; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class FirmwareUploadJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + ComponentModeHandler componentModeHandler; + @Mock + FirmwareUploadController firmwareUploadController; + @InjectMocks + FirmwareUploadJobHandler firmwareUploadJobHandler; + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + //and + willReturn(Optional.of(fwiDTO)).given(communicationServiceController).fetchFirmwareWorkItem(workItemId); + + //when + var result = firmwareUploadJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(fwiDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchFirmwareWorkItem(workItemId); + + //when + var result = firmwareUploadJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @Test + void shouldStartProcessing_updateFirmwareWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updateFirmwareWorkItem(eq(workItemId), any()); + + //when + firmwareUploadJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updateFirmwareWorkItem( + eq(workItemId), + argThat(firmwareWorkItemUpdateDTO -> firmwareWorkItemUpdateDTO.getStatus() == FirmwareWorkItemStatus.SENDING_TO_DEVICE + && firmwareWorkItemUpdateDTO.getMessage() == null)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFinishedResult() { + //given + UUID workItemId = UUID.randomUUID(); + UUID firmwareId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + //and + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, ConnectionWorkItemStatus.SUCCESS, UUID.randomUUID(), UUID.randomUUID()); + var fwiDTO = new FirmwareWorkItemDTO(); + fwiDTO.setFirmwareId(firmwareId); + fwiDTO.setConnectionWorkItem(connectionWorkItem); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + //and + willDoNothing().given(firmwareUploadController).uploadFirmwareFileToDevice(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + + //when + var result = firmwareUploadJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(FirmwareWorkItemStatus.SENDING_TO_DEVICE_FINISHED)); + assertThat(result.getMessage(), is(nullValue())); + verify(firmwareUploadController, times(1)).uploadFirmwareFileToDevice(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + verify(componentModeHandler, times(1)).changeComponentMode(deviceId, ComponentMode.FIRMWARE_UPDATE); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResult_whenUploadFirmwareThrowsException() { + //given + UUID workItemId = UUID.randomUUID(); + UUID firmwareId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + //and + var connectionWorkItem = TestDTOFactory.createConnectionWorkItemDTO(deviceId, ConnectionWorkItemStatus.SUCCESS, UUID.randomUUID(), UUID.randomUUID()); + var fwiDTO = new FirmwareWorkItemDTO(); + fwiDTO.setFirmwareId(firmwareId); + fwiDTO.setConnectionWorkItem(connectionWorkItem); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + //and + willThrow(new FirmwareUploadException("exception message", new Throwable())) + .given(firmwareUploadController) + .uploadFirmwareFileToDevice(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + + //when + var result = firmwareUploadJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(FirmwareWorkItemStatus.SENDING_TO_DEVICE_FAILED)); + assertThat(result.getMessage(), is("exception message")); + verify(firmwareUploadController, times(1)).uploadFirmwareFileToDevice(firmwareId, deviceId, connectionWorkItem.getConnectionPropertyValues()); + verify(componentModeHandler, times(1)).changeComponentMode(deviceId, ComponentMode.FIRMWARE_UPDATE); + verify(componentModeHandler, times(1)).restoreComponentMode(deviceId); + } + + @ParameterizedTest + @EnumSource(FirmwareWorkItemStatus.class) + void shouldFinishProcessing_updateFirmwareWorkItem(FirmwareWorkItemStatus firmwareWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var fwiDTO = new FirmwareWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, fwiDTO, () -> false); + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus, "result message"); + //and + willDoNothing().given(communicationServiceController).updateFirmwareWorkItem(eq(workItemId), any()); + + //when + firmwareUploadJobHandler.finishProcessing(workItemWrapper, firmwareWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateFirmwareWorkItem( + eq(workItemId), + argThat(firmwareWorkItemUpdateRequestDTO -> firmwareWorkItemUpdateRequestDTO.getStatus() == firmwareWorkItemStatus + && "result message".equals(firmwareWorkItemUpdateRequestDTO.getMessage()))); + } + + @ParameterizedTest + @MethodSource("getFirmwareWorkItemStatusesForMapping") + void shouldMapToJobResult(FirmwareWorkItemStatus firmwareWorkItemStatus, JobStatus jobStatus) { + //given + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus, "message"); + + //when + var result = firmwareUploadJobHandler.mapToJobResult(firmwareWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getFirmwareWorkItemStatusesForMapping() { + return Stream.of( + of(FirmwareWorkItemStatus.SENDING_TO_DEVICE_FINISHED, JobStatus.DONE), + of(FirmwareWorkItemStatus.SENDING_TO_DEVICE_FAILED, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource( + value = FirmwareWorkItemStatus.class, + names = { + "SENDING_TO_DEVICE_FINISHED", + "SENDING_TO_DEVICE_FAILED"}, + mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(FirmwareWorkItemStatus firmwareWorkItemStatus) { + //given + var firmwareWorkItemResult = new FirmwareWorkItemResult(firmwareWorkItemStatus); + + //expect + assertThrows(IllegalStateException.class, () -> firmwareUploadJobHandler.mapToJobResult(firmwareWorkItemResult)); + } + + @Test + void shouldGetJobType() { + //when + var result = firmwareUploadJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.FIRMWARE)); + } + + @Test + void shouldGetJobAction() { + //when + var result = firmwareUploadJobHandler.getJobAction(); + + //then + assertThat(result, is(JobAction.UPDATE)); + } + + @Test + void shouldGetJobHandlerGroup() { + //when + var result = firmwareUploadJobHandler.getJobHandlerGroup(); + + //then + assertThat(result, is(JobHandlerGroup.FIRMWARE_UPLOAD)); + } +} diff --git a/src/test/java/io/gec/raw/connector/ftp/control/FtpControllerTest.java b/src/test/java/io/gec/raw/connector/ftp/control/FtpControllerTest.java new file mode 100755 index 0000000..611186e --- /dev/null +++ b/src/test/java/io/gec/raw/connector/ftp/control/FtpControllerTest.java @@ -0,0 +1,154 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.access.configworkitem.control.AccessDbConfigParser; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.access.logworkitem.control.AccessLogParser; +import io.gec.raw.connector.ftp.domain.SftpData; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class FtpControllerTest { + @Mock + Logger logger; + @Mock + AccessDbConfigParser accessDbConfigParser; + @Mock + AccessLogParser accessLogParser; + @Mock + IPAddressHelper ipAddressHelper; + @Mock + SftpDataProvider sftpDataProvider; + @Mock + SftpDownloader sftpDownloader; + @InjectMocks + FtpController ftpController; + + final String VALID_IP = "1.2.3.4"; + final String INVALID_IP = ""; + final int VALID_PORT = 22; + final int INVALID_PORT = 65536; + final List VALID_DEVICE_NUMBER_LIST = new ArrayList<>(); + final List INVALID_DEVICE_NUMBER_LIST = null; + + @Test + void getAccessFile_shouldFailWhenWrongIp() { + //when + Exception exception = assertThrows(IllegalArgumentException.class, () -> ftpController.getAccessFile(INVALID_IP, VALID_PORT, "null", "null")); + + //then + assertThat(exception.getMessage(), is("IP address is null or empty")); + } + + @Test + void getAccessFile_shouldFailWhenWrongPort() { + //when + Exception exception = assertThrows(IllegalArgumentException.class, () -> ftpController.getAccessFile(VALID_IP, INVALID_PORT, "null", "null")); + + //then + assertThat(exception.getMessage(), is("Port 65536 is invalid. Port should be between 0-65534")); + } + + @Test + void shouldCreateSftpData() { + //given + String deviceUrl = "http://192.168.1.2"; + List connectionWorkItemValueDTOs = new ArrayList<>(); + //and + SftpData sftpDataMock = mock(SftpData.class); + willReturn(sftpDataMock).given(sftpDataProvider).createSftpData(connectionWorkItemValueDTOs, deviceUrl); + + //when + var sftpData = ftpController.createSftpData(connectionWorkItemValueDTOs, deviceUrl); + + //then + assertNotNull(sftpData); + assertEquals(sftpDataMock, sftpData); + } + + @Test + void getLoggingFile_shouldFailWhenWrongIp() { + //given + var sftpData = TestDTOFactory.createSftpData(); + sftpData.setIpAddress(INVALID_IP); + //and + OffsetDateTime fromTime = OffsetDateTime.parse("2024-01-01T00:00:00Z"); + + //when + Exception exception = assertThrows( + IllegalArgumentException.class, + () -> ftpController.getLoggingFile(sftpData, fromTime, UUID.randomUUID(), VALID_DEVICE_NUMBER_LIST)); + + //then + assertThat(exception.getMessage(), is("IP address is null or empty")); + } + + @Test + void getLoggingFile_shouldFailWhenWrongPort() { + //given + var sftpData = TestDTOFactory.createSftpData(); + sftpData.setPort(INVALID_PORT); + //and + OffsetDateTime fromTime = OffsetDateTime.parse("2024-01-01T00:00:00Z"); + + //when + Exception exception = assertThrows( + IllegalArgumentException.class, + () -> ftpController.getLoggingFile(sftpData, fromTime, UUID.randomUUID(), VALID_DEVICE_NUMBER_LIST)); + + //then + assertThat(exception.getMessage(), is("Port 65536 is invalid. Port should be between 0-65534")); + } + + @Test + void getSyslogFile_shouldFailWhenWrongPort() { + //when + Exception exception = assertThrows( + IllegalArgumentException.class, + () -> ftpController.getSyslogFile(VALID_IP, INVALID_PORT, "null", "null", null, UUID.randomUUID(), VALID_DEVICE_NUMBER_LIST)); + + //then + assertThat(exception.getMessage(), is("Port 65536 is invalid. Port should be between 0-65534")); + } + + @Test + void getSyslogFile_shouldFailWhenWrongIp() { + //when + Exception exception = assertThrows( + IllegalArgumentException.class, + () -> ftpController.getSyslogFile(INVALID_IP, VALID_PORT, "null", "null", null, UUID.randomUUID(), VALID_DEVICE_NUMBER_LIST)); + + //then + assertThat(exception.getMessage(), is("IP address is null or empty")); + } + + @Test + void getSyslogFile_shouldFailWhenWrongDeviceNumberList() { + //when + Exception exception = assertThrows( + IllegalArgumentException.class, + () -> ftpController.getSyslogFile(VALID_IP, VALID_PORT, "null", "null", null, UUID.randomUUID(), INVALID_DEVICE_NUMBER_LIST)); + + //then + assertThat(exception.getMessage(), is("Device number list is null or empty")); + } +} diff --git a/src/test/java/io/gec/raw/connector/ftp/control/SftpDataProviderTest.java b/src/test/java/io/gec/raw/connector/ftp/control/SftpDataProviderTest.java new file mode 100755 index 0000000..8afdc1c --- /dev/null +++ b/src/test/java/io/gec/raw/connector/ftp/control/SftpDataProviderTest.java @@ -0,0 +1,67 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.protocol.control.PropertyRepository; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.BDDMockito.willReturn; + +@ExtendWith(MockitoExtension.class) +class SftpDataProviderTest { + @Mock + DeviceController deviceController; + @Mock + IPAddressHelper ipAddressHelper; + @Mock + PropertyRepository propertyRepository; + @InjectMocks + SftpDataProvider sftpDataProvider; + + @Test + void shouldCreateSftpData() { + //given + UUID commSvcDeviceId = UUID.randomUUID(); + String usernameValue = "username-value"; + String deviceUrl = "http://192.168.1.2"; + String ipAddress = "192.168.1.2"; + //and + Device device = new Device(); + device.setDeviceURL(deviceUrl); + //and + var protocolProperty = TestEntityFactory.createProtocolProperty("Username", TestEntityFactory.createProtocol()); + var connectionWorkItemValueDTO = TestDTOFactory.createConnectionWorkItemValueDTO(protocolProperty.getId(), usernameValue); + //and + willReturn(device).given(deviceController).getDeviceByCommSvcId(commSvcDeviceId); + willReturn(ipAddress).given(ipAddressHelper).removeHttpFromIpAddress(deviceUrl); + willReturn(protocolProperty).given(propertyRepository).findByCommSvcId(protocolProperty.getId()); + + //when + var sftpData = sftpDataProvider.createSftpData(commSvcDeviceId, List.of(connectionWorkItemValueDTO)); + + //then + assertNotNull(sftpData); + assertEquals(sftpData.getUserName(), usernameValue); + assertEquals(sftpData.getIpAddress(), ipAddress); + } + + @Test + void shouldCreateSftpData_throwException_whenDeviceUrlIsNull() { + //when + var exception = assertThrows(IllegalArgumentException.class, () -> sftpDataProvider.createSftpData(List.of(), null)); + + //then + assertEquals("Device URL can not be null", exception.getMessage()); + } +} diff --git a/src/test/java/io/gec/raw/connector/ftp/control/SftpDirectoryCleanerTest.java b/src/test/java/io/gec/raw/connector/ftp/control/SftpDirectoryCleanerTest.java new file mode 100755 index 0000000..d57c2bd --- /dev/null +++ b/src/test/java/io/gec/raw/connector/ftp/control/SftpDirectoryCleanerTest.java @@ -0,0 +1,138 @@ +package io.gec.raw.connector.ftp.control; + +import io.gec.raw.connector.exception.entity.SftpException; +import lombok.SneakyThrows; +import net.schmizz.sshj.sftp.RemoteResourceInfo; +import net.schmizz.sshj.sftp.SFTPClient; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.BDDMockito.*; + +@ExtendWith(MockitoExtension.class) +class SftpDirectoryCleanerTest { + @Mock + Logger logger; + @InjectMocks + SftpDirectoryCleaner sftpDirectoryCleaner; + + @SneakyThrows + @Test + void removeFilesFromDirectory_success_forSingleFile() { + //given + String dirToClear = "/dir/to/clear/"; + String filePathToRemove = "/dir/to/clear/filename.ext"; + SFTPClient sftpClientMock = mock(SFTPClient.class); + RemoteResourceInfo resourceInfoMock = mock(RemoteResourceInfo.class); + //and + willReturn(List.of(resourceInfoMock)).given(sftpClientMock).ls(dirToClear); + willReturn(false).given(resourceInfoMock).isDirectory(); + willReturn(filePathToRemove).given(resourceInfoMock).getPath(); + willDoNothing().given(sftpClientMock).rm(filePathToRemove); + + //expect + assertDoesNotThrow(() -> sftpDirectoryCleaner.removeFilesFromDirectory(sftpClientMock, dirToClear)); + //and + verify(sftpClientMock, times(1)).rm(filePathToRemove); + } + + @SneakyThrows + @Test + void removeFilesFromDirectory_success_forMultipleFiles() { + //given + String dirToClear = "/dir/to/clear/"; + SFTPClient sftpClientMock = mock(SFTPClient.class); + RemoteResourceInfo resourceInfoMock = mock(RemoteResourceInfo.class); + var filesToRemove = List.of(resourceInfoMock, resourceInfoMock, resourceInfoMock); + //and + willReturn(filesToRemove).given(sftpClientMock).ls(dirToClear); + willReturn(false).given(resourceInfoMock).isDirectory(); + + //expect + assertDoesNotThrow(() -> sftpDirectoryCleaner.removeFilesFromDirectory(sftpClientMock, dirToClear)); + //and + verify(sftpClientMock, times(3)).rm(any()); + } + + @SneakyThrows + @Test + void shouldRemoveFilesFromDirectory_doNothing_whenOnlyDirectoriesExistInsideDirectory() { + //given + String dirToClear = "/dir/to/clear/"; + SFTPClient sftpClientMock = mock(SFTPClient.class); + RemoteResourceInfo resourceInfoMock = mock(RemoteResourceInfo.class); + var filesToRemove = List.of(resourceInfoMock, resourceInfoMock, resourceInfoMock); + //and + willReturn(filesToRemove).given(sftpClientMock).ls(dirToClear); + willReturn(true).given(resourceInfoMock).isDirectory(); + + //expect + assertDoesNotThrow(() -> sftpDirectoryCleaner.removeFilesFromDirectory(sftpClientMock, dirToClear)); + //and + verify(sftpClientMock, times(0)).rm(any()); + } + + @SneakyThrows + @Test + void shouldRemoveFilesFromDirectory_doNothing_whenDirectoryIsEmpty() { + //given + String dirToClear = "/dir/to/clear/"; + SFTPClient sftpClientMock = mock(SFTPClient.class); + //and + willReturn(List.of()).given(sftpClientMock).ls(dirToClear); + + //expect + assertDoesNotThrow(() -> sftpDirectoryCleaner.removeFilesFromDirectory(sftpClientMock, dirToClear)); + //and + verify(sftpClientMock, times(0)).rm(any()); + } + + @SneakyThrows + @Test + void shouldRemoveFilesFromDirectory_throwSftpException_whenIOExceptionThrownByListingFiles() { + //given + String dirToClear = "/dir/to/clear/"; + SFTPClient sftpClientMock = mock(SFTPClient.class); + //and + willThrow(new IOException("exception message")).given(sftpClientMock).ls(dirToClear); + + //when + var exception = assertThrows(SftpException.class, () -> sftpDirectoryCleaner.removeFilesFromDirectory(sftpClientMock, dirToClear)); + + //then + verify(sftpClientMock, times(0)).rm(any()); + //and + assertThat(exception.getMessage(), is("Error while removing file(s): exception message")); + } + + @SneakyThrows + @Test + void shouldRemoveFilesFromDirectory_throwSftpException_whenIOExceptionThrownByRemovingFiles() { + //given + String dirToClear = "/dir/to/clear/"; + SFTPClient sftpClientMock = mock(SFTPClient.class); + RemoteResourceInfo resourceInfoMock = mock(RemoteResourceInfo.class); + //and + willReturn(List.of(resourceInfoMock)).given(sftpClientMock).ls(dirToClear); + willThrow(new IOException("exception message")).given(sftpClientMock).rm(any()); + + //when + var exception = assertThrows(SftpException.class, () -> sftpDirectoryCleaner.removeFilesFromDirectory(sftpClientMock, dirToClear)); + + //then + verify(sftpClientMock, times(1)).rm(any()); + //and + assertThat(exception.getMessage(), is("Error while removing file(s): exception message")); + } +} diff --git a/src/test/java/io/gec/raw/connector/job/control/JobControllerTest.java b/src/test/java/io/gec/raw/connector/job/control/JobControllerTest.java new file mode 100755 index 0000000..b10766a --- /dev/null +++ b/src/test/java/io/gec/raw/connector/job/control/JobControllerTest.java @@ -0,0 +1,156 @@ +package io.gec.raw.connector.job.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobDTO; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.JobHandler; +import io.gec.raw.connector.utils.TestDTOFactory; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class JobControllerTest { + + @Mock + CommunicationServiceController communicationServiceController; + @Mock + JobsExecutor jobsExecutor; + @Mock + List jobHandlers; + @Mock + Logger logger; + @InjectMocks + JobController jobController; + + @Test + void shouldGetJobs_searchForJobHandler() { + //given + JobDTO jobDTO = TestDTOFactory.createJobDTO(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID()); + //and + willReturn(List.of(jobDTO)).given(communicationServiceController).fetchJobs(anyString()); + willReturn(Stream.empty()).given(jobHandlers).stream(); + + //when + jobController.getJobs(); + + //then + verify(communicationServiceController, times(1)).fetchJobs(anyString()); + verify(jobHandlers, times(1)).stream(); + verify(logger, times(1)).warnf(anyString(), any(), any()); + } + + @Test + void shouldGetJobs_notSearchForJobHandler_whenNoJobs() { + //given + willReturn(Collections.emptyList()).given(communicationServiceController).fetchJobs(anyString()); + + //when + jobController.getJobs(); + + //then + verify(communicationServiceController, times(1)).fetchJobs(anyString()); + verify(jobHandlers, times(0)).stream(); + } + + @ParameterizedTest + @EnumSource(JobType.class) + void shouldGetJobs_handleJob(JobType jobType) { + //given + JobDTO jobDTO = TestDTOFactory.createJobDTO(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID()); + jobDTO.setType(jobType); + //and + var jobHandler = mock(JobHandler.class); + var jobHandlersForJob = List.of(jobHandler); + //and + willReturn(List.of(jobDTO)).given(communicationServiceController).fetchJobs(anyString()); + willReturn(Stream.of(jobHandler)).given(jobHandlers).stream(); + willReturn(jobType).given(jobHandler).getJobType(); + willReturn(JobAction.EXECUTE).given(jobHandler).getJobAction(); + + //when + jobController.getJobs(); + + //then + verify(communicationServiceController, times(1)).fetchJobs(anyString()); + verify(jobHandlers, times(1)).stream(); + verify(jobsExecutor, times(1)).execute(jobHandlersForJob, jobDTO); + } + + @Test + void shouldGetJobs_handleFirmwareJob_withMoreHandlers_inOrderOfPriority() { + //given + var jobType = JobType.FIRMWARE; + //and + JobDTO jobDTO = TestDTOFactory.createJobDTO(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID()); + jobDTO.setType(jobType); + //and + var jobHandler1 = mock(JobHandler.class); // FIRMWARE_DOWNLOAD: priority=1 + var jobHandler2 = mock(JobHandler.class); // FIRMWARE_UPLOAD: priority=2 + var jobHandler3 = mock(JobHandler.class); // FIRMWARE_UPDATE_VERIFICATION: priority=3 + //and + var handlersStream = Stream.of(jobHandler3, jobHandler1, jobHandler2); // different order of handlers on purpose + var expectedJobHandlersInThisOrder = List.of(jobHandler1, jobHandler2, jobHandler3); // handlers should be exactly in this order + //and + willReturn(jobType).given(jobHandler1).getJobType(); + willReturn(jobType).given(jobHandler2).getJobType(); + willReturn(jobType).given(jobHandler3).getJobType(); + willReturn(JobAction.EXECUTE).given(jobHandler1).getJobAction(); + willReturn(JobAction.EXECUTE).given(jobHandler2).getJobAction(); + willReturn(JobAction.EXECUTE).given(jobHandler3).getJobAction(); + willReturn(JobHandlerGroup.FIRMWARE_DOWNLOAD).given(jobHandler1).getJobHandlerGroup(); + willReturn(JobHandlerGroup.FIRMWARE_UPLOAD).given(jobHandler2).getJobHandlerGroup(); + willReturn(JobHandlerGroup.FIRMWARE_UPDATE_VERIFICATION).given(jobHandler3).getJobHandlerGroup(); + //and + willReturn(List.of(jobDTO)).given(communicationServiceController).fetchJobs(anyString()); + willReturn(handlersStream).given(jobHandlers).stream(); + + //when + jobController.getJobs(); + + //then + verify(communicationServiceController, times(1)).fetchJobs(anyString()); + verify(jobHandlers, times(1)).stream(); + verify(jobsExecutor, times(1)).execute(expectedJobHandlersInThisOrder, jobDTO); + } + + @Test + void shouldGetJobs_notHandleJob_whenNoHandlersForJobType() { + //given + var toProcessJobType = JobType.DRIVER; + var supportedJobType = JobType.ACCESS_CONNECTION; + //and + JobDTO jobDTO = TestDTOFactory.createJobDTO(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID()); + jobDTO.setType(toProcessJobType); + //and + var jobHandler = mock(JobHandler.class); + //and + willReturn(List.of(jobDTO)).given(communicationServiceController).fetchJobs(anyString()); + willReturn(Stream.of(jobHandler)).given(jobHandlers).stream(); + willReturn(supportedJobType).given(jobHandler).getJobType(); + + //when + jobController.getJobs(); + + //then + verify(communicationServiceController, times(1)).fetchJobs(anyString()); + verify(jobHandlers, times(1)).stream(); + verify(jobsExecutor, times(0)).execute(any(), any()); + } +} diff --git a/src/test/java/io/gec/raw/connector/job/control/JobExecutorProviderTest.java b/src/test/java/io/gec/raw/connector/job/control/JobExecutorProviderTest.java new file mode 100755 index 0000000..d083517 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/job/control/JobExecutorProviderTest.java @@ -0,0 +1,85 @@ +package io.gec.raw.connector.job.control; + +import io.gec.raw.connector.job.domain.JobHandlerGroup; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.lang.reflect.Field; +import java.util.concurrent.ExecutorService; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class JobExecutorProviderTest { + @InjectMocks + JobExecutorProvider jobExecutorProvider; + + @SneakyThrows + @Test + void shouldGetExecutor_returnDefaultExecutor() { + //given + ExecutorService executorServiceMock = mock(ExecutorService.class); + Field field = jobExecutorProvider.getClass().getDeclaredField("defaultExecutorService"); + field.setAccessible(true); + field.set(jobExecutorProvider, executorServiceMock); + + //when + var result = jobExecutorProvider.getExecutor(JobHandlerGroup.DEFAULT); + + //then + assertThat(result, is(executorServiceMock)); + } + + @SneakyThrows + @Test + void shouldGetExecutor_returnExecutor_forFirmwareDownloader() { + //given + ExecutorService executorServiceMock = mock(ExecutorService.class); + Field field = jobExecutorProvider.getClass().getDeclaredField("firmwareDownloaderExecutorService"); + field.setAccessible(true); + field.set(jobExecutorProvider, executorServiceMock); + + //when + var result = jobExecutorProvider.getExecutor(JobHandlerGroup.FIRMWARE_DOWNLOAD); + + //then + assertThat(result, is(executorServiceMock)); + } + + @SneakyThrows + @Test + void shouldGetExecutor_returnExecutor_forFirmwareUploader() { + //given + ExecutorService executorServiceMock = mock(ExecutorService.class); + Field field = jobExecutorProvider.getClass().getDeclaredField("firmwareUploaderExecutorService"); + field.setAccessible(true); + field.set(jobExecutorProvider, executorServiceMock); + + //when + var result = jobExecutorProvider.getExecutor(JobHandlerGroup.FIRMWARE_UPLOAD); + + //then + assertThat(result, is(executorServiceMock)); + } + + @SneakyThrows + @Test + void shouldGetExecutor_returnExecutor_forFirmwareUpdateVerifier() { + //given + ExecutorService executorServiceMock = mock(ExecutorService.class); + Field field = jobExecutorProvider.getClass().getDeclaredField("firmwareUpdateVerifierExecutorService"); + field.setAccessible(true); + field.set(jobExecutorProvider, executorServiceMock); + + //when + var result = jobExecutorProvider.getExecutor(JobHandlerGroup.FIRMWARE_UPDATE_VERIFICATION); + + //then + assertThat(result, is(executorServiceMock)); + } +} diff --git a/src/test/java/io/gec/raw/connector/job/control/JobMapperTest.java b/src/test/java/io/gec/raw/connector/job/control/JobMapperTest.java new file mode 100755 index 0000000..bbc012b --- /dev/null +++ b/src/test/java/io/gec/raw/connector/job/control/JobMapperTest.java @@ -0,0 +1,37 @@ +package io.gec.raw.connector.job.control; + +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.utils.TestDTOFactory; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class JobMapperTest { + JobMapper jobMapper = new JobMapper(); + + @Test + void shouldCreateJobStateFromJobDTO() { + // given + UUID connectorId = UUID.randomUUID(); + UUID referenceId = UUID.randomUUID(); + UUID plantId = UUID.randomUUID(); + UUID userId = UUID.randomUUID(); + var jobDTO = TestDTOFactory.createJobDTO(connectorId, referenceId, plantId, userId); + jobDTO.setStatus(JobStatus.NEW); + jobDTO.setType(JobType.ACCESS_CONNECTION); + + //when + var jobStateDTO = jobMapper.createJobStateDTO(jobDTO); + + //then + assertNotNull(jobStateDTO); + assertThat(jobStateDTO.getStatus(), is(jobDTO.getStatus())); + assertThat(jobStateDTO.getUserId(), is(jobDTO.getUserId())); + + } +} diff --git a/src/test/java/io/gec/raw/connector/job/control/JobsExecutorTest.java b/src/test/java/io/gec/raw/connector/job/control/JobsExecutorTest.java new file mode 100755 index 0000000..64ddb24 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/job/control/JobsExecutorTest.java @@ -0,0 +1,131 @@ +package io.gec.raw.connector.job.control; + +import io.gec.raw.connector.job.domain.JobWrapper; +import io.gec.raw.connector.job.dto.JobDTO; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.job.handler.JobHandler; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutorService; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class JobsExecutorTest { + @Mock + JobExecutorProvider jobExecutorProvider; + @Mock + Logger logger; + @InjectMocks + JobsExecutor jobsExecutor; + + @Test + void shouldExecute_handleJob() { + //given + JobHandler jobHandlerMock = mock(JobHandler.class); + ExecutorService executorServiceMock = mock(ExecutorService.class); + JobDTO jobDTO = new JobDTO(); + jobDTO.setId(UUID.randomUUID()); + //and + willReturn(executorServiceMock).given(jobExecutorProvider).getExecutor(any()); + + //when + jobsExecutor.execute(List.of(jobHandlerMock), jobDTO); + + //then + verify(jobExecutorProvider, times(1)).getExecutor(any()); + verify(executorServiceMock, times(1)).execute(any()); + } + + @Test + void shouldExecute_notHandleJob_ifJobStatusIsCancelRequested() { + //given + JobHandler jobHandlerMock = mock(JobHandler.class); + JobDTO jobDTO = new JobDTO(); + jobDTO.setId(UUID.randomUUID()); + jobDTO.setStatus(JobStatus.CANCEL_REQUESTED); + + //when + jobsExecutor.execute(List.of(jobHandlerMock), jobDTO); + + //then + verify(jobExecutorProvider, times(0)).getExecutor(any()); + } + + @Test + void shouldExecuteJob_getOneExecutorService_forOneHandler() { + //given + JobHandler jobHandlerMock = mock(JobHandler.class); + ExecutorService executorServiceMock = mock(ExecutorService.class); + JobWrapper jobWrapperMock = mock(JobWrapper.class); + //and + willReturn(executorServiceMock).given(jobExecutorProvider).getExecutor(any()); + + //when + jobsExecutor.executeJob(List.of(jobHandlerMock), jobWrapperMock); + + //then + verify(jobExecutorProvider, times(1)).getExecutor(any()); + } + + @Test + void shouldExecuteJob_getExecutorService_perEachHandler() { + //given + JobHandler jobHandlerMock1 = mock(JobHandler.class); + JobHandler jobHandlerMock2 = mock(JobHandler.class); + JobHandler jobHandlerMock3 = mock(JobHandler.class); + var jobHandlers = List.of(jobHandlerMock1, jobHandlerMock2, jobHandlerMock3); + //and + ExecutorService executorServiceMock = mock(ExecutorService.class); + JobWrapper jobWrapperMock = mock(JobWrapper.class); + //and + willReturn(executorServiceMock).given(jobExecutorProvider).getExecutor(any()); + + //when + jobsExecutor.executeJob(jobHandlers, jobWrapperMock); + + //then + verify(jobExecutorProvider, times(3)).getExecutor(any()); + } + + @ParameterizedTest + @EnumSource(value = JobType.class, names = {"DISCOVERY", "FIRMWARE"}) + void shouldIsJobCancellable_returnTrue(JobType jobType) { + //given + JobDTO jobDTO = new JobDTO(); + jobDTO.setType(jobType); + + //when + var result = jobsExecutor.isJobCancellable(jobDTO); + + //then + assertTrue(result); + } + + @ParameterizedTest + @EnumSource(value = JobType.class, names = {"DISCOVERY", "FIRMWARE"}, mode = EnumSource.Mode.EXCLUDE) + void shouldIsJobCancellable_returnFalse(JobType jobType) { + //given + JobDTO jobDTO = new JobDTO(); + jobDTO.setType(jobType); + + //when + var result = jobsExecutor.isJobCancellable(jobDTO); + + //then + assertFalse(result); + } +} diff --git a/src/test/java/io/gec/raw/connector/pauseworkitem/handler/PauseWorkItemJobHandlerTest.java b/src/test/java/io/gec/raw/connector/pauseworkitem/handler/PauseWorkItemJobHandlerTest.java new file mode 100755 index 0000000..d1f2a13 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/pauseworkitem/handler/PauseWorkItemJobHandlerTest.java @@ -0,0 +1,324 @@ +package io.gec.raw.connector.pauseworkitem.handler; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.pauseworkitem.domain.PauseWorkItemResult; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemDTO; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemStatus; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.variable.control.VariableController; +import jakarta.persistence.EntityNotFoundException; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class PauseWorkItemJobHandlerTest { + @Mock + CommunicationServiceController communicationServiceController; + @Mock + Logger logger; + @Mock + VariableController variableController; + @Mock + DeviceController deviceController; + @InjectMocks + PauseWorkItemJobHandler pauseWorkItemJobHandler; + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var pauseWorkItemDTO = new PauseWorkItemDTO(); + //and + willReturn(Optional.of(pauseWorkItemDTO)).given(communicationServiceController).fetchPauseWorkItem(workItemId); + + //when + var result = pauseWorkItemJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(true)); + assertThat(result.get(), is(pauseWorkItemDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchPauseWorkItem(workItemId); + + //when + var result = pauseWorkItemJobHandler.getWorkItem(workItemId); + + //then + assertThat(result.isPresent(), is(false)); + } + + @Test + void shouldStartProcessing_updatePauseWorkItem() { + //given + UUID workItemId = UUID.randomUUID(); + var pauseWorkItemDTO = new PauseWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + //and + willDoNothing().given(communicationServiceController).updatePauseWorkItem(eq(workItemId), any()); + + //when + pauseWorkItemJobHandler.startProcessing(workItemWrapper); + + //then + verify(communicationServiceController, times(1)).updatePauseWorkItem( + eq(workItemId), + argThat(pauseWorkItemUpdateDTO -> pauseWorkItemUpdateDTO.getStatus() == PauseWorkItemStatus.IN_PROGRESS)); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDoneResultForVariableModePause() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID varCommId = UUID.randomUUID(); + var mode = ComponentMode.PAUSE; + var pauseWorkItemDTO = TestDTOFactory.createPauseWorkItem(deviceId, varCommId, mode); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + + //when + var result = pauseWorkItemJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(PauseWorkItemStatus.DONE)); + assertThat(result.getMessage(), is(nullValue())); + verify(variableController, times(1)).updateModeByCommSvcId(varCommId, mode); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDoneResultForVariableModeOperational() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID varCommId = UUID.randomUUID(); + var mode = ComponentMode.OPERATION; + var pauseWorkItemDTO = TestDTOFactory.createPauseWorkItem(deviceId, varCommId, mode); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + + //when + var result = pauseWorkItemJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(PauseWorkItemStatus.DONE)); + assertThat(result.getMessage(), is(nullValue())); + verify(variableController, times(1)).updateModeByCommSvcId(varCommId, mode); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResultForVariableModeOperational() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID varCommId = UUID.randomUUID(); + var mode = ComponentMode.OPERATION; + var pauseWorkItemDTO = TestDTOFactory.createPauseWorkItem(deviceId, varCommId, mode); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + //and + willThrow(EntityNotFoundException.class).given(variableController).updateModeByCommSvcId(varCommId, mode); + + //when + var result = pauseWorkItemJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(PauseWorkItemStatus.FAILED)); + assertThat(result.getMessage(), is(notNullValue())); + verify(variableController, times(1)).updateModeByCommSvcId(varCommId, mode); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDoneResultForDeviceModeOperational() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + var mode = ComponentMode.OPERATION; + //and + var pauseWorkItemDTO = TestDTOFactory.createPauseWorkItem(deviceId, null, mode); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + + //when + var result = pauseWorkItemJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(PauseWorkItemStatus.DONE)); + assertThat(result.getMessage(), is(nullValue())); + verify(deviceController, times(1)).updateModeByCommSvcId(deviceId, mode); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFailedResultForDeviceModeOperational() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + var mode = ComponentMode.OPERATION; + //and + var pauseWorkItemDTO = TestDTOFactory.createPauseWorkItem(deviceId, null, mode); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + //and + willThrow(EntityNotFoundException.class).given(deviceController).updateModeByCommSvcId(deviceId, mode); + + //when + var result = pauseWorkItemJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(PauseWorkItemStatus.FAILED)); + assertThat(result.getMessage(), is(notNullValue())); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withExceptionForDeviceWithoutId() { + //given + UUID workItemId = UUID.randomUUID(); + var mode = ComponentMode.OPERATION; + var pauseWorkItemDTO = TestDTOFactory.createPauseWorkItem(null, null, mode); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + + //when + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> pauseWorkItemJobHandler.processWorkItem(workItemWrapper)); + + //then + assertEquals("Device ID is required but not provided for work item Id: %s .".formatted(workItemId), exception.getMessage()); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withExceptionForPauseWorkItemNull() { + //given + UUID workItemId = UUID.randomUUID(); + var workItemWrapper = new WorkItemWrapper(workItemId, null, () -> false); + + //when + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> pauseWorkItemJobHandler.processWorkItem(workItemWrapper)); + + //then + assertEquals("PauseWorkItemDTO is required but not provided for work item Id: %s".formatted(workItemId), exception.getMessage()); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDoneResultForDeviceModePause() { + //given + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + var mode = ComponentMode.PAUSE; + //and + var pauseWorkItemDTO = TestDTOFactory.createPauseWorkItem(deviceId, null, mode); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + + //when + var result = pauseWorkItemJobHandler.processWorkItem(workItemWrapper); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.getStatus(), is(PauseWorkItemStatus.DONE)); + assertThat(result.getMessage(), is(nullValue())); + verify(deviceController, times(1)).updateModeByCommSvcId(deviceId, mode); + } + + @ParameterizedTest + @EnumSource(PauseWorkItemStatus.class) + void shouldFinishProcessing_updatePauseWorkItem(PauseWorkItemStatus pauseWorkItemStatus) { + //given + UUID workItemId = UUID.randomUUID(); + var pauseWorkItemDTO = new PauseWorkItemDTO(); + var workItemWrapper = new WorkItemWrapper<>(workItemId, pauseWorkItemDTO, () -> false); + var pauseWorkItemResult = new PauseWorkItemResult(pauseWorkItemStatus); + //and + willDoNothing().given(communicationServiceController).updatePauseWorkItem(eq(workItemId), any()); + + //when + pauseWorkItemJobHandler.finishProcessing(workItemWrapper, pauseWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updatePauseWorkItem( + eq(workItemId), + argThat(pauseWorkItemUpdateDto -> pauseWorkItemUpdateDto.getStatus() == pauseWorkItemStatus)); + } + + @ParameterizedTest + @MethodSource("getPauseWorkItemStatusesForMapping") + void shouldMapToJobResult(PauseWorkItemStatus pauseWorkItemStatus, JobStatus jobStatus) { + //given + var pauseWorkItemResult = new PauseWorkItemResult(pauseWorkItemStatus, "message"); + + //when + var result = pauseWorkItemJobHandler.mapToJobResult(pauseWorkItemResult); + + //then + assertThat(result, is(notNullValue())); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getPauseWorkItemStatusesForMapping() { + return Stream.of( + of(PauseWorkItemStatus.DONE, JobStatus.DONE), + of(PauseWorkItemStatus.FAILED, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource(value = PauseWorkItemStatus.class, names = {"DONE", "FAILED"}, mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(PauseWorkItemStatus pauseWorkItemStatus) { + //given + var discoveryJobResult = new PauseWorkItemResult(pauseWorkItemStatus); + + //expect + assertThrows(IllegalStateException.class, () -> { + pauseWorkItemJobHandler.mapToJobResult(discoveryJobResult); + }); + } + + @Test + void shouldGetJobType() { + //when + var result = pauseWorkItemJobHandler.getJobType(); + + //then + assertThat(result, is(JobType.PAUSE)); + } +} diff --git a/src/test/java/io/gec/raw/connector/protocol/control/ProtocolMapperTest.java b/src/test/java/io/gec/raw/connector/protocol/control/ProtocolMapperTest.java new file mode 100755 index 0000000..80cf06a --- /dev/null +++ b/src/test/java/io/gec/raw/connector/protocol/control/ProtocolMapperTest.java @@ -0,0 +1,85 @@ +package io.gec.raw.connector.protocol.control; + +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.protocol.dto.ProtocolDTO; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ProtocolMapperTest { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + SnmpConfig snmpConfig; + @InjectMocks + ProtocolMapper protocolMapper; + + @Test + void shouldCreateThreeProtocols() { + // given + when(snmpConfig.getDiscoveryDeprecatedProtocols()).thenReturn(Optional.of(List.of())); + + // when + List results = protocolMapper.getProtocols(List.of( + SnmpVersionEnum.SNMP_V1, + SnmpVersionEnum.SNMP_V2C, + SnmpVersionEnum.SNMP_V3 + )); + + // then + assertEquals(3, results.size()); + + Optional optionalSnmpV1Protocol = results.stream() + .filter(protocolDTO -> protocolDTO.getName().equals(SnmpVersionEnum.SNMP_V1.getName())) + .findFirst(); + assertTrue(optionalSnmpV1Protocol.isPresent()); + ProtocolDTO snmpV1ProtocolDTO = optionalSnmpV1Protocol.get(); + assertEquals(SnmpVersionEnum.SNMP_V1.getName(), snmpV1ProtocolDTO.getName()); + assertEquals("SNMPv1", snmpV1ProtocolDTO.getDescription()); + assertEquals(5, snmpV1ProtocolDTO.getProperties().size()); + + Optional optionalSnmpV2Protocol = results.stream() + .filter(protocolDTO -> protocolDTO.getName().equals(SnmpVersionEnum.SNMP_V2C.getName())) + .findFirst(); + assertTrue(optionalSnmpV2Protocol.isPresent()); + ProtocolDTO snmpV2ProtocolDTO = optionalSnmpV2Protocol.get(); + assertEquals(SnmpVersionEnum.SNMP_V2C.getName(), snmpV2ProtocolDTO.getName()); + assertEquals(5, snmpV2ProtocolDTO.getProperties().size()); + + Optional optionalSnmpV3Protocol = results.stream() + .filter(protocolDTO -> protocolDTO.getName().equals(SnmpVersionEnum.SNMP_V3.getName())) + .findFirst(); + assertTrue(optionalSnmpV3Protocol.isPresent()); + ProtocolDTO snmpV3ProtocolDTO = optionalSnmpV3Protocol.get(); + assertEquals(SnmpVersionEnum.SNMP_V3.getName(), snmpV3ProtocolDTO.getName()); + assertEquals("SNMPv3", snmpV3ProtocolDTO.getDescription()); + assertEquals(12, snmpV3ProtocolDTO.getProperties().size()); + } + + @Test + void allProtocolsShouldBeDeprecated() { + // given + when(snmpConfig.getDiscoveryDeprecatedProtocols()).thenReturn(Optional.of( + Stream.of(SnmpVersionEnum.values()).map(SnmpVersionEnum::getName).toList())); + + // when + List results = protocolMapper.getProtocols(Arrays.stream(SnmpVersionEnum.values()).toList()); + + // then + assertEquals(SnmpVersionEnum.values().length, results.size()); + assertTrue(results.stream().allMatch(ProtocolDTO::isDeprecated)); + } +} diff --git a/src/test/java/io/gec/raw/connector/protocol/control/ProtocolServiceTest.java b/src/test/java/io/gec/raw/connector/protocol/control/ProtocolServiceTest.java new file mode 100755 index 0000000..89f9c3f --- /dev/null +++ b/src/test/java/io/gec/raw/connector/protocol/control/ProtocolServiceTest.java @@ -0,0 +1,143 @@ +package io.gec.raw.connector.protocol.control; + +import io.gec.raw.connector.protocol.dto.PropertyDTO; +import io.gec.raw.connector.protocol.dto.PropertyValueDTO; +import io.gec.raw.connector.protocol.dto.ProtocolDTO; +import io.gec.raw.connector.protocol.entity.Property; +import io.gec.raw.connector.protocol.entity.PropertyValue; +import io.gec.raw.connector.protocol.entity.Protocol; +import io.quarkus.test.TestTransaction; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@QuarkusTest +class ProtocolServiceTest { + + public static final UUID EXISTING_PROTOCOL_ID = UUID.randomUUID(); + public static final String EXISTING_PROTOCOL_NAME = "requestedProtocol"; + public static final UUID EXISTING_PROPERTY_ID = UUID.randomUUID(); + public static final String EXISTING_PROPERTY_NAME = "requestedProperty"; + public static final UUID EXISTING_PROPERTY_VALUE_ID = UUID.randomUUID(); + public static final String EXISTING_PROPERTY_VALUE_NAME = "requestedPropertyValue"; + public static final UUID NEW_FIRST_PROPERTY_VALUE_ID = UUID.randomUUID(); + public static final String NEW_FIRST_PROPERTY_VALUE_NAME = "newFirstPropertyValue"; + public static final String NEW_FIRST_ROPERTY_NAME = "newFirstProperty"; + public static final String NEW_PROTOCOL_NAME = "newProtocol"; + private static final UUID NEW_FIRST_PROPERTY_ID = UUID.randomUUID(); + private static final UUID NEW_SECOND_PROPERTY_VALUE_ID = UUID.randomUUID(); + private static final String NEW_SECOND_PROPERTY_VALUE_NAME = "newSecondPropertyValue"; + private static final UUID NEW_PROTOCOL_ID = UUID.randomUUID(); + private static final UUID NEW_SECOND_PROPERTY_ID = UUID.randomUUID(); + private static final String NEW_SECOND_PROPERTY_NAME = "newSecondProperty"; + private static final UUID NEW_THIRD_PROPERTY_VALUE_ID = UUID.randomUUID(); + private static final String NEW_THIRD_PROPERTY_VALUE_NAME = "newThirdPropertyValue"; + + @Inject + ProtocolRepository protocolRepository; + @Inject + PropertyRepository propertyRepository; + @Inject + PropertyValueRepository propertyValueRepository; + @Inject + ProtocolService protocolService; + + @Test + @TestTransaction + void shouldUpdateOnlyExistingObjects() { + // given + persistProtocol(); + + // when + List protocolDTOs = prepareSyntheticDTOs(); + protocolService.createOrUpdateProtocols(protocolDTOs); + + // then + assertEquals(2, protocolRepository.findAll().count()); + assertEquals(3, propertyRepository.findAll().count()); + assertEquals(4, propertyValueRepository.findAll().count()); + + Optional optionalProtocol = protocolRepository.findByName(EXISTING_PROTOCOL_NAME); + assertTrue(optionalProtocol.isPresent()); + Protocol protocol = optionalProtocol.get(); + assertEquals(EXISTING_PROTOCOL_ID, protocol.getCommunicationServiceId()); + + Optional optionalProperty = propertyRepository.findByName(EXISTING_PROPERTY_NAME); + assertTrue(optionalProperty.isPresent()); + Property property = optionalProperty.get(); + assertEquals(EXISTING_PROPERTY_ID, property.getCommunicationServiceId()); + assertEquals(protocol, property.getProtocol()); + + Optional optionalPropertyValue = propertyValueRepository.findByName(EXISTING_PROPERTY_VALUE_NAME); + assertTrue(optionalPropertyValue.isPresent()); + PropertyValue propertyValue = optionalPropertyValue.get(); + assertEquals(EXISTING_PROPERTY_VALUE_ID, propertyValue.getCommunicationServiceId()); + assertEquals(property, propertyValue.getProperty()); + } + + private void persistProtocol() { + Protocol protocol = Protocol.builder() + .name(EXISTING_PROTOCOL_NAME) + .property(Property.builder() + .name(EXISTING_PROPERTY_NAME) + .propertyValue( + PropertyValue.builder() + .name(EXISTING_PROPERTY_VALUE_NAME) + .build()) + .build()) + .build(); + protocolRepository.persist(protocol); + } + + private List prepareSyntheticDTOs() { + return List.of( + ProtocolDTO.builder() + .id(EXISTING_PROTOCOL_ID) + .name(EXISTING_PROTOCOL_NAME) + .properties(List.of( + PropertyDTO.builder() + .id(EXISTING_PROPERTY_ID) + .name(EXISTING_PROPERTY_NAME) + .propertyValues(List.of( + PropertyValueDTO.builder() + .id(EXISTING_PROPERTY_VALUE_ID) + .name(EXISTING_PROPERTY_VALUE_NAME) + .build(), + PropertyValueDTO.builder() + .id(NEW_FIRST_PROPERTY_VALUE_ID) + .name(NEW_FIRST_PROPERTY_VALUE_NAME) + .build())) + .build(), + PropertyDTO.builder() + .id(NEW_FIRST_PROPERTY_ID) + .name(NEW_FIRST_ROPERTY_NAME) + .propertyValues(List.of( + PropertyValueDTO.builder() + .id(NEW_SECOND_PROPERTY_VALUE_ID) + .name(NEW_SECOND_PROPERTY_VALUE_NAME) + .build())) + .build())) + .build(), + ProtocolDTO.builder() + .id(NEW_PROTOCOL_ID) + .name(NEW_PROTOCOL_NAME) + .properties(List.of( + PropertyDTO.builder() + .id(NEW_SECOND_PROPERTY_ID) + .name(NEW_SECOND_PROPERTY_NAME) + .propertyValues(List.of( + PropertyValueDTO.builder() + .id(NEW_THIRD_PROPERTY_VALUE_ID) + .name(NEW_THIRD_PROPERTY_VALUE_NAME) + .build())) + .build())) + .build()); + } +} diff --git a/src/test/java/io/gec/raw/connector/protocol/entity/PropertyTest.java b/src/test/java/io/gec/raw/connector/protocol/entity/PropertyTest.java new file mode 100755 index 0000000..debf3a3 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/protocol/entity/PropertyTest.java @@ -0,0 +1,212 @@ +package io.gec.raw.connector.protocol.entity; + +import io.gec.raw.connector.protocol.control.PropertyRepository; +import io.gec.raw.connector.protocol.control.PropertyValueRepository; +import io.gec.raw.connector.protocol.control.ProtocolRepository; +import io.quarkus.hibernate.orm.panache.PanacheQuery; +import io.quarkus.test.TestTransaction; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; + +@QuarkusTest +class PropertyTest { + + private static final String PROPERTY_1_NAME = "property-1"; + private static final String PROPERTY_2_NAME = "property-2"; + private static final String ALTERNATIVE_PROPERTY_NAME = "alternativePropertyName"; + private static final String PROPERTY_VALUE_1_NAME = "propertyValue-1"; + private static final String PROPERTY_VALUE_2_NAME = "propertyValue-2"; + private static final String PROTOCOL_NAME = "protocol"; + private static final UUID CONSTANT_UUID = UUID.fromString("fab57aa4-b533-4488-8b9a-82997073a575"); + + @Inject + ProtocolRepository protocolRepository; + @Inject + PropertyRepository propertyRepository; + @Inject + PropertyValueRepository propertyValueRepository; + + private static List createProperties() { + Property firstProperty = Property.builder() + .name(PROPERTY_1_NAME) + .propertyValues(List.of( + PropertyValue.builder() + .name(PROPERTY_VALUE_1_NAME) + .build(), + PropertyValue.builder() + .name(PROPERTY_VALUE_2_NAME) + .build())) + .build(); + + Property secondProperty = Property.builder() + .name(PROPERTY_2_NAME) + .build(); + + return List.of(firstProperty, secondProperty); + } + + private static Stream shouldLookForPropertyWithGivenArguments() { + return Stream.of( + of(PROPERTY_1_NAME, CONSTANT_UUID, PROPERTY_1_NAME, CONSTANT_UUID, true), + of(PROPERTY_1_NAME, CONSTANT_UUID, ALTERNATIVE_PROPERTY_NAME, CONSTANT_UUID, false), + of(PROPERTY_1_NAME, CONSTANT_UUID, ALTERNATIVE_PROPERTY_NAME, CONSTANT_UUID, false), + of(PROPERTY_1_NAME, UUID.randomUUID(), PROPERTY_1_NAME, UUID.randomUUID(), false), + of(PROPERTY_1_NAME, UUID.randomUUID(), ALTERNATIVE_PROPERTY_NAME, UUID.randomUUID(), false) + ); + } + + @Test + @TestTransaction + void shouldCompareSameProperties() { + // given + Property property = Property.builder() + .name(PROPERTY_1_NAME) + .build(); + propertyRepository.persist(property); + + // when + Optional foundProperty = propertyRepository.findByName(PROPERTY_1_NAME); + + // then + assertTrue(foundProperty.isPresent()); + Property anotherInstance = Property.builder() + .id(foundProperty.get().getId()) + .name(PROPERTY_1_NAME) + .build(); + assertNotSame(property, anotherInstance); + assertEquals(property, anotherInstance); + assertEquals(property.hashCode(), anotherInstance.hashCode()); + } + + @Test + @TestTransaction + void shouldCompareDifferentProperties() { + // given + List properties = List.of(Property.builder() + .name(PROPERTY_1_NAME) + .build(), + Property.builder() + .name(PROPERTY_2_NAME) + .build()); + propertyRepository.persist(properties); + + // when + Optional property1 = propertyRepository.findByName(PROPERTY_1_NAME); + Optional property2 = propertyRepository.findByName(PROPERTY_2_NAME); + + // then + assertTrue(property1.isPresent()); + assertTrue(property2.isPresent()); + assertNotEquals(property1.get(), property2.get()); + } + + @Test + @TestTransaction + void shouldComparePropertyWithObject() { + // given + Property property = Property.builder() + .name(PROPERTY_1_NAME) + .build(); + propertyRepository.persist(property); + + // when + Optional foundProperty = propertyRepository.findByName(PROPERTY_1_NAME); + + // then + assertTrue(foundProperty.isPresent()); + assertNotEquals(new Object(), foundProperty.get()); + } + + @Test + @TestTransaction + void shouldCompareTwoDifferentObjects() { + // given + Property property = Property.builder() + .name(PROPERTY_1_NAME) + .build(); + propertyRepository.persist(property); + + // when + Optional clonedProperty = propertyRepository.findByName(PROPERTY_1_NAME); + + // then + assertTrue(clonedProperty.isPresent()); + assertEquals(property, clonedProperty.get()); + } + + @Test + @TestTransaction + void shouldRemoveOnePropertyValue() { + // given + List propertyList = createProperties(); + propertyRepository.persist(propertyList); + + // when + Property property = propertyRepository.findAll().firstResult(); + Optional anyProperty = property.getPropertyValues().stream().findFirst(); + property.removePropertyValue(anyProperty.get()); + PanacheQuery propertyValues = propertyValueRepository.findAll(); + + // then + assertEquals(1, property.getPropertyValues().size()); + assertEquals(1, propertyValues.count()); + } + + @Test + @TestTransaction + void shouldRemoveAllPropertyValues() { + // given + List propertyList = createProperties(); + propertyRepository.persist(propertyList); + + // when + Property property = propertyRepository.findAll().firstResult(); + property.removeAllPropertyValues(); + PanacheQuery propertyValues = propertyValueRepository.findAll(); + + // then + assertTrue(property.getPropertyValues().isEmpty()); + assertEquals(0, propertyValues.count()); + } + + @ParameterizedTest + @MethodSource + @TestTransaction + void shouldLookForPropertyWithGivenArguments(String propertyName, UUID protocolExternalId, + String propertyNameToBeFound, UUID protocolExternalIdToBeFound, + boolean shouldFind) { + // given + Property property = Property.builder() + .name(propertyName) + .build(); + + Protocol protocol = Protocol.builder() + .communicationServiceId(protocolExternalId) + .name(PROTOCOL_NAME) + .build(); + protocol.addProperty(property); + protocolRepository.persist(protocol); + + // when + Optional originalProperty = propertyRepository.findByName(PROPERTY_1_NAME); + Optional foundProperty = propertyRepository.findByNameAndProtocolCommunicationServiceId(propertyNameToBeFound, protocolExternalIdToBeFound); + + // then + assertEquals(shouldFind, foundProperty.isPresent()); + if (shouldFind) { + assertEquals(originalProperty, foundProperty); + } + } +} diff --git a/src/test/java/io/gec/raw/connector/protocol/entity/PropertyValueTest.java b/src/test/java/io/gec/raw/connector/protocol/entity/PropertyValueTest.java new file mode 100755 index 0000000..95ee75c --- /dev/null +++ b/src/test/java/io/gec/raw/connector/protocol/entity/PropertyValueTest.java @@ -0,0 +1,105 @@ +package io.gec.raw.connector.protocol.entity; + +import io.gec.raw.connector.protocol.control.PropertyValueRepository; +import io.quarkus.test.TestTransaction; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@QuarkusTest +class PropertyValueTest { + + private static final String PROPERTY_VALUE_1_NAME = "propertyValue-1"; + private static final String PROPERTY_VALUE_2_NAME = "propertyValue-2"; + + @Inject + PropertyValueRepository propertyValueRepository; + + @Test + @TestTransaction + void shouldCompareSamePropertyValues() { + // given + PropertyValue propertyValue = PropertyValue.builder() + .name(PROPERTY_VALUE_1_NAME) + .build(); + propertyValueRepository.persist(propertyValue); + + // when + Optional foundPropertyValue = propertyValueRepository.findByName(PROPERTY_VALUE_1_NAME); + + // then + assertTrue(foundPropertyValue.isPresent()); + assertSame(propertyValue, foundPropertyValue.get()); + assertEquals(propertyValue, foundPropertyValue.get()); + assertEquals(propertyValue.hashCode(), foundPropertyValue.get().hashCode()); + } + + @Test + @TestTransaction + void shouldCompareDifferentPropertyValues() { + // given + List propertyValues = List.of(PropertyValue.builder() + .name(PROPERTY_VALUE_1_NAME) + .build(), + PropertyValue.builder() + .name(PROPERTY_VALUE_2_NAME) + .build()); + propertyValueRepository.persist(propertyValues); + + // when + Optional propertyValue1 = propertyValueRepository.findByName(PROPERTY_VALUE_1_NAME); + Optional propertyValue2 = propertyValueRepository.findByName(PROPERTY_VALUE_2_NAME); + + // then + assertTrue(propertyValue1.isPresent()); + assertTrue(propertyValue2.isPresent()); + assertNotEquals(propertyValue1.get(), propertyValue2.get()); + assertEquals(propertyValue1.hashCode(), propertyValue2.get().hashCode()); + } + + @Test + @TestTransaction + void shouldComparePropertyValueWithObject() { + // given + PropertyValue propertyValue = PropertyValue.builder() + .name(PROPERTY_VALUE_1_NAME) + .build(); + propertyValueRepository.persist(propertyValue); + + // when + Optional foundPropertyValue = propertyValueRepository.findByName(PROPERTY_VALUE_1_NAME); + + // then + assertTrue(foundPropertyValue.isPresent()); + assertNotEquals(new Object(), foundPropertyValue.get()); + assertNotEquals(new Object().hashCode(), foundPropertyValue.get().hashCode()); + } + + @Test + @TestTransaction + void shouldCompareTwoDifferentObjects() { + // given + PropertyValue propertyValue = PropertyValue.builder() + .name(PROPERTY_VALUE_1_NAME) + .build(); + propertyValueRepository.persist(propertyValue); + + // when + Optional found = propertyValueRepository.findByName(PROPERTY_VALUE_1_NAME); + + // then + assertTrue(found.isPresent()); + PropertyValue anotherInstance = PropertyValue.builder() + .id(found.get().getId()) + .name(PROPERTY_VALUE_1_NAME) + .build(); + assertNotSame(propertyValue, anotherInstance); + assertEquals(propertyValue, anotherInstance); + assertEquals(propertyValue.hashCode(), anotherInstance.hashCode()); + } +} diff --git a/src/test/java/io/gec/raw/connector/protocol/entity/ProtocolTest.java b/src/test/java/io/gec/raw/connector/protocol/entity/ProtocolTest.java new file mode 100755 index 0000000..91d6b25 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/protocol/entity/ProtocolTest.java @@ -0,0 +1,215 @@ +package io.gec.raw.connector.protocol.entity; + +import io.gec.raw.connector.protocol.control.PropertyRepository; +import io.gec.raw.connector.protocol.control.ProtocolRepository; +import io.quarkus.hibernate.orm.panache.PanacheQuery; +import io.quarkus.test.TestTransaction; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; + +@QuarkusTest +class ProtocolTest { + + private static final String PROTOCOL_1_NAME = "protocol-1"; + private static final String PROTOCOL_2_NAME = "protocol-2"; + private static final String PROPERTY_1_NAME = "property-1"; + private static final UUID CONSTANT_UUID = UUID.fromString("fab57aa4-b533-4488-8b9a-82997073a575"); + + private static Protocol createProtocol() { + return Protocol.builder() + .name(PROTOCOL_1_NAME) + .properties(List.of( + Property.builder() + .name(PROPERTY_1_NAME) + .build())) + .build(); + } + + private static Stream shouldLookForProtocolByExternalId() { + return Stream.of( + of(CONSTANT_UUID, CONSTANT_UUID, true), + of(CONSTANT_UUID, UUID.randomUUID(), false), + of(CONSTANT_UUID, null, false), + of(UUID.randomUUID(), null, false), + of(UUID.randomUUID(), UUID.randomUUID(), false), + of(null, null, false), + of(null, UUID.randomUUID(), false) + ); + } + + @Inject + ProtocolRepository protocolRepository; + @Inject + PropertyRepository propertyRepository; + + @Test + @TestTransaction + void shouldCreateProtocolWithProperties() { + // given + Protocol createdProtocols = createProtocol(); + protocolRepository.persist(createdProtocols); + + // when + PanacheQuery protocols = protocolRepository.findAll(); + Protocol protocol = protocols.firstResult(); + Set properties = protocol.getProperties(); + Optional firstProperty = properties.stream().findFirst(); + + // then + assertEquals(1, protocols.count()); + assertTrue(protocolRepository.isPersistent(protocol)); + assertEquals(1, properties.size()); + assertTrue(firstProperty.isPresent()); + assertTrue(propertyRepository.isPersistent(firstProperty.get())); + assertNotNull(firstProperty.get().getProtocol()); + } + + @Test + @TestTransaction + void shouldRemoveProtocolWithChildren() { + // given + Protocol createdProtocol = createProtocol(); + protocolRepository.persist(createdProtocol); + + // when + protocolRepository.deleteById(createdProtocol.getId()); + PanacheQuery protocols = protocolRepository.findAll(); + PanacheQuery properties = propertyRepository.findAll(); + + // then + assertEquals(0, protocols.count()); + assertEquals(0, properties.count()); + } + + @ParameterizedTest + @MethodSource + @TestTransaction + void shouldLookForProtocolByExternalId(UUID protocolExternalId, UUID protocolExternalIdToBeFound, boolean shouldFind) { + // given + Protocol protocol = Protocol.builder() + .communicationServiceId(protocolExternalId) + .name(PROTOCOL_1_NAME) + .build(); + protocolRepository.persist(protocol); + + // when + Optional foundProtocol = protocolRepository.findByCommunicationServiceId(protocolExternalIdToBeFound); + + // then + assertEquals(shouldFind, foundProtocol.isPresent()); + } + + @Test + @TestTransaction + void shouldRemoveProperty() { + // given + Protocol createdProtocol = createProtocol(); + protocolRepository.persist(createdProtocol); + + // when + Property property = createdProtocol.getProperties().stream().findFirst().get(); + createdProtocol.removeProperty(property); + PanacheQuery properties = propertyRepository.findAll(); + + // then + assertTrue(createdProtocol.getProperties().isEmpty()); + assertTrue(properties.firstResultOptional().isEmpty()); + } + + @Test + @TestTransaction + void shouldCompareSameProtocols() { + // given + Protocol protocol = Protocol.builder() + .name(PROTOCOL_1_NAME) + .build(); + protocolRepository.persist(protocol); + + // when + Optional foundProtocol = protocolRepository.findByIdOptional(protocol.getId()); + + // then + assertTrue(foundProtocol.isPresent()); + assertSame(protocol, foundProtocol.get()); + assertEquals(protocol, foundProtocol.get()); + assertEquals(protocol.hashCode(), foundProtocol.get().hashCode()); + } + + @Test + @TestTransaction + void shouldCompareDifferentProtocols() { + // given + List protocols = List.of(Protocol.builder() + .name(PROTOCOL_1_NAME) + .build(), + Protocol.builder() + .name(PROTOCOL_2_NAME) + .build()); + protocolRepository.persist(protocols); + + // when + Optional protocol1 = protocolRepository.findByName(PROTOCOL_1_NAME); + Optional protocol2 = protocolRepository.findByName(PROTOCOL_2_NAME); + + // then + assertTrue(protocol1.isPresent()); + assertTrue(protocol2.isPresent()); + assertNotSame(protocol1.get(), protocol2.get()); + assertNotEquals(protocol1.get(), protocol2.get()); + assertEquals(protocol1.get().hashCode(), protocol2.get().hashCode()); + } + + @Test + @TestTransaction + void shouldCompareProtocolsWithObject() { + // given + Protocol protocol = Protocol.builder() + .name(PROTOCOL_1_NAME) + .build(); + protocolRepository.persist(protocol); + + // when + Optional foundProtocol = protocolRepository.findByName(PROTOCOL_1_NAME); + + // then + assertTrue(foundProtocol.isPresent()); + assertNotEquals(new Object(), foundProtocol.get()); + assertNotEquals(new Object().hashCode(), foundProtocol.get().hashCode()); + } + + @Test + @TestTransaction + void shouldCompareTwoDifferentObjects() { + // given + Protocol protocol = Protocol.builder() + .name(PROTOCOL_1_NAME) + .build(); + protocolRepository.persist(protocol); + + // when + Optional found = protocolRepository.findByName(PROTOCOL_1_NAME); + + // then + assertTrue(found.isPresent()); + Protocol anotherInstance = Protocol.builder() + .id(found.get().getId()) + .name(PROTOCOL_1_NAME) + .build(); + assertNotSame(protocol, anotherInstance); + assertEquals(protocol, anotherInstance); + assertEquals(protocol.hashCode(), anotherInstance.hashCode()); + } +} diff --git a/src/test/java/io/gec/raw/connector/rittal/helper/RittalEnumHelperTest.java b/src/test/java/io/gec/raw/connector/rittal/helper/RittalEnumHelperTest.java new file mode 100755 index 0000000..d3a042d --- /dev/null +++ b/src/test/java/io/gec/raw/connector/rittal/helper/RittalEnumHelperTest.java @@ -0,0 +1,33 @@ +package io.gec.raw.connector.rittal.helper; + +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class RittalEnumHelperTest { + + RittalEnumHelper rittalEnumHelper = new RittalEnumHelper(); + + @ParameterizedTest + @EnumSource( + value = VarTypeEnum.class, + names = {"COMMAND", "COMMANDSIGNAL", "CONFIG", "GSMSTATUS", "LEDMODE", "LOGIC", "MODE", "MOUNTPOS", "OUTPUT", "SOCKETTYPE", "TYPE", "STATUS"}, + mode = EnumSource.Mode.INCLUDE) + void shouldIsVarTypeSupportedForConstraints_returnTrue(VarTypeEnum type) { + //expect + assertTrue(rittalEnumHelper.isVarTypeSupported(type)); + } + + @ParameterizedTest + @EnumSource( + value = VarTypeEnum.class, + names = {"COMMAND", "COMMANDSIGNAL", "CONFIG", "GSMSTATUS", "LEDMODE", "LOGIC", "MODE", "MOUNTPOS", "OUTPUT", "SOCKETTYPE", "TYPE", "STATUS"}, + mode = EnumSource.Mode.EXCLUDE) + void shouldIsVarTypeSupportedForConstraints_returnFalse(VarTypeEnum type) { + //expect + assertFalse(rittalEnumHelper.isVarTypeSupported(type)); + } +} diff --git a/src/test/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupControllerTest.java b/src/test/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupControllerTest.java new file mode 100755 index 0000000..69e5ea7 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupControllerTest.java @@ -0,0 +1,316 @@ +package io.gec.raw.connector.rittal.maintenancegroup.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.rittal.maintenancegroup.dto.MaintenanceGroupEnum; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; +import static org.wildfly.common.Assert.assertNotNull; +import static org.wildfly.common.Assert.assertTrue; + +@ExtendWith(MockitoExtension.class) +class MaintenanceGroupControllerTest { + + @Mock + DeviceController deviceController; + + @Mock + DevicePropertyController devicePropertyController; + + @Mock + MaintenanceGroupMapper maintenanceGroupMapper; + + @InjectMocks + MaintenanceGroupController maintenanceGroupController; + + @Test + void shouldGetMaintenanceGroup_returnMaintenanceGroupForDeviceWithModelNumber() { + // given + UUID deviceId = UUID.randomUUID(); + UUID parentId = UUID.randomUUID(); + var device = new Device(); + device.setId(deviceId); + device.setParentId(parentId); + + var deviceProperty = new DeviceProperty(); + deviceProperty.setName("Model number"); + deviceProperty.setValueAsString("7856070"); + + when(deviceController.getDeviceById(deviceId)).thenReturn(device); + when(devicePropertyController.findByDeviceId(deviceId)).thenReturn(List.of(deviceProperty)); + when(devicePropertyController.findByName(any(), eq("Model number"))).thenReturn(Optional.of(deviceProperty)); + when(maintenanceGroupMapper.getMaintenanceGroupsByModelNumber("7856070")).thenReturn(List.of(MaintenanceGroupEnum.POWER)); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertNotNull(result); + assertThat(result, hasSize(1)); + assertThat(result.getFirst(), is(MaintenanceGroupEnum.POWER)); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(devicePropertyController, times(1)).findByDeviceId(deviceId); + } + + @Test + void shouldGetMaintenanceGroup_returnNullWhenNoModelNumberFound() { + // given + UUID deviceId = UUID.randomUUID(); + UUID parentId = UUID.randomUUID(); + var device = new Device(); + device.setId(deviceId); + device.setParentId(parentId); + + when(deviceController.getDeviceById(deviceId)).thenReturn(device); + when(devicePropertyController.findByDeviceId(deviceId)).thenReturn(List.of()); + when(devicePropertyController.findByName(any(), eq("Model number"))).thenReturn(Optional.empty()); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertTrue(result.isEmpty()); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(devicePropertyController, times(1)).findByDeviceId(deviceId); + } + + @Test + void shouldGetMaintenanceGroup_searchParentDeviceWhenModelNumberNotFoundOnChild() { + // given + UUID deviceId = UUID.randomUUID(); + UUID parentId = UUID.randomUUID(); + var device = new Device(); + device.setId(deviceId); + device.setParentId(parentId); + + var parentDeviceProperty = new DeviceProperty(); + parentDeviceProperty.setName("Model number"); + parentDeviceProperty.setValueAsString("7856080"); + + when(deviceController.getDeviceById(deviceId)).thenReturn(device); + when(devicePropertyController.findByDeviceId(deviceId)).thenReturn(List.of()); + when(devicePropertyController.findByName(any(), eq("Model number"))).thenReturn(Optional.empty()); + when(devicePropertyController.findByDeviceId(parentId)).thenReturn(List.of(parentDeviceProperty)); + when(devicePropertyController.findByName(List.of(parentDeviceProperty), "Model number")).thenReturn(Optional.of(parentDeviceProperty)); + when(maintenanceGroupMapper.getMaintenanceGroupsByModelNumber("7856080")).thenReturn(List.of(MaintenanceGroupEnum.POWER)); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertNotNull(result); + assertThat(result, hasSize(1)); + assertThat(result.getFirst(), is(MaintenanceGroupEnum.POWER)); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(devicePropertyController, times(1)).findByDeviceId(deviceId); + verify(devicePropertyController, times(1)).findByDeviceId(parentId); + } + + @Test + void shouldGetMaintenanceGroup_returnTwoMaintenanceGroupsForDeviceWithModelNumber() { + // given + UUID deviceId = UUID.randomUUID(); + UUID parentId = UUID.randomUUID(); + var device = new Device(); + device.setId(deviceId); + device.setParentId(parentId); + + var deviceProperty = new DeviceProperty(); + deviceProperty.setName("Model number"); + deviceProperty.setValueAsString("7856070"); + + when(deviceController.getDeviceById(deviceId)).thenReturn(device); + when(devicePropertyController.findByDeviceId(deviceId)).thenReturn(List.of(deviceProperty)); + when(devicePropertyController.findByName(any(), eq("Model number"))).thenReturn(Optional.of(deviceProperty)); + when(maintenanceGroupMapper.getMaintenanceGroupsByModelNumber("7856070")).thenReturn(List.of(MaintenanceGroupEnum.POWER, MaintenanceGroupEnum.POWER)); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertNotNull(result); + assertThat(result, hasSize(2)); + assertThat(result.getFirst(), is(MaintenanceGroupEnum.POWER)); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(devicePropertyController, times(1)).findByDeviceId(deviceId); + } + + @ParameterizedTest + @MethodSource("provideModelNumbersAndExpectedGroups") + void shouldGetMaintenanceGroup_returnMaintenanceGroupForDeviceWithModelNumber(String modelNumber, MaintenanceGroupEnum expectedGroup) { + // given + UUID deviceId = UUID.randomUUID(); + UUID parentId = UUID.randomUUID(); + var device = new Device(); + device.setId(deviceId); + device.setParentId(parentId); + + var deviceProperty = new DeviceProperty(); + deviceProperty.setName("Model number"); + deviceProperty.setValueAsString(modelNumber); + + when(deviceController.getDeviceById(deviceId)).thenReturn(device); + when(devicePropertyController.findByDeviceId(deviceId)).thenReturn(List.of(deviceProperty)); + when(devicePropertyController.findByName(any(), eq("Model number"))).thenReturn(Optional.of(deviceProperty)); + when(maintenanceGroupMapper.getMaintenanceGroupsByModelNumber(modelNumber)).thenReturn(List.of(expectedGroup)); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertNotNull(result); + assertThat(result, hasSize(1)); + assertThat(result.getFirst(), is(expectedGroup)); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(devicePropertyController, times(1)).findByDeviceId(deviceId); + } + + static Stream provideModelNumbersAndExpectedGroups() { + return Stream.of( + Arguments.of("7856070", MaintenanceGroupEnum.POWER), + Arguments.of("7856080", MaintenanceGroupEnum.POWER), + Arguments.of("7856082", MaintenanceGroupEnum.POWER), + Arguments.of("7979102", MaintenanceGroupEnum.POWER), + Arguments.of("3311391", MaintenanceGroupEnum.COOLING), + Arguments.of("7030200", MaintenanceGroupEnum.AVAILABILITY), + Arguments.of("7030120", MaintenanceGroupEnum.SECURITY), + Arguments.of("7030000", MaintenanceGroupEnum.MONITORING) + ); + } + + @Test + void shouldReturnMaintenanceGroupsByParentDeviceTypeWhenNotFoundOnChild() { + // given + UUID deviceId = UUID.randomUUID(); + UUID parentId = UUID.randomUUID(); + + Device childDevice = new Device(); + childDevice.setId(deviceId); + childDevice.setParentId(parentId); + childDevice.setType("1.3.6.1.4.1.2606.7.7.4.99999"); // Invalid OID for child + + Device parentDevice = new Device(); + parentDevice.setId(parentId); + parentDevice.setType("1.3.6.1.4.1.2606.7.7.4.33792"); // Valid OID for parent + + when(deviceController.getDeviceById(deviceId)).thenReturn(childDevice); + when(deviceController.getDeviceById(parentId)).thenReturn(parentDevice); + when(maintenanceGroupMapper.getMaintenanceGroupsByDeviceType(childDevice.getType())) + .thenReturn(List.of()); + when(maintenanceGroupMapper.getMaintenanceGroupsByDeviceType(parentDevice.getType())) + .thenReturn(List.of(MaintenanceGroupEnum.MONITORING)); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertEquals(1, result.size()); + assertEquals(MaintenanceGroupEnum.MONITORING, result.getFirst()); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(deviceController, times(1)).getDeviceById(parentId); + verify(maintenanceGroupMapper, times(1)).getMaintenanceGroupsByDeviceType("1.3.6.1.4.1.2606.7.7.4.33792"); + } + + @Test + void shouldReturnMaintenanceGroupsByModelNumberWhenFound() { + // given + UUID deviceId = UUID.randomUUID(); + + Device device = new Device(); + device.setId(deviceId); + device.setParentId(UUID.randomUUID()); + + DeviceProperty deviceProperty = new DeviceProperty(); + deviceProperty.setName("Model number"); + deviceProperty.setValueAsString("7856070"); + + when(deviceController.getDeviceById(deviceId)).thenReturn(device); + when(devicePropertyController.findByDeviceId(deviceId)).thenReturn(List.of(deviceProperty)); + when(devicePropertyController.findByName(any(), eq("Model number"))).thenReturn(Optional.of(deviceProperty)); + when(maintenanceGroupMapper.getMaintenanceGroupsByModelNumber("7856070")) + .thenReturn(List.of(MaintenanceGroupEnum.POWER)); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertEquals(1, result.size()); + assertEquals(MaintenanceGroupEnum.POWER, result.get(0)); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(devicePropertyController, times(1)).findByDeviceId(deviceId); + verify(maintenanceGroupMapper, times(1)).getMaintenanceGroupsByModelNumber("7856070"); + } + + @Test + void shouldReturnEmptyListWhenNoMaintenanceGroupsFoundForDeviceTypeAndModel() { + // given + UUID deviceId = UUID.randomUUID(); + + Device device = new Device(); + device.setId(deviceId); + device.setParentId(UUID.randomUUID()); + + DeviceProperty deviceProperty = new DeviceProperty(); + deviceProperty.setName("Model number"); + deviceProperty.setValueAsString("999999"); // No matching model number + + when(deviceController.getDeviceById(deviceId)).thenReturn(device); + when(devicePropertyController.findByDeviceId(deviceId)).thenReturn(List.of(deviceProperty)); + when(devicePropertyController.findByName(any(), eq("Model number"))).thenReturn(Optional.of(deviceProperty)); + when(maintenanceGroupMapper.getMaintenanceGroupsByModelNumber("999999")).thenReturn(Collections.emptyList()); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertEquals(0, result.size()); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(devicePropertyController, times(1)).findByDeviceId(deviceId); + verify(maintenanceGroupMapper, times(1)).getMaintenanceGroupsByModelNumber("999999"); + } + + @Test + void shouldReturnMaintenanceGroupsByDeviceNameWhenFound() { + // given + UUID deviceId = UUID.randomUUID(); + + Device device = new Device(); + device.setId(deviceId); + device.setName("PDU-Controller"); // Valid device name + device.setParentId(UUID.randomUUID()); + + when(deviceController.getDeviceById(deviceId)).thenReturn(device); + when(maintenanceGroupMapper.getMaintenanceGroupsByDeviceName("PDU-Controller")) + .thenReturn(List.of(MaintenanceGroupEnum.MONITORING)); + + // when + List result = maintenanceGroupController.getMaintenanceGroup(deviceId); + + // then + assertEquals(1, result.size()); + assertEquals(MaintenanceGroupEnum.MONITORING, result.get(0)); + verify(deviceController, times(1)).getDeviceById(deviceId); + verify(maintenanceGroupMapper, times(1)).getMaintenanceGroupsByDeviceName("PDU-Controller"); + } +} diff --git a/src/test/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupMapperTest.java b/src/test/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupMapperTest.java new file mode 100755 index 0000000..f6925c3 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/rittal/maintenancegroup/control/MaintenanceGroupMapperTest.java @@ -0,0 +1,309 @@ +package io.gec.raw.connector.rittal.maintenancegroup.control; + +import io.gec.raw.connector.deviceproperty.control.DeviceTypeProvider; +import io.gec.raw.connector.rittal.maintenancegroup.dto.MaintenanceGroupEnum; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(MockitoExtension.class) +public class MaintenanceGroupMapperTest { + + @InjectMocks + MaintenanceGroupMapper maintenanceGroupMapper; + @Mock + DeviceTypeProvider deviceTypeProvider; + + @ParameterizedTest + @MethodSource("provideSerialNumbersForTesting") + public void testGetMaintenanceGroupsByModelNumber(String serialNumber, List expectedGroups) { + List actualGroups = maintenanceGroupMapper.getMaintenanceGroupsByModelNumber(serialNumber); + assertEquals(expectedGroups, actualGroups, "The maintenance groups do not match"); + } + + @ParameterizedTest + @MethodSource("provideDeviceNamesForTesting") + public void testGetMaintenanceGroupsByDeviceName(String deviceName, List expectedGroups) { + List actualGroups = maintenanceGroupMapper.getMaintenanceGroupsByDeviceName(deviceName); + assertEquals(expectedGroups, actualGroups, "The maintenance groups do not match for the given device name."); + } + + private static Stream provideSerialNumbersForTesting() { + return Stream.of( + // Power + Arguments.of("7856070", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856080", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856082", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856090", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856100", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856120", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856170", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856191", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856220", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856230", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856240", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856321", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7856323", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7857009", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979102", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979103", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979104", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979110", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979111", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979112", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979113", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979114", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979115", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979116", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979117", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979118", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979130", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979131", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979132", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979133", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979134", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979135", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979136", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979137", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979138", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979139", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979140", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979141", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979142", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979143", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979175", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979202", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979203", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979204", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979210", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979211", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979212", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979213", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979214", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979215", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979216", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979217", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979218", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979230", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979231", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979232", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979233", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979234", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979235", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979236", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979237", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979238", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979239", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979240", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979242", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979256", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979276", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979302", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979303", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979304", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979310", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979311", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979312", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979313", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979314", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979315", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979316", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979317", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979318", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979330", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979331", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979332", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979333", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979334", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979335", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979336", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979337", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979338", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979339", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979340", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979342", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979402", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979403", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979404", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979410", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979411", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979412", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979413", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979414", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979415", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979416", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979417", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979418", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979430", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979431", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979432", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979433", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979434", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979435", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979436", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979437", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979438", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979439", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979440", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979442", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979502", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979503", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979504", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979510", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979511", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979512", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979513", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979514", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979515", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979516", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979530", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979531", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979532", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979533", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979534", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979535", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979536", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979537", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979538", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979539", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979540", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979542", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979615", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979616", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979711", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979712", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979713", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979714", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979721", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979722", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979723", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979724", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979801", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979811", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979812", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979813", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979814", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979815", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979821", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7979822", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7030050", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7030060", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7859410", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7859420", List.of(MaintenanceGroupEnum.POWER)), + Arguments.of("7859430", List.of(MaintenanceGroupEnum.POWER)), + + // Cooling + Arguments.of("3311391", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313238", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313268", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313290", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313390", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313410", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313420", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313430", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313440", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313450", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313460", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313470", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313480", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313538", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313540", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313548", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313568", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314130", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314230", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314250", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314260", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314530", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314540", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314542", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314550", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314560", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3314570", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3311490", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3311491", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3311492", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3311493", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3313610", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3232701", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3232711", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3232721", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3232731", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336390", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336400", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336405", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336410", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336415", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336430", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336435", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336450", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336455", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336460", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336470", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("3336480", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("7030110", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("7030.110", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("7030111", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("7030.111", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("7030140", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("7030150", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("7030190", List.of(MaintenanceGroupEnum.MONITORING)), + Arguments.of("7030.190", List.of(MaintenanceGroupEnum.MONITORING)), + Arguments.of("7030430", List.of(MaintenanceGroupEnum.COOLING)), + Arguments.of("7030440", List.of(MaintenanceGroupEnum.COOLING)), + + // Availability + Arguments.of("7030200", List.of(MaintenanceGroupEnum.AVAILABILITY)), + Arguments.of("7030230", List.of(MaintenanceGroupEnum.AVAILABILITY)), + Arguments.of("7030233", List.of(MaintenanceGroupEnum.AVAILABILITY)), + Arguments.of("7030261", List.of(MaintenanceGroupEnum.AVAILABILITY)), + Arguments.of("7320793", List.of(MaintenanceGroupEnum.AVAILABILITY)), + Arguments.of("7338121", List.of(MaintenanceGroupEnum.AVAILABILITY)), + Arguments.of("7338130", List.of(MaintenanceGroupEnum.AVAILABILITY)), + Arguments.of("7338221", List.of(MaintenanceGroupEnum.AVAILABILITY)), + Arguments.of("7338321", List.of(MaintenanceGroupEnum.AVAILABILITY)), + + // Security + Arguments.of("7030120", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7030128", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7030130", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7320570", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7320700", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7320721", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7320794", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7320814", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7030.202", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7030202", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7030223", List.of(MaintenanceGroupEnum.SECURITY)), + Arguments.of("7030.223", List.of(MaintenanceGroupEnum.SECURITY)), + + // Monitoring + Arguments.of("7030000", List.of(MaintenanceGroupEnum.MONITORING)), + Arguments.of("7030022", List.of(MaintenanceGroupEnum.MONITORING)), + Arguments.of("7030040", List.of(MaintenanceGroupEnum.MONITORING)), + Arguments.of("7030100", List.of(MaintenanceGroupEnum.MONITORING)), + Arguments.of("7030400", List.of(MaintenanceGroupEnum.MONITORING)), + Arguments.of("7030571", List.of(MaintenanceGroupEnum.MONITORING)), + Arguments.of("7030950", List.of(MaintenanceGroupEnum.MONITORING)), + + // Test for an invalid serial number + Arguments.of("INVALID_SERIAL", List.of()) + ); + } + + private static Stream provideDeviceNamesForTesting() { + return Stream.of( + Arguments.of("PDU-Controller", List.of(MaintenanceGroupEnum.MONITORING)), // Known device name + Arguments.of("Unknown Device", List.of()) // Unknown device name + ); + } +} diff --git a/src/test/java/io/gec/raw/connector/setworkitem/controller/SnmpSetControllerTest.java b/src/test/java/io/gec/raw/connector/setworkitem/controller/SnmpSetControllerTest.java new file mode 100755 index 0000000..7b11eeb --- /dev/null +++ b/src/test/java/io/gec/raw/connector/setworkitem/controller/SnmpSetControllerTest.java @@ -0,0 +1,137 @@ +package io.gec.raw.connector.setworkitem.controller; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import io.gec.raw.connector.variable.control.VariableController; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SnmpSetControllerTest { + + @Mock + SnmpService snmpService; + @Mock + VariableController variableController; + @Mock + DevicePropertyController propertyController; + @Mock + DeviceController deviceController; + @Mock + DiscoveryController discoveryController; + @Mock + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + @Mock + IPAddressHelper ipAddressHelper; + @Mock + Logger logger; + @InjectMocks + SnmpSetController snmpSetController; + + @BeforeEach + void beforeEach() { + when(deviceController.getDeviceById(any())).thenReturn(new Device()); + when(deviceController.getRootDevice(any())).thenReturn(new Device()); + when(ipAddressHelper.removeHttpFromIpAddress(any())).thenAnswer(i -> i.getArgument(0)); + when(discoveryController.getDiscoveryPropertyValue(any(), any())).thenReturn(Optional.of("empty")); + when(discoveryWorkItemToDiscoveryDataMapper.toSnmpSetMessageData(any())).thenReturn(TestDTOFactory.createSnmpMessageData()); + } + + @Test + void performSnmpSet_shouldCallSnmpSetForVariable_andReturnNoErrors() { + // given + var datatype = DataTypeEnum.STRING; + var value = "10"; + var variableOid = "1.2.3.4"; + var setWorkItemDTO = TestDTOFactory.createSetWorkItemDTO(UUID.randomUUID(), null, value); + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setVarDataType(datatype); + + // when + Optional errorMessages = snmpSetController.performSnmpSet(setWorkItemDTO, variable.getDeviceId(), variableOid, variable.getVarDataType()); + + // then + verify(snmpService, Mockito.times(1)).snmpSet(Mockito.any()); + assertTrue(errorMessages.isEmpty()); + } + + @Test + void performSnmpSet_shouldCallSnmpSet_andReturnErrors() { + // given + var datatype = DataTypeEnum.STRING; + var value = "10"; + var randomOid = "1.2.3.4"; + var setWorkItemDTO = TestDTOFactory.createSetWorkItemDTO(UUID.randomUUID(), null, value); + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setVarDataType(datatype); + //and + when(snmpService.snmpSet(any())).thenReturn(Optional.of("0:Error occurred")); + + // when + Optional errorMessages = snmpSetController.performSnmpSet(setWorkItemDTO, variable.getDeviceId(), randomOid, variable.getVarDataType()); + + // then + verify(snmpService, Mockito.times(1)).snmpSet(Mockito.any()); + assertTrue(errorMessages.isPresent()); + assertEquals("0:Error occurred", errorMessages.get()); + } + + @Test + void performSnmpSet_shouldCallSnmpSetForProperty_andReturnNoErrors() { + // given + String randomOid = "1.2.3.4"; + var datatype = DataTypeEnum.STRING; + var value = "10"; + var deviceProperty = TestEntityFactory.createProperty(); + deviceProperty.setValueChangeDatatype(datatype); + var setWorkItemDTO = TestDTOFactory.createSetWorkItemDTO(null, UUID.randomUUID(), value); + + // when + Optional errorMessages = snmpSetController.performSnmpSet(setWorkItemDTO, deviceProperty.getDeviceId(), randomOid, deviceProperty.getValueChangeDatatype()); + + // then + verify(snmpService, Mockito.times(1)).snmpSet(Mockito.any()); + assertTrue(errorMessages.isEmpty()); + } + + @Test + void performSnmpSet_shouldCallSnmpSetForInteger_andReturnNoErrors() { + // given + String randomOid = "1.2.3.4"; + var datatype = DataTypeEnum.INTEGER; + var value = "10"; + var setWorkItemDto = TestDTOFactory.createSetWorkItemDTO(UUID.randomUUID(), null, value); + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setVarDataType(datatype); + + // when + Optional errorMessages = snmpSetController.performSnmpSet(setWorkItemDto, variable.getDeviceId(), randomOid, variable.getVarDataType()); + + // then + verify(snmpService, Mockito.times(1)).snmpSet(Mockito.any()); + assertTrue(errorMessages.isEmpty()); + } +} diff --git a/src/test/java/io/gec/raw/connector/setworkitem/handler/SetPropertyJobHandlerTest.java b/src/test/java/io/gec/raw/connector/setworkitem/handler/SetPropertyJobHandlerTest.java new file mode 100755 index 0000000..914ab5d --- /dev/null +++ b/src/test/java/io/gec/raw/connector/setworkitem/handler/SetPropertyJobHandlerTest.java @@ -0,0 +1,279 @@ +package io.gec.raw.connector.setworkitem.handler; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.setworkitem.controller.SnmpSetController; +import io.gec.raw.connector.setworkitem.domain.SetWorkItemResult; +import io.gec.raw.connector.setworkitem.dto.ActionEnum; +import io.gec.raw.connector.setworkitem.dto.SetStatusEnum; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.utils.TestEntityFactory; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static io.smallrye.common.constraint.Assert.assertNotNull; +import static io.smallrye.common.constraint.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.BDDMockito.willDoNothing; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class SetPropertyJobHandlerTest { + @Mock + Logger logger; + @Mock + CommunicationServiceController communicationServiceController; + @Mock + SnmpSetController snmpSetController; + @Mock + DevicePropertyController devicePropertyController; + @InjectMocks + SetPropertyJobHandler setPropertyJobHandler; + + @Test + void shouldGetJobType() { + //when + var result = setPropertyJobHandler.getJobType(); + + //then + assertEquals(JobType.PROPERTY, result); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDoneResultForPropertyStringSet() { + //given + var datatype = DataTypeEnum.STRING; + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID propCommId = UUID.randomUUID(); + //and + var workItem = TestDTOFactory.createSetWorkItemDTO(null, propCommId, "value"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + //and + var property = TestEntityFactory.createProperty(); + property.setId(propCommId); + property.setValueChangeDatatype(datatype); + property.setDeviceId(deviceId); + property.setCommServiceId(propCommId); + //and + when(devicePropertyController.findPropertyByCommSvcId(workItem.getPropertyId())).thenReturn(property); + + //when + var result = setPropertyJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.SUCCESS)); + assertNull(result.getMessage()); + verify(snmpSetController, times(1)).performSnmpSet(workItem, deviceId, property.getValueChangeOid(), datatype); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withDoneResultForPropertyIntegerSet() { + //given + var datatype = DataTypeEnum.INTEGER; + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID propCommId = UUID.randomUUID(); + //and + var workItem = TestDTOFactory.createSetWorkItemDTO(null, propCommId, "22"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + //and + var property = TestEntityFactory.createProperty(); + property.setId(propCommId); + property.setValueChangeDatatype(datatype); + property.setDeviceId(deviceId); + property.setCommServiceId(propCommId); + //and + when(devicePropertyController.findPropertyByCommSvcId(workItem.getPropertyId())).thenReturn(property); + + //when + var result = setPropertyJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.SUCCESS)); + assertNull(result.getMessage()); + verify(snmpSetController, times(1)).performSnmpSet(workItem, deviceId, property.getValueChangeOid(), datatype); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFAILEDResultForPropertyStringSetWithNoPropertyID() { + //given + UUID workItemId = UUID.randomUUID(); + var workItem = TestDTOFactory.createSetWorkItemDTO(null, null, "value"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + + //when + var result = setPropertyJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.FAILED)); + assertNotNull(result.getMessage()); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_withFAILEDResultForPropertyStringSetFailedToDevice() { + //given + var datatype = DataTypeEnum.STRING; + UUID workItemId = UUID.randomUUID(); + UUID varCommId = UUID.randomUUID(); + var workItem = TestDTOFactory.createSetWorkItemDTO(varCommId, null, "value"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + var workItemData = TestDTOFactory.buildSetWorkItemData("value", datatype); + //and + lenient().doThrow(RuntimeException.class).when(snmpSetController).performSnmpSet(workItem, workItemData); + + //when + var result = setPropertyJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.FAILED)); + assertNotNull(result.getMessage()); + } + + @SneakyThrows + @Test + void shouldProcessWorkItem_UpdateIntervalForSetActionSET_INTERVAL() { + //given + var value = "testValue"; + var datatype = DataTypeEnum.STRING; + UUID deviceId = UUID.randomUUID(); + UUID propCommId = UUID.randomUUID(); + UUID workItemId = UUID.randomUUID(); + //and + var workItem = TestDTOFactory.createSetWorkItemDTO(null, propCommId, value); + workItem.setAction(ActionEnum.SET_INTERVAL); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + //and + var property = TestEntityFactory.createProperty(); + property.setId(propCommId); + property.setValueChangeDatatype(datatype); + property.setDeviceId(deviceId); + property.setCommServiceId(propCommId); + //and + when(devicePropertyController.findPropertyByCommSvcId(workItem.getPropertyId())).thenReturn(property); + + //when + var result = setPropertyJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.SUCCESS)); + assertNull(result.getMessage()); + verify(snmpSetController, times(1)).updatePropertyInterval(propCommId, value); + } + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var setWorkItemDTO = TestDTOFactory.createSetWorkItemDTO(UUID.randomUUID(), null, "5"); + //and + willReturn(Optional.of(setWorkItemDTO)).given(communicationServiceController).fetchSetWorkItem(workItemId); + + //when + var result = setPropertyJobHandler.getWorkItem(workItemId); + + //then + assertTrue(result.isPresent()); + assertThat(result.get(), is(setWorkItemDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchSetWorkItem(workItemId); + + //when + var result = setPropertyJobHandler.getWorkItem(workItemId); + + //then + assertFalse(result.isPresent()); + } + + @ParameterizedTest + @EnumSource(SetStatusEnum.class) + void shouldFinishProcessing_updateSetWorkItem(SetStatusEnum setStatusEnum) { + //given + UUID workItemId = UUID.randomUUID(); + var setWorkItemDTO = TestDTOFactory.createSetWorkItemDTO(UUID.randomUUID(), null, "5"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, setWorkItemDTO, () -> false); + var setWorkItemResult = new SetWorkItemResult(setStatusEnum); + //and + willDoNothing().given(communicationServiceController).updateSetWorkItem(eq(workItemId), any()); + + //when + setPropertyJobHandler.finishProcessing(workItemWrapper, setWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateSetWorkItem( + eq(workItemId), + argThat(setWorkItemUpdateDTO -> setWorkItemUpdateDTO.getStatus() == setStatusEnum)); + } + + @ParameterizedTest + @MethodSource("getSetWorkItemStatusesForMapping") + void shouldMapToJobResult(SetStatusEnum setStatusEnum, JobStatus jobStatus) { + //given + var setWorkItemResult = new SetWorkItemResult(setStatusEnum, "message"); + + //when + var result = setPropertyJobHandler.mapToJobResult(setWorkItemResult); + + //then + assertNotNull(result); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getSetWorkItemStatusesForMapping() { + return Stream.of( + of(SetStatusEnum.SUCCESS, JobStatus.DONE), + of(SetStatusEnum.FAILED, JobStatus.FAILED), + of(SetStatusEnum.ERROR, JobStatus.FAILED), + of(SetStatusEnum.ERROR_READONLY, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource(value = SetStatusEnum.class, names = {"SUCCESS", "FAILED", "ERROR", "ERROR_READONLY"}, mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(SetStatusEnum setStatusEnum) { + //given + var setWorkItemResult = new SetWorkItemResult(setStatusEnum); + + //expect + assertThrows(IllegalStateException.class, () -> { + setPropertyJobHandler.mapToJobResult(setWorkItemResult); + }); + } +} diff --git a/src/test/java/io/gec/raw/connector/setworkitem/handler/SetVariableJobHandlerTest.java b/src/test/java/io/gec/raw/connector/setworkitem/handler/SetVariableJobHandlerTest.java new file mode 100755 index 0000000..b86a818 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/setworkitem/handler/SetVariableJobHandlerTest.java @@ -0,0 +1,294 @@ +package io.gec.raw.connector.setworkitem.handler; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.job.domain.WorkItemWrapper; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.setworkitem.controller.SnmpSetController; +import io.gec.raw.connector.setworkitem.domain.SetWorkItemResult; +import io.gec.raw.connector.setworkitem.dto.ActionEnum; +import io.gec.raw.connector.setworkitem.dto.SetStatusEnum; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.utils.control.ValueScalingHelper; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.control.VariableHandler; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +import static io.smallrye.common.constraint.Assert.assertNotNull; +import static io.smallrye.common.constraint.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.BDDMockito.willDoNothing; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.argThat; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SetVariableJobHandlerTest { + + @Mock + Logger logger; + @Mock + CommunicationServiceController communicationServiceController; + @Mock + SnmpSetController snmpSetController; + @Mock + ValueScalingHelper scalingHelper; + @Mock + VariableController variableController; + @Mock + VariableHandler variableHandler; + @InjectMocks + SetVariableJobHandler setVariableJobHandler; + + @Test + void shouldGetJobType() { + //when + var result = setVariableJobHandler.getJobType(); + + //then + assertEquals(JobType.VARIABLE, result); + } + + @Test + void shouldProcessWorkItem_withDoneResultForVariableStringSet() { + //given + var datatype = DataTypeEnum.STRING; + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID varCommId = UUID.randomUUID(); + var workItem = TestDTOFactory.createSetWorkItemDTO(varCommId, null, "value"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + //and + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setSnmpSetVarDataType(datatype); + variable.setDeviceId(deviceId); + variable.setCommServiceId(varCommId); + //and + when(variableController.findVariableByCommSvcId(workItem.getVariableId())).thenReturn(variable); + + //when + var result = setVariableJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.SUCCESS)); + assertNull(result.getMessage()); + verify(snmpSetController, times(1)).performSnmpSet(workItem, deviceId, variable.getValueAsStringOid(), datatype); + } + + @Test + void shouldProcessWorkItem_withDoneResultForVariableIntegerSet() { + //given + var datatype = DataTypeEnum.INTEGER; + UUID workItemId = UUID.randomUUID(); + UUID deviceId = UUID.randomUUID(); + UUID varCommId = UUID.randomUUID(); + var workItem = TestDTOFactory.createSetWorkItemDTO(varCommId, null, "123"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + //and + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setVarDataType(datatype); + variable.setDeviceId(deviceId); + variable.setCommServiceId(varCommId); + //and + when(variableController.findVariableByCommSvcId(workItem.getVariableId())).thenReturn(variable); + //and + when(scalingHelper.getScaledVariableValueForDevice(variable.getVarDataType(), workItem.getValue(), variable.getScale())).thenReturn("123"); + //and + VariableValueData expectedVariableValueDataSentAsNewValue = new VariableValueData("123", QualityType.GOOD); + + //when + var result = setVariableJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.SUCCESS)); + assertNull(result.getMessage()); + verify(snmpSetController, times(1)).performSnmpSet(workItem, deviceId, variable.getValueAsIntegerOid(), datatype); + verify(variableHandler, times(1)).handleVariableValueFetchedFromDevice(eq(variable), eq(expectedVariableValueDataSentAsNewValue)); + } + + @Test + void shouldProcessWorkItem_withFAILEDResultForVariableStringSetWithNoVariableID() { + //given + UUID workItemId = UUID.randomUUID(); + var workItem = TestDTOFactory.createSetWorkItemDTO(null, null, "value"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + + //when + var result = setVariableJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.FAILED)); + assertNotNull(result.getMessage()); + } + + @Test + void processWorkItem_shouldReturnFailedResult_whenSnmpSetFailed() { + // given + UUID workItemId = UUID.randomUUID(); + UUID variableId = UUID.randomUUID(); + var workItem = TestDTOFactory.createSetWorkItemDTO(variableId, null, "value"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + // and + Variable variable = TestEntityFactory.createVariableWithoutConstraints(); + when(variableController.findVariableByCommSvcId(variableId)).thenReturn(variable); + // and + when(snmpSetController.performSnmpSet(workItem, variable.getDeviceId(), variable.getValueAsIntegerOid(), variable.getVarDataType())) + .thenReturn(Optional.of("0:Error")); + + // when + SetWorkItemResult setWorkItemResult = setVariableJobHandler.processWorkItem(workItemWrapper); + + // then + assertNotNull(setWorkItemResult); + assertThat(setWorkItemResult.getStatus(), is(SetStatusEnum.FAILED)); + assertEquals("0:Error", setWorkItemResult.getMessage()); + } + + @Test + void shouldProcessWorkItem_UpdateIntervalForSetActionSET_INTERVAL() { + //given + var value = "testValue"; + var datatype = DataTypeEnum.STRING; + UUID deviceId = UUID.randomUUID(); + UUID varCommId = UUID.randomUUID(); + UUID workItemId = UUID.randomUUID(); + //and + var workItem = TestDTOFactory.createSetWorkItemDTO(varCommId, null, value); + workItem.setAction(ActionEnum.SET_INTERVAL); + var workItemWrapper = new WorkItemWrapper<>(workItemId, workItem, () -> false); + //and + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setId(varCommId); + variable.setVarDataType(datatype); + variable.setDeviceId(deviceId); + variable.setCommServiceId(varCommId); + //and + when(variableController.findVariableByCommSvcId(workItem.getVariableId())).thenReturn(variable); + + //when + var result = setVariableJobHandler.processWorkItem(workItemWrapper); + + //then + assertNotNull(result); + assertThat(result.getStatus(), is(SetStatusEnum.SUCCESS)); + assertNull(result.getMessage()); + verify(snmpSetController, times(1)).updateVariableInterval(varCommId, value); + } + + @Test + void shouldGetWorkItem_returnNonEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + var setWorkItemDTO = TestDTOFactory.createSetWorkItemDTO(UUID.randomUUID(), null, "5"); + //and + willReturn(Optional.of(setWorkItemDTO)).given(communicationServiceController).fetchSetWorkItem(workItemId); + + //when + var result = setVariableJobHandler.getWorkItem(workItemId); + + //then + assertTrue(result.isPresent()); + assertThat(result.get(), is(setWorkItemDTO)); + } + + @Test + void shouldGetWorkItem_returnEmptyOptional() { + //given + UUID workItemId = UUID.randomUUID(); + //and + willReturn(Optional.empty()).given(communicationServiceController).fetchSetWorkItem(workItemId); + + //when + var result = setVariableJobHandler.getWorkItem(workItemId); + + //then + assertFalse(result.isPresent()); + } + + @ParameterizedTest + @EnumSource(SetStatusEnum.class) + void shouldFinishProcessing_updateSetWorkItem(SetStatusEnum setStatusEnum) { + //given + UUID workItemId = UUID.randomUUID(); + var setWorkItemDTO = TestDTOFactory.createSetWorkItemDTO(UUID.randomUUID(), null, "5"); + var workItemWrapper = new WorkItemWrapper<>(workItemId, setWorkItemDTO, () -> false); + var setWorkItemResult = new SetWorkItemResult(setStatusEnum); + //and + willDoNothing().given(communicationServiceController).updateSetWorkItem(eq(workItemId), any()); + + //when + setVariableJobHandler.finishProcessing(workItemWrapper, setWorkItemResult); + + //then + verify(communicationServiceController, times(1)).updateSetWorkItem( + eq(workItemId), + argThat(setWorkItemUpdateDTO -> setWorkItemUpdateDTO.getStatus() == setStatusEnum)); + } + + @ParameterizedTest + @MethodSource("getSetWorkItemStatusesForMapping") + void shouldMapToJobResult(SetStatusEnum setStatusEnum, JobStatus jobStatus) { + //given + var setWorkItemResult = new SetWorkItemResult(setStatusEnum, "message"); + + //when + var result = setVariableJobHandler.mapToJobResult(setWorkItemResult); + + //then + assertNotNull(result); + assertThat(result.status(), is(jobStatus)); + assertThat(result.message(), is("message")); + } + + private static Stream getSetWorkItemStatusesForMapping() { + return Stream.of( + of(SetStatusEnum.SUCCESS, JobStatus.DONE), + of(SetStatusEnum.FAILED, JobStatus.FAILED), + of(SetStatusEnum.ERROR, JobStatus.FAILED), + of(SetStatusEnum.ERROR_READONLY, JobStatus.FAILED) + ); + } + + @ParameterizedTest + @EnumSource(value = SetStatusEnum.class, names = {"SUCCESS", "FAILED", "ERROR", "ERROR_READONLY"}, mode = EnumSource.Mode.EXCLUDE) + void shouldMapToJobResult_throwIllegalStateException(SetStatusEnum setStatusEnum) { + //given + var setWorkItemResult = new SetWorkItemResult(setStatusEnum); + + //expect + assertThrows(IllegalStateException.class, () -> { + setVariableJobHandler.mapToJobResult(setWorkItemResult); + }); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/common/control/DeviceOidValueMapTest.java b/src/test/java/io/gec/raw/connector/snmp/common/control/DeviceOidValueMapTest.java new file mode 100755 index 0000000..b568732 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/common/control/DeviceOidValueMapTest.java @@ -0,0 +1,43 @@ +package io.gec.raw.connector.snmp.common.control; + +import static org.junit.jupiter.api.Assertions.*; + +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import org.junit.jupiter.api.Test; + +class DeviceOidValueMapTest { + + @Test + void shouldNotReturnNulls() { + DeviceOidValueMap out = new DeviceOidValueMap(); + assertNotNull(out.getEnterprise()); + assertNotNull(out.getSysContact()); + assertNotNull(out.getSysDescr()); + assertNotNull(out.getSysName()); + assertNotNull(out.getSysLocation()); + assertNotNull(out.getSysObjectId()); + assertNotNull(out.getSysUpTime()); + } + + @Test + void shouldNotValidValues() { + DeviceOidValueMap out = new DeviceOidValueMap(); + out.put(".1.3.6.1.2.1.1.1.0", "Rittal PDU SN 34604114 HW REV.0406 - SW V7.19.00"); + out.put(".1.3.6.1.2.1.1.2.0", "1.3.6.1.4.1.2606.7"); + out.put(".1.3.6.1.2.1.1.3.0", "13 days, 23:48:36.45"); + out.put(".1.3.6.1.2.1.1.4.0", "Not me"); + out.put(".1.3.6.1.2.1.1.5.0", "PDU Controllers Name"); + out.put(".1.3.6.1.2.1.1.6.0", "Limburg Office"); + out.put(".1.3.6.1.2.1.1.7.0", "64"); + out.put(".1.3.6.1.2.1.1.8.0", "0:00:00.33"); + out.put(".1.3.6.1.4.1.2606.7.1.1.0", "1"); + + assertEquals("2606", out.getEnterprise()); + assertEquals("Not me", out.getSysContact()); + assertEquals("Rittal PDU SN 34604114 HW REV.0406 - SW V7.19.00", out.getSysDescr()); + assertEquals("PDU Controllers Name", out.getSysName()); + assertEquals("Limburg Office", out.getSysLocation()); + assertEquals("1.3.6.1.4.1.2606.7", out.getSysObjectId()); + assertEquals("13 days, 23:48:36.45", out.getSysUpTime()); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/common/control/PDUResponseMapperTest.java b/src/test/java/io/gec/raw/connector/snmp/common/control/PDUResponseMapperTest.java new file mode 100755 index 0000000..59209a0 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/common/control/PDUResponseMapperTest.java @@ -0,0 +1,69 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.dto.VarQuality; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.PDU; +import org.snmp4j.smi.*; + +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.of; + +@ExtendWith(MockitoExtension.class) +class PDUResponseMapperTest { + + @InjectMocks + PDUResponseMapper pduResponseMapper; + + private static Stream shouldToQualityTypeReturnExpectedQualityType() { + return Stream.of( + of(null, QualityType.DEVICE_COMMUNICATION_ISSUE), + of(new PDU(), QualityType.UNCERTAIN), + of(emptyValuePDU(), QualityType.UNCERTAIN), + of(nullValuePDU(Null.noSuchObject), QualityType.UNCERTAIN), + of(nullValuePDU(Null.noSuchInstance), QualityType.DEVICE_UNAVAILABLE), + of(nullValuePDU(Null.endOfMibView), QualityType.UNCERTAIN), + of(nullValuePDU(Null.instance), QualityType.UNCERTAIN), + of(intValuePDU(VarQuality.UNDEFINED.getValue()), QualityType.UNAVAILABLE), + of(intValuePDU(VarQuality.OK.getValue()), QualityType.GOOD), + of(intValuePDU(VarQuality.WARNING.getValue()), QualityType.GOOD), + of(intValuePDU(VarQuality.ALARM.getValue()), QualityType.GOOD), + of(intValuePDU(VarQuality.INFO.getValue()), QualityType.GOOD), + of(intValuePDU(VarQuality.UNDEFINEDNOVALUE.getValue()), QualityType.NO_VALUE), + of(intValuePDU(VarQuality.OKNOVALUE.getValue()), QualityType.NO_VALUE), + of(intValuePDU(VarQuality.WARNINGNOVALUE.getValue()), QualityType.NO_VALUE), + of(intValuePDU(VarQuality.ALARMNOVALUE.getValue()), QualityType.NO_VALUE), + of(intValuePDU(VarQuality.INFONOVALUE.getValue()), QualityType.NO_VALUE) + ); + } + + private static PDU emptyValuePDU() { + return new PDU(PDU.RESPONSE, List.of(new VariableBinding(new OID(), new OctetString()))); + } + + private static PDU intValuePDU(int value) { + return new PDU(PDU.RESPONSE, List.of(new VariableBinding(new OID(), new Integer32(value)))); + } + + private static PDU nullValuePDU(Null value) { + return new PDU(PDU.RESPONSE, List.of(new VariableBinding(new OID(), value))); + } + + @ParameterizedTest + @MethodSource + void shouldToQualityTypeReturnExpectedQualityType(PDU pdu, QualityType expected) { + // given & when + QualityType result = pduResponseMapper.toQualityType(pdu); + + // then + assertEquals(expected, result); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpHelperTest.java b/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpHelperTest.java new file mode 100755 index 0000000..9d9e576 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpHelperTest.java @@ -0,0 +1,57 @@ +package io.gec.raw.connector.snmp.common.control; + +import org.jboss.logging.Logger; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.PDU; +import org.snmp4j.smi.Null; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.VariableBinding; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.of; + +@ExtendWith(MockitoExtension.class) +class SnmpHelperTest { + + @Mock + Logger logger; + @InjectMocks + SnmpHelper snmpHelper; + + private static PDU createPDU(int errorStatus) { + PDU pdu = new PDU(); + pdu.setErrorStatus(errorStatus); + return pdu; + } + + private static Stream shouldCheckIfWalkFinished() { + PDU pdu = createPDU(PDU.noError); + return Stream.of( + of(new OID("1.2.3"), pdu, new VariableBinding(new OID("1.2.3.4")), false), + of(new OID("1.2.3"), createPDU(PDU.authorizationError), new VariableBinding(new OID("1.2.3.4")), true), + of(new OID("1.2.3"), pdu, new VariableBinding(new OID("1.2")), true), + of(new OID("1.2.3"), pdu, new VariableBinding(new OID("1.2.2")), true), + of(new OID("1.2.3"), pdu, new VariableBinding(new OID("1.2.4")), true), + of(new OID("1.2.3"), pdu, new VariableBinding(new OID("1.2.3.4"), Null.endOfMibView), true), + of(new OID("1.2.3"), pdu, new VariableBinding(new OID("1.2.5.4")), true) + ); + } + + @ParameterizedTest + @MethodSource + void shouldCheckIfWalkFinished(OID oid, PDU pdu, VariableBinding variableBinding, boolean expected) { + // when + boolean result = snmpHelper.checkWalkFinished(oid, pdu, variableBinding); + + // then + assertEquals(expected, result); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpMessageSenderTest.java b/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpMessageSenderTest.java new file mode 100755 index 0000000..96bea63 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpMessageSenderTest.java @@ -0,0 +1,132 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.protocol.domain.SecurityLevelEnum; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.snmp.common.domain.SnmpConnectionType; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; +import io.gec.raw.connector.snmp.common.domain.SnmpRequestData; +import io.gec.raw.connector.snmp.common.domain.SnmpV3Data; +import io.gec.raw.connector.statistic.control.StatisticCollectorController; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.CommunityTarget; +import org.snmp4j.PDU; +import org.snmp4j.PDUv1; +import org.snmp4j.ScopedPDU; +import org.snmp4j.Snmp; +import org.snmp4j.event.ResponseEvent; +import org.snmp4j.mp.SnmpConstants; +import org.snmp4j.smi.Address; + +import java.io.IOException; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SnmpMessageSenderTest { + + private static final int UNSUPPORTED_SNMP_MESSAGE = -1; + + @Mock + SnmpProvider snmpProvider; + @Mock + DiscoveryDataToSnmpMapper mapper; + @Mock + Snmp snmp; + @Mock + StatisticCollectorController statisticCollectorController; + @InjectMocks + SnmpMessageSender snmpMessageSender; + + private static Stream shouldReceiveGivenResponseType() { + return Stream.of(PDU.GET, PDU.GETNEXT, PDU.GETBULK, PDU.SET).flatMap(snmpMessage -> + Stream.of( + of(SnmpVersionEnum.SNMP_V1, snmpMessage, new PDUv1()), + of(SnmpVersionEnum.SNMP_V2C, snmpMessage, new PDU()), + of(SnmpVersionEnum.SNMP_V3, snmpMessage, new ScopedPDU()))); + } + + @ParameterizedTest + @MethodSource + void shouldReceiveGivenResponseType(SnmpVersionEnum snmpVersionEnum, int snmpMessage, PDU expected) throws IOException { + // given + SnmpRequestData snmpRequestData = createSnmpRequestData(snmpVersionEnum, snmpMessage); + when(snmpProvider.getSnmp(SnmpConnectionType.COMMAND_SENDER)).thenReturn(snmp); + when(mapper.toPDU(any(SnmpProtocolData.class))).thenReturn(new PDU()); + expected.setType(snmpMessage); + ResponseEvent
expectedResponse = new ResponseEvent<>(new Object(), null, null, expected, null, 0L); + lenient().when(snmp.get(any(PDU.class), any())).thenReturn(expectedResponse); + lenient().when(snmp.getNext(any(PDU.class), any())).thenReturn(expectedResponse); + lenient().when(snmp.getBulk(any(PDU.class), any())).thenReturn(expectedResponse); + lenient().when(snmp.set(any(PDU.class), any())).thenReturn(expectedResponse); + + // when + ResponseEvent
result = snmpMessageSender.sendSnmpMessage(snmpRequestData); + + // then + assertNotNull(result); + assertNotNull(result.getResponse()); + assertEquals(expected.getClass().getSimpleName(), result.getResponse().getClass().getSimpleName()); + assertEquals(snmpMessage, result.getResponse().getType()); + } + + @Test + void shouldThrowWhenUnsupportedSnmpMessage() { + // given + SnmpRequestData snmpRequestData = createSnmpRequestData(SnmpVersionEnum.SNMP_V1, UNSUPPORTED_SNMP_MESSAGE); + when(snmpProvider.getSnmp(SnmpConnectionType.COMMAND_SENDER)).thenReturn(snmp); + when(mapper.toPDU(any(SnmpProtocolData.class))).thenReturn(new PDU()); + + // when & then + assertThrows(IllegalArgumentException.class, () -> snmpMessageSender.sendSnmpMessage(snmpRequestData)); + } + + @Test + void shouldCreateTarget() { + // given + SnmpRequestData snmpRequestData = createSnmpRequestData(SnmpVersionEnum.SNMP_V1, UNSUPPORTED_SNMP_MESSAGE); + + // when + CommunityTarget
target = snmpMessageSender.createTarget(snmpRequestData); + + // then + assertNotNull(target); + assertNotNull(target.getCommunity()); + assertTrue(target.getCommunity().toString().isEmpty()); + assertNotNull(target.getAddress()); + assertEquals(SnmpConstants.version1, target.getVersion()); + } + + private SnmpRequestData createSnmpRequestData(SnmpVersionEnum snmpVersionEnum, int snmpMessage) { + return SnmpRequestData.builder() + .snmpMessage(snmpMessage) + .snmpMessageData(SnmpMessageData.builder() + .hostname("192.168.1.1") + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(snmpVersionEnum) + .snmpV3Data(Optional.of(SnmpV3Data.builder() + .securityName(Optional.of("securityName")) + .securityLevel(Optional.of(SecurityLevelEnum.NOAUTHNOPRIV)) + .build())) + .build()) + .build()) + .build(); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpWalkTest.java b/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpWalkTest.java new file mode 100755 index 0000000..0fbba8f --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/common/control/SnmpWalkTest.java @@ -0,0 +1,229 @@ +package io.gec.raw.connector.snmp.common.control; + +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import io.gec.raw.connector.job.domain.ProcessingCanceledException; +import io.gec.raw.connector.job.domain.ProcessingCancellationChecker; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.PDU; +import org.snmp4j.event.ResponseEvent; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.OctetString; +import org.snmp4j.smi.VariableBinding; + +import java.text.ParseException; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SnmpWalkTest { + + private static final String SAMPLE_OID = "1.2.3"; + private static final String SAMPLE_VARIABLE_VALUE = "abc"; + private static final String SAMPLE_HOSTNAME = "1.2.3.4"; + + @Mock + SnmpMessageSender snmpMessageSender; + @Mock + DiscoveryDataToSnmpMapper mapper; + @Mock + IPAddressHelper ipAddressHelper; + @Mock + SnmpHelper snmpHelper; + @Mock + Logger logger; + @Mock + SnmpTimeouts snmpTimeouts; + @InjectMocks + SnmpWalk snmpWalk; + + @SneakyThrows + @Test + void shouldReturnEmptyMapOnInvalidIp() { + // given + SnmpMessageData snmpMessageData = SnmpMessageData.builder() + .hostname(SAMPLE_OID) + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .build(); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + // and + doThrow(ParseException.class).when(ipAddressHelper).validateIP(anyString()); + + // when + DeviceOidValueMap result = snmpWalk.collectDeviceOidValueMap(snmpMessageData, processingCancellationCheckerMock); + + // then + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @SneakyThrows + @Test + void shouldReturnEmptyMapOnNullSnmpResponse() { + // given + SnmpMessageData snmpMessageData = SnmpMessageData.builder() + .hostname(SAMPLE_HOSTNAME) + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .variableBindings(List.of(new VariableBinding(new OID(SAMPLE_OID), new OctetString(SAMPLE_VARIABLE_VALUE)))) + .build(); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + // and + doNothing().when(ipAddressHelper).validateIP(any()); + when(mapper.toPDU(any())).thenReturn(new PDU()); + when(snmpMessageSender.sendSnmpMessage(any())).thenReturn(null); + + // when + DeviceOidValueMap result = snmpWalk.collectDeviceOidValueMap(snmpMessageData, processingCancellationCheckerMock); + + // then + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @SneakyThrows + @Test + void shouldReturnEmptyMapOnSnmpReportResponse() { + // given + SnmpMessageData snmpMessageData = SnmpMessageData.builder() + .hostname(SAMPLE_HOSTNAME) + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .variableBindings(List.of(new VariableBinding(new OID(SAMPLE_OID), new OctetString(SAMPLE_VARIABLE_VALUE)))) + .build(); + PDU pdu = new PDU(); + pdu.setType(PDU.REPORT); + ResponseEvent
responseEvent = mock(ResponseEvent.class); + when(responseEvent.getResponse()).thenReturn(pdu); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + // and + doNothing().when(ipAddressHelper).validateIP(any()); + when(mapper.toPDU(any())).thenReturn(pdu); + when(snmpMessageSender.sendSnmpMessage(any())).thenReturn(responseEvent); + + // when + DeviceOidValueMap result = snmpWalk.collectDeviceOidValueMap(snmpMessageData, processingCancellationCheckerMock); + + // then + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @SneakyThrows + @Test + void shouldReturnEmptyMapWhenNoVariableBindingPresent() { + // given + SnmpMessageData snmpMessageData = SnmpMessageData.builder() + .hostname(SAMPLE_HOSTNAME) + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .variableBindings(List.of(new VariableBinding(new OID(SAMPLE_OID), new OctetString(SAMPLE_VARIABLE_VALUE)))) + .build(); + PDU pdu = new PDU(); + pdu.setType(PDU.RESPONSE); + pdu.setVariableBindings(List.of()); + PDU pdu2 = new PDU(); + pdu2.setType(PDU.RESPONSE); + pdu2.setVariableBindings(List.of()); + ResponseEvent
responseEvent = mock(ResponseEvent.class); + when(responseEvent.getResponse()).thenReturn(pdu2); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + // and + when(mapper.toPDU(any())).thenReturn(pdu); + when(snmpMessageSender.sendSnmpMessage(any())).thenReturn(responseEvent); + + // when + DeviceOidValueMap result = snmpWalk.collectDeviceOidValueMap(snmpMessageData, processingCancellationCheckerMock); + + // then + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @SneakyThrows + @Test + void shouldReturnResult() { + // given + SnmpMessageData snmpMessageData = SnmpMessageData.builder() + .hostname(SAMPLE_HOSTNAME) + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .variableBindings(List.of(new VariableBinding(new OID(SAMPLE_OID), new OctetString(SAMPLE_VARIABLE_VALUE)))) + .build(); + PDU pdu = new PDU(); + pdu.setType(PDU.RESPONSE); + ResponseEvent
responseEvent = mock(ResponseEvent.class); + when(responseEvent.getResponse()).thenReturn(pdu); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + // and + when(mapper.toPDU(any())).thenReturn(pdu); + when(snmpMessageSender.sendSnmpMessage(any())).thenReturn(responseEvent); + when(snmpHelper.oidToString(any())).thenReturn(SAMPLE_OID); + when(snmpHelper.checkWalkFinished(any(), any(), any())).thenReturn(true); + + // when + DeviceOidValueMap result = snmpWalk.collectDeviceOidValueMap(snmpMessageData, processingCancellationCheckerMock); + + // then + assertNotNull(result); + assertFalse(result.isEmpty()); + assertEquals(SAMPLE_VARIABLE_VALUE, result.get(SAMPLE_OID).toString()); + } + + @Test + void shouldThrowProcessingCanceledException() { + // given + SnmpMessageData snmpMessageData = SnmpMessageData.builder() + .hostname(SAMPLE_HOSTNAME) + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .variableBindings(List.of(new VariableBinding(new OID(SAMPLE_OID), new OctetString(SAMPLE_VARIABLE_VALUE)))) + .build(); + PDU pdu = new PDU(); + pdu.setType(PDU.RESPONSE); + ResponseEvent
responseEvent = mock(ResponseEvent.class); + when(responseEvent.getResponse()).thenReturn(pdu); + var processingCancellationCheckerMock = mock(ProcessingCancellationChecker.class); + // and + when(mapper.toPDU(any())).thenReturn(pdu); + when(snmpMessageSender.sendSnmpMessage(any())).thenReturn(responseEvent); + when(processingCancellationCheckerMock.isProcessingCanceled()).thenReturn(true); + + // expect + assertThrows(ProcessingCanceledException.class, () -> snmpWalk.collectDeviceOidValueMap(snmpMessageData, processingCancellationCheckerMock)); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/common/domain/DiscoveryDataToSnmpMapperTest.java b/src/test/java/io/gec/raw/connector/snmp/common/domain/DiscoveryDataToSnmpMapperTest.java new file mode 100755 index 0000000..baff7ea --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/common/domain/DiscoveryDataToSnmpMapperTest.java @@ -0,0 +1,266 @@ +package io.gec.raw.connector.snmp.common.domain; + +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.protocol.domain.AuthenticationProtocolEnum; +import io.gec.raw.connector.protocol.domain.PrivacyAlgorithmEnum; +import io.gec.raw.connector.protocol.domain.SecurityLevelEnum; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.snmp.common.control.DiscoveryDataToSnmpMapper; +import io.gec.raw.connector.utils.control.ValueHelper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentMatchers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.PDU; +import org.snmp4j.PDUv1; +import org.snmp4j.ScopedPDU; +import org.snmp4j.mp.SnmpConstants; +import org.snmp4j.security.*; +import org.snmp4j.smi.Null; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.VariableBinding; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class DiscoveryDataToSnmpMapperTest { + + public static final String SECURITY_NAME = "securityName"; + public static final String PASS_PHRASE = "passPhrase"; + public static final String EMPTY_STRING = ""; + public static final String OID = "1.2"; + private static final String READ_COMMUNITY = "readCommunity"; + private static final String WRITE_COMMUNITY = "writeCommunity"; + + @Mock + ValueHelper valueHelper; + @InjectMocks + DiscoveryDataToSnmpMapper mapper; + + private static Stream shouldReturnSecurityLevel() { + return Stream.of( + of(SecurityLevelEnum.AUTHPRIV, SecurityLevel.AUTH_PRIV), + of(SecurityLevelEnum.AUTHNOPRIV, SecurityLevel.AUTH_NOPRIV), + of(SecurityLevelEnum.NOAUTHNOPRIV, SecurityLevel.NOAUTH_NOPRIV) + ); + } + + private static Stream shouldReturnSnmpVersion() { + return Stream.of( + of(SnmpVersionEnum.SNMP_V1, SnmpConstants.version1), + of(SnmpVersionEnum.SNMP_V2C, SnmpConstants.version2c), + of(SnmpVersionEnum.SNMP_V3, SnmpConstants.version3) + ); + } + + private static Stream provideSnmpVersionAndExpectedPDUClass() { + return Stream.of( + Arguments.of(SnmpVersionEnum.SNMP_V1, PDUv1.class), + Arguments.of(SnmpVersionEnum.SNMP_V2C, PDU.class), + Arguments.of(SnmpVersionEnum.SNMP_V3, ScopedPDU.class) + ); + } + + + private static Stream shouldReturnSnmpDiscoveryMessage() { + return Stream.of( + of(SnmpVersionEnum.SNMP_V1, PDU.GETNEXT), + of(SnmpVersionEnum.SNMP_V2C, PDU.GETBULK), + of(SnmpVersionEnum.SNMP_V3, PDU.GETBULK) + ); + } + + private static Stream shouldReturnCommunityString() { + return Stream.of( + of(PDU.GETNEXT, READ_COMMUNITY), + of(PDU.GETBULK, READ_COMMUNITY), + of(PDU.GET, READ_COMMUNITY), + of(PDU.SET, WRITE_COMMUNITY) + ); + } + + private static Stream shouldReturnUsmUser() { + return Stream.of( + of(SECURITY_NAME, AuthenticationProtocolEnum.MD5, PASS_PHRASE, PrivacyAlgorithmEnum.AES128, PASS_PHRASE, true), + of(null, AuthenticationProtocolEnum.MD5, PASS_PHRASE, PrivacyAlgorithmEnum.AES128, PASS_PHRASE, false), + of(SECURITY_NAME, null, PASS_PHRASE, PrivacyAlgorithmEnum.AES128, PASS_PHRASE, true), + of(SECURITY_NAME, AuthenticationProtocolEnum.MD5, null, PrivacyAlgorithmEnum.AES128, PASS_PHRASE, true), + of(SECURITY_NAME, AuthenticationProtocolEnum.MD5, PASS_PHRASE, null, PASS_PHRASE, true), + of(SECURITY_NAME, AuthenticationProtocolEnum.MD5, PASS_PHRASE, PrivacyAlgorithmEnum.AES128, null, true), + of(EMPTY_STRING, AuthenticationProtocolEnum.MD5, PASS_PHRASE, PrivacyAlgorithmEnum.AES128, PASS_PHRASE, false), + of(SECURITY_NAME, AuthenticationProtocolEnum.MD5, EMPTY_STRING, PrivacyAlgorithmEnum.AES128, PASS_PHRASE, true), + of(SECURITY_NAME, AuthenticationProtocolEnum.MD5, PASS_PHRASE, PrivacyAlgorithmEnum.AES128, EMPTY_STRING, true)); + } + + private static Stream shouldReturnVariableBindingsWithValues() { + return Stream.of( + of(OID, "123", DataTypeEnum.INTEGER), + of(OID, "2", DataTypeEnum.ENUM), + of(OID, "sampleString", DataTypeEnum.STRING), + of(OID, "123", DataTypeEnum.ANALOGINT), + of(OID, "123", DataTypeEnum.STATUSINT), + of(OID, "123", DataTypeEnum.NUMERIC), + of(OID, "1.23", DataTypeEnum.FLOAT) + ); + } + + private static Stream shouldReturnAuthenticationProtocolID() { + return Stream.of( + of(AuthenticationProtocolEnum.MD5, AuthMD5.ID), + of(AuthenticationProtocolEnum.SHA, AuthSHA.ID), + of(AuthenticationProtocolEnum.SHA224, AuthHMAC128SHA224.ID), + of(AuthenticationProtocolEnum.SHA256, AuthHMAC192SHA256.ID), + of(AuthenticationProtocolEnum.SHA384, AuthHMAC256SHA384.ID), + of(AuthenticationProtocolEnum.SHA512, AuthHMAC384SHA512.ID) + ); + } + + private static Stream shouldReturnPrivacyAlgorithmID() { + return Stream.of( + of(PrivacyAlgorithmEnum.DES, PrivDES.ID), + of(PrivacyAlgorithmEnum.AES128, PrivAES128.ID), + of(PrivacyAlgorithmEnum.AES192, PrivAES192.ID), + of(PrivacyAlgorithmEnum.AES256, PrivAES256.ID), + of(PrivacyAlgorithmEnum.DES3, Priv3DES.ID) + ); + } + + @ParameterizedTest + @MethodSource + void shouldReturnSecurityLevel(SecurityLevelEnum securityLevelEnum, int securityLevel) { + assertEquals(securityLevel, mapper.toSecurityLevel(securityLevelEnum)); + } + + @ParameterizedTest + @MethodSource + void shouldReturnSnmpVersion(SnmpVersionEnum snmpVersionEnum, int snmpVersion) { + assertEquals(snmpVersion, mapper.toSnmpVersion(snmpVersionEnum)); + } + + @ParameterizedTest + @MethodSource("provideSnmpVersionAndExpectedPDUClass") + void shouldReturnPDU(SnmpVersionEnum snmpVersionEnum, Class expectedPDUClass) { + //given + SnmpProtocolData snmpProtocolData = SnmpProtocolData.builder() + .port(161) + .snmpVersion(snmpVersionEnum) + .build(); + + //when + PDU pdu = mapper.toPDU(snmpProtocolData); + + //then + assertEquals(expectedPDUClass, pdu.getClass()); + } + + + @ParameterizedTest + @MethodSource + void shouldReturnSnmpDiscoveryMessage(SnmpVersionEnum snmpVersionEnum, Integer snmpDiscoveryMessage) { + assertEquals(snmpDiscoveryMessage, mapper.toSnmpDiscoveryMessage(snmpVersionEnum)); + } + + @ParameterizedTest + @MethodSource + void shouldReturnCommunityString(Integer snmpMessage, String expected) { + SnmpRequestData snmpRequestData = Mockito.mock(SnmpRequestData.class); + SnmpMessageData snmpMessageData = Mockito.mock(SnmpMessageData.class); + SnmpProtocolData snmpProtocolData = Mockito.mock(SnmpProtocolData.class); + when(snmpRequestData.getSnmpMessage()).thenReturn(snmpMessage); + when(snmpRequestData.getSnmpMessageData()).thenReturn(snmpMessageData); + when(snmpMessageData.getSnmpProtocolData()).thenReturn(snmpProtocolData); + lenient().when(snmpProtocolData.getReadCommunity()).thenReturn(Optional.of(READ_COMMUNITY)); + lenient().when(snmpProtocolData.getWriteCommunity()).thenReturn(Optional.of(WRITE_COMMUNITY)); + + Optional communityString = mapper.toCommunityString(snmpRequestData); + + assertTrue(communityString.isPresent()); + assertEquals(expected, communityString.get()); + } + + @Test + void shouldThrowCommunityStringException() { + SnmpRequestData snmpRequestData = Mockito.mock(SnmpRequestData.class); + when(snmpRequestData.getSnmpMessage()).thenReturn(PDU.RESPONSE); + + assertThrows(IllegalArgumentException.class, () -> mapper.toCommunityString(snmpRequestData)); + } + + @ParameterizedTest + @MethodSource + void shouldReturnUsmUser(String securityName, AuthenticationProtocolEnum authenticationProtocol, String authenticationPassphrase, + PrivacyAlgorithmEnum privacyAlgorithm, String privacyPassphrase, boolean shouldCreateUsmUser) { + SnmpV3Data snmpV3Data = SnmpV3Data.builder() + .securityName(Optional.ofNullable(securityName)) + .authenticationProtocol(Optional.ofNullable(authenticationProtocol)) + .authenticationPassphrase(Optional.ofNullable(authenticationPassphrase)) + .privacyAlgorithm(Optional.ofNullable(privacyAlgorithm)) + .privacyPasssphrase(Optional.ofNullable(privacyPassphrase)) + .build(); + when(valueHelper.trim(ArgumentMatchers.any())) + .thenAnswer(i -> { + Optional optionalString = i.getArgument(0); + return optionalString.filter(v -> !v.isEmpty()); + }); + + if (shouldCreateUsmUser) { + assertDoesNotThrow(() -> mapper.toUsmUser(snmpV3Data)); + } else { + assertThrows(IllegalArgumentException.class, () -> mapper.toUsmUser(snmpV3Data)); + } + } + + @Test + void shouldReturnVariableBindings() { + List variableBindings = mapper.toVariableBindings(OID); + + assertFalse(variableBindings.isEmpty()); + assertEquals(1, variableBindings.size()); + assertEquals(String.format("%s = Null", OID), variableBindings.getFirst().toString()); + assertEquals(Null.instance, variableBindings.getFirst().getVariable()); + } + + @ParameterizedTest + @MethodSource + void shouldReturnVariableBindingsWithValues(String oid, String value, DataTypeEnum dataTypeEnum) { + List variableBindings = mapper.toVariableBindings(oid, value, dataTypeEnum); + + assertFalse(variableBindings.isEmpty()); + assertEquals(1, variableBindings.size()); + assertNotEquals(Null.instance, variableBindings.getFirst().getVariable()); + } + + + @ParameterizedTest + @MethodSource + void shouldReturnAuthenticationProtocolID(AuthenticationProtocolEnum authenticationProtocolEnum, OID oid) { + assertEquals(oid, mapper.toAuthenticationProtocolID(authenticationProtocolEnum)); + } + + @ParameterizedTest + @MethodSource + void shouldReturnPrivacyAlgorithmID(PrivacyAlgorithmEnum privacyAlgorithmEnum, OID oid) { + assertEquals(oid, mapper.toPrivacyAlgorithmID(privacyAlgorithmEnum)); + } + + @Test + void shouldReturnVariableBinding() { + VariableBinding variableBinding = mapper.toVariableBinding(OID); + + assertEquals(OID, variableBinding.getOid().toString()); + assertEquals(Null.instance, variableBinding.getVariable()); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/common/domain/DiscoveryWorkItemToDiscoveryDataMapperTest.java b/src/test/java/io/gec/raw/connector/snmp/common/domain/DiscoveryWorkItemToDiscoveryDataMapperTest.java new file mode 100755 index 0000000..cde9b56 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/common/domain/DiscoveryWorkItemToDiscoveryDataMapperTest.java @@ -0,0 +1,246 @@ +package io.gec.raw.connector.snmp.common.domain; + +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.protocol.control.ProtocolRepository; +import io.gec.raw.connector.protocol.domain.AuthenticationProtocolEnum; +import io.gec.raw.connector.protocol.domain.PrivacyAlgorithmEnum; +import io.gec.raw.connector.protocol.domain.SecurityLevelEnum; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.protocol.entity.Protocol; +import io.gec.raw.connector.snmp.common.control.DiscoveryDataToSnmpMapper; +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import jakarta.persistence.EntityNotFoundException; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.OctetString; +import org.snmp4j.smi.VariableBinding; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static io.gec.raw.connector.protocol.domain.DiscoveryPropertyNameEnum.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class DiscoveryWorkItemToDiscoveryDataMapperTest { + + @Mock + Logger logger; + @Mock + DiscoveryController discoveryController; + @Mock + DiscoveryDataToSnmpMapper discoveryDataToSnmpMapper; + @Mock + IPAddressHelper ipAddressHelper; + @Mock + ProtocolRepository protocolRepository; + @InjectMocks + DiscoveryWorkItemToDiscoveryDataMapper mapper; + + private static Stream shouldReturnSnmpVersion() { + return Stream.of( + of("SNMPv1", SnmpVersionEnum.SNMP_V1), + of("SNMPv2c", SnmpVersionEnum.SNMP_V2C), + of("SNMPv3", SnmpVersionEnum.SNMP_V3) + ); + } + + @Test + void shouldCreateSnmpMessageDataList() { + // given + Optional optionalStartIp = Optional.of("192.168.0.1"); + Optional optionalEndIp = Optional.of("192.168.0.5"); + when(discoveryController.getDiscoveryPropertyValue(eq(START_IP_ADDRESS), any(DiscoveryWorkItemDTO.class))) + .thenReturn(optionalStartIp); + when(discoveryController.getDiscoveryPropertyValue(eq(END_IP_ADDRESS), any(DiscoveryWorkItemDTO.class))) + .thenReturn(optionalEndIp); + when(discoveryController.getDiscoveryPropertyValue(eq(PORT), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("1")); + when(ipAddressHelper.getStartEndIpOctet(anyString(), anyString())).thenReturn(IntStream.range(1, 6) + .mapToObj(index -> String.format("192.168.0.%d", index)).toList()); + DiscoveryWorkItemDTO dwiDTO = DiscoveryWorkItemDTO.builder() + .protocolId(UUID.randomUUID()) + .build(); + when(discoveryDataToSnmpMapper.toVariableBindings(anyString())).thenReturn(List.of()); + when(protocolRepository.findByCommunicationServiceId(any(UUID.class))).thenReturn(Optional.of(Protocol.builder() + .name(SnmpVersionEnum.SNMP_V1.getName()) + .build())); + + // when + List result = mapper.toSnmpMessageDataList(dwiDTO, "1.2"); + + // then + assertNotNull(result); + assertFalse(result.isEmpty()); + assertEquals(5, result.size()); + } + + @Test + void shouldCreateSnmpGetMessageData() { + // given + SnmpGetJob snmpGetJob = SnmpGetJob.builder() + .ipAddress("192.168.0.1") + .oid("1.2") + .build(); + when(discoveryDataToSnmpMapper.toVariableBindings(anyString())).thenReturn(List.of(new VariableBinding(new OID("1.2"), new OctetString("variableValue")))); + when(protocolRepository.findByCommunicationServiceId(any(UUID.class))).thenReturn(Optional.of(Protocol.builder() + .name(SnmpVersionEnum.SNMP_V3.getName()) + .build())); + when(discoveryController.getDiscoveryPropertyValue(eq(PORT), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("1")); + when(discoveryController.getDiscoveryPropertyValue(eq(WRITE_COMMUNITY), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("writeCommunity")); + when(discoveryController.getDiscoveryPropertyValue(eq(READ_COMMUNITY), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("readCommunity")); + when(discoveryController.getDiscoveryPropertyValue(eq(SECURITY_NAME), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("securityName")); + when(discoveryController.getDiscoveryPropertyValue(eq(SECURITY_LEVEL), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of(SecurityLevelEnum.AUTHPRIV.getName())); + when(discoveryController.getDiscoveryPropertyValue(eq(AUTHENTICATION_PROTOCOL), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of(AuthenticationProtocolEnum.MD5.getName())); + when(discoveryController.getDiscoveryPropertyValue(eq(AUTHENTICATION_PASSPHRASE), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("authenticationPassphrase")); + when(discoveryController.getDiscoveryPropertyValue(eq(PRIVACY_ALGORITHM), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of(PrivacyAlgorithmEnum.DES.getName())); + when(discoveryController.getDiscoveryPropertyValue(eq(PRIVACY_PASSPHRASE), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("privacyPassphrase")); + when(discoveryController.getDiscoveryPropertyValue(eq(CONTEXT_NAME), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("Context Name")); + DiscoveryWorkItemDTO dwiDTO = DiscoveryWorkItemDTO.builder() + .protocolId(UUID.randomUUID()) + .build(); + + // when + SnmpMessageData result = mapper.toSnmpGetMessageData(snmpGetJob, dwiDTO); + + // then + assertNotNull(result); + assertEquals("192.168.0.1", result.getHostname()); + assertEquals(1, result.getVariableBindings().size()); + SnmpProtocolData snmpProtocolData = result.getSnmpProtocolData(); + assertEquals(SnmpVersionEnum.SNMP_V3, snmpProtocolData.getSnmpVersion()); + assertTrue(snmpProtocolData.getWriteCommunity().isPresent()); + assertTrue(snmpProtocolData.getReadCommunity().isPresent()); + assertTrue(snmpProtocolData.getSnmpV3Data().isPresent()); + SnmpV3Data snmpV3Data = snmpProtocolData.getSnmpV3Data().get(); + assertTrue(snmpV3Data.getAuthenticationPassphrase().isPresent()); + assertTrue(snmpV3Data.getAuthenticationProtocol().isPresent()); + assertTrue(snmpV3Data.getPrivacyPasssphrase().isPresent()); + assertTrue(snmpV3Data.getPrivacyAlgorithm().isPresent()); + assertTrue(snmpV3Data.getSecurityName().isPresent()); + assertTrue(snmpV3Data.getSecurityLevel().isPresent()); + assertTrue(snmpV3Data.getContextName().isPresent()); + assertEquals("writeCommunity", snmpProtocolData.getWriteCommunity().get()); + assertEquals("readCommunity", snmpProtocolData.getReadCommunity().get()); + assertEquals(1, snmpProtocolData.getPort()); + assertEquals("authenticationPassphrase", snmpV3Data.getAuthenticationPassphrase().get()); + assertEquals(AuthenticationProtocolEnum.MD5, snmpV3Data.getAuthenticationProtocol().get()); + assertEquals(PrivacyAlgorithmEnum.DES, snmpV3Data.getPrivacyAlgorithm().get()); + assertEquals("privacyPassphrase", snmpV3Data.getPrivacyPasssphrase().get()); + assertEquals(SecurityLevelEnum.AUTHPRIV, snmpV3Data.getSecurityLevel().get()); + assertEquals("securityName", snmpV3Data.getSecurityName().get()); + assertEquals("Context Name", snmpV3Data.getContextName().get()); + + } + + @Test + void shouldCreateSnmpSetMessageData() { + // given + var datatype = DataTypeEnum.STRING; + var value = "value"; + var setWorkItemData = TestDTOFactory.buildSetWorkItemData(value, datatype); + + when(discoveryDataToSnmpMapper.toVariableBindings(anyString(), anyString(), any(DataTypeEnum.class))).thenReturn( + List.of(new VariableBinding(new OID("1.2"), new OctetString("variableValue")))); + when(protocolRepository.findByCommunicationServiceId(any(UUID.class))).thenReturn(Optional.of(Protocol.builder() + .name(SnmpVersionEnum.SNMP_V2C.getName()) + .build())); + when(discoveryController.getDiscoveryPropertyValue(eq(PORT), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("1")); + when(discoveryController.getDiscoveryPropertyValue(eq(WRITE_COMMUNITY), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("writeCommunity")); + when(discoveryController.getDiscoveryPropertyValue(eq(READ_COMMUNITY), any(DiscoveryWorkItemDTO.class))) + .thenReturn(Optional.of("readCommunity")); + DiscoveryWorkItemDTO dwiDTO = DiscoveryWorkItemDTO.builder() + .protocolId(UUID.randomUUID()) + .build(); + + // when + SnmpMessageData result = mapper.toSnmpSetMessageData(setWorkItemData); + + // then + assertNotNull(result); + assertEquals("192.168.10.199", result.getHostname()); + assertEquals(1, result.getVariableBindings().size()); + SnmpProtocolData snmpProtocolData = result.getSnmpProtocolData(); + assertEquals(SnmpVersionEnum.SNMP_V2C, snmpProtocolData.getSnmpVersion()); + assertTrue(snmpProtocolData.getWriteCommunity().isPresent()); + assertTrue(snmpProtocolData.getReadCommunity().isPresent()); + assertTrue(snmpProtocolData.getSnmpV3Data().isEmpty()); + assertEquals("writeCommunity", snmpProtocolData.getWriteCommunity().get()); + assertEquals("readCommunity", snmpProtocolData.getReadCommunity().get()); + assertEquals(1, snmpProtocolData.getPort()); + } + + @Test + void shouldThrowExceptionWhenSnmpVersionNotSupported() { + // when & then + assertThrows(IllegalArgumentException.class, () -> mapper.toSnmpVersionEnum("unsupported")); + } + + @MethodSource + @ParameterizedTest + void shouldReturnSnmpVersion(String snmpVersion, SnmpVersionEnum expected) { + // when + SnmpVersionEnum result = mapper.toSnmpVersionEnum(snmpVersion); + + // then + assertEquals(expected, result); + } + + @Test + void shouldThrowWhenProtocolNotFound() { + // given + when(protocolRepository.findByCommunicationServiceId(any(UUID.class))).thenReturn(Optional.empty()); + DiscoveryWorkItemDTO dwiDTO = DiscoveryWorkItemDTO.builder() + .protocolId(UUID.randomUUID()) + .build(); + + // when & then + assertThrows(EntityNotFoundException.class, () -> mapper.toSnmpProtocolData(dwiDTO)); + } + + @Test + void shouldThrowWhenPortNotSet() { + // given + DiscoveryWorkItemDTO dwiDTO = DiscoveryWorkItemDTO.builder() + .protocolId(UUID.randomUUID()) + .build(); + when(protocolRepository.findByCommunicationServiceId(any(UUID.class))).thenReturn(Optional.of(Protocol.builder() + .name(SnmpVersionEnum.SNMP_V1.getName()) + .build())); + when(discoveryController.getDiscoveryPropertyValue(eq(PORT), any(DiscoveryWorkItemDTO.class))).thenReturn(Optional.empty()); + + // when & then + assertThrows(NoSuchElementException.class, () -> mapper.toSnmpProtocolData(dwiDTO)); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/traps/control/PropertyTrapProcessorTest.java b/src/test/java/io/gec/raw/connector/snmp/traps/control/PropertyTrapProcessorTest.java new file mode 100755 index 0000000..16933df --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/traps/control/PropertyTrapProcessorTest.java @@ -0,0 +1,58 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.snmp.traps.domain.PropertyTrapContent; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.smi.Address; + +import java.util.Optional; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class PropertyTrapProcessorTest { + + @Mock + private Logger logger; + + @Mock + private TrapContentHandler trapContentHandler; + + @Mock + private TrapContentMapper trapContentMapper; + + @InjectMocks + private PropertyTrapProcessor propertyTrapProcessor; + + @Test + void testProcessPropertyTrapWithValidContent() { + //given + CommandResponderEvent
event = mock(CommandResponderEvent.class); + PropertyTrapContent propertyTrapContent = mock(PropertyTrapContent.class); + when(trapContentMapper.toTrapContentWithProperty(event)).thenReturn(Optional.of(propertyTrapContent)); + + //when + propertyTrapProcessor.processPropertyTrap(event); + + //then + verify(trapContentHandler, times(1)).updatePropertyStatus(propertyTrapContent); + } + + @Test + void testProcessPropertyTrapWithEmptyContent() { + // given + CommandResponderEvent
event = mock(CommandResponderEvent.class); + when(trapContentMapper.toTrapContentWithProperty(event)).thenReturn(Optional.empty()); + + //when + propertyTrapProcessor.processPropertyTrap(event); + + //then + verify(trapContentHandler, never()).updatePropertyStatus(any()); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/traps/control/TrapReceiverTest.java b/src/test/java/io/gec/raw/connector/snmp/traps/control/TrapReceiverTest.java new file mode 100755 index 0000000..41a5762 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/traps/control/TrapReceiverTest.java @@ -0,0 +1,93 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.snmp.common.control.SnmpProvider; +import io.quarkus.runtime.ShutdownEvent; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.PDU; +import org.snmp4j.PDUv1; +import org.snmp4j.smi.Integer32; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.UdpAddress; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class TrapReceiverTest { + + @Mock + CommandResponderEvent event; + @Mock + SnmpProvider snmpProvider; + @Mock + Logger logger; + @InjectMocks + TrapReceiver trapReceiver; + + private static Stream shouldCallWarnWhenPDUTypeNotSupported() { + PDUv1 pduV1 = mock(PDUv1.class); + when(pduV1.getSpecificTrap()).thenReturn(1); + when(pduV1.getEnterprise()).thenReturn(new OID()); + + PDU pduV2 = mock(PDU.class); + when(pduV2.getVariable(RittalMibVariable.SNMP_TRAP_OID.getOid())).thenReturn(new OID()); + + return Stream.of( + of(PDU.noError, PDU.V1TRAP, pduV1, 0), + of(PDU.noError, PDU.TRAP, pduV2, 0), + of(PDU.noError, PDU.INFORM, pduV2, 1) + ); + } + + @Test + void shouldCallWarnWhenPDUError() { + // given + PDUv1 pdu = mock(PDUv1.class); + when(event.getPDU()).thenReturn(pdu); + when(pdu.getErrorStatus()).thenReturn(PDU.tooBig); + when(pdu.getErrorStatusText()).thenReturn("empty"); + + // when + assertDoesNotThrow(() -> trapReceiver.processPdu(event)); + + // then + verify(logger, times(1)).warnv(anyString(), anyString()); + } + + @ParameterizedTest + @MethodSource + void shouldCallWarnWhenPDUTypeNotSupported(int errorStatus, int type, PDU pdu, int expectedWarnCount) { + // given + when(event.getPDU()).thenReturn(pdu); + when(pdu.getErrorStatus()).thenReturn(errorStatus); + when(pdu.getType()).thenReturn(type); + when(pdu.toString()).thenReturn("empty"); + when(pdu.getErrorStatusText()).thenReturn("empty"); + when(pdu.getRequestID()).thenReturn(new Integer32(1)); + + // when + assertDoesNotThrow(() -> trapReceiver.processPdu(event)); + + // then + verify(logger, times(expectedWarnCount)).warnv(any(), anyInt()); + } + + @Test + void shouldDestroyNotThrowExceptionWhenSnmpNotInitialized() { + assertDoesNotThrow(() -> trapReceiver.destroy(new ShutdownEvent())); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableBindingParserTest.java b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableBindingParserTest.java new file mode 100755 index 0000000..f7d78d9 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableBindingParserTest.java @@ -0,0 +1,91 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.snmp4j.smi.Integer32; +import org.snmp4j.smi.OctetString; +import org.snmp4j.smi.VariableBinding; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import static io.gec.raw.connector.rittal.domain.RittalMibVariable.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.of; + +class VariableBindingParserTest { + + private static final String CMCIII_HUM = "CMCIII-HUM"; + private static final int DEVICE_INDEX = 3; + private static final int MESSAGE_STATUS = 7; + + VariableBindingParser variableBindingParser = new VariableBindingParser(); + + private static Stream shouldReturnVariableStringValue() { + return Stream.of( + of(CMC_III_DEV_NAME, CMCIII_HUM), + of(CMC_III_MSG_STATUS, String.valueOf(MESSAGE_STATUS)) + ); + } + + private static Stream shouldReturnVariableIntValue() { + return Stream.of( + of(CMC_III_MSG_STATUS, MESSAGE_STATUS) + ); + } + + @Test + void shouldReturnDeviceIndex() { + // given + List variableBindings = prepareVariableBindings(); + + // when + Optional deviceIndexFromMibVariable = variableBindingParser.getLastOidFromVariableBinding(variableBindings, CMC_III_DEV_NAME); + + // then + assertTrue(deviceIndexFromMibVariable.isPresent()); + assertEquals(DEVICE_INDEX, deviceIndexFromMibVariable.get()); + } + + @ParameterizedTest + @MethodSource + void shouldReturnVariableStringValue(RittalMibVariable mibVariable, String expected) { + // given + List variableBindings = prepareVariableBindings(); + + // when + Optional variableStringValue = variableBindingParser.getVariableStringValue(variableBindings, mibVariable); + + // then + assertTrue(variableStringValue.isPresent()); + assertEquals(expected, variableStringValue.get()); + } + + @ParameterizedTest + @MethodSource + void shouldReturnVariableIntValue(RittalMibVariable mibVariable, int expected) { + // given + List variableBindings = prepareVariableBindings(); + + // when + Optional variableIntValue = variableBindingParser.getVariableIntValue(variableBindings, mibVariable); + + // then + assertTrue(variableIntValue.isPresent()); + assertEquals(expected, variableIntValue.get()); + } + + private List prepareVariableBindings() { + return List.of( + new VariableBinding(CMC_III_DEV_NAME.getOid().append(DEVICE_INDEX), + new OctetString(CMCIII_HUM)), + new VariableBinding(CMC_III_MSG_STATUS.getOid().append(DEVICE_INDEX).append(2), + new Integer32(MESSAGE_STATUS)) + ); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableStatusValueCacheTest.java b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableStatusValueCacheTest.java new file mode 100755 index 0000000..984104a --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableStatusValueCacheTest.java @@ -0,0 +1,73 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapContent; +import io.quarkus.cache.CaffeineCache; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class VariableStatusValueCacheTest { + + @Mock + CaffeineCache cache; + @InjectMocks + VariableStatusValueCache variableStatusValueCache; + + @Test + void shouldGetLastStatusValueReturnEmptyResult() { + // given + doReturn(cache).when(cache).as(any()); + when(cache.getIfPresent(any())).thenReturn(CompletableFuture.completedFuture(null)); + VariableTrapContent trapContent = VariableTrapContent.builder().build(); + + // when + Optional result = variableStatusValueCache.getLastStatusValue(trapContent); + + // then + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @Test + void shouldGetLastStatusValueReturnStatusValueProvidedBefore() { + // given + VariableTrapContent trapContent = VariableTrapContent.builder() + .statusValue(ValuesSnmpVarStatus.SERVICE) + .build(); + Map map = new HashMap<>(Map.of(trapContent, trapContent.getStatusValue())); + doReturn(cache).when(cache).as(any()); + doAnswer(invocationOnMock -> { + VariableTrapContent key = invocationOnMock.getArgument(0); + return CompletableFuture.completedFuture(map.get(key)); + }).when(cache).getIfPresent(any()); + doAnswer(invocationOnMock -> { + VariableTrapContent key = invocationOnMock.getArgument(0); + CompletableFuture completableFuture = invocationOnMock.getArgument(1); + ValuesSnmpVarStatus value = completableFuture.get(); + map.put(key, value); + return null; + }).when(cache).put(any(), any()); + + // when + variableStatusValueCache.getLastStatusValue(trapContent); + Optional result = variableStatusValueCache.getLastStatusValue(trapContent); + + // then + assertNotNull(result); + assertTrue(result.isPresent()); + assertEquals(ValuesSnmpVarStatus.SERVICE, result.get()); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapContentContentHandlerTest.java b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapContentContentHandlerTest.java new file mode 100755 index 0000000..b0e79a4 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapContentContentHandlerTest.java @@ -0,0 +1,116 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapData; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.control.VariableHandler; +import io.gec.raw.connector.variable.control.VariableMapper; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class VariableTrapContentContentHandlerTest { + + @Mock + VariableController variableController; + @Mock + IPAddressHelper ipAddressHelper; + @Mock + VariableHandler variableHandler; + @Mock + VariableMapper variableMapper; + @Mock + DeviceController deviceController; + @Mock + Logger logger; + @InjectMocks + TrapContentHandler trapContentHandler; + + @Test + void shouldHandleFirstVariableWhenOnlyOneVariableFound() { + // given + VariableTrapData tempObject = VariableTrapData.builder() + .statusValue(ValuesSnmpVarStatus.OFF) + .build(); + + Variable variable = new Variable(); + when(variableController.findByValueAsIntOid(any())).thenReturn(Collections.singletonList(variable)); + when(variableMapper.toVariableValueData(any(), any())).thenReturn(null); + + // when + trapContentHandler.updateVariableStatus(tempObject); + + // then + verify(variableHandler).handleVariableValueFetchedFromDevice(eq(variable), any()); + } + + @Test + void shouldHandleMultipleVariablesWhenMatchingDeviceFound() { + // given + VariableTrapData tempObject = VariableTrapData.builder() + .statusValue(ValuesSnmpVarStatus.OFF) + .ipAddress("192.168.0.1") + .build(); + + Variable variable1 = new Variable(); + variable1.setDeviceId(UUID.randomUUID()); + Variable variable2 = new Variable(); + variable2.setDeviceId(UUID.randomUUID()); + + Device device1 = new Device(); + Device rootDevice1 = new Device(); + rootDevice1.setDeviceURL("http://192.168.0.1"); + when(variableController.findByValueAsIntOid(any())).thenReturn(List.of(variable1, variable2)); + when(deviceController.getDeviceById(variable1.getDeviceId())).thenReturn(device1); + when(deviceController.getRootDevice(device1)).thenReturn(rootDevice1); + when(ipAddressHelper.removeHttpFromIpAddress(any())).thenReturn("192.168.0.1"); + when(variableMapper.toVariableValueData(any(), any())).thenReturn(null); + + // when + trapContentHandler.updateVariableStatus(tempObject); + + // then + verify(variableHandler).handleVariableValueFetchedFromDevice(eq(variable1), any()); + } + + @Test + void shouldNotHandleVariableWhenNoMatchingDeviceFound() { + // given + VariableTrapData tempObject = VariableTrapData.builder() + .statusValue(ValuesSnmpVarStatus.OFF) + .build(); + + Variable variable1 = new Variable(); + variable1.setDeviceId(UUID.randomUUID()); + + Device device1 = new Device(); + Device rootDevice1 = new Device(); + rootDevice1.setDeviceURL("http://192.168.0.2"); + when(variableController.findByValueAsIntOid(any())).thenReturn(List.of(variable1, variable1)); + when(deviceController.getDeviceById(variable1.getDeviceId())).thenReturn(device1); + when(deviceController.getRootDevice(device1)).thenReturn(rootDevice1); + when(ipAddressHelper.removeHttpFromIpAddress(any())).thenReturn("192.168.0.2"); + + // when + trapContentHandler.updateVariableStatus(tempObject); + + // then + verify(variableHandler, never()).handleVariableValueFetchedFromDevice(any(), any()); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapContentMapperTest.java b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapContentMapperTest.java new file mode 100755 index 0000000..99a7d40 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapContentMapperTest.java @@ -0,0 +1,119 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import io.gec.raw.connector.snmp.common.control.SnmpHelper; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapContent; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapData; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.PDU; +import org.snmp4j.smi.UdpAddress; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class VariableTrapContentMapperTest { + + private final static String ROOT_DEVICE_IP = "0.0.0.0"; + + @Mock + CommandResponderEvent event; + @Mock + PDU pdu; + @Mock + VariableBindingParser variableBindingParser; + @Mock + SnmpHelper snmpHelper; + @InjectMocks + TrapContentMapper trapContentMapper; + + @Test + void shouldCreateValidTrapContentForVariable() { + // given + when(event.getPDU()).thenReturn(pdu); + when(variableBindingParser.getLastOidFromVariableBinding(anyList(), same(RittalMibVariable.CMC_III_DEV_NAME))) + .thenReturn(Optional.of(3)); + when(variableBindingParser.getLastOidFromVariableBinding(anyList(), same(RittalMibVariable.CMC_III_MSG_TEXT))) + .thenReturn(Optional.of(3)); + when(variableBindingParser.getVariableStringValue(anyList(), same(RittalMibVariable.CMC_III_MSG_TEXT))) + .thenReturn(Optional.of("Humidity")); + when(variableBindingParser.getVariableIntValue(anyList(), same(RittalMibVariable.CMC_III_MSG_STATUS))) + .thenReturn(Optional.of(7)); + when(variableBindingParser.getVariableStringValue(anyList(), same(RittalMibVariable.CMC_III_MSG_STATUS_TEXT))) + .thenReturn(Optional.of("Humidity test")); + when(snmpHelper.getIpAddress(any())) + .thenReturn(Optional.of(ROOT_DEVICE_IP)); + + // when + Optional trapContent = trapContentMapper.toTrapContentWithVariable(event); + + // then + assertFalse(trapContent.isEmpty()); + } + + @Test + void shouldCreateInvalidTrapContentForVariable() { + // when + when(event.getPDU()).thenReturn(pdu); + Optional trapContent = trapContentMapper.toTrapContentWithVariable(event); + + // then + assertTrue(trapContent.isEmpty()); + } + + @Test + void shouldReturnEmptyWhenDeviceIndexIsMissing() { + // given + when(event.getPDU()).thenReturn(pdu); + when(variableBindingParser.getLastOidFromVariableBinding(anyList(), same(RittalMibVariable.CMC_III_DEV_NAME))) + .thenReturn(Optional.empty()); + when(variableBindingParser.getLastOidFromVariableBinding(anyList(), same(RittalMibVariable.CMC_III_MSG_TEXT))) + .thenReturn(Optional.of(3)); + when(variableBindingParser.getVariableStringValue(anyList(), same(RittalMibVariable.CMC_III_MSG_TEXT))) + .thenReturn(Optional.of("Temperature")); + when(variableBindingParser.getVariableIntValue(anyList(), same(RittalMibVariable.CMC_III_MSG_STATUS))) + .thenReturn(Optional.of(1)); + when(variableBindingParser.getVariableStringValue(anyList(), same(RittalMibVariable.CMC_III_MSG_STATUS_TEXT))) + .thenReturn(Optional.of("Status text")); + when(snmpHelper.getIpAddress(any())).thenReturn(Optional.of(ROOT_DEVICE_IP)); + + // when + Optional trapContent = trapContentMapper.toTrapContentWithVariable(event); + + // then + assertTrue(trapContent.isEmpty()); + } + + @Test + void shouldMapTrapContentToVariableDataCorrectly() { + // given + String ipAddress = "192.168.1.1"; + VariableTrapContent variableTrapContent = VariableTrapContent.builder() + .ipAddress(ipAddress) + .deviceIndex(3) + .variableIndex(5) + .variableName("Temperature") + .statusValue(ValuesSnmpVarStatus.OK) + .statusText("All good") + .build(); + + // when + VariableTrapData variableTrapData = trapContentMapper.toVariableData(ipAddress, variableTrapContent, "5"); + + // then + assertEquals(ipAddress, variableTrapData.getIpAddress()); + assertEquals(".1.3.6.1.4.1.2606.7.4.2.2.1.11.3.5", variableTrapData.getValueAsIntOid()); + assertEquals(ValuesSnmpVarStatus.OK, variableTrapData.getStatusValue()); + } + + +} diff --git a/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapProcessorTest.java b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapProcessorTest.java new file mode 100755 index 0000000..3120dbd --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/traps/control/VariableTrapProcessorTest.java @@ -0,0 +1,148 @@ +package io.gec.raw.connector.snmp.traps.control; + +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapContent; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapData; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.smi.Address; + +import java.util.Optional; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class VariableTrapProcessorTest { + + @Mock + private Logger logger; + + @Mock + private SnmpService snmpService; + + @Mock + private DiscoveryController discoveryController; + + @Mock + private DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + + @Mock + private TrapContentHandler trapContentHandler; + + @Mock + private TrapContentMapper trapContentMapper; + + @Mock + private DeviceController deviceController; + + @Mock + VariableStatusValueCache variableStatusValueCache; + + @InjectMocks + private VariableTrapProcessor variableTrapProcessor; + + @Test + void testProcessVariableTrapWithValidContent() { + //given + CommandResponderEvent
event = mock(CommandResponderEvent.class); + + VariableTrapContent variableTrapContent = mock(VariableTrapContent.class); + when(variableTrapContent.getIpAddress()).thenReturn("127.0.0.1"); + + when(trapContentMapper.toTrapContentWithVariable(event)).thenReturn(Optional.of(variableTrapContent)); + when(deviceController.findDeviceIdByDeviceUrl("127.0.0.1")).thenReturn(Optional.of(UUID.randomUUID())); + + DiscoveryWorkItemDTO dwiDTO = mock(DiscoveryWorkItemDTO.class); + when(discoveryController.getDiscoveryWorkItemByDeviceId(any(UUID.class))).thenReturn(dwiDTO); + + SnmpMessageData snmpMessageData = mock(SnmpMessageData.class); + when(discoveryWorkItemToDiscoveryDataMapper.toSnmpMessageData(anyString(), any(), anyString())).thenReturn(snmpMessageData); + + when(snmpService.snmpGet(snmpMessageData)).thenReturn(Optional.of("123")); + + VariableTrapData variableTrapData = mock(VariableTrapData.class); + when(trapContentMapper.toVariableData(anyString(), any(), anyString())).thenReturn(variableTrapData); + + //when + variableTrapProcessor.processVariableTrap(event); + + //then + verify(trapContentHandler, times(1)).updateVariableStatus(variableTrapData); + } + + @Test + void testProcessVariableTrapWithEmptyContent() { + //given + CommandResponderEvent
event = mock(CommandResponderEvent.class); + when(trapContentMapper.toTrapContentWithVariable(event)).thenReturn(Optional.empty()); + + //when + variableTrapProcessor.processVariableTrap(event); + + //then + verify(trapContentHandler, never()).updateVariableStatus(any()); + } + + @Test + void testProcessVariableTrapWithNoRootDeviceId() { + //given + CommandResponderEvent
event = mock(CommandResponderEvent.class); + VariableTrapContent variableTrapContent = mock(VariableTrapContent.class); + when(variableTrapContent.getIpAddress()).thenReturn("127.0.0.1"); + + when(trapContentMapper.toTrapContentWithVariable(event)).thenReturn(Optional.of(variableTrapContent)); + when(deviceController.findDeviceIdByDeviceUrl("127.0.0.1")).thenReturn(Optional.empty()); + + //when + variableTrapProcessor.processVariableTrap(event); + + //then + verify(trapContentHandler, never()).updateVariableStatus(any()); + } + + @Test + void testProcessVariableTrapWithNoDiscoveryWorkItem() { + //given + CommandResponderEvent
event = mock(CommandResponderEvent.class); + VariableTrapContent variableTrapContent = mock(VariableTrapContent.class); + when(variableTrapContent.getIpAddress()).thenReturn("127.0.0.1"); + + when(trapContentMapper.toTrapContentWithVariable(event)).thenReturn(Optional.of(variableTrapContent)); + when(deviceController.findDeviceIdByDeviceUrl("127.0.0.1")).thenReturn(Optional.of(UUID.randomUUID())); + when(discoveryController.getDiscoveryWorkItemByDeviceId(any(UUID.class))).thenReturn(null); + + //when + variableTrapProcessor.processVariableTrap(event); + + //then + verify(trapContentHandler, never()).updateVariableStatus(any()); + } + + @Test + void testHandleSnmpResponseWithValidData() { + //given + VariableTrapContent variableTrapContent = mock(VariableTrapContent.class); + String ipAddress = "127.0.0.1"; + String varIdx = "123"; + VariableTrapData variableTrapData = mock(VariableTrapData.class); + when(trapContentMapper.toVariableData(ipAddress, variableTrapContent, varIdx)).thenReturn(variableTrapData); + + //when + variableTrapProcessor.handleSnmpResponse(variableTrapContent, ipAddress, varIdx); + + //then + verify(trapContentHandler, times(1)).updateVariableStatus(variableTrapData); + } +} diff --git a/src/test/java/io/gec/raw/connector/snmp/vardyntable/control/VariableDynamicTableServiceTest.java b/src/test/java/io/gec/raw/connector/snmp/vardyntable/control/VariableDynamicTableServiceTest.java new file mode 100755 index 0000000..e05962b --- /dev/null +++ b/src/test/java/io/gec/raw/connector/snmp/vardyntable/control/VariableDynamicTableServiceTest.java @@ -0,0 +1,279 @@ +package io.gec.raw.connector.snmp.vardyntable.control; + +import io.gec.raw.connector.config.entity.SnmpConfig; +import io.gec.raw.connector.device.control.DeviceRepository; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.projection.DeviceParentIdProjection; +import io.gec.raw.connector.device.projection.DeviceURLProjection; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.snmp.common.control.SnmpService; +import io.gec.raw.connector.snmp.common.control.SnmpWalk; +import io.gec.raw.connector.snmp.common.control.DiscoveryDataToSnmpMapper; +import io.gec.raw.connector.snmp.common.control.DiscoveryWorkItemToDiscoveryDataMapper; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; +import io.gec.raw.connector.rittal.domain.RittalMibVariable; +import io.gec.raw.connector.snmp.vardyntable.domain.VariableDynamicTableRequestHolder; +import io.gec.raw.connector.snmp.vardyntable.domain.VariableTypeEnum; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.utils.control.IPAddressHelper; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.control.VariableHandler; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Answers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.snmp4j.smi.OID; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ScheduledExecutorService; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class VariableDynamicTableServiceTest { + + @Mock + Logger logger; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + SnmpConfig snmpConfig; + @Mock + SnmpService snmpService; + @Mock + SnmpWalk snmpWalk; + @Mock + ScheduledExecutorService executorService; + @Mock + DeviceRepository deviceRepository; + @Mock + VariableController variableController; + @Mock + DiscoveryDataToSnmpMapper discoveryDataToSnmpMapper; + @Mock + DiscoveryWorkItemToDiscoveryDataMapper discoveryWorkItemToDiscoveryDataMapper; + @Mock + DiscoveryController discoveryController; + @Mock + IPAddressHelper ipAddressHelper; + @Mock + VariableHandler variableHandler; + @InjectMocks + VariableDynamicTableService variableDynamicTableService; + + private static Stream shouldToVariableMapsByTypeReturnEmptyLists() { + return Stream.of( + of(null, null), + of(DataTypeEnum.INTEGER, null), + of(DataTypeEnum.STRING, null), + of(DataTypeEnum.INTEGER, "1.3.6.1.4.1.2607") + ); + } + + @Test + void shouldProcessVariablesDoNotCreateRequestHolders() { + // when + variableDynamicTableService.processVariables(List.of()); + + // then + List variableDynamicTableRequestHolders = variableDynamicTableService.getVariableDynamicTableRequestHolders(); + assertEquals(0, variableDynamicTableRequestHolders.size()); + } + + @Test + void shouldProcessVariablesCreateExpectedNumberOfRequestHolders() { + // given + UUID firstDeviceID = UUID.randomUUID(); + UUID intVariableId = UUID.randomUUID(); + UUID secondDeviceID = UUID.randomUUID(); + UUID stringVariableId = UUID.randomUUID(); + //and + Variable intVariable = new Variable(); + intVariable.setId(intVariableId); + intVariable.setDeviceId(firstDeviceID); + intVariable.setVarDataType(DataTypeEnum.INTEGER); + intVariable.setValueAsIntegerOid(".1.3.6.1.4.1.2606.7.4.2.2.1.11.2.28"); + intVariable.setMode(ComponentMode.OPERATION); + intVariable.setSubscriptionInterval(10); + //and + SnmpMessageData snmpMessageData = SnmpMessageData.builder() + .hostname("") + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .build(); + //and + Variable stringVariable = new Variable(); + stringVariable.setId(stringVariableId); + stringVariable.setDeviceId(secondDeviceID); + stringVariable.setVarDataType(DataTypeEnum.STRING); + stringVariable.setValueAsStringOid(".1.3.6.1.4.1.2606.7.4.2.2.1.10.2.22"); + stringVariable.setMode(ComponentMode.OPERATION); + stringVariable.setSubscriptionInterval(10); + //and + List subscribedVariables = List.of(intVariable, stringVariable); + //and + when(variableController.filterByVendorOid(subscribedVariables, RittalMibVariable.RITTAL)).thenReturn(subscribedVariables); + when(deviceRepository.findDeviceURLProjection(any(UUID.class))).thenReturn(Optional.of(new DeviceURLProjection("1.1.1.1"))); + when(deviceRepository.findDeviceParentIdProjection(any(UUID.class))) + .thenAnswer(i -> Optional.of(new DeviceParentIdProjection(i.getArgument(0), null))); + when(discoveryWorkItemToDiscoveryDataMapper.toSnmpMessageData(any(), any())).thenReturn(snmpMessageData); + when(snmpConfig.getDynamicTableDefaultPoolingInterval()).thenReturn(10); + + // when + variableDynamicTableService.processVariables(subscribedVariables); + + // then + List variableDynamicTableRequestHolders = variableDynamicTableService.getVariableDynamicTableRequestHolders(); + assertEquals(2, variableDynamicTableRequestHolders.size()); + Optional optionalIntDynamicTableVariableRequestHolder = variableDynamicTableRequestHolders.stream() + .filter(requestHolder -> !requestHolder.getIntVariableUUIDbyOidSuffixes().isEmpty()) + .filter(requestHolder -> requestHolder.getRootDeviceId().equals(firstDeviceID)) + .findFirst(); + assertTrue(optionalIntDynamicTableVariableRequestHolder.isPresent()); + VariableDynamicTableRequestHolder intDynamicTableVariableRequestHolder = optionalIntDynamicTableVariableRequestHolder.get(); + Map intVariableUUIDbyOidSuffixes = intDynamicTableVariableRequestHolder.getIntVariableUUIDbyOidSuffixes(); + assertEquals(1, intVariableUUIDbyOidSuffixes.size()); + UUID intVariableUUID = intVariableUUIDbyOidSuffixes.get(new OID("2.28")); + assertEquals(intVariableId, intVariableUUID); + Optional optionalStringDynamicTableVariableRequestHolder = variableDynamicTableRequestHolders.stream() + .filter(requestHolder -> !requestHolder.getStringVariableUUIDbyOidSuffixes().isEmpty()) + .filter(requestHolder -> requestHolder.getRootDeviceId().equals(secondDeviceID)) + .findFirst(); + assertTrue(optionalStringDynamicTableVariableRequestHolder.isPresent()); + VariableDynamicTableRequestHolder stringDynamicTableVariableRequestHolder = optionalStringDynamicTableVariableRequestHolder.get(); + Map stringVariableUUIDbyOidSuffixes = stringDynamicTableVariableRequestHolder.getStringVariableUUIDbyOidSuffixes(); + assertEquals(1, stringVariableUUIDbyOidSuffixes.size()); + UUID stringVariableUUID = stringVariableUUIDbyOidSuffixes.get(new OID("2.22")); + assertEquals(stringVariableId, stringVariableUUID); + } + + @Test + void shouldProcessVariables() { + //given + var subscribedVariable = TestEntityFactory.createVariableWithoutConstraints(); + subscribedVariable.setMode(ComponentMode.OPERATION); + var unsubscribedVariable = TestEntityFactory.createVariableWithoutConstraints(); + unsubscribedVariable.setMode(ComponentMode.PAUSE); + var updatedVariables = List.of(subscribedVariable, unsubscribedVariable); + //and + when(variableController.filterByVendorOid(updatedVariables, RittalMibVariable.RITTAL)).thenReturn(updatedVariables); + when(deviceRepository.findDeviceParentIdProjection(any())).thenReturn(Optional.empty()); + + //when + variableDynamicTableService.processVariables(updatedVariables); + + //then + verify(deviceRepository, times(2)).findDeviceParentIdProjection(any()); + } + + @Test + void shouldProcessVariableUpdateDynamicTableVariableRequestHolders() { + // given + UUID firstDeviceID = UUID.randomUUID(); + UUID secondDeviceID = UUID.randomUUID(); + UUID stringVariableId = UUID.randomUUID(); + UUID newStringVariableId = UUID.randomUUID(); + UUID intVariableId = UUID.randomUUID(); + //and + //INFO: object created without TestEntityFactory because explicit set of required variables is prepared in this test + Variable intVariable = Variable.builder() + .id(intVariableId) + .deviceId(firstDeviceID) + .varDataType(DataTypeEnum.INTEGER) + .valueAsIntegerOid(".1.3.6.1.4.1.2606.7.4.2.2.1.11.2.28") + .mode(ComponentMode.OPERATION) + .subscriptionInterval(10) + .build(); + //and + //INFO: object created without TestEntityFactory because explicit set of required variables is prepared in this test + Variable stringVariable = Variable.builder() + .id(stringVariableId) + .deviceId(secondDeviceID) + .varDataType(DataTypeEnum.STRING) + .valueAsStringOid(".1.3.6.1.4.1.2606.7.4.2.2.1.10.2.22") + .mode(ComponentMode.OPERATION) + .subscriptionInterval(10) + .build(); + //and + var subscribedVariables = List.of(intVariable, stringVariable); + //and + when(variableController.filterByVendorOid(subscribedVariables, RittalMibVariable.RITTAL)).thenReturn(subscribedVariables); + when(deviceRepository.findDeviceURLProjection(any(UUID.class))).thenReturn(Optional.of(new DeviceURLProjection("1.1.1.1"))); + when(deviceRepository.findDeviceParentIdProjection(any(UUID.class))) + .thenAnswer(i -> Optional.of(new DeviceParentIdProjection(i.getArgument(0), null))); + when(discoveryWorkItemToDiscoveryDataMapper.toSnmpMessageData(any(), any())).thenReturn(SnmpMessageData.builder() + .hostname("") + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .build()); + when(snmpConfig.getDynamicTableDefaultPoolingInterval()).thenReturn(10); + //and + variableDynamicTableService.processVariables(subscribedVariables); + //INFO: object created without TestEntityFactory because explicit set of required variables is prepared in this test + Variable newStringVariable = Variable.builder() + .id(newStringVariableId) + .deviceId(firstDeviceID) + .varDataType(DataTypeEnum.STRING) + .valueAsStringOid(".1.3.6.1.4.1.2606.7.4.2.2.1.10.2.29") + .mode(ComponentMode.OPERATION) + .subscriptionInterval(10) + .build(); + stringVariable.setMode(ComponentMode.PAUSE); + var updatedVariables = List.of(newStringVariable, stringVariable); + when(variableController.filterByVendorOid(updatedVariables, RittalMibVariable.RITTAL)).thenReturn(updatedVariables); + // when + variableDynamicTableService.processVariables(updatedVariables); + // then + List variableDynamicTableRequestHolders = variableDynamicTableService.getVariableDynamicTableRequestHolders(); + assertEquals(1, variableDynamicTableRequestHolders.size()); + Optional optionalDynamicTableVariableRequestHolder = variableDynamicTableRequestHolders.stream() + .findFirst(); + assertTrue(optionalDynamicTableVariableRequestHolder.isPresent()); + VariableDynamicTableRequestHolder dynamicTableVariableRequestHolder = optionalDynamicTableVariableRequestHolder.get(); + Map intVariableUUIDbyOidSuffixes = dynamicTableVariableRequestHolder.getIntVariableUUIDbyOidSuffixes(); + assertEquals(1, intVariableUUIDbyOidSuffixes.size()); + UUID intVariableUUID = intVariableUUIDbyOidSuffixes.get(new OID("2.28")); + assertEquals(intVariableId, intVariableUUID); + Map stringVariableUUIDbyOidSuffixes = dynamicTableVariableRequestHolder.getStringVariableUUIDbyOidSuffixes(); + assertEquals(1, stringVariableUUIDbyOidSuffixes.size()); + UUID stringVariableUUID = stringVariableUUIDbyOidSuffixes.get(new OID("2.29")); + assertEquals(newStringVariableId, stringVariableUUID); + } + + @ParameterizedTest + @MethodSource + void shouldToVariableMapsByTypeReturnEmptyLists(DataTypeEnum varDataType, String valueAsIntegerOid) { + // given + Variable variable = Variable.builder() + .varDataType(varDataType) + .valueAsIntegerOid(valueAsIntegerOid) + .build(); + List variables = List.of(variable); + + // when + Map> variableMapsByType = variableDynamicTableService.toVariableMapsByType(variables); + + // then + assertEquals(0, variableMapsByType.get(VariableTypeEnum.INTEGER).size()); + assertEquals(0, variableMapsByType.get(VariableTypeEnum.STRING).size()); + } +} diff --git a/src/test/java/io/gec/raw/connector/statistic/control/StatisticCollectorControllerTest.java b/src/test/java/io/gec/raw/connector/statistic/control/StatisticCollectorControllerTest.java new file mode 100755 index 0000000..67ade05 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/statistic/control/StatisticCollectorControllerTest.java @@ -0,0 +1,26 @@ +package io.gec.raw.connector.statistic.control; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class StatisticCollectorControllerTest { + + /** + * Method under test: {@link StatisticCollectorController#toString()} + */ + @Test + void testToString() { + assertEquals("\nTotal:\nno statistic data available for this interval\n", + (new StatisticCollectorController()).toString()); + } + + /** + * Method under test: {@link StatisticCollectorController#toJson()} + */ + @Test + void testToJson() { + assertEquals("{\"json\":\"json\"}", (new StatisticCollectorController()).toJson()); + } +} + diff --git a/src/test/java/io/gec/raw/connector/subscription/control/ScheduledTaskServiceTest.java b/src/test/java/io/gec/raw/connector/subscription/control/ScheduledTaskServiceTest.java new file mode 100755 index 0000000..5c1a11c --- /dev/null +++ b/src/test/java/io/gec/raw/connector/subscription/control/ScheduledTaskServiceTest.java @@ -0,0 +1,269 @@ +package io.gec.raw.connector.subscription.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.subscription.domain.ScheduledTask; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.lang.reflect.Field; +import java.util.UUID; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ScheduledTaskServiceTest { + + @Mock + Logger logger; + @Mock + ScheduledExecutorService scheduledExecutor; + @InjectMocks + ScheduledTaskService scheduledTaskService; + + + @BeforeEach + void setUp() throws Exception { + Field executorField = ScheduledTaskService.class.getDeclaredField("scheduledExecutor"); + executorField.setAccessible(true); + executorField.set(scheduledTaskService, scheduledExecutor); + } + + @Test + void shouldScheduleTask_createScheduledTaskWithInterval() { + // given + var variable = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .build(); + var scheduledTask = mock(ScheduledTask.class); + when(scheduledTask.entity()).thenReturn(variable); + + // when + scheduledTaskService.scheduleTask(scheduledTask); + + // then + verify(scheduledExecutor, times(1)).scheduleWithFixedDelay(any(Runnable.class), eq(10L), eq(10L), eq(TimeUnit.SECONDS)); + } + + @Test + void shouldScheduleTask_doNothing_forSameInterval() { + // given + var variableId = UUID.randomUUID(); + var variable = Variable.builder() + .id(variableId) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var scheduledTask = mock(ScheduledTask.class); + when(scheduledTask.entity()).thenReturn(variable); + var future = mock(ScheduledFuture.class); + // and + when(scheduledExecutor.scheduleWithFixedDelay(any(Runnable.class), eq(10L), eq(10L), eq(TimeUnit.SECONDS))).thenReturn(future); + scheduledTaskService.scheduleTask(scheduledTask); + // and + var updatedVariable = Variable.builder() + .id(variableId) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var updatedScheduledTask = mock(ScheduledTask.class); + when(updatedScheduledTask.entity()).thenReturn(updatedVariable); + + // when + scheduledTaskService.scheduleTask(updatedScheduledTask); + + // then + verify(future, times(0)).cancel(false); + verify(scheduledExecutor, times(1)).scheduleWithFixedDelay(any(Runnable.class), anyLong(), anyLong(), eq(TimeUnit.SECONDS)); + } + + @Test + void shouldScheduleTask_reschedule_forChangedInterval() { + // given + var variableId = UUID.randomUUID(); + var variable = Variable.builder() + .id(variableId) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var scheduledTask = mock(ScheduledTask.class); + when(scheduledTask.entity()).thenReturn(variable); + var future = mock(ScheduledFuture.class); + when(future.isDone()).thenReturn(false); + when(future.isCancelled()).thenReturn(false); + when(future.cancel(false)).thenReturn(true); + // and + when(scheduledExecutor.scheduleWithFixedDelay(any(Runnable.class), eq(10L), eq(10L), eq(TimeUnit.SECONDS))).thenReturn(future); + scheduledTaskService.scheduleTask(scheduledTask); + // and + var updatedVariable = Variable.builder() + .id(variableId) + .subscriptionInterval(999) + .mode(ComponentMode.OPERATION) + .build(); + var updatedScheduledTask = mock(ScheduledTask.class); + when(updatedScheduledTask.entity()).thenReturn(updatedVariable); + + // when + scheduledTaskService.scheduleTask(updatedScheduledTask); + + // then + verify(future, times(1)).cancel(false); + verify(scheduledExecutor, times(2)).scheduleWithFixedDelay(any(Runnable.class), anyLong(), anyLong(), eq(TimeUnit.SECONDS)); + verify(scheduledExecutor, times(1)).scheduleWithFixedDelay(any(Runnable.class), eq(10L), eq(10L), eq(TimeUnit.SECONDS)); + verify(scheduledExecutor, times(1)).scheduleWithFixedDelay(any(Runnable.class), eq(999L), eq(999L), eq(TimeUnit.SECONDS)); + } + + + @Test + void shouldResetNextExecutionInterval_resetsInterval_forSubscribed() { + // given + var variable = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var scheduledTask = mock(ScheduledTask.class); + when(scheduledTask.entity()).thenReturn(variable); + var future = mock(ScheduledFuture.class); + when(future.isDone()).thenReturn(false); + when(future.isCancelled()).thenReturn(false); + when(future.cancel(false)).thenReturn(true); + // and + when(scheduledExecutor.scheduleWithFixedDelay(any(Runnable.class), eq(10L), eq(10L), eq(TimeUnit.SECONDS))).thenReturn(future); + scheduledTaskService.scheduleTask(scheduledTask); + + // when + scheduledTaskService.resetNextExecutionInterval(variable); + + // then + verify(future, times(1)).cancel(false); + verify(scheduledExecutor, times(2)).scheduleWithFixedDelay(any(Runnable.class), anyLong(), anyLong(), eq(TimeUnit.SECONDS)); + verify(scheduledExecutor, times(2)).scheduleWithFixedDelay(any(Runnable.class), eq(10L), eq(10L), eq(TimeUnit.SECONDS)); + } + + @Test + void shouldResetNextExecutionInterval_doNothing_forUnsubscribed() { + // given + var variable = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var scheduledTask = mock(ScheduledTask.class); + when(scheduledTask.entity()).thenReturn(variable); + var future = mock(ScheduledFuture.class); + // and + when(scheduledExecutor.scheduleWithFixedDelay(any(Runnable.class), eq(10L), eq(10L), eq(TimeUnit.SECONDS))).thenReturn(future); + scheduledTaskService.scheduleTask(scheduledTask); + + // when + variable.setMode(ComponentMode.PAUSE); + scheduledTaskService.resetNextExecutionInterval(variable); + + // then + verify(future, times(0)).cancel(false); + verify(scheduledExecutor, times(1)).scheduleWithFixedDelay(any(Runnable.class), anyLong(), anyLong(), eq(TimeUnit.SECONDS)); + } + + @ParameterizedTest + @EnumSource(value = ComponentMode.class) + void shouldExecuteTaskOnce_executesTaskImmediately_forAnyMode(ComponentMode mode) { + // given + var variable = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(mode) + .build(); + var scheduledTask = mock(ScheduledTask.class); + when(scheduledTask.entity()).thenReturn(variable); + + // when + scheduledTaskService.executeTaskOnce(scheduledTask); + + // then + var taskCaptor = ArgumentCaptor.forClass(Runnable.class); + verify(scheduledExecutor, times(1)).execute(taskCaptor.capture()); + taskCaptor.getValue().run(); + verify(scheduledTask, times(1)).run(); + } + + @Test + void shouldExecuteActionAndRemoveTaskIfExists_removesAndExecutesTaskOnce_forKnownTask() { + // given + var variableId = UUID.randomUUID(); + var variable = Variable.builder() + .id(variableId) + .subscriptionInterval(10) + .build(); + var scheduledTask = mock(ScheduledTask.class); + when(scheduledTask.entity()).thenReturn(variable); + var future = mock(ScheduledFuture.class); + when(future.isDone()).thenReturn(false); + when(future.isCancelled()).thenReturn(false); + when(future.cancel(false)).thenReturn(true); + // and + when(scheduledExecutor.scheduleWithFixedDelay(any(Runnable.class), anyLong(), anyLong(), any())).thenReturn(future); + scheduledTaskService.scheduleTask(scheduledTask); + + // when + scheduledTaskService.executeActionAndRemoveTaskIfExists(scheduledTask); + + // then + verify(future, times(1)).cancel(false); + var taskCaptor = ArgumentCaptor.forClass(Runnable.class); + verify(scheduledExecutor, times(1)).execute(taskCaptor.capture()); + taskCaptor.getValue().run(); + verify(scheduledTask, times(1)).run(); + } + + @Test + void shouldExecuteActionAndRemoveTaskIfExists_executeTaskOnce_forUnknownTask() { + // given + var variableId = UUID.randomUUID(); + var variable = Variable.builder() + .id(variableId) + .subscriptionInterval(10) + .build(); + var scheduledTask = mock(ScheduledTask.class); + when(scheduledTask.entity()).thenReturn(variable); + var future = mock(ScheduledFuture.class); + // and + when(scheduledExecutor.scheduleWithFixedDelay(any(Runnable.class), anyLong(), anyLong(), any())).thenReturn(future); + scheduledTaskService.scheduleTask(scheduledTask); + // and + var unknownId = UUID.randomUUID(); + var unknownVariable = Variable.builder() + .id(unknownId) + .subscriptionInterval(10) + .build(); + var unknownTask = mock(ScheduledTask.class); + when(unknownTask.entity()).thenReturn(unknownVariable); + + // when + scheduledTaskService.executeActionAndRemoveTaskIfExists(unknownTask); + + // then + verify(future, times(0)).cancel(false); + verify(scheduledExecutor, times(1)).execute(any(Runnable.class)); + verify(scheduledTask, times(0)).run(); + } +} diff --git a/src/test/java/io/gec/raw/connector/subscription/control/SubscriptionControllerTest.java b/src/test/java/io/gec/raw/connector/subscription/control/SubscriptionControllerTest.java new file mode 100755 index 0000000..78263a5 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/subscription/control/SubscriptionControllerTest.java @@ -0,0 +1,131 @@ +package io.gec.raw.connector.subscription.control; + +import io.gec.raw.connector.deviceproperty.control.DevicePropertyController; +import io.gec.raw.connector.deviceproperty.control.DevicePropertyTaskScheduler; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.snmp.vardyntable.control.VariableDynamicTableService; +import io.gec.raw.connector.utils.TestClassUtil; +import io.gec.raw.connector.variable.control.VariableController; +import io.gec.raw.connector.variable.control.VariableValueTaskScheduler; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.lang.reflect.Field; +import java.time.OffsetDateTime; +import java.util.List; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SubscriptionControllerTest { + + @Mock + VariableController variableController; + @Mock + VariableDynamicTableService variableDynamicTableService; + @Mock + DevicePropertyController propertyController; + @Mock + Logger logger; + @Mock + VariableValueTaskScheduler variableValueTaskScheduler; + @Mock + DevicePropertyTaskScheduler devicePropertyTaskScheduler; + @InjectMocks + SubscriptionController subscriptionController; + + @Test + void processDeviceVariableValues_callTaskSchedulerAndDynamicTableService_withVariables() { + // given + var variables = List.of(Variable.builder().build()); + when(variableController.findVariablesInOperationMode()).thenReturn(variables); + + // when + subscriptionController.processDeviceVariableValues(); + + // then + verify(variableValueTaskScheduler, times(1)).scheduleTasks(variables); + verify(variableDynamicTableService, times(1)).processVariables(variables); + } + + @Test + void processDeviceVariableValues_callTaskSchedulerAndDynamicTableService_noVariables() { + // given + when(variableController.findVariablesInOperationMode()).thenReturn(List.of()); + + // when + subscriptionController.processDeviceVariableValues(); + + // then + verify(variableValueTaskScheduler, times(1)).scheduleTasks(any()); + verify(variableDynamicTableService, times(1)).processVariables(any()); + } + + + @Test + void processDevicePropertyValues_callTaskScheduler_withProperties() { + // given + var deviceProperties = List.of(DeviceProperty.builder().build()); + when(propertyController.findSubscribedDeviceProperties()).thenReturn(deviceProperties); + + // when + subscriptionController.processDevicePropertyValues(); + + // then + verify(devicePropertyTaskScheduler, times(1)).scheduleTasks(deviceProperties); + } + + @Test + void processDevicePropertyValues_callTaskScheduler_noProperties() { + // given + when(propertyController.findSubscribedDeviceProperties()).thenReturn(List.of()); + + // when + subscriptionController.processDevicePropertyValues(); + + // then + verify(devicePropertyTaskScheduler, times(1)).scheduleTasks(any()); + } + + @Test + void processDeviceVariableValues_withLookupStamp() throws Exception { + // given + var variables = List.of(Variable.builder().build()); + OffsetDateTime previousTimestamp = OffsetDateTime.now().minusDays(1); + TestClassUtil.setPrivateField(SubscriptionController.class, subscriptionController, "variablesLookupStamp", previousTimestamp); + when(variableController.findVariablesUpdatedAfter(previousTimestamp)).thenReturn(variables); + + // when + subscriptionController.processDeviceVariableValues(); + + // then + verify(variableController, times(1)).findVariablesUpdatedAfter(previousTimestamp); + verify(variableValueTaskScheduler, times(1)).scheduleTasks(variables); + verify(variableDynamicTableService, times(1)).processVariables(variables); + } + + @Test + void processDevicePropertyValues_withLookupStamp() throws Exception { + // given + var deviceProperties = List.of(DeviceProperty.builder().build()); + OffsetDateTime previousTimestamp = OffsetDateTime.now().minusDays(1); + TestClassUtil.setPrivateField(SubscriptionController.class, subscriptionController, "propertiesLookupStamp", previousTimestamp); + when(propertyController.findSubscribableDevicePropertiesUpdatedAfter(previousTimestamp)).thenReturn(deviceProperties); + + // when + subscriptionController.processDevicePropertyValues(); + + // then + verify(propertyController, times(1)).findSubscribableDevicePropertiesUpdatedAfter(previousTimestamp); + verify(devicePropertyTaskScheduler, times(1)).scheduleTasks(deviceProperties); + } + +} diff --git a/src/test/java/io/gec/raw/connector/utils/DeviceOidValueMapProvider.java b/src/test/java/io/gec/raw/connector/utils/DeviceOidValueMapProvider.java new file mode 100755 index 0000000..8e9b970 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/utils/DeviceOidValueMapProvider.java @@ -0,0 +1,55 @@ +package io.gec.raw.connector.utils; + +import io.gec.raw.connector.device.domain.DeviceOidValueMap; +import jakarta.enterprise.context.ApplicationScoped; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +@ApplicationScoped +public class DeviceOidValueMapProvider { + private static final String TEST_RESOURCES_BASE_PATH = "src/test/resources/discovery/"; + public static final DeviceOidValueMap RITTAL_PDU_OID_MAP = createTestRittalPduOidMap(); + public static final DeviceOidValueMap THIRD_PARTY_SYNOLOGY_OID_MAP = createTestThirdPartySynologyOidMap(); + + private static DeviceOidValueMap createTestRittalPduOidMap() { + return createOidMap(TEST_RESOURCES_BASE_PATH + "rittal_pdu.snmprec"); + } + + private static DeviceOidValueMap createTestThirdPartySynologyOidMap() { + return createOidMap(TEST_RESOURCES_BASE_PATH + "synology.snmprec"); + } + + private static DeviceOidValueMap createOidMap(String filepath) { + File file = new File(filepath); + + DeviceOidValueMap oidValueMap = new DeviceOidValueMap(); + + try { + BufferedReader reader = new BufferedReader(new FileReader(file)); + String line = reader.readLine(); + + while (line != null) { + line = reader.readLine(); + if (line != null) { + String[] lineContent = line.split("::"); + if (lineContent.length == 0) { + continue; + } else if (lineContent.length > 1) { + oidValueMap.put(lineContent[0], lineContent[1].trim()); + } else { + oidValueMap.put(lineContent[0], ""); + } + } + } + + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return oidValueMap; + } +} diff --git a/src/test/java/io/gec/raw/connector/utils/IPAddressHelperTest.java b/src/test/java/io/gec/raw/connector/utils/IPAddressHelperTest.java new file mode 100755 index 0000000..abb00ac --- /dev/null +++ b/src/test/java/io/gec/raw/connector/utils/IPAddressHelperTest.java @@ -0,0 +1,150 @@ +package io.gec.raw.connector.utils; + +import io.gec.raw.connector.utils.control.IPAddressHelper; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; + +class IPAddressHelperTest { + + private static final String REFERENCE_ADDRESS = "192.168.1.77"; + + IPAddressHelper ipAddressHelper = new IPAddressHelper(); + + private static Stream shouldReturnIpAdresses() { + return Stream.of( + of(REFERENCE_ADDRESS, REFERENCE_ADDRESS, List.of(REFERENCE_ADDRESS)), + of("192.168.1.5", "192.168.1.6", List.of("192.168.1.5", "192.168.1.6")) + ); + } + + private static Stream shouldReturnExactCountfIpAdresses() { + return Stream.of( + of("192.168.1.0", "192.168.1.100", 101) + ); + } + + private static Stream shouldExtractIPv4Address() { + return Stream.of( + of(REFERENCE_ADDRESS, Optional.of(REFERENCE_ADDRESS)), + of("192.168.1.77a", Optional.of(REFERENCE_ADDRESS)), + of("a192.168.1.77", Optional.of(REFERENCE_ADDRESS)), + of("+192.168.1.77", Optional.of(REFERENCE_ADDRESS)), + of(" 192.168.1.77", Optional.of(REFERENCE_ADDRESS)), + of("192.168.1.77 ", Optional.of(REFERENCE_ADDRESS)), + of("192.1.77", Optional.empty()), + of("192.AB.1.77", Optional.empty()), + of("", Optional.empty()), + of(" ", Optional.empty()), + of("192 168 1 1", Optional.empty()), + of("192.168.1,1", Optional.empty()), + of("text", Optional.empty()), + of("a.b.c.d", Optional.empty()), + of("...", Optional.empty()) + ); + } + + private static Stream shouldValidateIpRangeNotThrowAnException() { + return Stream.of( + of("1.1.1.0", "1.1.1.0"), + of("1.1.1.0", "1.1.1.1"), + of("1.1.1.0", "1.1.1.255") + ); + } + + private static Stream shouldValidateIpRangeThrowAnException() { + return Stream.of( + of("1.1.1.1", "1.1.2.1"), + of("1.1.1.1", "1.2.1.1"), + of("1.1.1.1", "2.1.1.1"), + of("1.1.2.1", "1.1.1.1"), + of("1.2.1.1", "1.1.1.1"), + of("2.1.1.1", "1.1.1.1"), + + of("1.1.1.1", "1.1.1.256"), + of("1.1.1.256", "1.1.1.1"), + of("1.1.1.256", "1.1.1.256"), + of("1.1.1.1", "1.1.1.-1"), + of("1.1.1.-1", "1.1.1.1"), + of("1.1.1.-1", "1.1.1.-1"), + + of(null, "1.1.1.1"), + of("", "1.1.1.1"), + of(" ", "1.1.1.1"), + of("a", "1.1.1.1"), + of("1.1.1.a", "1.1.1.1"), + of("1.1.1. ", "1.11.1"), + of("1.1.1.", "1.1.1.1"), + of("1.1.1", "1.1.1.1"), + of("1.1.", "1.1.1.1"), + of("1.1", "1.1.1.1"), + of("1.", "1.1.1.1"), + of("1", "1.1.1.1"), + of("1.1.1.1", null), + of("1.1.1.1", ""), + of("1.1.1.1", " "), + of("1.1.1.1", "a"), + of("1.1.1.1", "1.1.1.a"), + of("1.1.1.1", "1.1.1. "), + of("1.1.1.1", "1.1.1."), + of("1.1.1.1", "1.1.1"), + of("1.1.1.1", "1.1."), + of("1.1.1.1", "1.1"), + of("1.1.1.1", "1."), + of("1.1.1.1", "1"), + of("1.1.1.1", "."), + of("1.1.1.1", "1.1.1.0"), + of("1.1.1.1", "1.1.0.1"), + of("1.1.1.1", "1.0.1.1"), + of("1.1.1.1", "0.1.1.1") + ); + } + + @ParameterizedTest + @MethodSource + void shouldReturnIpAdresses(String startIp, String endIp, List expected) { + List results = ipAddressHelper.getStartEndIpOctet(startIp, endIp); + + assertEquals(expected, results); + } + + @ParameterizedTest + @MethodSource + void shouldReturnExactCountfIpAdresses(String startIp, String endIp, int expectedCount) { + List results = ipAddressHelper.getStartEndIpOctet(startIp, endIp); + + assertEquals(expectedCount, results.size()); + } + + @ParameterizedTest + @MethodSource + void shouldExtractIPv4Address(String ipV4Address, Optional expected) { + Optional result = ipAddressHelper.extractIPv4(ipV4Address); + + if (expected.isPresent()) { + assertTrue(result.isPresent()); + assertEquals(expected.get(), result.get()); + } else { + assertTrue(result.isEmpty()); + } + } + + @ParameterizedTest + @MethodSource + void shouldValidateIpRangeNotThrowAnException(String startIp, String endIp) { + assertDoesNotThrow(() -> ipAddressHelper.validateIpRange(startIp, endIp)); + } + + @ParameterizedTest + @MethodSource + void shouldValidateIpRangeThrowAnException(String startIp, String endIp) { + assertThrows(RuntimeException.class, () -> ipAddressHelper.validateIpRange(startIp, endIp)); + } +} diff --git a/src/test/java/io/gec/raw/connector/utils/IntegrationTestHelper.java b/src/test/java/io/gec/raw/connector/utils/IntegrationTestHelper.java new file mode 100755 index 0000000..0652522 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/utils/IntegrationTestHelper.java @@ -0,0 +1,234 @@ +package io.gec.raw.connector.utils; + +import io.gec.raw.connector.communicationservice.control.CommunicationService; +import io.gec.raw.connector.connector.control.ConnectorController; +import io.gec.raw.connector.connector.dto.ConnectorResponseDTO; +import io.gec.raw.connector.device.control.DeviceController; +import io.gec.raw.connector.device.control.DeviceStructureService; +import io.gec.raw.connector.device.domain.DeviceMapping; +import io.gec.raw.connector.discovery.control.DiscoveryController; +import io.gec.raw.connector.discovery.control.DiscoveryWorkItemRepository; +import io.gec.raw.connector.discovery.dto.DiscoveryValueDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.discovery.entity.DiscoveryWorkItem; +import io.gec.raw.connector.driver.control.DeviceDriverServiceClient; +import io.gec.raw.connector.protocol.control.ProtocolMapper; +import io.gec.raw.connector.protocol.control.ProtocolService; +import io.gec.raw.connector.protocol.domain.DiscoveryPropertyNameEnum; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.protocol.dto.PropertyDTO; +import io.gec.raw.connector.protocol.dto.ProtocolDTO; +import io.gec.raw.connector.protocol.entity.Protocol; +import io.quarkus.test.InjectMock; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; +import org.eclipse.microprofile.rest.client.inject.RestClient; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@ApplicationScoped +public class IntegrationTestHelper { + public static final UUID PLANT_ID = UUID.fromString("00000000-0000-0000-0000-000000000000"); + public static final UUID CONNECTOR_ID = UUID.fromString("00000000-0000-0000-0000-000000000001"); + public static final UUID THIRD_PARTY_DRIVER_HEADER_ID = UUID.fromString("20000000-0000-0000-0000-000000000002"); + + @Inject + EntityManager entityManager; + @Inject + DeviceStructureService deviceStructureService; + @Inject + DeviceController deviceController; + @Inject + DiscoveryController discoveryController; + @Inject + DiscoveryWorkItemRepository discoveryWorkItemRepository; + @Inject + ConnectorController connectorController; + @Inject + ProtocolMapper protocolMapper; + @Inject + ProtocolService protocolService; + @InjectMock + @RestClient + CommunicationService communicationService; + @InjectMock + @RestClient + DeviceDriverServiceClient deviceDriverServiceClient; + + @Transactional + public void setupTestEnvironment() { + registerTestConnectorWithDriver(); + createFinishedRittalDeviceDiscovery(); + createFinishedThirdPartyDiscovery(); + } + + @Transactional + public void cleanupTestEnvironment() { + entityManager.createNativeQuery("TRUNCATE connector_svc.variable CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.property_value CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.property CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.device_property CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.discovery_value CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.discovery_workitem CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.protocol CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.device CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.driver_header CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.driver_variable CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.value_mapping_container CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.value_mapping CASCADE") + .executeUpdate(); + entityManager.createNativeQuery("TRUNCATE connector_svc.variable CASCADE") + .executeUpdate(); + } + + private void registerTestConnectorWithDriver() { + var protocolDTO_snmpV2 = protocolMapper.toProtocolDTO(SnmpVersionEnum.SNMP_V2C); + TestClassUtil.setPrivateField(ProtocolDTO.class, protocolDTO_snmpV2, "id", UUID.randomUUID()); + for (PropertyDTO propertyDTO : protocolDTO_snmpV2.getProperties()) { + TestClassUtil.setPrivateField(PropertyDTO.class, propertyDTO, "id", UUID.randomUUID()); + } + + var connectorResponseDTO = + ConnectorResponseDTO.builder() + .id(UUID.randomUUID()) + .name("TestConnector") + .description("TestConnectorDescription") + .ipAddress("127.0.0.1") + .protocols(List.of(protocolDTO_snmpV2)) + .build(); + when(communicationService.registerConnector(any())).thenReturn(connectorResponseDTO); + var deviceDriverDTO = TestDTOFactory.createSynologyDeviceDriverDTO(THIRD_PARTY_DRIVER_HEADER_ID); + when(deviceDriverServiceClient.findAll()).thenReturn(List.of(deviceDriverDTO)); + connectorController.registerOnServer(); + } + + private void createFinishedRittalDeviceDiscovery() { + var discovery = createFinishedDiscovery(); + + try { + deviceController.storeDevice( + createTestRittalDeviceMapping(discovery.getCommDiscoveryId()), + PLANT_ID, + null + ); + } catch (Exception e) { + throw new RuntimeException("Failed to store rittal devices", e); + } + } + + private void createFinishedThirdPartyDiscovery() { + var discovery = createFinishedDiscovery(); + + try { + deviceController.storeDevice( + createTestThirdPartyDeviceMapping(discovery.getCommDiscoveryId()), + PLANT_ID, + null + ); + } catch (Exception e) { + throw new RuntimeException("Failed to store third party devices", e); + } + } + + private DiscoveryWorkItem createFinishedDiscovery() { + var snmpV2Protocol = protocolService.findProtocolByName(SnmpVersionEnum.SNMP_V2C.getName()); + var discoveryValues = createDiscoveryValues(snmpV2Protocol); + var dwiDto = TestDTOFactory.createDiscoveryWorkItemDTO(DiscoveryWorkItemStatus.FINISHED); + dwiDto.setProtocolId(snmpV2Protocol.getCommunicationServiceId()); + dwiDto.setDiscoveryValues(discoveryValues); + discoveryController.persistDiscoveryWorkItem(dwiDto); + + return discoveryWorkItemRepository.findByCommunicationServiceId(dwiDto.getId()); + } + + private List createDiscoveryValues(Protocol protocol) { + return protocol.getProperties().stream() + .map(property -> + DiscoveryValueDTO.builder() + .propertyId(property.getCommunicationServiceId()) + .propertyValue(getDiscoveryValue(property.getName())) + .build() + ) + .toList(); + } + + private String getDiscoveryValue(String propertyName) { + switch (DiscoveryPropertyNameEnum.fromName(propertyName)) { + case START_IP_ADDRESS -> { + return "10.0.0.0"; + } + case END_IP_ADDRESS -> { + return "10.0.0.1"; + } + case READ_COMMUNITY -> { + return "readCommunity"; + } + case WRITE_COMMUNITY -> { + return "writeCommunity"; + } + case PORT -> { + return "161"; + } + case SECURITY_LEVEL -> { + return "securityLevel"; + } + case SECURITY_NAME -> { + return "securityName"; + } + case AUTHENTICATION_PROTOCOL -> { + return "authenticationProtocol"; + } + case AUTHENTICATION_PASSPHRASE -> { + return "authenticationPassphrase"; + } + case PRIVACY_ALGORITHM -> { + return "privacyAlgorithm"; + } + case PRIVACY_PASSPHRASE -> { + return "privacyPassphrase"; + } + case CONTEXT_NAME -> { + return "Context Name"; + } + case null -> { + return ""; + } + } + } + + private DeviceMapping createTestRittalDeviceMapping(UUID discoveryId) { + return deviceStructureService.createRittalDeviceStructure( + DeviceOidValueMapProvider.RITTAL_PDU_OID_MAP, + CONNECTOR_ID, + discoveryId, + "127.0.0.1" + ); + } + + private DeviceMapping createTestThirdPartyDeviceMapping(UUID discoveryId) { + return deviceStructureService.createExternalDeviceStructure( + DeviceOidValueMapProvider.THIRD_PARTY_SYNOLOGY_OID_MAP, + CONNECTOR_ID, + discoveryId, + IntegrationTestHelper.THIRD_PARTY_DRIVER_HEADER_ID, + "127.0.0.1" + ); + } +} diff --git a/src/test/java/io/gec/raw/connector/utils/TestClassUtil.java b/src/test/java/io/gec/raw/connector/utils/TestClassUtil.java new file mode 100755 index 0000000..04003c8 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/utils/TestClassUtil.java @@ -0,0 +1,16 @@ +package io.gec.raw.connector.utils; + +import java.lang.reflect.Field; + +public class TestClassUtil { + + public static void setPrivateField(Class clazz, T target, String fieldName, Object value) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + field.set(target, value); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/test/java/io/gec/raw/connector/utils/TestDTOFactory.java b/src/test/java/io/gec/raw/connector/utils/TestDTOFactory.java new file mode 100755 index 0000000..b2921a6 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/utils/TestDTOFactory.java @@ -0,0 +1,447 @@ +package io.gec.raw.connector.utils; + +import io.gec.raw.connector.access.configworkitem.domain.AccessUserRole; +import io.gec.raw.connector.access.configworkitem.dto.AccessCardCodeDTO; +import io.gec.raw.connector.access.configworkitem.dto.AccessConfigDTO; +import io.gec.raw.connector.access.configworkitem.dto.CardCodeType; +import io.gec.raw.connector.access.configworkitem.dto.HandleDTO; +import io.gec.raw.connector.access.configworkitem.dto.KeypadDTO; +import io.gec.raw.connector.access.configworkitem.dto.OptionsDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemDTO; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemStatus; +import io.gec.raw.connector.access.connectionworkitem.dto.ConnectionWorkItemValueDTO; +import io.gec.raw.connector.access.logworkitem.dto.AccessLogDTO; +import io.gec.raw.connector.access.logworkitem.dto.AccessLogItemDTO; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import io.gec.raw.connector.deviceproperty.domain.DevicePropertySnmpMessageTaskData; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.discovery.dto.DiscoveryValueDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemDTO; +import io.gec.raw.connector.discovery.dto.DiscoveryWorkItemStatus; +import io.gec.raw.connector.driver.domain.DeviceDriverDTO; +import io.gec.raw.connector.driver.domain.DriverHeaderDTO; +import io.gec.raw.connector.driver.domain.DriverVariableDTO; +import io.gec.raw.connector.driver.domain.ValueMappingContainerDTO; +import io.gec.raw.connector.driver.domain.ValueMappingDTO; +import io.gec.raw.connector.driver.dto.DriverWorkItemDTO; +import io.gec.raw.connector.ftp.domain.SftpData; +import io.gec.raw.connector.job.dto.JobAction; +import io.gec.raw.connector.job.dto.JobDTO; +import io.gec.raw.connector.job.dto.JobStateDTO; +import io.gec.raw.connector.job.dto.JobStatus; +import io.gec.raw.connector.job.dto.JobType; +import io.gec.raw.connector.pauseworkitem.dto.PauseWorkItemDTO; +import io.gec.raw.connector.protocol.domain.SnmpVersionEnum; +import io.gec.raw.connector.rittal.enums.ValuesSnmpVarStatus; +import io.gec.raw.connector.setworkitem.domain.SetWorkItemData; +import io.gec.raw.connector.setworkitem.dto.ActionEnum; +import io.gec.raw.connector.setworkitem.dto.SetStatusEnum; +import io.gec.raw.connector.setworkitem.dto.SetWorkItemDTO; +import io.gec.raw.connector.snmp.common.domain.SnmpMessageData; +import io.gec.raw.connector.snmp.common.domain.SnmpProtocolData; +import io.gec.raw.connector.snmp.traps.domain.PropertyTrapContent; +import io.gec.raw.connector.snmp.traps.domain.VariableTrapContent; +import io.gec.raw.connector.variable.domain.VariableSnmpMessageTaskData; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.gec.raw.connector.variable.entity.Variable; +import org.snmp4j.PDU; +import org.snmp4j.event.ResponseEvent; +import org.snmp4j.smi.AbstractVariable; +import org.snmp4j.smi.Address; +import org.snmp4j.smi.Null; +import org.snmp4j.smi.OID; +import org.snmp4j.smi.VariableBinding; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class TestDTOFactory { + + public static JobDTO createJobDTO(UUID connectorId, UUID referenceId, UUID plantId, UUID userId) { + JobDTO jobDTO = new JobDTO(); + jobDTO.setUserId(userId); + jobDTO.setConnectorId(connectorId); + jobDTO.setAction(JobAction.EXECUTE); + jobDTO.setStatus(JobStatus.NEW); + jobDTO.setId(UUID.randomUUID()); + jobDTO.setCreated(OffsetDateTime.now()); + jobDTO.setType(JobType.ACCESS_CONNECTION); + jobDTO.setStamp(OffsetDateTime.now()); + jobDTO.setPlantId(plantId); + jobDTO.setReferenceId(referenceId); + + return jobDTO; + } + + public static ConnectionWorkItemDTO createConnectionWorkItemDTO(UUID deviceId, ConnectionWorkItemStatus connectionWorkItemStatus, UUID protocolId, UUID protocolPropertyId) { + ConnectionWorkItemValueDTO connectionWorkItemValueDTO = createConnectionWorkItemValueDTO(protocolPropertyId, "Test Value"); + ConnectionWorkItemDTO connectionWorkItemDTO = new ConnectionWorkItemDTO(); + connectionWorkItemDTO.setStatus(connectionWorkItemStatus); + connectionWorkItemDTO.setDeviceId(deviceId); + connectionWorkItemDTO.setProtocolId(protocolId); + connectionWorkItemDTO.setConnectionPropertyValues(List.of(connectionWorkItemValueDTO)); + + return connectionWorkItemDTO; + } + + public static ConnectionWorkItemValueDTO createConnectionWorkItemValueDTO(UUID protocolPropertyId, String protocolPropertyValue) { + ConnectionWorkItemValueDTO connectionWorkItemValueDTO = new ConnectionWorkItemValueDTO(); + connectionWorkItemValueDTO.setProtocolPropertyId(protocolPropertyId); + connectionWorkItemValueDTO.setProtocolPropertyValue(protocolPropertyValue); + + return connectionWorkItemValueDTO; + } + + public static JobStateDTO createJobStateDTO(UUID userId) { + JobStateDTO jobStateDTO = new JobStateDTO(); + jobStateDTO.setStatus(JobStatus.RUNNING); + jobStateDTO.setUserId(userId); + + return jobStateDTO; + } + + public static DiscoveryWorkItemDTO createDiscoveryWorkItemDTO(DiscoveryWorkItemStatus status) { + return DiscoveryWorkItemDTO.builder() + .id(UUID.randomUUID()) + .name("Discovery Work Item Name") + .status(status) + .plantId(UUID.randomUUID()) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .connectorId(UUID.randomUUID()) + .protocolId(UUID.randomUUID()) + .build(); + } + + public static List createDiscoveryWorkItemDTOs(int count) { + return IntStream.range(0, count) + .mapToObj(index -> { + var dwi = createDiscoveryWorkItemDTO(DiscoveryWorkItemStatus.INSERTED); + dwi.setName("sampleName%s".formatted(index)); + return dwi; + }) + .collect(Collectors.toList()); + } + + public static AccessLogDTO createAccessLogDto(UUID workItemId, List accessLogItemDTO) { + AccessLogDTO accessLogDTO = new AccessLogDTO(); + accessLogDTO.setWorkItemId(workItemId); + accessLogDTO.setAccessLogItems(accessLogItemDTO); + return accessLogDTO; + } + + public static AccessLogItemDTO createAccessLogItemDTO() { + AccessLogItemDTO accessLogItemDTO = new AccessLogItemDTO(); + accessLogItemDTO.setDateTime(OffsetDateTime.now()); + accessLogItemDTO.setDeviceDescription("test Description"); + accessLogItemDTO.setDeviceName("test Name"); + accessLogItemDTO.setDeviceNumber(5); + accessLogItemDTO.setMessage("test message"); + return accessLogItemDTO; + } + + public static SftpData createSftpData() { + var sftpData = new SftpData(); + sftpData.setPort(22); + sftpData.setPassword("Test password"); + sftpData.setUserName("Test username"); + sftpData.setIpAddress("192.168.10.199"); + return sftpData; + } + + public static PauseWorkItemDTO createPauseWorkItem(UUID deviceId, UUID variableId, ComponentMode mode) { + var pauseWorkItemDTO = new PauseWorkItemDTO(); + pauseWorkItemDTO.setDeviceId(deviceId); + pauseWorkItemDTO.setVariableId(variableId); + pauseWorkItemDTO.setMode(mode); + return pauseWorkItemDTO; + } + + public static DriverWorkItemDTO createDriverWorkItem(UUID driverId) { + var driverWorkItemDTO = new DriverWorkItemDTO(); + driverWorkItemDTO.setDriverId(driverId); + return driverWorkItemDTO; + } + + public static SetWorkItemData buildSetWorkItemData(String value, DataTypeEnum dataTypeEnum) { + DiscoveryWorkItemDTO dwi = createDiscoveryWorkItemDTO(); + return SetWorkItemData.builder() + .oid("1.2.3.4") + .value(value) + .community("public") + .dataType(dataTypeEnum) + .ipAddress("192.168.10.199") + .discoveryWorkItemDTO(dwi) + .build(); + } + + public static DiscoveryWorkItemDTO createDiscoveryWorkItemDTO() { + DiscoveryWorkItemDTO discoveryWorkItemDTO = new DiscoveryWorkItemDTO(); + var discValue = createDiscoveryValueDTO(); + discoveryWorkItemDTO.setId(UUID.randomUUID()); + discoveryWorkItemDTO.setCreated(OffsetDateTime.now()); + discoveryWorkItemDTO.setStamp(OffsetDateTime.now()); + discoveryWorkItemDTO.setConnectorId(UUID.randomUUID()); + discoveryWorkItemDTO.setProtocolId(UUID.randomUUID()); + discoveryWorkItemDTO.setName("test name"); + discoveryWorkItemDTO.setPlantId(UUID.randomUUID()); + discoveryWorkItemDTO.setStatus(DiscoveryWorkItemStatus.FINISHED); + discoveryWorkItemDTO.setDiscoveryValues(List.of(discValue)); + return discoveryWorkItemDTO; + } + + public static DiscoveryValueDTO createDiscoveryValueDTO() { + return DiscoveryValueDTO.builder() + .propertyId(UUID.randomUUID()) + .propertyValue("Port") + .build(); + } + + public static SetWorkItemDTO createSetWorkItemDTO(UUID variableId, UUID propertyId, String value) { + return SetWorkItemDTO.builder() + .variableId(variableId) + .propertyId(propertyId) + .action(ActionEnum.SET_VALUE) + .value(value) + .status(SetStatusEnum.IN_PROGRESS) + .build(); + } + + public static SnmpMessageData createSnmpMessageData() { + return SnmpMessageData.builder() + .hostname("") + .snmpProtocolData(SnmpProtocolData.builder() + .port(1) + .snmpVersion(SnmpVersionEnum.SNMP_V1) + .build()) + .build(); + } + + public static VariableSnmpMessageTaskData createVariableSnmpMessageTaskData(Variable entity) { + return new VariableSnmpMessageTaskData(entity, createSnmpMessageData(), createSnmpMessageData()); + } + + public static DevicePropertySnmpMessageTaskData createDevicePropertySnmpMessageTaskData(DeviceProperty entity) { + return new DevicePropertySnmpMessageTaskData(entity, createSnmpMessageData()); + } + + public static AccessConfigDTO createAccessConfigDTO(UUID accessMgmtDeviceId) { + AccessConfigDTO accessConfigDTO = new AccessConfigDTO(); + accessConfigDTO.setMgmtDeviceComponentId(accessMgmtDeviceId); + + return accessConfigDTO; + } + + public static AccessCardCodeDTO createAccessCardCodeDTO(CardCodeType type, String value, String userName) { + return createAccessCardCodeDTO(type, value, userName, AccessUserRole.ACCESS_USER.getRoleName()); + } + + public static AccessCardCodeDTO createAccessCardCodeDTO(CardCodeType type, String value, String userName, String userRole) { + AccessCardCodeDTO accessCardCodeDTO = new AccessCardCodeDTO(); + accessCardCodeDTO.setType(type); + accessCardCodeDTO.setValue(value); + accessCardCodeDTO.setUserName(userName); + accessCardCodeDTO.setUserRole(userRole); + + return accessCardCodeDTO; + } + + public static HandleDTO createHandleDTO(String accessDeviceSerialNr, AccessCardCodeDTO... accessCardCodes) { + HandleDTO handleDTO = new HandleDTO(); + handleDTO.setAccessDeviceSerialNr(accessDeviceSerialNr); + handleDTO.setAccessCardCodes(List.of(accessCardCodes)); + + return handleDTO; + } + + public static KeypadDTO createKeypadDTO(String accessDeviceSerialNr, HandleDTO... handles) { + KeypadDTO keypadDTO = new KeypadDTO(); + keypadDTO.setAccessDeviceSerialNr(accessDeviceSerialNr); + keypadDTO.setHandles(List.of(handles)); + + return keypadDTO; + } + + public static OptionsDTO createOptionsDTO(boolean fourEyes, boolean twoFactor, int fourEyesTimeout, int twoFactorTimeout) { + OptionsDTO optionsDTO = new OptionsDTO(); + optionsDTO.setFourEyes(fourEyes); + optionsDTO.setTwoFactor(twoFactor); + optionsDTO.setFourEyesTimeout(fourEyesTimeout); + optionsDTO.setTwoFactorTimeout(twoFactorTimeout); + + return optionsDTO; + } + + public static UpdateVariableRequestDTO createUpdateVariableRequestDTO() { + UpdateVariableRequestDTO dto = new UpdateVariableRequestDTO(); + dto.setVariableId(UUID.randomUUID()); + dto.setCommunicationServiceVariableId(UUID.randomUUID()); + dto.setQualityType(QualityType.GOOD); + dto.setValue("value1"); + dto.setUpdateTime(OffsetDateTime.now()); + + return dto; + } + + /** + * Creates a test {@link DeviceDriverDTO} for the ThirdParty Synology device {@link DeviceOidValueMapProvider#THIRD_PARTY_SYNOLOGY_OID_MAP synology.snmprec} with the following + * variables: + *
+     * 1. DriverVariable:
+     *  - name: DiskTemperature
+     *  - type: {@link DataTypeEnum#FLOAT}, {@link FunctionTypeEnum#VALUE}
+     *  - value mapping: none
+     * 2. DriverVariable:
+     *  - name: DiskStatus
+     *  - type: {@link DataTypeEnum#STATUSINT}, {@link FunctionTypeEnum#STATE}
+     *  - value mapping:
+     *      2 -> 4
+     *      3 -> 100
+     * 
+ * + * @param driverHeaderId the UUID of the driver header. + * @return the created {@code DeviceDriverDTO} instance. + */ + public static DeviceDriverDTO createSynologyDeviceDriverDTO(UUID driverHeaderId) { + var valueMappingContainerId = UUID.randomUUID(); + var driverVariableDTO = createDriverVariableDTO_DiskTemperature(driverHeaderId); + var driverVariableDTOWithValueMapping = createDriverVariableDTO_DiskStatus_WithValueMapping(driverHeaderId, valueMappingContainerId); + var valueMappingDTO_1 = createValueMappingDTO(valueMappingContainerId, "2", "4"); + var valueMappingDTO_2 = createValueMappingDTO(valueMappingContainerId, "3", "100"); + var valueMappingContainerDTO = createValueMappingContainerDTO( + valueMappingContainerId, + driverVariableDTOWithValueMapping.getId(), + List.of(valueMappingDTO_1.getId(), valueMappingDTO_2.getId()) + ); + + return DeviceDriverDTO.builder() + .driverHeaderDTO(createDriverHeaderDTO(driverHeaderId)) + .driverVariableDTOs(List.of(driverVariableDTO, driverVariableDTOWithValueMapping)) + .valueMappingDTOs(List.of(valueMappingDTO_1, valueMappingDTO_2)) + .valueMappingContainerDTOs(List.of(valueMappingContainerDTO)) + .build(); + } + + public static VariableTrapContent createVariableStatusTrapContent() { + return VariableTrapContent.builder() + .ipAddress("192.168.1.1") + .variableIndex(1) + .deviceIndex(1) + .variableName("exampleName") + .statusValue(ValuesSnmpVarStatus.OK) + .statusText("exampleText") + .build(); + } + + private static DriverHeaderDTO createDriverHeaderDTO(UUID driverHeaderId) { + return DriverHeaderDTO.builder() + .id(driverHeaderId) + .description(".*SynNAS.*") + .name("DriverHeaderName") + .sysObjectId("1.3.6.1.4.1.8072.3.2.10") + .bulkPolling(false) + .content("DriverHeaderContent") + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build(); + } + + private static DriverVariableDTO createDriverVariableDTO_DiskTemperature(UUID driverHeaderId) { + return DriverVariableDTO.builder() + .id(UUID.randomUUID()) + .driverHeaderId(driverHeaderId) + .name("DiskTemperature") + .displayName("DiskTemperatureDisplayName") + .description("DiskTemperatureDescription") + .oid(".1.3.6.1.4.1.6574.2.1.1.6.1") + .dataType(DataTypeEnum.FLOAT) + .functionType(FunctionTypeEnum.VALUE) + .min("0") + .max("100") + .intervalFactor("10") + .unit("C") + .step("1") + .scale("1") + .displayFactor("1") + .isReadOnly(false) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .build(); + } + + private static DriverVariableDTO createDriverVariableDTO_DiskStatus_WithValueMapping(UUID driverHeaderId, UUID valueMappingContainerId) { + return DriverVariableDTO.builder() + .id(UUID.randomUUID()) + .driverHeaderId(driverHeaderId) + .name("DiskStatus") + .displayName("DiskStatusDisplayName") + .description("DiskStatusDescription") + .oid(".1.3.6.1.4.1.6574.2.1.1.5.1") + .dataType(DataTypeEnum.STATUSINT) + .functionType(FunctionTypeEnum.STATE) + .min("0") + .max("0") + .intervalFactor("10") + .unit("") + .step("1") + .scale("1") + .displayFactor("1") + .isReadOnly(true) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .valueMappingContainerId(valueMappingContainerId) + .build(); + } + + private static ValueMappingDTO createValueMappingDTO(UUID valueMappingContainerId, String value, String mapping) { + return ValueMappingDTO.builder() + .id(UUID.randomUUID()) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .value(value) + .mapping(mapping) + .valueMappingContainerId(valueMappingContainerId) + .build(); + } + + private static ValueMappingContainerDTO createValueMappingContainerDTO(UUID id, UUID driverVariableId, List valueMappingIds) { + return ValueMappingContainerDTO.builder() + .id(id) + .created(OffsetDateTime.now()) + .stamp(OffsetDateTime.now()) + .driverVariableIds(List.of(driverVariableId)) + .valueMappingIds(valueMappingIds) + .build(); + } + + public static PropertyTrapContent createPropertyStatusTrapContent() { + return PropertyTrapContent.builder() + .ipAddress("192.168.1.1") + .deviceIndex(1) + .statusValue(0) + .statusText("OK") + .build(); + } + + public static class SNMP { + public static ResponseEvent
createResponse(OID oid, AbstractVariable value) { + if (oid == null) { + return new ResponseEvent<>(new Object(), null, null, createNullValuePDU(new OID(), Null.noSuchObject), null, 0L); + } + var responsePDU = new PDU(PDU.RESPONSE, List.of(new VariableBinding(oid, value))); + + return new ResponseEvent<>(new Object(), null, null, responsePDU, null, 0L); + } + + public static PDU createNullValuePDU(OID oid, Null value) { + return new PDU(PDU.RESPONSE, List.of(new VariableBinding(oid, value))); + } + } + +} diff --git a/src/test/java/io/gec/raw/connector/utils/TestEntityFactory.java b/src/test/java/io/gec/raw/connector/utils/TestEntityFactory.java new file mode 100755 index 0000000..6559f40 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/utils/TestEntityFactory.java @@ -0,0 +1,173 @@ +package io.gec.raw.connector.utils; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.entity.Device; +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import io.gec.raw.connector.deviceproperty.entity.DeviceProperty; +import io.gec.raw.connector.discovery.entity.DiscoveryWorkItem; +import io.gec.raw.connector.driver.entity.DriverVariable; +import io.gec.raw.connector.protocol.entity.Property; +import io.gec.raw.connector.protocol.entity.Protocol; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.variable.entity.Variable; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.UUID; + +public class TestEntityFactory { + + public static DiscoveryWorkItem createDiscoveryWorkItem(UUID id) { + DiscoveryWorkItem dwi = new DiscoveryWorkItem(); + dwi.setId(id); + dwi.setName("sampleName"); + dwi.setProtocolId(UUID.randomUUID()); + dwi.setCommDiscoveryId(UUID.randomUUID()); + dwi.setCreated(OffsetDateTime.now()); + dwi.setStamp(OffsetDateTime.now()); + dwi.setDiscoveryValues(List.of()); + return dwi; + } + + public static Variable createVariableWithoutConstraints() { + Variable variable = new Variable(); + variable.setId(UUID.randomUUID()); + variable.setDeviceId(UUID.randomUUID()); + variable.setName("Beispielname"); + variable.setDescription("Dies ist ein Beispiel"); + variable.setCreated(OffsetDateTime.now()); + variable.setStamp(OffsetDateTime.now()); + variable.setSubscriptionInterval(10); + variable.setMin(0); + variable.setMax(100); + variable.setVarType(VarTypeEnum.TYPE); + variable.setSnmpSetVarDataType(DataTypeEnum.INTEGER); + variable.setVarDataType(DataTypeEnum.INTEGER); + variable.setUnit("C"); + variable.setScale("2"); + variable.setStep("5"); + variable.setVarAccessType(AccessTypeEnum.READONLY); + variable.setVarQualityOid("0.1.0.20.1"); + variable.setValueAsIntegerOid("0.1.02.3"); + variable.setValueAsStringOid("1.4.28.4"); + variable.setCommServiceId(UUID.randomUUID()); + variable.setFunctionType(FunctionTypeEnum.VALUE); + variable.setMode(ComponentMode.PAUSE); + variable.setRestoreMode(ComponentMode.PAUSE); + + return variable; + } + + public static Variable createVariableWithConstraints(String constraints, VarTypeEnum varTypeEnum, DataTypeEnum dataTypeEnum) { + Variable variable = new Variable(); + variable.setId(UUID.randomUUID()); + variable.setDeviceId(UUID.randomUUID()); + variable.setName("TestVarWithConstraints"); + variable.setDescription("Variable with Constraints"); + variable.setCreated(OffsetDateTime.now()); + variable.setStamp(OffsetDateTime.now()); + variable.setSubscriptionInterval(10); + variable.setMin(0); + variable.setMax(100); + variable.setVarType(varTypeEnum); + variable.setVarDataType(dataTypeEnum); + variable.setUnit("C"); + variable.setSnmpSetVarDataType(dataTypeEnum); + variable.setScale("2"); + variable.setStep("5"); + variable.setVarAccessType(AccessTypeEnum.READONLY); + variable.setVarQualityOid("0.1.0.20.1"); + variable.setValueAsIntegerOid("0.1.02.3"); + variable.setValueAsStringOid("1.4.28.4"); + variable.setCommServiceId(UUID.randomUUID()); + variable.setFunctionType(FunctionTypeEnum.VALUE); + variable.setMode(ComponentMode.PAUSE); + variable.setRestoreMode(ComponentMode.PAUSE); + + variable.setConstraints(constraints); + return variable; + } + + public static DeviceProperty createProperty() { + return DeviceProperty.builder() + .id(UUID.randomUUID()) + .deviceId(UUID.randomUUID()) + .name("Prop1") + .description("Beispielbeschreibung") + .valueAsString("Hallo Welt") + .propertyClass("CLASSES") + .propertyGroup("GENERAL") + .isReadonly(true) + .valueChangeOid("1.1.1") + .valueChangeDatatype(DataTypeEnum.STRING) + .commServiceId(UUID.randomUUID()) + .subscriptionInterval(300) + .mode(ComponentMode.OPERATION) + .restoreMode(ComponentMode.OPERATION) + .build(); + } + + public static Device createDevice(UUID deviceId) { + Device device = new Device(); + device.setId(deviceId); + device.setCreated(OffsetDateTime.now()); + device.setStamp(OffsetDateTime.now()); + device.setName("Device Name"); + device.setDescription("Device Description"); + device.setType("Device Type"); + device.setDeviceURL("https://192.168.10.199"); + device.setPlantId(UUID.randomUUID()); + device.setConnectorId(UUID.randomUUID()); + device.setCommServiceId(UUID.randomUUID()); + device.setMode(ComponentMode.OPERATION); + device.setRestoreMode(ComponentMode.OPERATION); + return device; + } + + public static Property createProtocolProperty(String name, Protocol protocol) { + Property property = new Property(); + property.setId(UUID.randomUUID()); + property.setName(name); + property.setCommunicationServiceId(UUID.randomUUID()); + property.setCreated(OffsetDateTime.now()); + property.setStamp(OffsetDateTime.now()); + property.setProtocol(protocol); + return property; + } + + public static Protocol createProtocol() { + Protocol protocol = new Protocol(); + protocol.setId(UUID.randomUUID()); + protocol.setName("test Protocol"); + protocol.setCommunicationServiceId(UUID.randomUUID()); + protocol.setCreated(OffsetDateTime.now()); + protocol.setStamp(OffsetDateTime.now()); + protocol.setReserved(true); + return protocol; + } + + public static DriverVariable createDriverVariable(DataTypeEnum dataTypeEnum) { + DriverVariable driverVariable = new DriverVariable(); + driverVariable.setDescription("Description"); + driverVariable.setName("Name"); + driverVariable.setPlant_id(UUID.randomUUID()); + driverVariable.setCreated(OffsetDateTime.now()); + driverVariable.setStamp(OffsetDateTime.now()); + driverVariable.setOid(UUID.randomUUID().toString()); + driverVariable.setDataType(dataTypeEnum); + driverVariable.setDisplayFactor("10"); + driverVariable.setDisplayFormat("10"); + driverVariable.setMax("10"); + driverVariable.setMin("10"); + driverVariable.setStep("10"); + driverVariable.setIsReadOnly(true); + driverVariable.setIntervalFactor("10"); + driverVariable.setScale("10"); + driverVariable.setOid(".1.2.3"); + driverVariable.setId(UUID.randomUUID()); + driverVariable.setFunctionType(FunctionTypeEnum.VALUE); + return driverVariable; + } +} diff --git a/src/test/java/io/gec/raw/connector/utils/control/ChecksumControllerTest.java b/src/test/java/io/gec/raw/connector/utils/control/ChecksumControllerTest.java new file mode 100755 index 0000000..e9329e4 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/utils/control/ChecksumControllerTest.java @@ -0,0 +1,75 @@ +package io.gec.raw.connector.utils.control; + +import lombok.SneakyThrows; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(MockitoExtension.class) +class ChecksumControllerTest { + private static final String TEST_RESOURCES_BASE_PATH = "src/test/resources/firmware/"; + @Mock + Logger logger; + @InjectMocks + ChecksumController checksumController; + + @Test + void verifySha1_shouldReturnTrue_ifChecksumMatches() { + //given + String fileToVerify = TEST_RESOURCES_BASE_PATH + "11111111-3534-46ff-8a63-44a8dcfa3f57/example.tar"; + String expectedChecksum = "ebbe62a246ae67469057c269575d21153f67ed81"; + + //expect + assertTrue(checksumController.verifySha1(fileToVerify, expectedChecksum)); + } + + @Test + void verifySha1_shouldReturnFalse_ifChecksumDoesNotMatch() { + //given + String fileToVerify = TEST_RESOURCES_BASE_PATH + "11111111-3534-46ff-8a63-44a8dcfa3f57/example.tar"; + String expectedChecksum = "some_checksum"; + + //expect + assertFalse(checksumController.verifySha1(fileToVerify, expectedChecksum)); + } + + @Test + void verifySha1_shouldReturnFalse_ifFileNotFound() { + //given + String fileToVerify = "./non-existing-file.ext"; + + //expect + assertFalse(checksumController.verifySha1(fileToVerify, "some_checksum")); + } + + @Test + void sha1_shouldThrowIOException_ifFileNotFound() { + //given + String fileToVerify = "./non-existing-file.ext"; + + //expect + assertThrows(IOException.class, () -> checksumController.sha1(fileToVerify)); + } + + @SneakyThrows + @Test + void sha1_shouldReturnChecksum() { + //given + String fileToVerify = TEST_RESOURCES_BASE_PATH + "11111111-3534-46ff-8a63-44a8dcfa3f57/example.tar"; + + //when + var result = checksumController.sha1(fileToVerify); + + //expect + assertThat(result, is("ebbe62a246ae67469057c269575d21153f67ed81")); + } +} diff --git a/src/test/java/io/gec/raw/connector/variable/control/VariableConstraintParserTest.java b/src/test/java/io/gec/raw/connector/variable/control/VariableConstraintParserTest.java new file mode 100755 index 0000000..69d4d54 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/variable/control/VariableConstraintParserTest.java @@ -0,0 +1,287 @@ +package io.gec.raw.connector.variable.control; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(MockitoExtension.class) +class VariableConstraintParserTest { + @InjectMocks + VariableConstraintParser constraintParser; + + @Test + public void testParseMinMaxConstraint_withValidInput() { + //given + String input = "min 0, max 1, scale *1, step 1"; + + //when + Map result = constraintParser.parseMinMaxConstraint(input); + + //then + assertEquals(0, result.get("min")); + assertEquals(1, result.get("max")); + } + + @Test + public void testParseMinMaxConstraint_withDifferentValidInput() { + //given + String input = "min 10, max 100"; + + //when + Map result = constraintParser.parseMinMaxConstraint(input); + + //then + assertEquals(10, result.get("min")); + assertEquals(100, result.get("max")); + } + + @Test + public void testParseMinMaxConstraint_missingMin() { + //given + String input = "max 50, scale *2, step 5"; + + //when + Map result = constraintParser.parseMinMaxConstraint(input); + + //then + assertNull(result.get("min")); + assertEquals(50, result.get("max")); + } + + @Test + public void testParseMinMaxConstraint_missingMax() { + //given + String input = "min 5, scale *2, step 5"; + + //when + Map result = constraintParser.parseMinMaxConstraint(input); + + //then + assertEquals(5, result.get("min")); + assertNull(result.get("max")); + } + + @Test + public void testParseMinMaxConstraint_missingBothMinMax() { + //given + String input = "scale *2, step 5"; + + //when + Map result = constraintParser.parseMinMaxConstraint(input); + + //then + assertNull(result.get("min")); + assertNull(result.get("max")); + } + + @Test + public void testParseMinMaxConstraint_emptyInput() { + //when + var exception = assertThrows(IllegalArgumentException.class, () -> { + constraintParser.parseMinMaxConstraint(""); + }); + + //then + assertEquals("Constraint is empty", exception.getMessage()); + } + + @Test + public void testParseMinMaxConstraint_nullInput() { + //when + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + constraintParser.parseMinMaxConstraint(null); + }); + + //then + assertEquals("Constraint is empty", exception.getMessage()); + } + + @Test + public void testParseMinMaxConstraint_withInvalidValues() { + //given + String input = "min foo, max bar, scale *1, step 1"; + + //when + Map result = constraintParser.parseMinMaxConstraint(input); + + //then + assertNull(result.get("min")); + assertNull(result.get("max")); + } + + @Test + public void testParseMinMaxConstraint_withRAWValidInput() { + //given + String input = "integer: min 0, max 255, scale *1, step 1"; + + //when + Map result = constraintParser.parseMinMaxConstraint(input); + + //then + assertEquals(0, result.get("min")); + assertEquals(255, result.get("max")); + } + + @Test + public void testParseConstraints_Regexp() { + // given + String input = "regexp: ^([-_ a-zA-Z0-9]{0,20})$"; + + // when + String result = constraintParser.parseConstraints(input); + + // then + assertEquals("^([-_ a-zA-Z0-9]{0,20})$", result); + } + + @Test + public void testParseConstraints_Enum() { + // given + String input = "enum: 0,1,2,3"; + + // when + String result = constraintParser.parseConstraints(input); + + // then + assertEquals("0,1,2,3", result); + } + + @Test + public void testParseConstraints_RangeEnum() { + // given + String input = "enum: 0-15"; + + // when + String result = constraintParser.parseConstraints(input); + + // then + assertEquals("0-15", result); + } + + @Test + public void testParseConstraints_InvalidFormat() { + // given + String input = "invalid_format_example"; + + // when / then + Exception exception = assertThrows(IllegalArgumentException.class, () -> { + constraintParser.parseConstraints(input); + }); + assertEquals("invalid input format. Expected: 'type: ' but was invalid_format_example", exception.getMessage()); + } + + @Test + public void testParseConstraints_EmptyInput() { + // given + String input = ""; + + // when + String result = constraintParser.parseConstraints(input); + + // then + assertNull(result); + } + + @Test + public void testParseConstraints_NullInput() { + // given + String input = null; + + // when + String result = constraintParser.parseConstraints(input); + + // then + assertNull(result); + } + + @Test + public void testParseConstraints_CommaSeparated() { + // given + String input = "0,1,2,3"; + + // when + List result = constraintParser.parseEnumConstraints(input); + + // then + assertEquals(List.of(0, 1, 2, 3), result); + } + + @Test + public void testParseConstraints_Range() { + // given + String input = "0-5"; + + // when + List result = constraintParser.parseEnumConstraints(input); + + // then + assertEquals(List.of(0, 1, 2, 3, 4, 5), result); + } + + @Test + public void testParseConstraints_Mixed() { + // given + String input = "1,3-5,7,10-12"; + + // when + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + constraintParser.parseEnumConstraints(input); + }); + assertEquals("invalid input format. Expected: '1,2,3' or '0-9' but was %s".formatted(input), exception.getMessage()); + } + + + @Test + public void testParseConstraints_SingleValue() { + // given + String input = "7"; + + // when + List result = constraintParser.parseEnumConstraints(input); + + // then + assertEquals(List.of(7), result); + } + + @Test + public void testParseConstraints_EmptyString() { + // given + String input = ""; + + // when + List result = constraintParser.parseEnumConstraints(input); + + // then + assertTrue(result.isEmpty()); + } + + @Test + public void testParseConstraints_NullString() { + // given + String input = null; + + // when + List result = constraintParser.parseEnumConstraints(input); + + // then + assertTrue(result.isEmpty()); + } + + @Test + public void testParseEnumConstraints_InvalidFormat() { + // given + String input = "invalid"; + + // when & then + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + constraintParser.parseEnumConstraints(input); + }); + assertEquals("invalid input format. Expected: '1,2,3' or '0-9' but was %s".formatted(input), exception.getMessage()); + } +} diff --git a/src/test/java/io/gec/raw/connector/variable/control/VariableControllerTest.java b/src/test/java/io/gec/raw/connector/variable/control/VariableControllerTest.java new file mode 100755 index 0000000..7624764 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/variable/control/VariableControllerTest.java @@ -0,0 +1,177 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.dto.VariableResponseDTO; +import io.gec.raw.connector.rittal.helper.RittalEnumHelper; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class VariableControllerTest { + + @Mock + Logger logger; + @Mock + VariableRepository variableRepository; + @Mock + VariableHandler variableHandler; + @Mock + VariableConstraintParser constraintParser; + @Mock + RittalEnumHelper rittalEnumHelper; + @InjectMocks + VariableController variableController; + + @Test + void shouldCreateVariablesSetRequiredFields() { + // given + List variables = List.of(Variable.builder().build()); + UUID deviceId = UUID.randomUUID(); + + // when + variableController.createVariables(variables, deviceId); + + // then + assertEquals(1, variables.size()); + Variable variable = variables.get(0); + assertNotNull(variable.getCreated()); + assertNotNull(variable.getStamp()); + assertEquals(deviceId, variable.getDeviceId()); + assertEquals(ComponentMode.PAUSE, variable.getMode()); + } + + @Test + void shouldUpdateCommunicationVariableIdChangeCommServiceIdValue() { + // given + UUID communicationVariableId = UUID.randomUUID(); + UUID connectorVariableId = UUID.randomUUID(); + List variableResponseDTOs = List.of(VariableResponseDTO.builder() + .id(communicationVariableId) + .connectorVariableId(connectorVariableId) + .deviceId(UUID.randomUUID()) + .build()); + Variable variable = Variable.builder() + .build(); + when(variableRepository.findById(connectorVariableId)).thenReturn(variable); + + // when + variableController.updateCommSvcId(variableResponseDTOs); + + // then + verify(variableRepository, times(1)).findById(connectorVariableId); + assertEquals(communicationVariableId, variable.getCommServiceId()); + } + + @Test + void shouldReturnEmptyListForEmptyConstraints() { + // given & when + var result = variableController.getPossibleValues("", VarTypeEnum.COMMAND); + + // then + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @Test + void shouldReturnEmptyListForNullConstraints() { + // given & when + var result = variableController.getPossibleValues(null, VarTypeEnum.COMMAND); + + // then + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @Test + void shouldGetPossibleValuesForRangeEnumConstrain() { + // given + String constraints = "0-7"; + + // when + var result = variableController.getPossibleValues(constraints, VarTypeEnum.GSMSTATUS); + + // then + assertNotNull(result); + assertEquals(0, result.size()); + verify(constraintParser, times(1)).parseEnumConstraints(constraints); + } + + @Test + void shouldGetPossibleValuesForNormalEnumConstrain() { + // given + String constraints = "4,9"; + + // when + var result = variableController.getPossibleValues(constraints, VarTypeEnum.COMMAND); + + // then + assertNotNull(result); + assertEquals(0, result.size()); + verify(constraintParser, times(1)).parseEnumConstraints(constraints); + } + + @ParameterizedTest + @MethodSource("getModesForUpdateMode") + void shouldUpdateModeSetExpectedModes(ComponentMode currentMode, ComponentMode currentRestoreMode, ComponentMode updateMode, ComponentMode expectedMode, + ComponentMode expectedRestoreMode) { + // given + var variable = TestEntityFactory.createVariableWithoutConstraints(); + variable.setMode(currentMode); + variable.setRestoreMode(currentRestoreMode); + + // when + variableController.updateMode(variable, updateMode); + + // then + assertEquals(expectedMode, variable.getMode()); + assertEquals(expectedRestoreMode, variable.getRestoreMode()); + } + + private static Stream getModesForUpdateMode() { + return Stream.of( + of(ComponentMode.PAUSE, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.PAUSE), + of(ComponentMode.FIRMWARE_UPDATE, ComponentMode.PAUSE, ComponentMode.OPERATION, ComponentMode.OPERATION, ComponentMode.PAUSE), + of(ComponentMode.OPERATION, ComponentMode.PAUSE, ComponentMode.FIRMWARE_UPDATE, ComponentMode.FIRMWARE_UPDATE, ComponentMode.OPERATION) + ); + } + + @Test + void shouldRestoreModeThrowIllegalStateExceptionWhenVariableIsNull() { + // when & then + assertThrows(NullPointerException.class, () -> variableController.restoreMode(null)); + } + + @Test + void shouldRestoreModeUpdateModeAndLog() { + // given + Variable variable = new Variable(); + variable.setId(UUID.randomUUID()); + variable.setMode(ComponentMode.OPERATION); + variable.setRestoreMode(ComponentMode.PAUSE); + + // when + variableController.restoreMode(variable); + + // then + assertEquals(ComponentMode.PAUSE, variable.getMode()); + + } +} diff --git a/src/test/java/io/gec/raw/connector/variable/control/VariableHandlerTest.java b/src/test/java/io/gec/raw/connector/variable/control/VariableHandlerTest.java new file mode 100755 index 0000000..0d4f196 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/variable/control/VariableHandlerTest.java @@ -0,0 +1,155 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.driver.control.ValueMappingService; +import io.gec.raw.connector.utils.control.ValueHelper; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.UUID; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.nullable; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class VariableHandlerTest { + + @Mock + VariableController variableController; + @Mock + VariableValueProvider variableValueProvider; + @Mock + ValueHelper valueHelper; + @Mock + ValueMappingService valueMappingService; + @Mock + VariableValueCacheHandler variableValueCacheHandler; + @Mock + VariableMapper variableMapper; + @Mock + Logger logger; + @InjectMocks + VariableHandler variableHandler; + + private static Stream shouldHandleVariableValueGoThroughInitialValueFetchedFromDeviceSteps() { + return Stream.of( + of(ComponentMode.PAUSE, false), + of(ComponentMode.PAUSE, true), + of(ComponentMode.OPERATION, false), + of(ComponentMode.OPERATION, true) + // TODO add cases for ComponentMode.SERVICE which is not supported yet + ); + } + + @ParameterizedTest + @MethodSource + void shouldHandleVariableValueGoThroughInitialValueFetchedFromDeviceSteps(ComponentMode mode, boolean initialValueFetched) { + // given + VariableValueData variableValueData = new VariableValueData("newValue", QualityType.GOOD); + //and + Variable variable = Variable.builder() + .mode(mode) + .initialValueFetched(initialValueFetched) + .varDataType(DataTypeEnum.STRING) + .build(); + lenient().when(valueMappingService.mapValue(nullable(UUID.class), anyString())) + .thenAnswer(i -> i.getArgument(1)); + //and + UpdateVariableRequestDTO updateVariableRequestDTO = new UpdateVariableRequestDTO(); + doReturn(updateVariableRequestDTO).when(variableMapper).toUpdateVariableRequestDTO(eq(variable), eq("newValue"), any(QualityType.class)); + + // when + variableHandler.handleVariableValueFetchedFromDevice(variable, variableValueData); + + // then + verify(variableValueCacheHandler, times(1)).update(nullable(UUID.class), eq(updateVariableRequestDTO)); + assertTrue(variable.isInitialValueFetched()); + } + + private static Stream shouldVariableIsSubscribedReturnExpectedValue() { + return Stream.of( + of(ComponentMode.PAUSE, false, 300, false), + of(ComponentMode.PAUSE, true, 300, false), + of(ComponentMode.PAUSE, false, 0, false), + of(ComponentMode.PAUSE, true, 0, false), + of(ComponentMode.OPERATION, false, 300, true), + of(ComponentMode.OPERATION, true, 300, true), + of(ComponentMode.OPERATION, false, 0, false), + of(ComponentMode.OPERATION, true, 0, false) + // TODO add cases for ComponentMode.SERVICE which is not supported yet + ); + } + + @ParameterizedTest + @MethodSource + void shouldVariableIsSubscribedReturnExpectedValue(ComponentMode mode, boolean initialValueFetched, int subscriptionInterval, boolean expectedResult) { + // given + Variable variable = Variable.builder() + .mode(mode) + .initialValueFetched(initialValueFetched) + .subscriptionInterval(subscriptionInterval) + .build(); + + // when + boolean result = variable.isSubscribed(); + + // then + assertEquals(expectedResult, result); + } + + private static Stream shouldValueRequiresScalingReturnExpectedFlag() { + return Stream.of( + of(DataTypeEnum.INTEGER, "1", true), + of(DataTypeEnum.NUMERIC, "1", true), + of(DataTypeEnum.FLOAT, "1", true), + of(DataTypeEnum.INTEGER, null, false), + of(DataTypeEnum.NUMERIC, null, false), + of(DataTypeEnum.FLOAT, null, false), + of(DataTypeEnum.INTEGER, "", false), + of(DataTypeEnum.NUMERIC, "", false), + of(DataTypeEnum.FLOAT, "", false), + of(DataTypeEnum.INTEGER, " ", false), + of(DataTypeEnum.NUMERIC, " ", false), + of(DataTypeEnum.STRING, "someValue", false), + of(DataTypeEnum.ANALOGINT, "1", false), + of(DataTypeEnum.STATUSINT, "1", false) + ); + + } + + @ParameterizedTest + @MethodSource + void shouldValueRequiresScalingReturnExpectedFlag(DataTypeEnum dataTypeEnum, String value, boolean requiresScaling) { + // given + Variable variable = Variable.builder() + .varDataType(dataTypeEnum) + .build(); + + // when + boolean result = variableHandler.valueRequiresScaling(variable, value); + + // then + assertEquals(requiresScaling, result); + } +} diff --git a/src/test/java/io/gec/raw/connector/variable/control/VariableMapperTest.java b/src/test/java/io/gec/raw/connector/variable/control/VariableMapperTest.java new file mode 100755 index 0000000..7dfbb8e --- /dev/null +++ b/src/test/java/io/gec/raw/connector/variable/control/VariableMapperTest.java @@ -0,0 +1,261 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.device.entity.AccessTypeEnum; +import io.gec.raw.connector.device.entity.DataTypeEnum; +import io.gec.raw.connector.device.enums.FunctionTypeEnum; +import io.gec.raw.connector.rittal.enums.IRittalEnum; +import io.gec.raw.connector.rittal.enums.ValuesSnmpCommand; +import io.gec.raw.connector.rittal.helper.RittalEnumHelper; +import io.gec.raw.connector.utils.TestEntityFactory; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.dto.VariableDTO; +import io.gec.raw.connector.variable.dto.VariableEnumConstraintDTO; +import io.gec.raw.connector.variable.entity.VarTypeEnum; +import io.gec.raw.connector.variable.entity.Variable; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class VariableMapperTest { + @Mock + IRittalEnum rittalEnum; + @Mock + RittalEnumHelper rittalEnumHelper; + @Mock + Logger logger; + @Mock + VariableController variableController; + @InjectMocks + VariableMapper variableMapper; + + @Test + void toVariableDTO_WithEnumConstraint_ReturnsVariableWithEnumConstraintDTOs() { + //given + var constrain = "1,2"; + var variable = TestEntityFactory.createVariableWithConstraints(constrain, VarTypeEnum.COMMAND, DataTypeEnum.ENUM); + //and + List enumList = List.of(ValuesSnmpCommand.ON, ValuesSnmpCommand.OFF); + when(rittalEnumHelper.isVarTypeSupported(variable.getVarType())).thenReturn(true); + when(variableController.getPossibleValues(any(), any())).thenReturn(enumList); + + //when + var result = variableMapper.toVariableDTO(variable); + + //then + assertNotNull(result.getEnumConstraints()); + assertEquals(2, result.getEnumConstraints().size()); + assertTrue(isEnumConstraintPresent(result.getEnumConstraints(), ValuesSnmpCommand.ON)); + assertTrue(isEnumConstraintPresent(result.getEnumConstraints(), ValuesSnmpCommand.OFF)); + + assertEquals(enumList.size(), result.getEnumConstraints().size()); + assertEquals(null, result.getRegExp()); + assertEquals(VarTypeEnum.COMMAND, result.getVarType()); + assertEquals(DataTypeEnum.ENUM, result.getVarDataType()); + } + + private boolean isEnumConstraintPresent(List enumConstraints, ValuesSnmpCommand value) { + for (VariableEnumConstraintDTO enumConstraint : enumConstraints) { + if (enumConstraint.getValue() == value.getValue()) { + return true; + } + } + return false; + } + + @Test + void toVariableDTO_WithNoConstraint_ReturnsVariableWithNoEnumConstraintDTOs() { + // given + var variable = TestEntityFactory.createVariableWithConstraints("", VarTypeEnum.COMMAND, DataTypeEnum.ENUM); + // and + when(rittalEnumHelper.isVarTypeSupported(variable.getVarType())).thenReturn(true); + when(variableController.getPossibleValues(any(), any())).thenReturn(List.of()); + + // when + var result = variableMapper.toVariableDTO(variable); + + // then + assertNotNull(result); + assertNotNull(result.getEnumConstraints()); + assertNull(result.getRegExp()); + assertEquals(List.of(), result.getEnumConstraints()); + + } + + @Test + void toVariableDTO_WithInvalidConstraint_ThrowsNumberFormatException() { + // Given + var variable = TestEntityFactory.createVariableWithConstraints("1#2", VarTypeEnum.COMMAND, DataTypeEnum.ENUM); + when(rittalEnumHelper.isVarTypeSupported(variable.getVarType())).thenReturn(true); + when(variableController.getPossibleValues(any(), any())).thenThrow(NumberFormatException.class); + + // when and then + assertThrows(NumberFormatException.class, () -> variableMapper.toVariableDTO(variable)); + } + + @Test + void toVariableDTO_WithDataTypeString_ReturnsVariableWithEnumConstraintDTOsNull() { + // given + var variable = TestEntityFactory.createVariableWithConstraints("", VarTypeEnum.DESCRIPTION, DataTypeEnum.STRING); + + // when + var result = variableMapper.toVariableDTO(variable); + + // then + assertNotNull(result); + assertNull(result.getEnumConstraints()); + assertNotNull(result.getRegExp()); + assertEquals(variable.getConstraints(), result.getRegExp()); + } + + @Test + void toVariableEnumConstraintDTO_ReturnsCorrectDTO() { + // Given + when(rittalEnum.getValue()).thenReturn(1); + when(rittalEnum.getDescription()).thenReturn("Example Description"); + + // When + VariableEnumConstraintDTO result = variableMapper.toVariableEnumConstraintDTO(rittalEnum); + + // Then + assertNotNull(result); + assertEquals(rittalEnum.getValue(), result.getValue()); + assertEquals(rittalEnum.getDescription(), result.getDisplayName()); + } + + @Test + void toVariableEnumConstraintDTOList_ReturnsCorrectDTOList() { + // Given + + when(rittalEnum.getValue()).thenReturn(2); + when(rittalEnum.getDescription()).thenReturn("Example Description 2"); + + List mockIRittalEnums = List.of(rittalEnum); + + // When + List resultList = variableMapper.toVariableEnumConstraintDTOList(mockIRittalEnums); + + // Then + assertNotNull(resultList); + assertEquals(1, resultList.size()); + assertEquals(rittalEnum.getValue(), resultList.get(0).getValue()); + assertEquals(rittalEnum.getDescription(), resultList.get(0).getDisplayName()); + } + + @Test + void shouldToVariableDTOsReturnEmptyList() { + // given & when + List result = variableMapper.toVariableDTOs(List.of()); + + // then + assertTrue(result.isEmpty()); + } + + @Test + void shouldToVariableDTOsReturnMappedElement() { + // given + var variableId = UUID.randomUUID(); + var commSvcVariableId = UUID.randomUUID(); + var variable = Variable.builder() + .id(variableId) + .commServiceId(commSvcVariableId) + .name("name") + .description("description") + .deviceId(UUID.randomUUID()) + .min(1) + .max(2) + .varAccessType(AccessTypeEnum.READONLY) + .varType(VarTypeEnum.COMMAND) + .unit("unit") + .varDataType(DataTypeEnum.ENUM) + .scale(1) + .step(1) + .varAccessType(AccessTypeEnum.READONLY) + .subscriptionInterval(10) + .functionType(FunctionTypeEnum.VALUE) + .mode(ComponentMode.PAUSE) + .constraints("constraints") + .build(); + + // when + var results = variableMapper.toVariableDTOs(List.of(variable)); + var firstVariableDTO = results.getFirst(); + + // then + assertEquals(1, results.size()); + assertEquals(variableId, firstVariableDTO.getConnectorVariableId()); + assertEquals(commSvcVariableId, firstVariableDTO.getId()); + assertEquals("name", firstVariableDTO.getName()); + assertEquals("description", firstVariableDTO.getDescription()); + assertEquals(variable.getDeviceId(), firstVariableDTO.getDeviceId()); + assertEquals(1, firstVariableDTO.getMin()); + assertEquals(2, firstVariableDTO.getMax()); + assertTrue(firstVariableDTO.isReadonly()); + assertTrue(firstVariableDTO.isSystemDefined()); + assertEquals(VarTypeEnum.COMMAND, firstVariableDTO.getVarType()); + assertEquals("unit", firstVariableDTO.getUnit()); + assertEquals(DataTypeEnum.ENUM, firstVariableDTO.getVarDataType()); + assertEquals(1, firstVariableDTO.getScale()); + assertEquals(1, firstVariableDTO.getStep()); + assertEquals(AccessTypeEnum.READONLY, firstVariableDTO.getVarAccessType()); + assertEquals(10, firstVariableDTO.getInterval()); + assertEquals(FunctionTypeEnum.VALUE, firstVariableDTO.getFunctionType()); + assertEquals(ComponentMode.PAUSE, firstVariableDTO.getMode()); + } + + @Test + void shouldToVariableDTOsReturnEmptyListWhenNullPassed() { + // given & when + var results = variableMapper.toVariableDTOs(null); + + // then + assertTrue(results.isEmpty()); + } + + @Test + void shouldReturnVariableValueDataWithCorrectValues() { + // given + String value = "testValue"; + QualityType qualityType = QualityType.GOOD; + + // when + VariableValueData result = variableMapper.toVariableValueData(value, qualityType); + + // then + assertNotNull(result); + assertEquals(value, result.value()); + assertEquals(qualityType, result.qualityType()); + } + + @Test + void shouldThrowExceptionWhenValueIsNull() { + // given + QualityType qualityType = QualityType.GOOD; + + // when & then + assertThrows(IllegalArgumentException.class, () -> variableMapper.toVariableValueData(null, qualityType)); + } + + @Test + void shouldThrowExceptionWhenValueIsEmpty() { + // given + String emptyValue = ""; + QualityType qualityType = QualityType.GOOD; + + // when & then + assertThrows(IllegalArgumentException.class, () -> variableMapper.toVariableValueData(emptyValue, qualityType)); + } + +} diff --git a/src/test/java/io/gec/raw/connector/variable/control/VariableValueBulkSenderTest.java b/src/test/java/io/gec/raw/connector/variable/control/VariableValueBulkSenderTest.java new file mode 100755 index 0000000..4c17c14 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/variable/control/VariableValueBulkSenderTest.java @@ -0,0 +1,216 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationServiceController; +import io.gec.raw.connector.config.control.VariableBulkValueSendingConfig; +import io.gec.raw.connector.statistic.control.StatisticCollectorController; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import org.jboss.logging.Logger; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.Duration; +import java.time.OffsetDateTime; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class VariableValueBulkSenderTest { + + @Mock + Logger logger; + @Mock + StatisticCollectorController statisticCollectorController; + @Mock + CommunicationServiceController communicationServiceController; + @Mock + VariableBulkValueSendingConfig variableBulkValueSendingConfig; + + @InjectMocks + VariableValueBulkSender variableValueBulkSender; + + @AfterEach + void setUp() { + variableValueBulkSender.sendingQueue.clear(); + variableValueBulkSender.firstItemUpdate = null; + variableValueBulkSender.lastItemUpdate = null; + } + + @Test + void addToQueue_shouldAddItemToQueue_andNotTriggerSendingIfQueueIsNotFull() { + // given + willReturn(2).given(variableBulkValueSendingConfig).maxQueueSize(); + willReturn(Duration.ofSeconds(10)).given(variableBulkValueSendingConfig).maxDelayForFirstValue(); + willReturn(Duration.ofSeconds(5)).given(variableBulkValueSendingConfig).maxWaitTimeForNextValue(); + UpdateVariableRequestDTO dto = TestDTOFactory.createUpdateVariableRequestDTO(); + assertTrue(variableValueBulkSender.isQueueEmpty()); + + // when + variableValueBulkSender.addToQueue(dto); + + // then + assertFalse(variableValueBulkSender.isQueueEmpty()); + } + + @Test + void addToQueue_shouldAddItemToQueue_andTriggerSendingIfQueueIsFull() { + // given + willReturn(1).given(variableBulkValueSendingConfig).maxQueueSize(); + UpdateVariableRequestDTO dto = TestDTOFactory.createUpdateVariableRequestDTO(); + assertTrue(variableValueBulkSender.isQueueEmpty()); + + // when + variableValueBulkSender.addToQueue(dto); + + // then + verify(communicationServiceController, times(1)).updateVariableValues(any()); + assertTrue(variableValueBulkSender.isQueueEmpty()); + } + + @Test + void shouldTriggerSending_shouldReturnFalse_whenQueueIsEmpty() { + // given + // Queue is empty by default + + // when + boolean result = variableValueBulkSender.shouldTriggerSending(); + + // then + assertFalse(result); + } + + @Test + void shouldTriggerSending_shouldReturnTrue_whenQueueSizeExceeded() { + // given + willReturn(1).given(variableBulkValueSendingConfig).maxQueueSize(); + UpdateVariableRequestDTO dto = TestDTOFactory.createUpdateVariableRequestDTO(); + variableValueBulkSender.sendingQueue.put(dto.getVariableId(), dto); + + // when + boolean result = variableValueBulkSender.shouldTriggerSending(); + + // then + assertTrue(result); + } + + @Test + void shouldTriggerSending_shouldReturnTrue_whenFirstItemDelayExceeded() { + // given + willReturn(3).given(variableBulkValueSendingConfig).maxQueueSize(); + willReturn(Duration.ofSeconds(10)).given(variableBulkValueSendingConfig).maxDelayForFirstValue(); + UpdateVariableRequestDTO dto1 = TestDTOFactory.createUpdateVariableRequestDTO(); + dto1.setUpdateTime(OffsetDateTime.now().minusSeconds(15)); + variableValueBulkSender.sendingQueue.put(dto1.getVariableId(), dto1); + variableValueBulkSender.updateTimeIndicators(dto1.getUpdateTime()); + UpdateVariableRequestDTO dto2 = TestDTOFactory.createUpdateVariableRequestDTO(); + variableValueBulkSender.sendingQueue.put(dto2.getVariableId(), dto2); + variableValueBulkSender.updateTimeIndicators(dto2.getUpdateTime()); + + // when + boolean result = variableValueBulkSender.shouldTriggerSending(); + + // then + assertTrue(result); + } + + @Test + void shouldTriggerSending_shouldReturnTrue_whenLastItemDelayExceeded() { + // given + willReturn(3).given(variableBulkValueSendingConfig).maxQueueSize(); + willReturn(Duration.ofSeconds(10)).given(variableBulkValueSendingConfig).maxDelayForFirstValue(); + willReturn(Duration.ofSeconds(5)).given(variableBulkValueSendingConfig).maxWaitTimeForNextValue(); + UpdateVariableRequestDTO dto1 = TestDTOFactory.createUpdateVariableRequestDTO(); + variableValueBulkSender.sendingQueue.put(dto1.getVariableId(), dto1); + variableValueBulkSender.updateTimeIndicators(dto1.getUpdateTime()); + UpdateVariableRequestDTO dto2 = TestDTOFactory.createUpdateVariableRequestDTO(); + dto2.setUpdateTime(OffsetDateTime.now().minusSeconds(6)); + variableValueBulkSender.sendingQueue.put(dto2.getVariableId(), dto2); + variableValueBulkSender.updateTimeIndicators(dto2.getUpdateTime()); + + // when + boolean result = variableValueBulkSender.shouldTriggerSending(); + + // then + assertTrue(result); + } + + @Test + void scheduledSend_shouldNotSendData_whenQueueIsEmpty() { + // given + //queue empty by default + + // when + variableValueBulkSender.scheduledSend(); + + // then + verify(communicationServiceController, never()).updateVariableValues(anyList()); + } + + @Test + void scheduledSend_shouldNotSendData_whenSendingNotTriggered_whenUpdateTimeIndicatorsAreNull() { + // when + variableValueBulkSender.scheduledSend(); + + // then + verify(communicationServiceController, never()).updateVariableValues(anyList()); + } + + @Test + void scheduledSend_shouldNotSendData_whenSendingNotTriggered_whenUpdateTimeIndicatorsAreNotNull() { + // given + willReturn(3).given(variableBulkValueSendingConfig).maxQueueSize(); + willReturn(Duration.ofSeconds(10)).given(variableBulkValueSendingConfig).maxDelayForFirstValue(); + willReturn(Duration.ofSeconds(5)).given(variableBulkValueSendingConfig).maxWaitTimeForNextValue(); + UpdateVariableRequestDTO dto1 = TestDTOFactory.createUpdateVariableRequestDTO(); + variableValueBulkSender.sendingQueue.put(dto1.getVariableId(), dto1); + variableValueBulkSender.updateTimeIndicators(dto1.getUpdateTime()); + UpdateVariableRequestDTO dto2 = TestDTOFactory.createUpdateVariableRequestDTO(); + variableValueBulkSender.sendingQueue.put(dto2.getVariableId(), dto2); + variableValueBulkSender.updateTimeIndicators(dto2.getUpdateTime()); + + // when + variableValueBulkSender.scheduledSend(); + + // then + verify(communicationServiceController, never()).updateVariableValues(anyList()); + } + + @Test + void scheduledSend_shouldSendData_ifShouldTriggerSendingReturnsTrue() { + // given + willReturn(3).given(variableBulkValueSendingConfig).maxQueueSize(); + willReturn(Duration.ofSeconds(10)).given(variableBulkValueSendingConfig).maxDelayForFirstValue(); + willReturn(Duration.ofSeconds(5)).given(variableBulkValueSendingConfig).maxWaitTimeForNextValue(); + UpdateVariableRequestDTO dto1 = TestDTOFactory.createUpdateVariableRequestDTO(); + variableValueBulkSender.sendingQueue.put(dto1.getVariableId(), dto1); + variableValueBulkSender.updateTimeIndicators(dto1.getUpdateTime()); + UpdateVariableRequestDTO dto2 = TestDTOFactory.createUpdateVariableRequestDTO(); + dto2.setUpdateTime(OffsetDateTime.now().minusSeconds(10)); //force exceeding max wait time for next value + variableValueBulkSender.sendingQueue.put(dto2.getVariableId(), dto2); + variableValueBulkSender.updateTimeIndicators(dto2.getUpdateTime()); + + // when + variableValueBulkSender.scheduledSend(); + + // then + ArgumentCaptor> argumentCaptor = ArgumentCaptor.forClass(List.class); + verify(communicationServiceController, times(1)).updateVariableValues(argumentCaptor.capture()); + List capturedArgument = argumentCaptor.getValue(); + assertThat(capturedArgument, containsInAnyOrder(dto1, dto2)); + } +} diff --git a/src/test/java/io/gec/raw/connector/variable/control/VariableValueCachedServiceIT.java b/src/test/java/io/gec/raw/connector/variable/control/VariableValueCachedServiceIT.java new file mode 100755 index 0000000..0010680 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/variable/control/VariableValueCachedServiceIT.java @@ -0,0 +1,180 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.quarkus.test.InjectMock; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@QuarkusTest +class VariableValueCachedServiceIT { + + @InjectMock + VariableValueBulkSender variableValueBulkSender; + @Inject + VariableValueCacheHandler variableValueCacheHandler; + + @Test + void getCachedValue_shouldReturnNull_whenVariableNotFoundInCache() { + // given + var variableId = UUID.randomUUID(); + + // when + UpdateVariableRequestDTO result = variableValueCacheHandler.getCachedValue(variableId); + + // then + assertNull(result); + } + + + @Test + void getCachedValue_shouldReturnVariableValue_whenVariableFoundInCache() { + // given + var variableId = UUID.randomUUID(); + UpdateVariableRequestDTO dto = new UpdateVariableRequestDTO(); + dto.setVariableId(variableId); + dto.setValue("value1"); + variableValueCacheHandler.update(variableId, dto); + + // when + UpdateVariableRequestDTO result = variableValueCacheHandler.getCachedValue(variableId); + + // then + assertEquals(result, dto); + } + + @Test + void update_shouldUpdateCachedValue_whenNewValueProvided() { + // given + var variableId = UUID.randomUUID(); + UpdateVariableRequestDTO dto1 = new UpdateVariableRequestDTO(); + dto1.setVariableId(variableId); + dto1.setValue("value1"); + variableValueCacheHandler.update(variableId, dto1); + //and + UpdateVariableRequestDTO dto2 = new UpdateVariableRequestDTO(); + dto2.setVariableId(variableId); + dto2.setValue("value2"); + variableValueCacheHandler.update(variableId, dto2); + + // when + var result = variableValueCacheHandler.getCachedValue(variableId); + + // then + assertEquals(result, dto2); + } + + @Test + void update_shouldUpdateCachedValue_callAddToBulkQueueOnEveryNewValue() { + // given + var variableId = UUID.randomUUID(); + UpdateVariableRequestDTO dto1 = new UpdateVariableRequestDTO(); + dto1.setVariableId(variableId); + dto1.setValue("value1"); + variableValueCacheHandler.update(variableId, dto1); + //and + UpdateVariableRequestDTO dto2 = new UpdateVariableRequestDTO(); + dto2.setVariableId(variableId); + dto2.setValue("value2"); + variableValueCacheHandler.update(variableId, dto2); + //and + UpdateVariableRequestDTO dto3 = new UpdateVariableRequestDTO(); + dto3.setVariableId(variableId); + dto3.setValue("value2"); + variableValueCacheHandler.update(variableId, dto3); + + // when + variableValueCacheHandler.getCachedValue(variableId); + + // then + verify(variableValueBulkSender, times(1)).addToQueue(dto1); + verify(variableValueBulkSender, times(1)).addToQueue(dto2); + } + + @Test + void update_shouldUpdateCacheAndAddToQueue_whenValueChangesFromNotNullToNull() { + // given + var variableId = UUID.randomUUID(); + UpdateVariableRequestDTO dto1 = new UpdateVariableRequestDTO(); + dto1.setVariableId(variableId); + dto1.setValue("value1"); + variableValueCacheHandler.update(variableId, dto1); + //and + UpdateVariableRequestDTO dto2 = new UpdateVariableRequestDTO(); + dto2.setVariableId(variableId); + dto2.setValue(null); + variableValueCacheHandler.update(variableId, dto2); + + // when + var result = variableValueCacheHandler.getCachedValue(variableId); + + // then + verify(variableValueBulkSender, times(1)).addToQueue(dto1); + verify(variableValueBulkSender, times(1)).addToQueue(dto2); + assertEquals(result, dto2); + } + + @Test + void update_shouldUpdateCacheAndAddToQueue_whenValueChangesFromNullToNotNull() { + // given + var variableId = UUID.randomUUID(); + UpdateVariableRequestDTO dto1 = new UpdateVariableRequestDTO(); + dto1.setVariableId(variableId); + dto1.setValue(null); + variableValueCacheHandler.update(variableId, dto1); + //and + UpdateVariableRequestDTO dto2 = new UpdateVariableRequestDTO(); + dto2.setVariableId(variableId); + dto2.setValue("value2"); + variableValueCacheHandler.update(variableId, dto2); + + // when + var result = variableValueCacheHandler.getCachedValue(variableId); + + // then + verify(variableValueBulkSender, times(1)).addToQueue(dto1); + verify(variableValueBulkSender, times(1)).addToQueue(dto2); + assertEquals(result, dto2); + } + + @Test + void removeFromCache_shouldRemoveExistingValue() { + // given + var variableId = UUID.randomUUID(); + UpdateVariableRequestDTO dto = new UpdateVariableRequestDTO(); + dto.setVariableId(variableId); + dto.setValue("value1"); + variableValueCacheHandler.update(variableId, dto); + //and + UpdateVariableRequestDTO resultBeforeInvalidate = variableValueCacheHandler.getCachedValue(variableId); + assertEquals(dto, resultBeforeInvalidate); + + // when + variableValueCacheHandler.removeFromCache(List.of(variableId)); + + // then + UpdateVariableRequestDTO resultAfterInvalidate = variableValueCacheHandler.getCachedValue(variableId); + assertNull(resultAfterInvalidate); + } + + @Test + void removeFromCache_shouldNotFailIfVariableNotFoundInCache() { + // given + var variableId = UUID.randomUUID(); + + // when + variableValueCacheHandler.removeFromCache(List.of(variableId)); + + // then + UpdateVariableRequestDTO resultAfterInvalidate = variableValueCacheHandler.getCachedValue(variableId); + assertNull(resultAfterInvalidate); + } +} diff --git a/src/test/java/io/gec/raw/connector/variable/control/VariableValueTaskSchedulerIT.java b/src/test/java/io/gec/raw/connector/variable/control/VariableValueTaskSchedulerIT.java new file mode 100755 index 0000000..3a3f813 --- /dev/null +++ b/src/test/java/io/gec/raw/connector/variable/control/VariableValueTaskSchedulerIT.java @@ -0,0 +1,137 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.communicationservice.control.CommunicationService; +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.driver.control.DeviceDriverServiceClient; +import io.gec.raw.connector.snmp.common.control.SnmpProvider; +import io.gec.raw.connector.subscription.control.ScheduledTaskService; +import io.gec.raw.connector.utils.IntegrationTestHelper; +import io.gec.raw.connector.utils.TestClassUtil; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.variable.domain.VariableValueScheduledTask; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.variable.dto.UpdateVariableRequestDTO; +import io.gec.raw.connector.variable.dto.VarQuality; +import io.gec.raw.connector.variable.entity.Variable; +import io.quarkus.test.InjectMock; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.snmp4j.Snmp; +import org.snmp4j.smi.Integer32; +import org.snmp4j.smi.OctetString; + +import java.io.IOException; +import java.util.concurrent.ScheduledExecutorService; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.of; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +@QuarkusTest +class VariableValueTaskSchedulerIT { + private static final String RITTAL_TEST_VARIABLE_NAME = "Temperature.Value"; + private static final String DRIVER_TEST_VARIABLE_NAME = "DiskStatus"; + + @Inject + IntegrationTestHelper integrationTestHelper; + @Inject + VariableRepository variableRepository; + @Inject + VariableValueTaskScheduler variableValueTaskScheduler; + @InjectMock + ScheduledTaskService scheduledTaskService; + @InjectMock + SnmpProvider snmpProvider; + @Mock + ScheduledExecutorService scheduledExecutor; + @InjectMock + VariableValueBulkSender variableValueBulkSender; + @InjectMock + @RestClient + CommunicationService communicationService; + @InjectMock + @RestClient + DeviceDriverServiceClient deviceDriverServiceClient; + + @BeforeEach + void beforeEach() { + TestClassUtil.setPrivateField(ScheduledTaskService.class, scheduledTaskService, "scheduledExecutor", scheduledExecutor); + integrationTestHelper.setupTestEnvironment(); + } + + @AfterEach + void afterEach() { + integrationTestHelper.cleanupTestEnvironment(); + } + + @ParameterizedTest + @MethodSource("getExecuteTaskVariableExpectedData") + void shouldExecuteTask_runTask_variableExpectedResult(String variableName, ComponentMode mode, String snmpGetValue, QualityType expectedQualityType, String expectedValue) + throws IOException { + // given + var variable = setupVariable(variableName, mode); + // and mock SNMP responses + var valueResponse = TestDTOFactory.SNMP.createResponse(variable.getOidValueAsStringOid(), new OctetString(snmpGetValue)); + var qualityResponse = TestDTOFactory.SNMP.createResponse(variable.getOidVarQualityOid(), new Integer32(VarQuality.OK.getValue())); + var snmpMock = mock(Snmp.class); + when(snmpProvider.getSnmp(any())).thenReturn(snmpMock); + when(snmpMock.get(any(), any())) + .thenReturn(valueResponse) + .thenReturn(qualityResponse); + + // when + variableValueTaskScheduler.executeTask(variable); + + // then + var taskCaptor = ArgumentCaptor.forClass(VariableValueScheduledTask.class); + verify(scheduledTaskService).executeTaskOnce(taskCaptor.capture()); + var task = taskCaptor.getValue(); + assertDoesNotThrow(task::run); + var dtoCaptor = ArgumentCaptor.forClass(UpdateVariableRequestDTO.class); + verify(variableValueBulkSender).addToQueue(dtoCaptor.capture()); + var requestDTO = dtoCaptor.getValue(); + assertEquals(variable.getId(), requestDTO.getVariableId()); + assertEquals(expectedValue, requestDTO.getValue()); + assertEquals(expectedQualityType, requestDTO.getQualityType()); + assertEquals(variable.getCommServiceId(), requestDTO.getCommunicationServiceVariableId()); + } + + @Transactional + Variable setupVariable(String variableName, ComponentMode mode) { + var variable = variableRepository.find("name = ?1", variableName).firstResult(); + variable.setMode(mode); + return variable; + } + + private static Stream getExecuteTaskVariableExpectedData() { + return Stream.of( + of(RITTAL_TEST_VARIABLE_NAME, ComponentMode.PAUSE, "3300", QualityType.PAUSE, "33.0"), + of(RITTAL_TEST_VARIABLE_NAME, ComponentMode.PAUSE, "", QualityType.PAUSE, ""), + of(RITTAL_TEST_VARIABLE_NAME, ComponentMode.OPERATION, "3300", QualityType.GOOD, "33.0"), + of(RITTAL_TEST_VARIABLE_NAME, ComponentMode.OPERATION, "", QualityType.GOOD, ""), + of(DRIVER_TEST_VARIABLE_NAME, ComponentMode.PAUSE, "1", QualityType.PAUSE, "1"), + of(DRIVER_TEST_VARIABLE_NAME, ComponentMode.PAUSE, "2", QualityType.PAUSE, "4"), // Mapped value, see {@link TestDTOFactory#createSynologyDeviceDriverDTO} + of(DRIVER_TEST_VARIABLE_NAME, ComponentMode.PAUSE, "3", QualityType.PAUSE, "100"), // Mapped value + of(DRIVER_TEST_VARIABLE_NAME, ComponentMode.PAUSE, "", QualityType.PAUSE, ""), + of(DRIVER_TEST_VARIABLE_NAME, ComponentMode.OPERATION, "1", QualityType.GOOD, "1"), + of(DRIVER_TEST_VARIABLE_NAME, ComponentMode.OPERATION, "2", QualityType.GOOD, "4"), // Mapped value + of(DRIVER_TEST_VARIABLE_NAME, ComponentMode.OPERATION, "3", QualityType.GOOD, "100"), // Mapped value + of(DRIVER_TEST_VARIABLE_NAME, ComponentMode.OPERATION, "", QualityType.GOOD, "") + ); + } +} diff --git a/src/test/java/io/gec/raw/connector/variable/control/VariableValueTaskSchedulerTest.java b/src/test/java/io/gec/raw/connector/variable/control/VariableValueTaskSchedulerTest.java new file mode 100755 index 0000000..c7c81fe --- /dev/null +++ b/src/test/java/io/gec/raw/connector/variable/control/VariableValueTaskSchedulerTest.java @@ -0,0 +1,165 @@ +package io.gec.raw.connector.variable.control; + +import io.gec.raw.connector.componentmode.dto.ComponentMode; +import io.gec.raw.connector.variable.dto.QualityType; +import io.gec.raw.connector.subscription.control.ScheduledTaskService; +import io.gec.raw.connector.utils.TestDTOFactory; +import io.gec.raw.connector.variable.domain.VariableValueData; +import io.gec.raw.connector.variable.domain.VariableValueScheduledTask; +import io.gec.raw.connector.variable.entity.Variable; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class VariableValueTaskSchedulerTest { + + @Mock + ScheduledTaskService scheduledTaskService; + @Mock + VariableValueProvider variableValueProvider; + @Mock + VariableController variableController; + @Mock + VariableHandler variableHandler; + @InjectMocks + VariableValueTaskScheduler variableValueTaskScheduler; + + @Test + void shouldScheduleTask_subscribedEntity_schedulesTask() { + // given + var variableId = UUID.randomUUID(); + var variable = Variable.builder() + .id(variableId) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + + // when + variableValueTaskScheduler.scheduleTask(variable); + + // then + verify(scheduledTaskService, times(1)).scheduleTask(any(VariableValueScheduledTask.class)); + } + + @Test + void shouldScheduleTask_unsubscribedEntity_executesActionAndRemovesTask() { + // given + var variableId = UUID.randomUUID(); + var variable = Variable.builder() + .id(variableId) + .subscriptionInterval(10) + .initialValueFetched(true) + .mode(ComponentMode.PAUSE) + .build(); + + // when + variableValueTaskScheduler.scheduleTask(variable); + + // then + verify(scheduledTaskService, times(1)).executeActionAndRemoveTaskIfExists(any(VariableValueScheduledTask.class)); + } + + @Test + void shouldScheduleTasks_schedulesEachTask() { + // given + var variable1 = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var variable2 = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + + var variables = List.of(variable1, variable2); + + // when + variableValueTaskScheduler.scheduleTasks(variables); + + // then + verify(scheduledTaskService, times(2)).scheduleTask(any(VariableValueScheduledTask.class)); + } + + @Test + void shouldExecuteTask_executesScheduledTaskOnce() { + // given + var variable = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + + // when + variableValueTaskScheduler.executeTask(variable); + + // then + verify(scheduledTaskService, times(1)).executeTaskOnce(any(VariableValueScheduledTask.class)); + } + + @Test + void shouldResetNextExecutionInterval_resetsInterval() { + // given + var variable = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + + // when + variableValueTaskScheduler.resetNextExecutionInterval(variable); + + // then + verify(scheduledTaskService, times(1)).resetNextExecutionInterval(variable); + } + + @Test + void shouldCreateTaskData() { + // given + var variableId = UUID.randomUUID(); + var variable = Variable.builder() + .id(variableId) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + when(variableController.findById(variableId)).thenReturn(variable); + + // when + variableValueTaskScheduler.createTaskData(variableId); + + // then + verify(variableController, times(1)).findById(variableId); + verify(variableValueProvider, times(1)).createSnmpMessageTaskData(variable); + } + + @Test + void shouldRunTaskAction() { + // given + var variable = Variable.builder() + .id(UUID.randomUUID()) + .subscriptionInterval(10) + .mode(ComponentMode.OPERATION) + .build(); + var taskData = TestDTOFactory.createVariableSnmpMessageTaskData(variable); + // and + var variableValueData = new VariableValueData("VariableValue", QualityType.GOOD); + when(variableValueProvider.executeSnmpMessageTask(taskData)).thenReturn(variableValueData); + + // when + variableValueTaskScheduler.runTask(taskData); + + // then + verify(variableValueProvider, times(1)).executeSnmpMessageTask(taskData); + verify(variableHandler, times(1)).handleVariableValueFetchedFromDevice(variable, variableValueData); + } +} diff --git a/src/test/resources/Logging.cmc3 b/src/test/resources/Logging.cmc3 new file mode 100755 index 0000000..0461762 --- /dev/null +++ b/src/test/resources/Logging.cmc3 @@ -0,0 +1,3487 @@ +========================== Logging-Information ======================= + +System-Name : PDU MAIN Controller changed +System-Location : Limburg Office +System-Contact : Not me +Serial-Number : 34604114 +IPv4-Address : 192.168.10.199 +IPv6-Address 1 : +IPv6-Address 2 : +IPv6-Addr. Auto : +IPv6-Addr. Local : fe80::2676:25ff:fe61:11c9/64 + +Date / Time : 2024-02-01, 11:28:42 + + Date / Time Msg-ID Text +------------------------------------------------------------------------ +2023-11-26/02:30:31 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/02:30:32 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/02:31:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/02:31:11 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/02:31:18 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/02:31:18 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/02:33:21 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/02:33:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/02:33:44 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/02:33:45 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/02:34:21 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/02:34:21 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/02:34:30 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/02:34:30 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/02:35:23 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/02:35:23 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/02:36:06 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/02:36:07 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/02:36:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/02:36:31 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/02:36:49 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/02:36:49 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/02:39:37 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/02:39:37 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/02:40:29 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/02:40:29 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/03:02:41 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (19.90 °C) +2023-11-26/08:17:48 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (20.80 °C) +2023-11-26/08:35:19 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/08:35:19 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/08:35:49 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/08:35:50 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/08:36:40 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/08:36:41 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/08:37:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/08:37:46 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/08:40:35 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/08:40:36 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/08:40:38 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/08:40:38 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/08:40:41 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/08:40:42 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-26/08:44:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-26/08:44:13 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-26/08:44:58 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-26/08:44:58 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:02:09 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:02:09 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:03:05 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:03:05 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:03:44 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (20.00 °C) +2023-11-27/01:03:45 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:03:46 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:03:46 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:04:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:04:13 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:04:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:04:26 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:04:37 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:04:37 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:05:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:05:04 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:06:38 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:06:38 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:07:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:07:10 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:10:50 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:10:51 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:11:05 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:11:06 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:11:17 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:11:17 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:11:25 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:11:26 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:13:19 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:13:20 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:16:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:16:49 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:17:03 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:17:04 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:17:44 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:17:45 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:18:09 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:18:09 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:18:34 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:18:35 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:20:03 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:20:03 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:22:56 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:22:56 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:23:03 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:23:03 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:24:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:24:09 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:24:30 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:24:30 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:24:33 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/01:24:33 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/01:24:35 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/01:24:36 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-27/01:45:18 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (19.90 °C) +2023-11-27/06:14:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/06:15:17 [4.009] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-27/06:16:23 [4.004] Device 6 (CMCIII-TMP-2-front-botom-middle) @2.04, Temperature: OK (20.00 °C) +2023-11-27/06:35:30 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (20.80 °C) +2023-11-27/06:35:31 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-27/13:21:46 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2023-11-27/13:21:46 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2023-11-27/13:21:46 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2023-11-27/13:21:47 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2023-11-27/13:21:47 [4.015] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2023-11-27/13:21:52 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-11-27/13:21:54 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '00000000266B5443' valid --> User '' not valid +2023-11-27/13:21:59 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '00000000462039EF' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2023-11-27/13:21:59 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2023-11-27/13:22:01 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2023-11-27/13:22:05 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '00000000DEB453F4' valid --> User '' not valid +2023-11-27/13:22:06 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-11-27/13:22:07 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-11-27/13:22:09 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '00000000DEB453F4' valid --> User '' not valid +2023-11-28/12:32:50 [2.000] Device 6 (CMCIII-TMP-2-front-botom-middle), Variable 'Temperature.SetPtHighAlarm' changed to '41.00 °C' by user 'snmpd' [SNMP] +2023-11-28/12:32:51 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.21) logged in +2023-11-28/12:34:31 [2.000] Device 6 (CMCIII-TMP-2-front-botom-middle), Description changed to 'CMCIII-TMP-2-front-botom-Left' by user 'snmpd' [SNMP] +2023-11-28/12:34:36 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.21) logged in +2023-11-28/12:46:11 [1.000] User 'admin' session (IP 10.242.2.21) terminated (Timeout) +2023-11-29/08:37:51 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.156) logged in +2023-11-29/08:45:35 [1.000] User 'admin' session (IP 192.168.10.156) terminated (Timeout) +2023-11-29/10:56:40 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/10:56:40 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/10:57:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.30 °C) +2023-11-29/10:57:29 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:06:00 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.20 °C) +2023-11-29/11:06:00 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:07:25 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:07:26 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:08:32 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:08:32 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:09:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:09:11 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:10:25 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:10:26 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:13:36 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:13:37 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:16:21 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:16:22 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:17:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:17:08 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:17:37 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:17:38 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:17:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:17:39 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:17:52 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:17:53 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:18:14 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:18:14 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:18:33 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:18:34 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:25:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:25:11 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:27:01 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:27:02 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:27:13 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:27:14 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:35:23 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:35:23 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:36:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:36:27 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/11:37:20 [4.006] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: High Warn (22.30 °C) +2023-11-29/11:37:21 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/11:39:33 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (22.20 °C) +2023-11-29/11:39:33 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-29/15:33:53 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.156) logged in +2023-11-29/15:39:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Left), Variable 'Temperature.SetPtHighAlarm' changed to '20.30 °C' by user 'admin' [Web] +2023-11-29/15:39:50 [4.008] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: Too High (22.00 °C) +2023-11-29/15:39:50 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-29/15:43:20 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtHighAlarm' changed to '23.50 °C' by user 'snmpd' [SNMP] +2023-11-29/15:51:59 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.17) logged in +2023-11-29/15:53:21 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtHighAlarm' changed to '21.00 °C' by user 'snmpd' [SNMP] +2023-11-29/15:53:24 [4.008] Device 7 (CMCIII-HUM) @2.05, Temperatur: Too High (21.70 °C) +2023-11-29/15:53:30 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.156) logged in +2023-11-29/15:54:01 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtHighAlarm' changed to '23.00 °C' by user 'snmpd' [SNMP] +2023-11-29/15:54:03 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (21.70 °C) +2023-11-29/15:57:05 [1.000] User 'admin' session (IP 192.168.10.156) terminated (Timeout) +2023-11-30/08:35:02 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.198) logged in +2023-11-30/08:35:02 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Left), Variable 'Temperature.SetPtHighAlarm' changed to '30.00 °C' by user 'snmpd' [SNMP] +2023-11-30/08:35:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Left) @2.04, Temperature: OK (21.80 °C) +2023-11-30/08:35:04 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-30/08:36:01 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Left), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +2023-11-30/08:37:01 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Left), Description changed to 'CMCIII-TMP-2-front-botom-right' by user 'snmpd' [SNMP] +2023-11-30/08:43:55 [1.000] User 'admin' session (IP 192.168.10.198) terminated (Timeout) +2023-11-30/09:18:56 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.197) logged in +2023-11-30/09:19:01 [2.000] Device 6 (CMCIII-TMP-2-front-botom-right), Description changed to 'CMCIII-TMP-2-front-botom-Review' by user 'snmpd' [SNMP] +2023-11-30/09:54:24 [1.000] User 'admin' (IP 192.168.10.197) logged out +2023-11-30/10:56:17 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.177) logged in +2023-11-30/10:57:44 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2023-11-30/11:01:04 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '34.00 °C' by user 'snmpd' [SNMP] +2023-11-30/11:06:38 [1.000] User 'admin' session (IP 192.168.10.177) terminated (Timeout) +2023-11-30/11:12:50 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.177) logged in +2023-11-30/11:37:00 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2023-11-30/11:53:38 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '34.00 °C' by user 'snmpd' [SNMP] +2023-11-30/11:53:56 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.198) logged in +2023-11-30/11:55:38 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +2023-11-30/11:58:58 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '34.00 °C' by user 'snmpd' [SNMP] +2023-11-30/12:00:39 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +2023-11-30/12:43:41 [1.000] User 'admin' (IP 192.168.10.198) logged out +2023-11-30/13:35:05 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '36.00 °C' by user 'snmpd' [SNMP] +2023-11-30/13:36:45 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +2023-11-30/13:38:05 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '36.00 °C' by user 'snmpd' [SNMP] +2023-11-30/13:39:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '34.00 °C' by user 'snmpd' [SNMP] +2023-11-30/13:54:05 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +2023-11-30/13:55:25 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '36.00 °C' by user 'snmpd' [SNMP] +2023-11-30/13:57:25 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '37.00 °C' by user 'snmpd' [SNMP] +2023-11-30/13:58:45 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +2023-11-30/14:13:13 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-11-30/14:13:14 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-11-30/14:16:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-11-30/14:16:09 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-11-30/16:04:42 [1.010] Device 4 (CMCIII-GRF2-2): Keycode not valid +2023-11-30/16:17:09 [1.010] Device 4 (CMCIII-GRF2-2): Keycode not valid +2023-11-30/16:17:14 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2023-11-30/16:17:14 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2023-11-30/16:17:14 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2023-11-30/16:17:15 [4.015] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2023-11-30/16:17:16 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2023-11-30/16:17:21 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-11-30/16:17:40 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-01/08:01:11 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-01/08:01:12 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-01/08:06:55 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (19.90 °C) +2023-12-01/08:11:14 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (19.90 °C) +2023-12-01/08:14:57 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (20.80 °C) +2023-12-01/08:14:58 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-01/10:31:16 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '20.00 °C' by user 'snmpd' [SNMP] +2023-12-01/10:31:18 [4.008] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Too High (21.80 °C) +2023-12-01/10:31:18 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-01/10:35:56 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '30.00 °C' by user 'snmpd' [SNMP] +2023-12-01/10:35:57 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (21.80 °C) +2023-12-01/10:35:57 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-01/12:00:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '31.00 °C' by user 'snmpd' [SNMP] +2023-12-04/11:09:21 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.17) logged in +2023-12-04/12:21:47 [1.000] User 'admin' (IP 192.168.10.17) logged out +2023-12-05/07:40:44 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-05/07:40:45 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-05/08:06:54 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-05/08:06:54 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-05/09:54:01 [4.008] Device 7 (CMCIII-HUM) @2.05, Temperatur: Too High (23.10 °C) +2023-12-05/09:54:02 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-05/09:56:22 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.177) logged in +2023-12-05/10:11:29 [3.002] Devices reorganized... +2023-12-05/10:11:35 [5.002] Device 1 (PDU-Controller) @1.01, OK +2023-12-05/10:11:35 [5.002] Device 2 (PDU-MET) @1.02, OK +2023-12-05/10:11:35 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-05/10:11:35 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-05/10:11:35 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-05/10:11:35 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, OK +2023-12-05/10:11:35 [5.002] Device 7 (CMCIII-HUM) @2.05, OK +2023-12-05/10:11:35 [4.010] Device 1 (PDU-Controller) @1.01, Input: Off (0 ) +2023-12-05/10:11:36 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-05/10:11:36 [4.004] Device 1 (PDU-Controller) @1.01, System Temperature: OK (none) +2023-12-05/10:11:36 [4.004] Device 1 (PDU-Controller) @1.01, System Current: OK (none) +2023-12-05/10:11:36 [4.004] Device 1 (PDU-Controller) @1.01, System Supply: OK (none) +2023-12-05/10:11:36 [4.010] Device 1 (PDU-Controller) @1.01, Login: Off (0 , 0 , 0 s) +2023-12-05/10:11:36 [4.004] Device 2 (PDU-MET) @1.02, Neutral Current: OK (0.07 A) +2023-12-05/10:11:36 [4.004] Device 2 (PDU-MET) @1.02, Power Active: OK (7 W) +2023-12-05/10:11:36 [4.004] Device 2 (PDU-MET) @1.02, Power L1: OK (7 W) +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 01: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 02: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 03: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 04: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 05: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 06: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 07: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 08: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 09: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 10: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 11: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 12: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 13: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 14: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 15: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 16: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 17: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 18: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 19: On () +2023-12-05/10:11:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 20: On () +2023-12-05/10:11:36 [4.013] Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-05/10:11:36 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-05/10:11:36 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-05/10:11:36 [4.013] Device 4 (CMCIII-GRF2-2) @2.02, Access: Closed (0 ) +2023-12-05/10:11:36 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-05/10:11:36 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-05/10:11:36 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (0 %) +2023-12-05/10:11:36 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-05/10:11:36 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-05/10:11:36 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-05/10:11:36 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (21.30 °C) +2023-12-05/10:11:36 [4.008] Device 7 (CMCIII-HUM) @2.05, Temperatur: Too High (23.60 °C) +2023-12-05/10:11:36 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-05/10:12:33 [3.002] Devices reorganized... +2023-12-05/10:12:37 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-05/10:12:41 [5.002] Device 1 (PDU-Controller) @1.01, OK +2023-12-05/10:12:41 [5.002] Device 2 (PDU-MET) @1.02, OK +2023-12-05/10:12:41 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-05/10:12:41 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-05/10:12:41 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-05/10:12:41 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, OK +2023-12-05/10:12:41 [4.010] Device 1 (PDU-Controller) @1.01, Input: Off (0 ) +2023-12-05/10:12:41 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-05/10:12:41 [4.004] Device 1 (PDU-Controller) @1.01, System Temperature: OK (none) +2023-12-05/10:12:41 [4.004] Device 1 (PDU-Controller) @1.01, System Current: OK (none) +2023-12-05/10:12:41 [4.004] Device 1 (PDU-Controller) @1.01, System Supply: OK (none) +2023-12-05/10:12:41 [4.010] Device 1 (PDU-Controller) @1.01, Login: Off (0 , 0 , 0 s) +2023-12-05/10:12:41 [4.004] Device 2 (PDU-MET) @1.02, Neutral Current: OK (0.07 A) +2023-12-05/10:12:41 [4.004] Device 2 (PDU-MET) @1.02, Power Active: OK (7 W) +2023-12-05/10:12:41 [4.004] Device 2 (PDU-MET) @1.02, Power L1: OK (7 W) +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 01: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 02: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 03: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 04: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 05: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 06: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 07: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 08: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 09: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 10: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 11: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 12: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 13: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 14: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 15: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 16: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 17: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 18: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 19: On () +2023-12-05/10:12:41 [4.011] Device 2 (PDU-MET) @1.02, Socket 20: On () +2023-12-05/10:12:41 [4.013] Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-05/10:12:41 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-05/10:12:41 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-05/10:12:41 [4.013] Device 4 (CMCIII-GRF2-2) @2.02, Access: Closed (0 ) +2023-12-05/10:12:41 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-05/10:12:41 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-05/10:12:41 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (0 %) +2023-12-05/10:12:41 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-05/10:12:41 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-05/10:12:41 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-05/10:12:41 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (21.50 °C) +2023-12-05/10:13:09 [5.004] Device 3 (CMCIII-GRF2-4) @2.01, Lost +2023-12-05/10:13:09 [5.004] Device 4 (CMCIII-GRF2-2) @2.02, Lost +2023-12-05/10:13:09 [5.004] Device 5 (CMCIII-UNI) @2.03, Lost +2023-12-05/10:13:09 [5.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Lost +2023-12-05/10:13:10 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-05/10:13:25 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-05/10:13:25 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-05/10:13:25 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-05/10:13:25 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, OK +2023-12-05/10:13:25 [5.003] Device 7 (CMCIII-HUM) @2.05, Detected [Type: CMCIII-HUM / Serial Number: 63534806] +2023-12-05/10:13:26 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-05/10:13:26 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-05/10:13:26 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-05/10:13:26 [4.005] Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-05/10:13:26 [4.027] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Inactive (1 ) +2023-12-05/10:13:26 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-05/10:13:26 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (1 %) +2023-12-05/10:13:26 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-05/10:13:26 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-05/10:13:26 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-05/10:13:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (21.70 °C) +2023-12-05/10:13:26 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-05/10:14:01 [3.001] Quit Device Configuration... +2023-12-05/10:14:02 [5.002] Device 7 (CMCIII-HUM) @2.05, OK +2023-12-05/10:14:03 [4.008] Device 7 (CMCIII-HUM) @2.05, Temperatur: Too High (22.90 °C) +2023-12-05/10:15:43 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Unlock' by user 'admin' [Web] +2023-12-05/10:15:45 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2023-12-05/10:15:50 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Lock' by user 'admin' [Web] +2023-12-05/10:15:57 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-05/10:15:58 [4.013] Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-05/10:16:04 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-05/10:16:14 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-05/10:16:14 [4.013] Device 4 (CMCIII-GRF2-2) @2.02, Access: Closed (0 ) +2023-12-05/10:17:46 [2.000] Configuration 'System-Info' changed by user 'admin' [Web] +2023-12-05/10:32:52 [5.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Lost +2023-12-05/10:32:52 [5.004] Device 7 (CMCIII-HUM) @2.05, Lost +2023-12-05/10:33:11 [5.004] Device 3 (CMCIII-GRF2-4) @2.01, Lost +2023-12-05/10:33:11 [5.004] Device 4 (CMCIII-GRF2-2) @2.02, Lost +2023-12-05/10:33:11 [5.004] Device 5 (CMCIII-UNI) @2.03, Lost +2023-12-05/10:33:26 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-05/10:33:26 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-05/10:33:26 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-05/10:33:26 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, OK +2023-12-05/10:33:27 [5.002] Device 7 (CMCIII-HUM) @2.05, OK +2023-12-05/10:33:27 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-05/10:33:27 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-05/10:33:27 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-05/10:33:27 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-05/10:33:27 [4.005] Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-05/10:33:27 [4.027] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Inactive (1 ) +2023-12-05/10:33:27 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-05/10:33:27 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (1 %) +2023-12-05/10:33:27 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-05/10:33:27 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-05/10:33:27 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-05/10:33:27 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (21.90 °C) +2023-12-05/10:33:27 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.10 °C) +2023-12-05/10:33:28 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-05/10:33:28 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-05/10:33:57 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-05/10:33:58 [4.013] Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-05/10:34:06 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-05/10:34:07 [4.013] Device 4 (CMCIII-GRF2-2) @2.02, Access: Closed (0 ) +2023-12-05/10:34:08 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-05/11:34:37 [1.000] User 'admin' session (IP 192.168.10.177) terminated (Timeout) +2023-12-05/12:56:17 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Alarm (1 ) +2023-12-05/12:56:18 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-05/16:49:02 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-05/16:49:03 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-06/01:17:46 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-06/01:17:47 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-06/01:18:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-06/01:18:01 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-06/01:20:55 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-06/01:20:56 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-06/03:50:15 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (19.90 °C) +2023-12-06/05:56:45 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (20.80 °C) +2023-12-06/06:05:43 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-06/06:05:43 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-06/06:06:19 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-06/06:06:20 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-06/06:06:45 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-06/06:06:46 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-06/11:02:52 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.14) logged in +2023-12-06/11:30:45 [2.000] Configuration 'User-Setup' changed by user 'admin' [Web] +2023-12-06/13:19:09 [1.000] User 'admin' session (IP 10.242.2.14) terminated (Timeout) +2023-12-07/01:51:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/01:51:01 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/01:51:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-07/01:51:03 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/01:51:04 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/01:51:04 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/01:51:06 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-07/01:51:07 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/01:51:13 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/01:51:14 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/01:51:14 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-07/01:51:14 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/01:51:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/01:51:49 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/01:52:13 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (19.90 °C) +2023-12-07/01:52:14 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/02:01:36 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (20.00 °C) +2023-12-07/02:01:37 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/02:02:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-07/02:02:12 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/02:05:08 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/02:05:08 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/02:05:16 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (19.90 °C) +2023-12-07/02:05:17 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/02:05:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/02:05:48 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/02:05:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-07/02:05:49 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/02:06:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/02:06:01 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/02:06:02 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-07/02:06:03 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/02:07:26 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/02:07:26 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/04:15:53 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (19.90 °C) +2023-12-07/05:45:30 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (20.80 °C) +2023-12-07/06:06:24 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-07/06:06:25 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/06:07:35 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-07/06:07:35 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-07/06:07:37 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-07/06:07:37 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-07/10:08:21 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '32.00 °C' by user 'snmpd' [SNMP] +2023-12-07/10:10:21 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2023-12-07/13:29:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '34.00 °C' by user 'snmpd' [SNMP] +2023-12-07/13:33:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighWarning' changed to '24.00 °C' by user 'snmpd' [SNMP] +2023-12-07/13:49:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2023-12-10/06:47:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-10/06:47:20 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-10/06:47:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-10/06:47:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-10/06:47:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-10/06:47:24 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-10/06:47:25 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-10/06:47:26 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-10/06:47:57 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-10/06:47:57 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-10/06:47:58 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (19.90 °C) +2023-12-10/06:47:59 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-10/06:48:00 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-10/06:48:00 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-10/06:48:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-10/06:48:03 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-10/06:48:08 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-10/06:48:09 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-10/06:48:24 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-10/06:48:24 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-10/06:48:34 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (19.90 °C) +2023-12-10/06:48:34 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-10/06:48:41 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (20.00 °C) +2023-12-10/06:48:42 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-10/10:37:03 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.2) logged in +2023-12-10/12:44:18 [1.000] User 'admin' session (IP 10.242.2.2) terminated (Timeout) +2023-12-11/10:25:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Current.SetPtHighWarning' changed to '12.00 A' by user 'snmpd' [SNMP] +2023-12-11/10:25:57 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/10:31:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Current.SetPtHighWarning' changed to '0.00 A' by user 'snmpd' [SNMP] +2023-12-11/10:31:37 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/10:32:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '211.0 V' by user 'snmpd' [SNMP] +2023-12-11/10:33:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/10:33:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/10:33:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/10:33:57 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/10:33:58 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/10:36:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:10:37 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:14:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '190.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:17:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '200.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:17:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '200.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:17:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '200.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:17:37 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '200.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:48:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '240.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:51:56 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '22.00 °C' by user 'snmpd' [SNMP] +2023-12-11/11:57:16 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Variable 'Temperature.SetPtLowWarning' changed to '22.00 °C' by user 'snmpd' [SNMP] +2023-12-11/11:57:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:57:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:57:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/11:57:57 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-11/12:01:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-11/12:01:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-11/12:01:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-11/12:01:37 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-11/12:04:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '250.0 V' by user 'snmpd' [SNMP] +2023-12-11/12:05:16 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '250.0 V' by user 'snmpd' [SNMP] +2023-12-11/12:05:18 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/15:36:27 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.11) logged in +2023-12-11/16:13:48 [1.000] User 'admin' (IP 10.242.2.11) logged out +2023-12-11/17:38:29 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/17:38:39 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/18:55:11 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/18:57:43 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/18:58:02 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/18:58:59 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/21:45:31 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-11/21:45:31 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/21:45:42 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (22.00 °C) +2023-12-11/21:45:43 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/21:52:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-11/21:52:21 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/21:52:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (22.00 °C) +2023-12-11/21:52:26 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/21:53:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-11/21:53:13 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/21:53:34 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (22.00 °C) +2023-12-11/21:53:34 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/21:53:44 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-11/21:53:45 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-11/21:55:06 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (22.00 °C) +2023-12-11/21:55:07 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-11/21:56:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-11/21:56:42 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-12/00:28:46 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-12/07:43:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (22.00 °C) +2023-12-12/07:43:52 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-12/07:43:56 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (22.00 °C) +2023-12-12/07:44:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-12/07:51:51 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (22.00 °C) +2023-12-12/07:54:07 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-12/07:54:36 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Temperature: OK (22.00 °C) +2023-12-12/07:56:50 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-12/07:56:50 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-12/08:50:57 [4.008] Device 7 (CMCIII-HUM) @2.05, Temperatur: Too High (23.10 °C) +2023-12-12/08:50:58 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-12/10:53:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:53:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:53:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:53:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:54:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:54:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:54:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:54:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:54:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:54:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:54:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:54:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:57:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:57:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:57:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/10:57:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:02:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:02:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:02:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:02:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:03:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:03:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:03:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:03:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:03:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '111.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:03:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '111.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:03:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '111.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:03:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '111.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:07:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '250.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:07:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '250.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:07:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '250.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:07:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '250.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:07:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:07:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:07:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:07:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:10:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '330.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:10:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '330.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:10:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '330.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:10:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '330.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:12:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:12:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:12:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:12:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:13:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:13:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:13:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:13:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:13:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '320.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:13:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '320.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:13:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '320.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:13:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '320.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:14:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:14:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:14:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:14:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:16:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:16:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:16:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:16:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:17:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:17:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:17:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:17:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:18:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:18:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:18:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:18:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:19:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:19:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:19:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:19:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:20:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:20:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:20:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:20:16 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:21:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:21:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:21:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:21:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:24:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:24:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:24:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:24:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:39:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:39:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:39:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:39:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:42:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:42:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:42:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:42:16 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:46:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:46:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:46:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:46:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:47:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:47:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:47:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:47:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:56:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '211.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:56:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '211.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:56:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '211.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:56:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '211.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:58:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '212.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:58:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '212.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:58:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '212.0 V' by user 'snmpd' [SNMP] +2023-12-12/11:58:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '212.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:01:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:01:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:01:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:01:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '110.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:02:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:02:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:02:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:02:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:03:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:03:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:04:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:04:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:04:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:04:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:05:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:05:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:05:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:05:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '230.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:29:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:29:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:29:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:29:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:37:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:37:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:37:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:37:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '210.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:38:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:38:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:38:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:38:15 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:39:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '240.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:39:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '240.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:39:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '240.0 V' by user 'snmpd' [SNMP] +2023-12-12/12:39:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '240.0 V' by user 'snmpd' [SNMP] +2023-12-12/16:13:28 [3.005] Quit Alarm Message... +2023-12-12/17:45:34 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Review), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-12/17:46:54 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update12' by user 'snmpd' [SNMP] +2023-12-12/17:59:54 [2.000] Device 5 (CMCIII-UNI), Variable 'Energy Meter 2.S0 Factor' changed to '5 1/kWh' by user 'snmpd' [SNMP] +2023-12-12/18:01:54 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update12), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-12/18:02:54 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update12' by user 'snmpd' [SNMP] +2023-12-12/18:08:14 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update12), Description changed to 'CMCIII-TMP-2-front-botom-Updat' by user 'snmpd' [SNMP] +2023-12-13/00:16:16 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.00 °C) +2023-12-13/00:18:55 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-13/00:42:41 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/00:42:42 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (21.90 °C) +2023-12-13/00:42:58 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (22.00 °C) +2023-12-13/00:43:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/00:43:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/00:43:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/00:43:27 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/00:43:29 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/00:43:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/07:48:59 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/07:49:18 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/07:49:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/07:49:31 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/07:49:33 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/07:50:03 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/07:50:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/07:50:24 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (22.00 °C) +2023-12-13/07:50:35 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/07:51:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/07:51:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.00 °C) +2023-12-13/08:54:52 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-13/09:44:16 [3.013] Ethernet: Auto +2023-12-13/09:44:16 [1.100] Application (V7.19.00) started +2023-12-13/09:44:53 [5.002] Device 1 (PDU-Controller) @1.01, OK +2023-12-13/09:44:53 [5.002] Device 2 (PDU-MET) @1.02, OK +2023-12-13/09:44:53 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-13/09:44:53 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-13/09:44:53 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-13/09:44:53 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, OK +2023-12-13/09:44:53 [5.002] Device 7 (CMCIII-HUM) @2.05, OK +2023-12-13/09:44:53 [4.010] Device 1 (PDU-Controller) @1.01, Input: Off (0 ) +2023-12-13/09:44:53 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-13/09:44:53 [4.004] Device 1 (PDU-Controller) @1.01, System Temperature: OK (none) +2023-12-13/09:44:53 [4.004] Device 1 (PDU-Controller) @1.01, System Current: OK (none) +2023-12-13/09:44:53 [4.004] Device 1 (PDU-Controller) @1.01, System Supply: OK (none) +2023-12-13/09:44:53 [4.010] Device 1 (PDU-Controller) @1.01, Login: Off (0 , 0 , 0 s) +2023-12-13/09:44:53 [4.004] Device 2 (PDU-MET) @1.02, Neutral Current: OK (0.04 A) +2023-12-13/09:44:53 [4.004] Device 2 (PDU-MET) @1.02, Power Active: OK (2 W) +2023-12-13/09:44:54 [4.004] Device 2 (PDU-MET) @1.02, Power L1: OK (2 W) +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 01: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 02: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 03: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 04: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 05: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 06: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 07: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 08: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 09: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 10: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 11: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 12: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 13: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 14: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 15: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 16: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 17: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 18: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 19: On () +2023-12-13/09:44:54 [4.011] Device 2 (PDU-MET) @1.02, Socket 20: On () +2023-12-13/09:44:54 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-13/09:44:54 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-13/09:44:54 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-13/09:44:54 [4.005] Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-13/09:44:54 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-13/09:44:54 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-13/09:44:54 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (0 %) +2023-12-13/09:44:54 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-13/09:44:54 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-13/09:44:54 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-13/09:44:54 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.30 °C) +2023-12-13/09:44:55 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (17.00 °C) +2023-12-13/09:44:55 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-13/10:11:53 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Updat), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-13/10:12:33 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-13/10:18:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:18:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:18:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:18:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:20:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '24.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:20:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '24.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:20:54 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '24.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:20:54 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '24.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:23:13 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:23:13 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:23:13 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:23:14 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:23:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '20.5 V' by user 'snmpd' [SNMP] +2023-12-13/10:23:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '20.5 V' by user 'snmpd' [SNMP] +2023-12-13/10:23:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '20.5 V' by user 'snmpd' [SNMP] +2023-12-13/10:23:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '20.5 V' by user 'snmpd' [SNMP] +2023-12-13/10:25:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '11.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:25:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '11.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:25:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '11.0 V' by user 'snmpd' [SNMP] +2023-12-13/10:25:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '11.0 V' by user 'snmpd' [SNMP] +2023-12-13/11:07:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/11:07:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/11:07:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/11:07:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/11:09:13 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update123' by user 'snmpd' [SNMP] +2023-12-13/12:31:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-13/12:31:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-13/12:31:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-13/12:31:54 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-13/12:39:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-13/12:39:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-13/12:39:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-13/12:39:34 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-13/12:52:13 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.4 V' by user 'snmpd' [SNMP] +2023-12-13/12:52:13 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.4 V' by user 'snmpd' [SNMP] +2023-12-13/12:52:13 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.4 V' by user 'snmpd' [SNMP] +2023-12-13/12:52:14 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.4 V' by user 'snmpd' [SNMP] +2023-12-13/13:05:33 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update123), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-13/15:49:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '2.3 V' by user 'snmpd' [SNMP] +2023-12-13/15:49:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '2.3 V' by user 'snmpd' [SNMP] +2023-12-13/15:49:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '2.3 V' by user 'snmpd' [SNMP] +2023-12-13/15:49:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '2.3 V' by user 'snmpd' [SNMP] +2023-12-13/15:53:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '12.1 V' by user 'snmpd' [SNMP] +2023-12-13/15:53:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '12.1 V' by user 'snmpd' [SNMP] +2023-12-13/15:53:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '12.1 V' by user 'snmpd' [SNMP] +2023-12-13/15:53:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '12.1 V' by user 'snmpd' [SNMP] +2023-12-13/15:55:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '1.2 V' by user 'snmpd' [SNMP] +2023-12-13/15:55:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '1.2 V' by user 'snmpd' [SNMP] +2023-12-13/15:55:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '1.2 V' by user 'snmpd' [SNMP] +2023-12-13/15:55:33 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '1.2 V' by user 'snmpd' [SNMP] +2023-12-13/18:07:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/18:07:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/18:07:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/18:07:53 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13/18:08:53 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update12' by user 'snmpd' [SNMP] +2023-12-13/23:35:46 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-13/23:43:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/23:43:51 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-13/23:43:55 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13/23:43:57 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-13/23:44:10 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/08:32:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14/08:33:16 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/08:33:17 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14/08:33:18 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/08:33:24 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14/08:46:54 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-14/08:56:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update12), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-14/09:00:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update12' by user 'snmpd' [SNMP] +2023-12-14/09:03:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/09:03:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/09:03:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/09:03:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/09:07:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14/09:08:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '23.3 V' by user 'snmpd' [SNMP] +2023-12-14/09:24:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/09:24:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/09:35:31 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/09:36:23 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-14/10:18:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14/10:18:10 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/10:18:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14/10:18:19 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/10:18:50 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14/10:19:05 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/10:19:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14/10:19:17 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/10:19:21 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (21.90 °C) +2023-12-14/10:45:52 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-14/12:53:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-14/12:53:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-14/12:53:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-14/12:53:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-14/12:58:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update12), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-14/13:06:35 [2.000] Device 1 (PDU-Controller), Variable 'System Health.Current.DescName' changed to 'Sascha Test' by user 'snmpd' [SNMP] +2023-12-14/13:18:55 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update12' by user 'snmpd' [SNMP] +2023-12-14/13:24:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/13:24:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/13:24:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/13:24:36 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14/13:24:55 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14/13:24:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14/13:24:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14/13:24:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14/13:28:35 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '21.0 V' by user 'snmpd' [SNMP] +2023-12-14/13:39:35 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update12), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-14/14:57:31 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.162) logged in +2023-12-14/16:12:35 [1.000] User 'admin' session (IP 192.168.10.162) terminated (Timeout) +2023-12-14/22:54:12 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-14/22:54:30 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/22:54:32 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-14/22:55:08 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14/22:55:48 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-14/22:56:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15/09:21:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-15/09:21:37 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15/09:21:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-15/11:29:26 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-15/23:33:37 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15/23:33:38 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-15/23:33:54 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15/23:34:45 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-15/23:34:47 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15/23:51:44 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-16/11:59:25 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/11:59:40 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (22.00 °C) +2023-12-16/12:00:53 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/12:01:07 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (22.00 °C) +2023-12-16/12:01:14 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/12:01:16 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/12:01:27 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/12:01:35 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/12:02:20 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/12:02:43 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/12:02:44 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/12:02:47 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/12:02:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/12:46:58 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-16/23:41:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:41:16 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:41:57 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:42:01 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:42:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:42:21 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:42:32 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:42:54 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:43:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:43:46 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:43:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:43:54 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:43:56 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:44:20 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:44:22 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:44:32 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:44:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16/23:45:06 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16/23:45:17 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/00:00:10 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-17/13:04:58 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/13:05:11 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/13:05:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/13:05:46 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/13:06:07 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/13:06:40 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/13:06:41 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/13:06:52 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/13:07:01 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/22:38:53 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/22:38:54 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/22:39:09 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/22:39:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/22:39:49 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/22:40:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/22:40:22 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/22:41:37 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/22:41:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/22:42:33 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (21.90 °C) +2023-12-17/22:42:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17/22:43:15 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17/22:43:19 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-18/08:15:54 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2023-12-18/08:16:12 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18/08:16:13 [4.013] Device 4 (CMCIII-GRF2-2) @2.02, Access: Closed (0 ) +2023-12-18/08:16:19 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18/08:16:20 [4.013] Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-18/08:16:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'admin' [Web] +2023-12-18/08:16:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (21.70 °C) +2023-12-18/08:17:11 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'admin' [Web] +2023-12-18/08:17:12 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.40 °C) +2023-12-18/08:17:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '260.0 V' by user 'admin' [Web] +2023-12-18/08:17:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '240.0 V' by user 'admin' [Web] +2023-12-18/08:17:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'admin' [Web] +2023-12-18/08:17:56 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '215.0 V' by user 'admin' [Web] +2023-12-18/08:18:09 [2.000] Device 2 (PDU-MET), Variable 'Phase L1.Voltage.Hysteresis' changed to '2.00 %' by user 'admin' [Web] +2023-12-18/08:18:10 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18/08:23:44 [1.000] User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2023-12-18/08:58:46 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2023-12-18/08:59:07 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '22.20 °C' by user 'admin' [Web] +2023-12-18/08:59:09 [4.009] Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (22.00 °C) +2023-12-18/08:59:09 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18/08:59:23 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'admin' [Web] +2023-12-18/08:59:25 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.00 °C) +2023-12-18/08:59:25 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18/09:00:02 [5.004] Device 3 (CMCIII-GRF2-4) @2.01, Lost +2023-12-18/09:00:02 [5.004] Device 4 (CMCIII-GRF2-2) @2.02, Lost +2023-12-18/09:00:02 [5.004] Device 5 (CMCIII-UNI) @2.03, Lost +2023-12-18/09:00:02 [5.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Lost +2023-12-18/09:00:03 [5.004] Device 7 (CMCIII-HUM) @2.05, Lost +2023-12-18/09:00:03 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18/09:00:18 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-18/09:00:18 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-18/09:00:18 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-18/09:00:18 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, OK +2023-12-18/09:00:18 [5.002] Device 7 (CMCIII-HUM) @2.05, OK +2023-12-18/09:00:18 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18/09:00:18 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-18/09:00:18 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-18/09:00:18 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-18/09:00:19 [4.005] Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-18/09:00:19 [4.027] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Inactive (1 ) +2023-12-18/09:00:19 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-18/09:00:19 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (1 %) +2023-12-18/09:00:19 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-18/09:00:19 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-18/09:00:19 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-18/09:00:19 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-18/09:00:19 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (21.90 °C) +2023-12-18/09:00:19 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18/09:00:19 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-18/09:00:45 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18/09:00:46 [4.013] Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-18/09:03:08 [5.004] Device 7 (CMCIII-HUM) @2.05, Lost +2023-12-18/09:03:35 [5.004] Device 3 (CMCIII-GRF2-4) @2.01, Lost +2023-12-18/09:03:35 [5.004] Device 4 (CMCIII-GRF2-2) @2.02, Lost +2023-12-18/09:03:36 [5.004] Device 5 (CMCIII-UNI) @2.03, Lost +2023-12-18/09:03:36 [5.004] Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Lost +2023-12-18/09:03:50 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-18/09:03:50 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-18/09:03:50 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-18/09:03:50 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, OK +2023-12-18/09:03:50 [5.002] Device 7 (CMCIII-HUM) @2.05, OK +2023-12-18/09:03:51 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18/09:03:51 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-18/09:03:51 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-18/09:03:51 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-18/09:03:52 [4.005] Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-18/09:03:52 [4.027] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Inactive (1 ) +2023-12-18/09:03:52 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-18/09:03:52 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (1 %) +2023-12-18/09:03:52 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-18/09:03:52 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-18/09:03:52 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-18/09:03:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-18/09:03:52 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (21.50 °C) +2023-12-18/09:03:52 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-18/09:03:52 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18/09:04:30 [3.002] Devices reorganized... +2023-12-18/09:04:36 [5.002] Device 1 (PDU-Controller) @1.01, OK +2023-12-18/09:04:36 [5.002] Device 2 (PDU-MET) @1.02, OK +2023-12-18/09:04:36 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-18/09:04:36 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-18/09:04:36 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-18/09:04:36 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, OK +2023-12-18/09:04:36 [5.002] Device 7 (CMCIII-HUM) @2.05, OK +2023-12-18/09:04:36 [4.010] Device 1 (PDU-Controller) @1.01, Input: Off (0 ) +2023-12-18/09:04:36 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18/09:04:36 [4.004] Device 1 (PDU-Controller) @1.01, System Temperature: OK (none) +2023-12-18/09:04:36 [4.004] Device 1 (PDU-Controller) @1.01, Sascha Test: OK (none) +2023-12-18/09:04:36 [4.004] Device 1 (PDU-Controller) @1.01, System Supply: OK (none) +2023-12-18/09:04:36 [4.010] Device 1 (PDU-Controller) @1.01, Login: Off (0 , 0 , 0 s) +2023-12-18/09:04:36 [4.004] Device 2 (PDU-MET) @1.02, Neutral Current: OK (0.07 A) +2023-12-18/09:04:36 [4.004] Device 2 (PDU-MET) @1.02, Power Active: OK (7 W) +2023-12-18/09:04:36 [4.004] Device 2 (PDU-MET) @1.02, Power L1: OK (7 W) +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 01: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 02: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 03: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 04: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 05: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 06: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 07: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 08: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 09: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 10: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 11: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 12: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 13: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 14: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 15: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 16: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 17: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 18: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 19: On () +2023-12-18/09:04:36 [4.011] Device 2 (PDU-MET) @1.02, Socket 20: On () +2023-12-18/09:04:37 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-18/09:04:37 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-18/09:04:37 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-18/09:04:37 [4.005] Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-18/09:04:37 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-18/09:04:37 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-18/09:04:37 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (0 %) +2023-12-18/09:04:37 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-18/09:04:37 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-18/09:04:37 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-18/09:04:37 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-18/09:04:37 [4.004] Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (21.50 °C) +2023-12-18/09:04:38 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18/09:05:00 [3.001] Quit Device Configuration... +2023-12-18/09:24:29 [5.004] Device 3 (CMCIII-GRF2-4) @2.01, Lost +2023-12-18/09:24:29 [5.004] Device 4 (CMCIII-GRF2-2) @2.02, Lost +2023-12-18/09:24:29 [5.004] Device 5 (CMCIII-UNI) @2.03, Lost +2023-12-18/09:24:29 [5.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Lost +2023-12-18/09:24:30 [5.004] Device 7 (CMCIII-HUM) @2.05, Lost +2023-12-18/09:24:46 [5.002] Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-18/09:24:46 [5.002] Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-18/09:24:46 [5.002] Device 5 (CMCIII-UNI) @2.03, OK +2023-12-18/09:24:46 [5.005] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Changed +2023-12-18/09:24:47 [5.005] Device 7 (CMCIII-HUM) @2.04, Changed +2023-12-18/09:24:47 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-18/09:24:47 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-18/09:24:47 [4.028] Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-18/09:24:47 [4.005] Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-18/09:24:47 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-18/09:24:47 [4.028] Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-18/09:24:47 [4.004] Device 5 (CMCIII-UNI) @2.03, Airflow: OK (1 %) +2023-12-18/09:24:47 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-18/09:24:47 [4.010] Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-18/09:24:47 [4.027] Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-18/09:24:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (22.00 °C) +2023-12-18/09:24:47 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.80 °C) +2023-12-18/09:25:21 [3.001] Quit Device Configuration... +2023-12-18/09:25:22 [5.002] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, OK +2023-12-18/09:25:22 [5.002] Device 7 (CMCIII-HUM) @2.04, OK +2023-12-18/09:35:36 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18/09:35:38 [4.013] Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-18/09:35:50 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18/09:35:51 [4.013] Device 4 (CMCIII-GRF2-2) @2.02, Access: Closed (0 ) +2023-12-18/09:35:52 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18/09:41:19 [1.000] User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2023-12-18/13:24:41 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2023-12-18/13:30:36 [2.000] Configuration 'System-Info' changed by user 'admin' [Web] +2023-12-18/13:30:55 [2.000] Configuration 'Syslog-Setup' changed by user 'admin' [Web] +2023-12-18/13:31:03 [2.000] Configuration 'Syslog-Setup' changed by user 'admin' [Web] +2023-12-18/13:31:28 [2.000] Configuration 'Security-Setup' changed by user 'admin' [Web] +2023-12-18/13:31:44 [2.000] Configuration 'Security-Setup' changed by user 'admin' [Web] +2023-12-18/13:32:31 [2.000] Configuration 'Server-Shutdown' changed by user 'admin' [Web] +2023-12-18/13:32:39 [2.000] Configuration 'Server-Shutdown' changed by user 'admin' [Web] +2023-12-18/13:39:32 [1.000] User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2023-12-20/03:15:26 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-20/03:15:26 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-20/04:54:40 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/04:54:42 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/04:56:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/04:56:23 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/04:56:34 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/04:56:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/04:57:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (20.00 °C) +2023-12-20/04:57:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/05:00:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/05:00:31 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/05:00:33 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/05:00:35 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/05:00:36 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/05:01:04 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/05:01:19 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/05:01:38 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/05:01:54 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/05:12:54 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/05:13:03 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/05:13:24 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/05:13:29 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/05:13:31 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/05:13:32 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20/05:14:01 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20/06:08:46 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-20/06:08:46 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-21/03:30:12 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-21/03:30:12 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-21/04:56:33 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/04:56:34 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/04:58:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/04:58:14 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/04:59:02 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/04:59:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/04:59:06 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/04:59:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:00:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (20.00 °C) +2023-12-21/05:00:13 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:00:37 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:00:50 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:00:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:00:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:01:06 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:01:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:01:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:01:31 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:02:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:02:23 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:02:39 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:03:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:03:30 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:03:51 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:03:56 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:03:59 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:04:02 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:10:59 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:11:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:11:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:11:39 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:11:40 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:11:59 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:12:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/05:12:21 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21/05:12:36 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21/06:00:38 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-21/06:00:38 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-21/10:57:35 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.12) logged in +2023-12-21/11:32:07 [1.000] User 'admin' (IP 10.242.2.12) logged out +2023-12-22/03:02:59 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-22/03:03:00 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-22/04:24:05 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22/04:24:20 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22/04:28:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22/05:19:50 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22/05:19:59 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22/05:19:59 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22/05:20:00 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (20.00 °C) +2023-12-22/05:20:04 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22/05:20:14 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22/05:20:27 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22/05:20:49 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22/05:20:59 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22/05:21:13 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22/05:21:16 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22/05:21:43 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22/05:21:45 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22/06:05:16 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-22/06:05:17 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-22/18:52:31 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-22/18:52:47 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-22/20:02:05 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-22/20:02:59 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-22/20:03:15 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-22/20:09:40 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-23/05:49:13 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-23/05:49:14 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-23/06:52:21 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-23/06:52:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-27/04:19:20 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-27/04:19:21 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-27/05:49:21 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-27/05:49:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-28/04:17:02 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-28/04:17:03 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-28/05:49:53 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-28/05:49:53 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-07/05:11:43 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-07/05:11:44 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-07/06:27:11 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:27:15 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:27:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:27:59 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:28:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:28:18 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (19.90 °C) +2024-01-07/06:31:14 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:31:15 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:31:26 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:31:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:31:50 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:33:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:33:55 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:34:15 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:37:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:37:24 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:37:33 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:39:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:40:04 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:41:18 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:41:38 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:43:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:43:14 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:43:17 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:43:37 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:43:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:44:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (20.00 °C) +2024-01-07/06:44:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:44:33 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:44:35 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:44:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:45:07 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:45:10 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:45:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:46:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:47:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:47:11 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:47:21 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:47:33 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:47:43 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/06:47:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07/06:48:01 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07/08:05:37 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-07/08:05:38 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-09/14:23:38 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-01-09/15:47:26 [1.000] User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-01-10/01:19:36 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-10/01:19:37 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-10/07:34:04 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-10/07:34:05 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-11/03:39:15 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-11/03:39:16 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-11/05:34:15 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-11/05:34:16 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-11/09:33:59 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.151) logged in +2024-01-11/09:47:26 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.151) logged in +2024-01-11/10:37:25 [1.000] User 'admin' session (IP 192.168.10.151) terminated (Timeout) +2024-01-15/11:11:28 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-15/12:48:22 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-15/13:45:49 [1.000] User 'admin' session (IP 192.168.10.184) terminated (Timeout) +2024-01-15/14:14:44 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-15/14:45:21 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtLowAlarm' changed to '3.80 °C' by user 'admin' [Web] +2024-01-15/14:45:56 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.DescName' changed to 'Temperature12345' by user 'admin' [Web] +2024-01-15/16:24:01 [1.000] User 'admin' session (IP 192.168.10.184) terminated (Timeout) +2024-01-16/07:38:17 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-16/07:38:17 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16/07:38:17 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16/07:38:18 [4.015] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-16/07:38:18 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-16/07:38:24 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-16/07:38:24 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-16/07:38:24 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16/07:38:24 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-16/07:38:35 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-16/07:38:38 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Alarm (1 ) +2024-01-16/07:38:39 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-16/07:38:40 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-16/07:38:40 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-16/07:38:43 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-16/07:38:46 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-16/07:38:46 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16/07:38:46 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16/07:38:47 [4.015] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-16/07:38:48 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-16/07:38:54 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-16/07:39:12 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-16/10:40:50 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.5) logged in +2024-01-16/11:41:59 [1.000] User 'admin' session (IP 10.242.2.5) terminated (Timeout) +2024-01-17/08:51:27 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.9) logged in +2024-01-17/09:13:30 [1.000] User 'admin' session (IP 10.242.2.9) terminated (Timeout) +2024-01-17/12:29:19 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-17/15:24:29 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-17/15:24:45 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-17/15:41:21 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +2024-01-17/16:31:02 [1.000] User 'admin' session (IP 10.242.2.6) terminated (Timeout) +2024-01-18/15:06:40 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.8) logged in +2024-01-18/15:14:04 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-18/15:17:24 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-18/15:17:44 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-18/15:17:44 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-18/15:37:47 [1.000] User 'admin' session (IP 10.242.2.8) terminated (Timeout) +2024-01-18/23:21:41 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-18/23:21:41 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/09:03:22 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-19/09:03:23 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/09:27:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:27:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:27:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:27:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:28:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:28:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:28:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:28:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:28:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:28:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:29:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:29:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:29:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:29:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:29:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:29:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:30:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:30:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:30:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:30:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:30:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:30:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:31:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:31:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:31:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:31:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:31:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:31:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:32:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:32:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:32:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:32:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:32:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:32:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:33:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:33:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:33:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:33:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:33:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:33:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:34:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:34:27 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:34:31 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:34:36 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:34:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:34:51 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:35:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:35:13 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:35:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:35:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:35:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:35:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:36:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:36:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:36:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:36:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:36:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:36:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:37:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:37:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:37:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:37:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:37:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:37:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:38:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:38:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:38:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:38:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:38:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:38:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:39:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:39:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:39:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:39:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:39:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:39:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:40:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:40:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:40:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:40:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:40:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:40:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:41:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:41:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:41:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:41:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:41:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:41:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:42:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:42:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:42:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:42:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:42:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:42:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:43:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:43:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:43:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:43:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:43:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:43:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:44:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:44:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:44:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:44:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:44:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:44:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:45:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:45:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:45:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:45:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:45:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:45:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:46:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:46:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:46:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:46:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:47:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:47:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:47:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:47:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:47:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:47:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:48:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:48:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:48:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:48:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:48:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:48:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:49:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:49:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:49:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:49:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:49:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:49:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:50:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:50:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:50:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:50:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:50:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:50:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:51:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:51:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:51:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:51:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:51:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:51:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:52:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:52:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:52:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:52:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:52:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:52:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:53:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:53:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:53:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:53:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:53:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:53:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:54:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:54:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:54:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:54:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:54:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:54:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:55:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:55:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:55:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:55:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:55:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:55:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:56:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:56:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:56:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:56:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:56:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:56:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:57:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:57:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:57:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:57:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:57:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:57:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:58:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:58:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:58:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:58:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:58:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:58:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:59:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:59:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:59:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:59:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:59:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/09:59:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:00:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:00:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:00:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:00:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:00:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:00:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:01:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:01:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:01:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:01:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:01:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:01:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:02:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:02:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:02:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:02:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:02:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:02:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:03:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:03:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:03:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:03:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:03:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:03:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:04:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:04:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:04:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:04:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:04:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:04:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:05:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:05:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:05:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:05:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:05:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:05:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:06:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:06:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:06:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:06:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:06:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:06:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:07:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:07:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:07:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:07:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:07:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:07:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:08:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:08:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:08:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:08:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:08:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:08:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:09:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:09:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:09:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:09:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:09:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:09:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:10:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:10:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:10:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:10:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:10:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:10:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:11:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:11:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:11:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:11:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:11:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:11:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:12:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:12:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:12:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:12:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:12:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:12:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:13:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:13:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:13:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:13:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:13:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:13:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:14:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:14:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:14:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:14:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:14:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:14:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:15:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:15:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:15:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:15:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:15:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:15:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:16:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:16:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:16:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:16:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:16:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:16:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:17:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:17:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:17:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:17:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:17:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:17:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:18:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:18:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:18:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:18:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:18:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:18:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:19:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:19:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:19:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:19:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:19:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:19:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:20:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:20:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:20:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:20:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:20:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:20:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:21:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:21:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:21:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:21:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:21:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:21:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:22:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:22:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:22:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:22:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:22:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:22:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:23:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:23:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:23:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:23:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:23:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:23:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:24:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:24:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:24:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:24:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:24:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:24:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:25:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:25:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:25:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:25:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:25:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:25:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:26:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:26:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:26:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:26:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:26:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:26:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:27:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:27:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:27:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:27:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:27:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:27:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:28:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:28:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:28:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:28:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:28:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:28:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:29:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:29:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:29:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:29:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:29:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:29:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:30:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:30:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:30:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:30:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:30:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:30:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:31:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:31:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:31:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:31:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:31:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:31:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:32:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:32:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:32:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:32:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:32:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:32:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:33:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:33:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:33:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:33:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:33:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:33:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:34:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:34:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:34:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:34:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:34:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:34:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:35:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:35:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:35:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:35:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:35:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:35:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:36:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:36:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:36:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:36:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:36:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:36:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:37:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:37:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:37:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:37:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:37:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:37:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:38:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:38:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:38:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:38:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:38:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:39:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:39:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:39:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:39:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:39:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:40:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:40:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:40:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:40:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:40:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:40:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:41:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:41:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:41:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:41:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:41:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:41:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:42:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:42:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:42:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:42:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:42:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:42:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:43:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:43:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:43:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:43:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:43:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:43:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:44:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:44:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:44:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:44:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:44:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:44:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:45:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:45:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:45:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:45:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:45:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:45:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:46:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:46:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:46:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:46:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:46:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:46:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:47:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:47:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:47:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:47:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:47:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:47:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:48:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:48:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:48:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:48:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:48:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:48:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:49:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:49:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:49:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:49:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:49:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:49:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:50:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:50:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:50:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:50:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:50:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:50:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:51:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:51:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:51:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:51:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:51:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:51:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:52:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:52:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:52:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:52:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:52:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:52:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:53:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:53:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:53:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:53:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:53:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:53:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:54:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:54:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:54:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:54:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:54:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:54:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:55:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:55:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:55:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:55:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:55:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:55:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:56:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:56:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:56:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:56:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:56:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:56:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:57:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:57:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:57:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:57:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:57:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:57:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:58:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:58:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:58:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:58:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:58:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:58:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:59:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:59:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:59:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:59:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:59:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/10:59:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:00:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:00:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:00:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:00:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:00:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:00:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:01:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:01:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:01:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:01:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:01:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:01:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:02:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:02:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:02:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:02:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:02:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:02:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:03:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:03:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:03:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:03:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:03:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:03:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:04:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:04:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:04:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:04:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:04:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:04:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:05:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:05:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:05:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:05:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:05:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:06:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:06:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:06:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:06:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:06:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:07:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:07:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:07:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:07:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:07:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:07:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:08:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:08:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:08:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:08:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:08:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:08:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:09:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:09:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:09:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:09:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:09:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:09:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:10:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:10:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:10:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:10:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:10:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:10:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:11:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:11:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:11:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:11:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:11:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:11:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:12:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:12:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:12:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:12:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:12:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:12:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:13:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:13:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:13:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:13:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:13:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:13:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:14:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:14:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:14:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:14:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:14:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:14:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:15:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:15:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:15:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:15:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:15:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:15:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:16:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:16:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:16:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:16:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:16:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:16:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:17:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:17:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:17:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:17:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:17:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:17:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:18:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:18:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:18:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:18:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:18:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:18:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:19:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:19:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:19:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:19:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:19:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:19:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:20:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:20:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:20:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:20:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:20:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:20:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:21:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:21:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:21:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:21:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:21:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:21:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:22:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:22:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:22:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:22:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:22:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:22:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:23:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:23:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:23:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:23:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:23:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:23:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:24:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:24:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:24:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:24:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:24:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:24:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:25:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:25:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:25:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:25:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:25:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:25:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:26:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:26:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:26:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:26:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:26:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:26:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:27:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:27:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:27:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:27:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:27:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:27:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:28:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:28:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:28:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:28:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:28:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:28:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:29:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:29:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:29:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:29:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:29:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:29:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:30:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:30:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:30:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:30:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:30:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:30:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:31:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:31:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:31:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:31:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:31:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:31:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:32:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:32:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:32:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:32:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:32:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:32:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:33:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:33:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:33:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:33:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:33:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:33:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:34:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:34:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:34:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:34:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:34:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:34:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:35:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:35:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:35:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:35:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:35:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:35:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:36:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:36:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:36:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:36:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:36:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:36:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:37:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:37:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:37:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:37:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:37:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:37:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:38:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:38:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:38:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:38:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:38:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:38:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:39:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:39:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:39:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:39:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:39:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:39:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:40:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:40:08 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:40:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:40:28 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:40:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:40:48 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:41:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:41:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:41:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:41:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:41:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:41:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:42:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:42:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:42:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:42:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:42:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:42:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:43:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:43:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:43:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:43:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:43:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:43:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:44:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:44:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:44:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:44:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:44:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:44:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:45:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:45:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:45:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:45:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:45:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:45:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:46:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:46:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:46:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:46:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:46:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:46:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:47:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:47:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:47:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:47:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:47:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:47:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:48:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:48:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:48:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:48:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:48:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:48:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:49:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:49:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:49:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:49:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:49:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:49:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:50:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:50:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:50:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:50:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:50:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:50:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:51:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:51:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:51:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:51:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:51:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:51:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:52:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:52:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:52:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:52:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:52:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:52:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:53:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:53:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:53:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:53:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:53:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:53:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:54:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:54:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:54:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:54:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:54:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:54:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:55:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:55:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:55:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:55:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:55:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:55:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:56:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:56:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:56:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:56:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:56:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:56:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:57:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:57:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:57:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:57:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:57:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:57:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:58:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:58:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:58:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:58:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:58:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:58:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:59:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:59:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:59:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:59:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:59:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/11:59:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:00:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:00:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:00:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:00:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:00:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:00:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:01:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:01:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:01:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:01:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:01:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:01:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:02:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:02:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:02:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:02:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:02:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:02:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:03:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:03:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:03:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:03:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:03:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:03:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:04:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:04:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:04:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:04:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:04:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:04:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:05:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:05:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:05:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:05:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:05:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:05:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:06:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:06:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:06:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:06:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:06:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:06:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:07:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:07:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:07:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:07:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:07:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:07:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:08:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:08:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:08:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:08:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:08:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:08:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:09:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:09:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:09:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:09:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:09:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:09:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:10:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:10:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:10:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:10:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:10:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:10:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:11:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:11:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:11:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:11:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:11:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:11:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:12:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:12:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:12:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:12:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:12:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:12:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:13:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:13:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:13:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:13:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:13:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:13:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:14:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:14:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:14:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:14:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:14:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:14:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:15:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:15:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:15:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:15:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:15:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:15:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:16:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:16:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:16:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:16:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:16:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:16:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:17:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:17:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:17:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:17:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:17:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:17:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:18:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:18:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:18:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:18:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:18:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:18:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:19:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:19:09 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:19:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:19:29 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:19:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19/12:19:49 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19/23:12:47 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:12:48 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:12:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:12:50 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:13:02 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:13:02 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:13:05 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:13:06 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:13:21 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:13:21 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:14:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:14:23 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:14:33 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-19/23:14:34 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:14:43 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:14:43 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:15:03 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:15:04 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:15:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:15:11 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:15:26 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:15:26 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:15:33 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:15:34 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:16:29 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:16:30 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:16:46 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:16:46 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:17:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:17:02 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:17:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:17:13 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:17:28 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:17:29 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:17:29 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:17:29 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:22:14 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:22:15 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:22:21 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:22:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:23:18 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:23:19 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:23:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-19/23:23:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:23:34 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:23:35 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:23:37 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:23:38 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:23:43 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:23:44 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:28:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19/23:28:13 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19/23:28:21 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19/23:28:22 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19/23:31:46 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-20/10:09:33 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/10:09:35 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/10:09:43 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/10:10:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/10:10:46 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/10:11:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/10:11:13 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/10:11:53 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/10:11:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/10:12:18 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/10:12:20 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:34:05 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:34:07 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20/11:34:08 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:34:27 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:34:40 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:34:43 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:34:44 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:34:58 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:35:56 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:36:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:36:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:36:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:36:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:36:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:36:39 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:38:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:38:16 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:38:19 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:38:22 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:38:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:38:29 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:38:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:38:46 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:39:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:40:02 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:40:20 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:40:24 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:41:50 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:42:04 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:44:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:44:06 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:44:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20/11:44:31 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:44:31 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:44:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:44:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:44:49 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:44:50 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:45:03 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:45:17 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:47:28 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:47:32 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:48:21 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:48:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:51:05 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:51:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:51:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:52:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:52:22 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:52:23 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:52:39 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:52:43 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:52:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:52:48 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:55:22 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:57:04 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:57:13 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:57:35 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:58:17 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:58:25 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:58:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:59:20 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/11:59:52 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/11:59:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:01:46 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:01:46 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:02:52 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:02:57 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:03:17 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:05:48 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:05:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:06:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:06:11 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:07:56 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:08:02 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:08:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20/12:08:05 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:09:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:09:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:14:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:15:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-20/12:15:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/12:15:13 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/12:15:17 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20/14:03:19 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:03:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:03:24 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:03:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:03:32 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:04:40 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:04:50 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:04:57 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:05:13 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:05:18 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:05:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:05:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:05:28 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:05:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:05:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:05:45 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:06:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-20/14:06:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20/14:06:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:07:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:07:38 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:07:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:07:41 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:07:41 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:07:50 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:08:38 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:08:44 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:09:34 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:09:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:11:15 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:11:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:15:32 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:15:34 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20/14:15:37 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20/14:15:47 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/11:33:36 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/11:33:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/11:33:51 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/11:34:16 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/11:34:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/11:34:24 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/11:34:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/11:34:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/11:34:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/11:35:26 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/11:35:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/11:37:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/11:37:54 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/11:42:27 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/11:42:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/12:24:41 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-21/12:24:41 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:42:59 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:43:00 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:43:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:43:01 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:44:21 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:44:21 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:44:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:44:29 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:44:34 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:44:35 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:44:37 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:44:38 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:44:39 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:44:39 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:44:41 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:44:42 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:48:43 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:48:44 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:48:53 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:48:54 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:49:22 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:49:23 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:49:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:49:30 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:49:41 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:49:41 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:50:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:50:01 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:50:05 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:50:05 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:50:37 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:50:38 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:50:53 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:50:53 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:51:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:51:04 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:51:06 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:51:06 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:51:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:51:08 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:52:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:52:52 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:52:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:52:52 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:54:08 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:54:09 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:54:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:54:31 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:54:34 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:54:35 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:54:59 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:55:00 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:55:03 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:55:03 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:55:05 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:55:05 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:55:27 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:55:27 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:55:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:55:29 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:55:57 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:55:58 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:56:19 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:56:20 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:56:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:56:24 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:57:06 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:57:07 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:57:19 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:57:20 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:57:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:57:23 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:57:33 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:57:33 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:57:53 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:57:54 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:58:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:58:23 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:58:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:58:28 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:58:44 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:58:44 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:59:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:59:03 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:59:04 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:59:05 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/13:59:06 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/13:59:07 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/13:59:13 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/13:59:14 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:00:56 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:00:57 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:01:08 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:01:09 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:01:09 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:01:10 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:04:17 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:04:18 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:04:19 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:04:19 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:05:18 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:05:18 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:05:21 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:05:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:06:55 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:06:56 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:06:56 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:06:56 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:07:02 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:07:02 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:07:07 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:07:08 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:07:22 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:07:22 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:07:25 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:07:26 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:07:39 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:07:39 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:08:08 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:08:08 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:08:29 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:08:29 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:08:30 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:08:30 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:08:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:08:42 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:08:43 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:08:43 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:08:59 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:09:00 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:09:01 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:09:02 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:09:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:09:12 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:11:40 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:11:40 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:11:46 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:11:46 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:12:04 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:12:04 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:23:55 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:23:56 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:23:57 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:23:58 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:23:58 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:23:59 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:24:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:24:01 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:27:38 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:27:38 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:27:42 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:27:42 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:28:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:28:51 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:28:53 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:28:53 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:28:53 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:28:54 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:28:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:28:56 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:29:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:29:20 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:29:20 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:29:21 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:29:30 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:29:31 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:30:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:30:00 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:30:04 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:30:05 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:30:13 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:30:13 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:30:32 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:30:32 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:30:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:30:39 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:30:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:30:49 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:31:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:31:56 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:32:04 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:32:05 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:32:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:32:12 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:32:16 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:32:16 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:32:27 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:32:28 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:32:34 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:32:35 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:33:50 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:33:50 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:34:37 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:34:37 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:34:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:34:40 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:34:40 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:34:40 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:34:42 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:34:42 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:35:10 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:35:11 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:35:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:35:12 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:37:39 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:37:40 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:37:42 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:37:43 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:38:53 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:38:54 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:38:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:38:56 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:39:07 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:39:08 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:39:17 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:39:18 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:45:26 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:45:26 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:46:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:46:12 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:46:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:46:21 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:46:32 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:46:33 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:51:06 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:51:07 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:51:13 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:51:13 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:51:47 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:51:47 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:51:58 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:51:58 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:52:06 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:52:06 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:52:33 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:52:34 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:52:56 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:52:56 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:53:09 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:53:09 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:53:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:53:15 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:53:16 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:53:17 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:53:43 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:53:44 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:53:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:53:47 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/14:54:18 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/14:54:19 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/14:54:19 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/14:54:20 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/15:56:52 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/15:56:52 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/15:57:09 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/15:57:10 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/15:57:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/15:57:12 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/15:57:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/15:57:13 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/15:57:26 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/15:57:26 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/15:57:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/15:57:28 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/15:57:34 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/15:57:34 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/15:57:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/15:57:52 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/15:57:53 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/15:57:54 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/15:58:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/15:58:00 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/15:58:27 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/15:58:27 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/15:58:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/15:58:53 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/15:59:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/15:59:02 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:09:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/16:09:47 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:09:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:09:49 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:10:50 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/16:10:51 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:10:52 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:10:53 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:10:58 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/16:10:59 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:11:00 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:11:01 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:11:02 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/16:11:03 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:11:35 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:11:35 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:11:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/16:11:50 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:11:53 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:11:54 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:11:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/16:11:56 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:12:14 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:12:15 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:12:16 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/16:12:16 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:12:17 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:12:18 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:12:19 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/16:12:20 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:13:28 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:13:29 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:14:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-21/16:14:12 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21/16:14:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/16:14:16 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21/16:29:49 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-21/19:29:56 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:30:07 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:30:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:30:57 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:31:40 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:31:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:34:00 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:34:10 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:34:14 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:34:25 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:34:32 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:34:57 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:36:02 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:36:11 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:36:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:36:24 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:38:06 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:38:21 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:38:46 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:38:57 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:38:58 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:45:16 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:45:25 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:46:54 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:46:57 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:47:10 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:47:29 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:47:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:47:48 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:49:59 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:50:01 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:50:14 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:50:15 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:50:27 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:50:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:50:56 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:51:36 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:51:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:51:44 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:51:46 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:51:52 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:52:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:54:17 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:54:28 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:54:36 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-21/19:54:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:54:51 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:55:09 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:55:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:55:45 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:55:46 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:55:57 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:56:13 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:56:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:56:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:56:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:56:33 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:58:41 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:58:53 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:58:56 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:58:58 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:59:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:59:25 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:59:38 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:59:40 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:59:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/19:59:44 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/19:59:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:01:32 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:01:35 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:01:45 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:01:51 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:01:53 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:02:05 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:02:09 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:02:37 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:02:47 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:02:54 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:02:57 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:03:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:03:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:04:32 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:04:45 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:04:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:04:48 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:05:02 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:05:12 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:05:18 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-21/20:05:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:05:42 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:11:42 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:11:49 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:26:41 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-21/20:26:50 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:32:35 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:32:43 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:33:01 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:33:27 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:33:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:33:35 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:33:50 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:33:59 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/20:34:17 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/20:34:25 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:19:45 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:19:55 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:20:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:20:41 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:21:10 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:21:12 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:21:32 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:21:58 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:25:03 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:25:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:25:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:25:33 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:25:35 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:25:50 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:25:57 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:25:59 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:26:02 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:26:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:26:26 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:26:38 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:26:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:26:49 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:26:55 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:28:38 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:28:39 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:29:07 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:34:13 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:34:20 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:34:22 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:34:23 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:34:24 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:35:24 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:35:28 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:35:48 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:36:07 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:36:15 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:37:02 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-21/21:37:09 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:37:11 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:37:14 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21/21:37:17 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21/21:38:01 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22/05:29:01 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-22/05:29:04 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22/05:29:06 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22/05:29:25 [4.009] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22/05:29:49 [4.004] Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22/08:56:17 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-22/08:56:17 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22/12:03:56 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.3) logged in +2024-01-22/12:13:15 [1.000] User 'admin' session (IP 10.242.2.3) terminated (Timeout) +2024-01-22/12:57:45 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-22/13:03:24 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.12) logged in +2024-01-22/13:53:23 [1.000] User 'admin' session (IP 10.242.2.12) terminated (Timeout) +2024-01-22/14:16:54 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.3) logged in +2024-01-22/14:17:11 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '67.00 °C' by user 'snmpd' [SNMP] +2024-01-22/14:18:03 [2.000] Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom' by user 'snmpd' [SNMP] +2024-01-22/14:19:03 [2.000] Device 6 (CMCIII-TMP-2-front-botom), Description changed to 'CMCIII-TMP-2-front' by user 'snmpd' [SNMP] +2024-01-22/14:20:03 [2.000] Device 6 (CMCIII-TMP-2-front), Description changed to 'CMCIII-TMP-2-front-status' by user 'snmpd' [SNMP] +2024-01-22/14:24:23 [2.000] Device 6 (CMCIII-TMP-2-front-status), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-22/14:26:23 [2.000] Device 6 (CMCIII-TMP-2-front-status), Description changed to 'CMCIII-TMP-2-front' by user 'snmpd' [SNMP] +2024-01-22/14:29:43 [2.000] Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '67.00 °C' by user 'snmpd' [SNMP] +2024-01-22/14:31:13 [2.000] Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-22/14:38:43 [2.000] Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '67.00 °C' by user 'snmpd' [SNMP] +2024-01-22/14:40:01 [2.000] Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-22/14:40:21 [2.000] Device 6 (CMCIII-TMP-2-front), Description changed to 'CMCIII-TMP-2-front-test' by user 'snmpd' [SNMP] +2024-01-22/14:41:41 [2.000] Device 6 (CMCIII-TMP-2-front-test), Description changed to 'CMCIII-TMP-2-front' by user 'snmpd' [SNMP] +2024-01-22/17:02:37 [1.000] User 'admin' session (IP 10.242.2.3) terminated (Timeout) +2024-01-22/22:45:04 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-22/22:45:05 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22/22:45:09 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22/22:45:09 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22/22:48:58 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22/22:48:58 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22/22:48:59 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22/22:49:00 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22/22:49:17 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22/22:49:17 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22/22:49:23 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22/22:49:24 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22/22:50:10 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22/22:50:10 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22/22:50:38 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22/22:50:38 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22/22:51:24 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22/22:51:24 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22/22:51:28 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22/22:51:29 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22/22:51:43 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22/22:51:44 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22/23:10:55 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-23/07:11:03 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:11:13 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:13:18 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (19.90 °C) +2024-01-23/07:13:26 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:14:41 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:15:22 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:15:32 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:15:36 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:15:44 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:15:50 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:15:53 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:15:54 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:16:31 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:16:56 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:16:58 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (19.90 °C) +2024-01-23/07:22:43 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:22:48 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:23:08 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:23:10 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:49:34 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:49:41 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:50:05 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:50:06 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:51:29 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:51:35 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:52:01 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:52:37 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/07:53:02 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/07:53:04 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/08:37:21 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-23/08:37:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:34:38 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:34:38 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:34:38 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:34:39 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:36:56 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:36:57 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:37:03 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:37:04 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:37:18 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-23/23:37:19 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:42:02 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:42:03 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:42:03 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:42:03 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:42:27 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:42:28 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:42:38 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:42:38 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:43:02 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (19.90 °C) +2024-01-23/23:43:03 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:43:13 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:43:13 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:43:17 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:43:18 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:44:08 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:44:08 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:44:08 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:44:09 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:44:10 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:44:10 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:45:24 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:45:25 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:45:27 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:45:28 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:46:21 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:46:21 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:46:24 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:46:24 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23/23:47:20 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23/23:47:21 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23/23:47:32 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23/23:47:32 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-24/00:19:06 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-24/05:54:41 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-24/06:22:25 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-24/06:22:26 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-24/18:48:37 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-24/18:49:05 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:15:42 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:15:43 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:15:43 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/02:15:44 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:15:44 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:15:44 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:15:52 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/02:15:52 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:15:53 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:15:54 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:15:55 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/02:15:55 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:16:24 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:16:24 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:16:26 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/02:16:27 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:16:27 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:16:27 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:16:29 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/02:16:29 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:16:43 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:16:43 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:17:37 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/02:17:38 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:17:54 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:17:54 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:17:57 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/02:17:58 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:17:59 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:17:59 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:19:46 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/02:19:47 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/02:19:47 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/02:19:48 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25/02:32:24 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-25/05:35:51 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/05:35:59 [4.009] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25/05:36:07 [4.004] Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25/05:49:22 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-25/05:49:22 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25/16:01:42 [2.000] Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '45.00 °C' by user 'snmpd' [SNMP] +2024-01-25/16:02:18 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.10) logged in +2024-01-25/16:03:21 [2.000] Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '46.00 °C' by user 'snmpd' [SNMP] +2024-01-25/16:04:41 [2.000] Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '47.00 °C' by user 'snmpd' [SNMP] +2024-01-25/16:13:05 [2.000] Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '46.00 °C' by user 'snmpd' [SNMP] +2024-01-25/16:17:26 [2.000] Device 6 (CMCIII-TMP-2-front), Description changed to 'CMCIII-TMP-2' by user 'snmpd' [SNMP] +2024-01-25/17:08:51 [1.000] User 'admin' session (IP 10.242.2.10) terminated (Timeout) +2024-01-26/04:00:31 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-26/04:00:31 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26/05:46:36 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26/05:46:37 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26/08:19:15 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26/08:19:16 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.70 °C) +2024-01-26/08:19:16 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26/08:20:35 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26/08:20:36 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26/08:20:36 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26/08:22:15 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26/08:22:16 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.80 °C) +2024-01-26/08:22:17 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26/08:22:55 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26/08:22:57 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26/08:22:57 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26/09:11:35 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26/09:11:37 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.80 °C) +2024-01-26/09:11:38 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26/09:12:15 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26/09:12:18 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26/09:12:18 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26/09:22:55 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26/09:22:57 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.70 °C) +2024-01-26/09:22:58 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26/09:25:35 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26/09:25:36 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26/09:25:37 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26/09:39:35 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26/09:39:37 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.70 °C) +2024-01-26/09:39:37 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26/09:40:15 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26/09:40:17 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26/09:40:18 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26/10:07:55 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26/10:07:56 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.70 °C) +2024-01-26/10:07:57 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26/11:15:50 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-26/13:24:24 [2.000] Configuration 'SNMP-Setup' changed by user 'admin' [Web] +2024-01-26/13:25:30 [2.000] Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtLowAlarm' changed to '5.00 °C' by user 'admin' [Web] +2024-01-26/13:26:15 [2.000] Configuration 'SNMP-Setup' changed by user 'admin' [Web] +2024-01-26/13:26:29 [2.000] Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtLowAlarm' changed to '5.20 °C' by user 'admin' [Web] +2024-01-26/13:30:12 [2.000] Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtLowAlarm' changed to '5.00 °C' by user 'admin' [Web] +2024-01-26/15:19:45 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-26/19:30:47 [1.000] User 'admin' (IP 10.242.2.6) logged out +2024-01-27/01:10:10 [2.000] Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-27/01:10:30 [2.000] Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtHighAlarm' changed to '65.00 °C' by user 'snmpd' [SNMP] +2024-01-27/01:11:10 [2.000] Device 6 (CMCIII-TMP-2), Description changed to 'CMCIII-TMP-2 update' by user 'snmpd' [SNMP] +2024-01-27/01:11:10 [2.000] Device 6 (CMCIII-TMP-2 update), Description changed to 'CMCIII-TMP-2 update' by user 'snmpd' [SNMP] +2024-01-27/01:11:24 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-27/01:33:49 [1.000] User 'admin' session (IP 10.242.2.6) terminated (Timeout) +2024-01-27/03:04:43 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27/03:05:03 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27/03:08:04 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27/03:08:05 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27/03:09:08 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27/03:09:10 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27/03:09:21 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27/03:09:36 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27/03:09:46 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27/03:09:53 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27/03:10:10 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27/06:55:24 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27/09:04:13 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.90 °C) +2024-01-27/09:04:14 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-27/10:49:45 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.90 °C) +2024-01-27/10:49:45 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-27/11:40:18 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.90 °C) +2024-01-27/11:40:19 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-27/15:59:36 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.90 °C) +2024-01-27/15:59:36 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-28/01:05:54 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/01:06:05 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/01:06:06 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/01:06:13 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/01:06:48 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/01:06:54 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/01:06:57 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/01:07:12 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/01:07:15 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/01:07:17 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/01:07:33 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/08:00:08 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/08:00:23 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/08:00:34 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/09:11:05 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.90 °C) +2024-01-28/09:11:05 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-28/10:34:24 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.90 °C) +2024-01-28/10:34:25 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-28/11:43:01 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.90 °C) +2024-01-28/11:43:02 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-28/15:04:03 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.90 °C) +2024-01-28/15:04:03 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-28/23:10:13 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/23:10:28 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/23:12:10 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/23:12:12 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/23:12:15 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/23:12:15 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/23:12:23 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/23:12:28 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/23:12:43 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28/23:12:50 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28/23:13:07 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/06:48:50 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/06:48:53 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/06:49:04 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/06:49:19 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/06:49:49 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/06:50:01 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/06:50:12 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/06:50:21 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/06:50:25 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/06:51:42 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/06:51:42 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/06:52:53 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/06:52:54 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/07:37:34 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/07:37:36 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/07:39:00 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/07:39:25 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/07:40:15 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/07:40:17 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/07:40:23 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/07:40:38 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/07:40:44 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/07:43:19 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/07:43:33 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/08:10:40 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/08:10:56 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/08:11:26 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/08:11:41 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/08:11:44 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/08:12:51 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/08:12:53 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/08:13:22 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/08:13:24 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/08:14:03 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/08:14:03 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/08:14:06 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/08:14:09 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/10:13:07 [2.000] Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-29/10:13:10 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.40 °C) +2024-01-29/10:13:10 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-29/13:23:28 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.9) logged in +2024-01-29/13:56:06 [2.000] Device 6 (CMCIII-TMP-2 update), Variable 'Temperature.SetPtHighAlarm' changed to '63.00 °C' by user 'snmpd' [SNMP] +2024-01-29/13:56:46 [2.000] Device 6 (CMCIII-TMP-2 update), Variable 'Temperature.SetPtHighAlarm' changed to '60.00 °C' by user 'snmpd' [SNMP] +2024-01-29/13:58:38 [2.000] Device 7 (CMCIII-HUM), Variable 'Humidity.SetPtHighAlarm' changed to '45.00 %' by user 'admin' [Web] +2024-01-29/14:17:46 [2.000] Device 6 (CMCIII-TMP-2 update), Variable 'Temperature.SetPtHighAlarm' changed to '64.00 °C' by user 'snmpd' [SNMP] +2024-01-29/17:29:31 [2.000] Device 7 (CMCIII-HUM), Variable 'Humidity.SetPtHighAlarm' changed to '43.00 %' by user 'snmpd' [SNMP] +2024-01-29/17:32:31 [2.000] Device 7 (CMCIII-HUM), Variable 'Humidity.SetPtHighAlarm' changed to '41.00 %' by user 'snmpd' [SNMP] +2024-01-29/17:34:31 [2.000] Device 7 (CMCIII-HUM), Description changed to 'CMCIII-HUM-update' by user 'snmpd' [SNMP] +2024-01-29/17:49:33 [1.000] User 'admin' session (IP 10.242.2.9) terminated (Timeout) +2024-01-29/22:53:32 [4.009] Device 7 (CMCIII-HUM-update) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-29/22:53:33 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-29/23:12:58 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/23:13:52 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/23:14:50 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29/23:15:17 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29/23:15:33 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-30/07:15:21 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-30/07:15:30 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-30/07:15:59 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-30/08:20:59 [4.004] Device 7 (CMCIII-HUM-update) @2.04, Temperatur: OK (20.80 °C) +2024-01-30/08:21:00 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-30/09:24:56 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-30/09:24:56 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30/09:24:56 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30/09:24:56 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-30/09:24:56 [4.015] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-30/09:25:01 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30/09:25:17 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-30/09:51:43 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-01-30/09:51:58 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-30/09:51:58 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30/09:51:58 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30/09:51:59 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-30/09:51:59 [4.015] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-30/09:52:09 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30/09:52:24 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-30/10:55:27 [1.000] User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-01-30/11:10:04 [1.001] User 'admin' (local / Group 'admins' / IP 10.242.2.10) logged in +2024-01-30/11:10:22 [2.000] Device 7 (CMCIII-HUM-update), Variable 'Humidity.SetPtHighAlarm' changed to '45.00 %' by user 'snmpd' [SNMP] +2024-01-30/11:13:43 [2.000] Device 7 (CMCIII-HUM-update), Variable 'Humidity.SetPtHighAlarm' changed to '43.00 %' by user 'snmpd' [SNMP] +2024-01-30/11:15:04 [2.000] Device 7 (CMCIII-HUM-update), Description changed to 'CMCIII-HUM' by user 'snmpd' [SNMP] +2024-01-30/11:52:39 [2.000] Device 7 (CMCIII-HUM), Variable 'Humidity.SetPtHighAlarm' changed to '45.00 %' by user 'snmpd' [SNMP] +2024-01-30/13:26:29 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-30/13:26:29 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30/13:26:29 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30/13:26:30 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-30/13:26:30 [4.015] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-30/13:26:35 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30/13:26:36 [4.005] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Alarm (1 ) +2024-01-30/13:26:37 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-30/13:26:37 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30/13:26:38 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-30/13:26:55 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-30/13:31:39 [1.010] Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-30/13:31:39 [2.000] Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30/13:31:39 [2.000] Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30/13:31:40 [4.015] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-30/13:31:41 [4.015] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-30/13:31:48 [4.014] Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30/13:32:06 [4.014] Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-30/13:41:45 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-01-30/16:06:31 [2.000] Device 6 (CMCIII-TMP-2 update), Variable 'Temperature.DescName' changed to 'Temperature-Update' by user 'snmpd' [SNMP] +2024-01-30/17:03:40 [1.000] User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-01-31/01:17:09 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-31/01:17:09 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-31/02:22:52 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-01-31/02:23:01 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-01-31/02:23:52 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-01-31/02:24:50 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-01-31/02:24:59 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-01-31/05:56:31 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-01-31/06:50:00 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-31/06:50:01 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-31/11:08:45 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-01-31/11:14:21 [2.000] Device 3 (CMCIII-GRF2-4), Description changed to 'CMCIII-GRF2-4 front' by user 'admin' [Web] +2024-01-31/11:14:33 [2.000] Device 4 (CMCIII-GRF2-2), Description changed to 'CMCIII-GRF2-2 rear' by user 'admin' [Web] +2024-01-31/11:58:48 [1.000] User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-02-01/01:40:52 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-02-01/01:40:53 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-02-01/03:02:23 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-02-01/03:02:46 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-02-01/03:02:54 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-02-01/05:44:18 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-02-01/05:44:50 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-02-01/05:44:51 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-02-01/06:22:47 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-02-01/06:22:48 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-02-01/07:55:00 [4.009] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-02-01/07:55:01 [4.010] Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-02-01/08:02:21 [4.009] Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-02-01/09:11:52 [4.004] Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-02-01/09:45:51 [4.004] Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-02-01/09:45:52 [4.011] Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-02-01/11:25:43 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-02-01/11:27:35 [1.000] User 'admin' session (IP 192.168.10.194) terminated (Timeout) + +============================ End of list ============================== + diff --git a/src/test/resources/Logging_v2.cmc3 b/src/test/resources/Logging_v2.cmc3 new file mode 100755 index 0000000..5c320ef --- /dev/null +++ b/src/test/resources/Logging_v2.cmc3 @@ -0,0 +1,602 @@ +========================== Logging-Information ======================= + +System-Name : 7030.000 CMC III PU SN 39596776 +System-Location : Location of the Unit +System-Contact : Contact Person3 +Serial-Number : 39596776 +IPv4-Address : 192.168.84.20 +IPv6-Address 1 : +IPv6-Address 2 : +IPv6-Addr. Auto : +IPv6-Addr. Local : fe80::2d0:93ff:fe6b:f43b/64 + +Date / Time : 26.01.1970, 00:45:32 + + Date / Time Msg-ID Text +------------------------------------------------------------------------ +25.03.2024/12:49:41 [2.000] Configuration 'Date / Time' changed by user 'admin' [Web] +25.03.2024/12:58:59 [1.000] User 'admin' session (IP 192.168.84.102) terminated (Timeout) +25.03.2024/13:11:14 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.84.102) logged in +25.03.2024/13:20:17 [3.001] Quit Device Configuration... +25.03.2024/13:20:17 [5.002] Device 1 (CMCIII-PU) @1.01, OK +25.03.2024/13:20:17 [5.002] Device 2 (CMCIII-IO3) @1.02, OK +25.03.2024/13:20:17 [5.002] Device 3 (CMCIII-ACC) @2.01, OK +25.03.2024/13:20:17 [5.002] Device 4 (CMCIII-LEAK) @2.02, OK +25.03.2024/13:20:17 [5.002] Device 5 (CMCIII-VAN) @2.03, OK +25.03.2024/13:20:17 [5.002] Device 6 (CMCIII-SMK) @2.04, OK +25.03.2024/13:20:18 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (33.20 °C) +25.03.2024/13:20:18 [4.027] Device 1 (CMCIII-PU) @1.01, Door: Inactive (0 ) +25.03.2024/13:20:18 [4.010] Device 1 (CMCIII-PU) @1.01, Input 1: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 1 (CMCIII-PU) @1.01, Input 2: Off (0 ) +25.03.2024/13:20:18 [4.011] Device 1 (CMCIII-PU) @1.01, Alarm Relay: On (On) +25.03.2024/13:20:18 [4.004] Device 1 (CMCIII-PU) @1.01, CAN1 Current: OK (0 mA) +25.03.2024/13:20:18 [4.004] Device 1 (CMCIII-PU) @1.01, CAN2 Current: OK (110 mA) +25.03.2024/13:20:18 [4.004] Device 1 (CMCIII-PU) @1.01, Sys Temp: OK (34.80 °C) +25.03.2024/13:20:18 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 24V: OK (23.630 V) +25.03.2024/13:20:18 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 5V0: OK (5.000 V) +25.03.2024/13:20:18 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 3V3: OK (3.290 V) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_1: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_2: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_3: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_4: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_5: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_6: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_7: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_8: Off (0 ) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_1: Off (Off) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_2: Off (Off) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_3: Off (Off) +25.03.2024/13:20:18 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_4: Off (Off) +25.03.2024/13:20:18 [4.012] Device 3 (CMCIII-ACC) @2.01, Door: Open (1 ) +25.03.2024/13:20:18 [4.004] Device 4 (CMCIII-LEAK) @2.02, Leakage: OK () +25.03.2024/13:20:18 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.25 g, 0.93 g) +25.03.2024/13:20:18 [4.004] Device 6 (CMCIII-SMK) @2.04, Smoke: OK (0 ) +25.03.2024/13:20:18 [4.010] Device 1 (CMCIII-PU) @1.01, Alarm Relay: Off (Off) +25.03.2024/13:20:23 [3.001] Quit Device Configuration... +25.03.2024/13:20:29 [3.001] Quit Device Configuration... +25.03.2024/13:20:32 [3.001] Quit Device Configuration... +25.03.2024/13:20:46 [3.001] Quit Device Configuration... +25.03.2024/13:20:53 [3.001] Quit Device Configuration... +25.03.2024/13:20:59 [3.001] Quit Device Configuration... +25.03.2024/13:24:23 [1.000] User 'admin' session (IP 192.168.84.102) terminated (Timeout) +25.03.2024/13:26:02 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +25.03.2024/14:10:50 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (35.10 °C) +25.03.2024/14:13:57 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +25.03.2024/14:17:39 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +25.03.2024/14:18:53 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '40.00 °C' by user 'admin' [Web] +25.03.2024/14:18:54 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (35.40 °C) +25.03.2024/14:19:00 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '36.00 °C' by user 'admin' [Web] +25.03.2024/14:19:57 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '40.00 °C' by user 'admin' [Web] +25.03.2024/14:20:02 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '45.00 °C' by user 'admin' [Web] +25.03.2024/15:01:09 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +25.03.2024/15:01:29 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +25.03.2024/15:29:42 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +26.03.2024/07:47:52 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +26.03.2024/09:10:00 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +26.03.2024/09:18:05 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +26.03.2024/10:22:01 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +26.03.2024/11:54:59 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '31.20 °C' by user 'snmpd' [SNMP] +26.03.2024/11:55:00 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (35.50 °C) +26.03.2024/11:55:17 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +26.03.2024/11:55:17 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '32.00 °C' by user 'snmpd' [SNMP] +26.03.2024/11:55:19 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (35.60 °C) +26.03.2024/11:56:43 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +26.03.2024/11:56:49 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +26.03.2024/11:57:04 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '40.00 °C' by user 'admin' [Web] +26.03.2024/11:57:05 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (35.90 °C) +26.03.2024/11:57:15 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '35.00 °C' by user 'admin' [Web] +26.03.2024/11:57:24 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '40.00 °C' by user 'admin' [Web] +26.03.2024/11:57:25 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (36.00 °C) +26.03.2024/11:57:30 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '45.00 °C' by user 'admin' [Web] +26.03.2024/12:36:23 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +26.03.2024/14:35:50 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +26.03.2024/14:35:51 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (35.80 °C) +26.03.2024/14:36:06 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +26.03.2024/14:36:24 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '40.00 °C' by user 'admin' [Web] +26.03.2024/14:36:25 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (35.90 °C) +26.03.2024/14:36:30 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '45.00 °C' by user 'admin' [Web] +26.03.2024/14:36:58 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +26.03.2024/14:36:59 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (35.90 °C) +26.03.2024/14:37:12 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '34.00 °C' by user 'snmpd' [SNMP] +26.03.2024/14:37:13 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '40.00 °C' by user 'admin' [Web] +26.03.2024/14:37:14 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (36.00 °C) +26.03.2024/14:37:22 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '50.00 °C' by user 'admin' [Web] +26.03.2024/14:37:23 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (36.00 °C) +26.03.2024/14:38:20 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '60.00 °C' by user 'admin' [Web] +26.03.2024/15:05:59 [2.000] Configuration 'System-Info' changed by user 'snmpd' [SNMP] +26.03.2024/15:28:40 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +27.03.2024/08:19:30 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +27.03.2024/09:05:30 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +28.03.2024/10:59:13 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +28.03.2024/11:07:52 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +28.03.2024/12:38:16 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +03.04.2024/13:17:51 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (0.12 g, -0.18 g, 1.50 g) +03.04.2024/13:17:57 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.18 g, 0.87 g) +03.04.2024/13:20:40 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (0.06 g, -0.12 g, 1.50 g) +03.04.2024/13:20:45 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.25 g, 0.87 g) +03.04.2024/13:26:33 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.06 g, -0.25 g, 1.50 g) +03.04.2024/13:26:39 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.25 g, 0.93 g) +03.04.2024/13:27:53 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, -0.31 g, 1.50 g) +03.04.2024/13:27:58 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.18 g, 0.93 g) +03.04.2024/13:28:18 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.25 g, 1.50 g) +03.04.2024/13:28:24 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.25 g, 0.93 g) +03.04.2024/13:29:49 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.25 g, 1.50 g) +03.04.2024/13:29:55 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.18 g, 0.93 g) +03.04.2024/13:30:03 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, -0.31 g, 1.50 g) +03.04.2024/13:30:09 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.25 g, 0.93 g) +03.04.2024/13:30:22 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.06 g, -0.31 g, 1.50 g) +03.04.2024/13:30:27 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.25 g, 0.93 g) +03.04.2024/13:31:47 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, -0.18 g, 1.50 g) +03.04.2024/13:31:57 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.18 g, 0.93 g) +03.04.2024/13:32:12 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (0.00 g, -0.18 g, 1.50 g) +03.04.2024/13:32:17 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.18 g, 0.93 g) +03.04.2024/13:32:33 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.25 g, 1.50 g) +03.04.2024/13:32:39 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.18 g, 0.93 g) +03.04.2024/13:32:43 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, -0.25 g, 1.50 g) +03.04.2024/13:32:48 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.25 g, 0.93 g) +03.04.2024/13:35:24 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, -0.31 g, 1.50 g) +03.04.2024/13:35:30 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.25 g, 0.87 g) +03.04.2024/13:35:57 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, -0.18 g, 1.50 g) +03.04.2024/13:36:03 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.18 g, 0.87 g) +03.04.2024/13:38:03 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.25 g, 1.50 g) +03.04.2024/13:38:09 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.18 g, 0.87 g) +03.04.2024/17:32:02 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, -0.31 g, 1.50 g) +03.04.2024/17:32:08 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -0.18 g, 0.93 g) +04.04.2024/11:45:51 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +04.04.2024/12:53:53 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +04.04.2024/13:44:40 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (0.06 g, -0.25 g, 1.50 g) +04.04.2024/13:44:46 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.18 g, 0.93 g) +04.04.2024/15:58:44 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (0.18 g, -0.31 g, 1.50 g) +04.04.2024/15:58:49 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.12 g, -0.25 g, 0.93 g) +05.04.2024/10:56:11 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.06 g, -0.31 g, 1.50 g) +05.04.2024/10:56:17 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.50 g, -0.18 g, 0.93 g) +05.04.2024/11:06:06 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, 1.50 g, 0.62 g) +05.04.2024/11:06:11 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -1.12 g, 0.62 g) +05.04.2024/11:13:47 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.06 g, 1.50 g, 0.56 g) +05.04.2024/11:13:53 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -1.12 g, 0.62 g) +05.04.2024/11:48:12 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.06 g, 1.50 g, 0.62 g) +05.04.2024/11:48:18 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.06 g, -1.12 g, 0.56 g) +05.04.2024/12:09:59 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.12 g, -1.18 g, 0.62 g) +05.04.2024/12:10:05 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (0.37 g, -0.81 g, 0.62 g) +05.04.2024/12:11:50 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (1.50 g, -0.62 g, 1.18 g) +05.04.2024/12:13:09 [3.001] Quit Alarm Message... +05.04.2024/12:13:58 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.43 g, -1.31 g, 0.31 g) +05.04.2024/12:16:13 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.50 g, 1.50 g, 0.12 g) +05.04.2024/12:16:31 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -1.31 g, 0.31 g) +05.04.2024/12:16:38 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, 1.50 g, 0.43 g) +05.04.2024/12:16:49 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -1.25 g, 0.37 g) +05.04.2024/12:22:33 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, 1.50 g, 0.56 g) +05.04.2024/12:22:40 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -1.25 g, 0.50 g) +05.04.2024/12:31:34 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, 1.50 g, 0.37 g) +05.04.2024/12:32:22 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/12:32:26 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.31 g, -0.43 g, 1.50 g) +05.04.2024/12:32:43 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/12:41:40 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.37 g, 1.50 g) +05.04.2024/12:41:45 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/12:51:22 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +05.04.2024/12:51:27 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/12:55:12 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (1.50 g, 1.50 g, 1.50 g) +05.04.2024/12:55:18 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/12:56:14 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/12:56:20 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/12:56:55 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, 1.50 g, 1.50 g) +05.04.2024/12:57:04 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/12:57:16 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/12:57:23 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/13:55:30 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +05.04.2024/13:55:39 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/13:56:39 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +05.04.2024/13:56:45 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/13:59:25 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/13:59:30 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:00:29 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:00:34 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:00:45 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 0.93 g) +05.04.2024/14:00:50 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:00:53 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:01:04 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 1.00 g) +05.04.2024/14:01:07 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:01:23 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:01:33 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.37 g, 1.50 g) +05.04.2024/14:01:41 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:01:55 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:02:04 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:30:49 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +05.04.2024/14:30:56 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:31:09 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:31:16 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:46:31 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:46:50 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:46:58 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:47:07 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:47:09 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:47:18 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:52:13 [3.013] Ethernet: Auto +05.04.2024/14:52:13 [1.100] Application (V3.15.70_4) started +05.04.2024/14:52:49 [5.002] Device 1 (CMCIII-PU) @1.01, OK +05.04.2024/14:52:49 [5.002] Device 2 (CMCIII-IO3) @1.02, OK +05.04.2024/14:52:49 [5.002] Device 3 (CMCIII-ACC) @2.01, OK +05.04.2024/14:52:49 [5.002] Device 4 (CMCIII-LEAK) @2.02, OK +05.04.2024/14:52:49 [5.002] Device 5 (CMCIII-VAN) @2.03, OK +05.04.2024/14:52:49 [5.002] Device 6 (CMCIII-SMK) @2.04, OK +05.04.2024/14:52:50 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (35.00 °C) +05.04.2024/14:52:50 [4.027] Device 1 (CMCIII-PU) @1.01, Door: Inactive (0 ) +05.04.2024/14:52:50 [4.010] Device 1 (CMCIII-PU) @1.01, Input 1: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 1 (CMCIII-PU) @1.01, Input 2: Off (0 ) +05.04.2024/14:52:50 [4.011] Device 1 (CMCIII-PU) @1.01, Alarm Relay: On (On) +05.04.2024/14:52:50 [4.004] Device 1 (CMCIII-PU) @1.01, CAN1 Current: OK (0 mA) +05.04.2024/14:52:50 [4.004] Device 1 (CMCIII-PU) @1.01, CAN2 Current: OK (120 mA) +05.04.2024/14:52:50 [4.004] Device 1 (CMCIII-PU) @1.01, Sys Temp: OK (38.10 °C) +05.04.2024/14:52:50 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 24V: OK (23.330 V) +05.04.2024/14:52:50 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 5V0: OK (5.000 V) +05.04.2024/14:52:50 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 3V3: OK (3.290 V) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_1: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_2: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_3: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_4: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_5: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_6: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_7: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_8: Off (0 ) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_1: Off (Off) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_2: Off (Off) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_3: Off (Off) +05.04.2024/14:52:50 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_4: Off (Off) +05.04.2024/14:52:50 [4.012] Device 3 (CMCIII-ACC) @2.01, Door: Open (1 ) +05.04.2024/14:52:50 [4.004] Device 4 (CMCIII-LEAK) @2.02, Leakage: OK () +05.04.2024/14:52:50 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.37 g, 0.93 g) +05.04.2024/14:52:50 [4.004] Device 6 (CMCIII-SMK) @2.04, Smoke: OK (0 ) +05.04.2024/14:52:50 [4.010] Device 1 (CMCIII-PU) @1.01, Alarm Relay: Off (Off) +05.04.2024/14:53:48 [3.001] Quit Alarm Message... +05.04.2024/14:59:11 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:59:17 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:59:40 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/14:59:50 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/14:59:56 [5.004] Device 6 (CMCIII-SMK) @1.00, Lost +05.04.2024/15:04:18 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/15:04:24 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:14:10 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/15:14:20 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:14:26 [5.004] Device 3 (CMCIII-ACC) @1.00, Lost +05.04.2024/15:14:26 [5.004] Device 4 (CMCIII-LEAK) @1.00, Lost +05.04.2024/15:14:27 [5.004] Device 5 (CMCIII-VAN) @1.00, Lost +05.04.2024/15:14:46 [5.005] Device 3 (CMCIII-ACC) @2.01, Changed +05.04.2024/15:14:46 [5.005] Device 4 (CMCIII-LEAK) @2.02, Changed +05.04.2024/15:14:46 [5.005] Device 5 (CMCIII-VAN) @2.03, Changed +05.04.2024/15:14:46 [5.005] Device 6 (CMCIII-SMK) @2.04, Changed +05.04.2024/15:14:46 [4.012] Device 3 (CMCIII-ACC) @2.01, Door: Open (1 ) +05.04.2024/15:14:46 [4.004] Device 4 (CMCIII-LEAK) @2.02, Leakage: OK () +05.04.2024/15:14:46 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:14:46 [4.004] Device 6 (CMCIII-SMK) @2.04, Smoke: OK (0 ) +05.04.2024/15:14:51 [5.002] Device 3 (CMCIII-ACC) @2.01, OK +05.04.2024/15:14:51 [5.002] Device 4 (CMCIII-LEAK) @2.02, OK +05.04.2024/15:14:51 [5.002] Device 5 (CMCIII-VAN) @2.03, OK +05.04.2024/15:14:51 [5.002] Device 6 (CMCIII-SMK) @2.04, OK +05.04.2024/15:14:52 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, 1.50 g, 1.50 g) +05.04.2024/15:14:57 [3.001] Quit Alarm Message... +05.04.2024/15:14:58 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:28:25 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/15:28:31 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:33:29 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/15:33:35 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:33:52 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/15:33:58 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:38:11 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.31 g, -0.43 g, 1.50 g) +05.04.2024/15:38:16 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:41:42 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.50 g, 1.50 g) +05.04.2024/15:41:48 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/15:42:02 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/15:42:07 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.18 g, -0.43 g, 0.93 g) +05.04.2024/15:44:03 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.31 g, -0.43 g, 1.50 g) +05.04.2024/15:44:09 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/16:01:55 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +05.04.2024/16:02:00 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/16:04:58 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +05.04.2024/16:05:04 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/16:06:03 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/16:06:09 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/16:06:44 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/16:06:50 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +05.04.2024/16:07:04 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +05.04.2024/16:07:10 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +08.04.2024/10:38:09 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +08.04.2024/10:57:36 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +08.04.2024/11:49:19 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +08.04.2024/11:49:24 [3.001] Quit Device Configuration... +08.04.2024/13:07:49 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +09.04.2024/10:48:40 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '26.50 °C' by user 'snmpd' [SNMP] +09.04.2024/10:48:41 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.00 °C) +09.04.2024/10:49:22 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '32.10 °C' by user 'snmpd' [SNMP] +09.04.2024/10:49:23 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.00 °C) +09.04.2024/10:49:33 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '54.10 °C' by user 'snmpd' [SNMP] +09.04.2024/10:49:35 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.00 °C) +09.04.2024/11:24:22 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '55.10 °C' by user 'snmpd' [SNMP] +09.04.2024/11:24:23 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (40.40 °C) +09.04.2024/12:48:15 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '44.60 °C' by user 'snmpd' [SNMP] +09.04.2024/12:48:27 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '24.80 °C' by user 'snmpd' [SNMP] +09.04.2024/12:48:28 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.30 °C) +10.04.2024/08:39:59 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '50.50 °C' by user 'snmpd' [SNMP] +10.04.2024/08:40:01 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (40.30 °C) +10.04.2024/08:41:06 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '-2.30 °C' by user 'snmpd' [SNMP] +10.04.2024/08:41:08 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.30 °C) +10.04.2024/08:51:05 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +10.04.2024/08:51:12 [3.001] Quit Device Configuration... +10.04.2024/08:51:47 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '57.30 °C' by user 'snmpd' [SNMP] +10.04.2024/08:51:48 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (40.30 °C) +10.04.2024/08:58:20 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '-14.60 °C' by user 'snmpd' [SNMP] +10.04.2024/08:58:21 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.10 °C) +10.04.2024/09:03:21 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '51.40 °C' by user 'snmpd' [SNMP] +10.04.2024/09:03:22 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (40.20 °C) +10.04.2024/09:08:46 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '-14.80 °C' by user 'snmpd' [SNMP] +10.04.2024/09:08:46 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.00 °C) +10.04.2024/09:15:29 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '57.70 °C' by user 'snmpd' [SNMP] +10.04.2024/09:15:30 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (40.90 °C) +10.04.2024/09:17:06 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +10.04.2024/09:39:38 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '18.10 °C' by user 'snmpd' [SNMP] +10.04.2024/09:39:39 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.00 °C) +10.04.2024/09:41:03 [3.001] Quit Alarm Message... +10.04.2024/10:09:19 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '24.30 °C' by user 'snmpd' [SNMP] +10.04.2024/10:29:29 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '60.10 °C' by user 'snmpd' [SNMP] +10.04.2024/10:29:29 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.30 °C) +10.04.2024/10:37:35 [3.001] Quit Alarm Message... +10.04.2024/11:27:50 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '26.40 °C' by user 'snmpd' [SNMP] +10.04.2024/11:27:52 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.30 °C) +10.04.2024/11:34:40 [3.001] Quit Alarm Message... +10.04.2024/11:38:31 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '3.90 °C' by user 'snmpd' [SNMP] +10.04.2024/11:38:38 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '59.40 °C' by user 'snmpd' [SNMP] +10.04.2024/11:38:39 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.60 °C) +10.04.2024/11:38:43 [3.001] Quit Alarm Message... +10.04.2024/12:00:52 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '-3.80 °C' by user 'snmpd' [SNMP] +10.04.2024/12:00:53 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.30 °C) +10.04.2024/12:02:17 [3.001] Quit Alarm Message... +10.04.2024/12:16:16 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '78.70 °C' by user 'snmpd' [SNMP] +10.04.2024/12:16:29 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '-8.60 °C' by user 'snmpd' [SNMP] +10.04.2024/12:16:35 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '57.10 °C' by user 'snmpd' [SNMP] +10.04.2024/12:16:36 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.50 °C) +10.04.2024/12:20:58 [3.001] Quit Alarm Message... +10.04.2024/12:25:19 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '2.80 °C' by user 'snmpd' [SNMP] +10.04.2024/12:25:20 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.60 °C) +10.04.2024/12:25:26 [3.001] Quit Alarm Message... +10.04.2024/12:36:28 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '48.60 °C' by user 'snmpd' [SNMP] +10.04.2024/12:36:34 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '80.00 °C' by user 'snmpd' [SNMP] +10.04.2024/12:36:34 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (40.60 °C) +10.04.2024/12:36:38 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '31.00 °C' by user 'snmpd' [SNMP] +10.04.2024/12:36:39 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.60 °C) +10.04.2024/12:36:44 [3.001] Quit Alarm Message... +10.04.2024/12:51:21 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '26.50 °C' by user 'snmpd' [SNMP] +10.04.2024/12:51:22 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.60 °C) +10.04.2024/12:51:28 [3.001] Quit Alarm Message... +10.04.2024/12:57:07 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '65.40 °C' by user 'snmpd' [SNMP] +10.04.2024/12:57:08 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.70 °C) +10.04.2024/13:04:45 [3.001] Quit Alarm Message... +10.04.2024/13:05:59 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '-22.10 °C' by user 'snmpd' [SNMP] +10.04.2024/13:06:00 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.90 °C) +10.04.2024/13:06:47 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '59.60 °C' by user 'snmpd' [SNMP] +10.04.2024/13:09:04 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '48.30 °C' by user 'snmpd' [SNMP] +10.04.2024/13:09:05 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (41.40 °C) +10.04.2024/13:09:54 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '-5.70 °C' by user 'snmpd' [SNMP] +10.04.2024/13:09:54 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (41.30 °C) +10.04.2024/13:40:43 [3.001] Quit Alarm Message... +10.04.2024/13:40:47 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +10.04.2024/16:21:40 [3.013] Ethernet: Auto +10.04.2024/16:21:40 [1.100] Application (V3.15.70_4) started +10.04.2024/16:22:16 [5.002] Device 1 (CMCIII-PU) @1.01, OK +10.04.2024/16:22:16 [5.002] Device 2 (CMCIII-IO3) @1.02, OK +10.04.2024/16:22:16 [5.005] Device 3 (CMCIII-ACC) @2.04, Changed +10.04.2024/16:22:16 [5.002] Device 4 (CMCIII-LEAK) @2.02, OK +10.04.2024/16:22:16 [5.002] Device 5 (CMCIII-VAN) @2.03, OK +10.04.2024/16:22:16 [5.005] Device 6 (CMCIII-SMK) @2.01, Changed +10.04.2024/16:22:16 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (25.30 °C) +10.04.2024/16:22:16 [4.027] Device 1 (CMCIII-PU) @1.01, Door: Inactive (0 ) +10.04.2024/16:22:16 [4.010] Device 1 (CMCIII-PU) @1.01, Input 1: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 1 (CMCIII-PU) @1.01, Input 2: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 1 (CMCIII-PU) @1.01, Alarm Relay: Off (Off) +10.04.2024/16:22:16 [4.004] Device 1 (CMCIII-PU) @1.01, CAN1 Current: OK (0 mA) +10.04.2024/16:22:16 [4.004] Device 1 (CMCIII-PU) @1.01, CAN2 Current: OK (110 mA) +10.04.2024/16:22:16 [4.004] Device 1 (CMCIII-PU) @1.01, Sys Temp: OK (27.20 °C) +10.04.2024/16:22:16 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 24V: OK (23.340 V) +10.04.2024/16:22:16 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 5V0: OK (5.000 V) +10.04.2024/16:22:16 [4.004] Device 1 (CMCIII-PU) @1.01, Supply 3V3: OK (3.290 V) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_1: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_2: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_3: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_4: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_5: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_6: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_7: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_8: Off (0 ) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_1: Off (Off) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_2: Off (Off) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_3: Off (Off) +10.04.2024/16:22:16 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_4: Off (Off) +10.04.2024/16:22:16 [4.012] Device 3 (CMCIII-ACC) @2.04, Door: Open (1 ) +10.04.2024/16:22:16 [4.004] Device 4 (CMCIII-LEAK) @2.02, Leakage: OK () +10.04.2024/16:22:16 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.37 g, 1.00 g) +10.04.2024/16:22:16 [4.004] Device 6 (CMCIII-SMK) @2.01, Smoke: OK (0 ) +10.04.2024/16:22:20 [3.001] Quit Alarm Message... +11.04.2024/08:37:08 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '56.40 °C' by user 'snmpd' [SNMP] +11.04.2024/08:37:28 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '14.60 °C' by user 'snmpd' [SNMP] +11.04.2024/08:37:29 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (38.50 °C) +11.04.2024/08:44:52 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '80.00 °C' by user 'snmpd' [SNMP] +11.04.2024/08:44:53 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (39.20 °C) +11.04.2024/08:49:12 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +11.04.2024/08:49:19 [3.001] Quit Device Configuration... +11.04.2024/08:49:20 [5.002] Device 3 (CMCIII-ACC) @2.04, OK +11.04.2024/08:49:20 [5.002] Device 6 (CMCIII-SMK) @2.01, OK +11.04.2024/08:50:38 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '19.90 °C' by user 'snmpd' [SNMP] +11.04.2024/08:50:39 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (39.20 °C) +11.04.2024/09:29:28 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '69.00 °C' by user 'snmpd' [SNMP] +11.04.2024/09:29:29 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.50 °C) +11.04.2024/09:30:07 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '14.80 °C' by user 'snmpd' [SNMP] +11.04.2024/09:30:19 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '78.50 °C' by user 'snmpd' [SNMP] +11.04.2024/09:42:16 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '-2.20 °C' by user 'snmpd' [SNMP] +11.04.2024/09:42:17 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (39.80 °C) +11.04.2024/09:46:32 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +11.04.2024/09:47:44 [3.001] Quit Device Configuration... +11.04.2024/09:55:26 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '48.50 °C' by user 'snmpd' [SNMP] +11.04.2024/09:55:27 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (39.70 °C) +11.04.2024/09:58:32 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +11.04.2024/09:58:38 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.37 g, 0.93 g) +11.04.2024/10:16:22 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +11.04.2024/10:16:56 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +11.04.2024/10:31:09 [3.001] Quit Alarm Message... +11.04.2024/10:38:22 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '17.70 °C' by user 'snmpd' [SNMP] +11.04.2024/10:38:23 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (39.60 °C) +11.04.2024/10:42:02 [3.001] Quit Alarm Message... +11.04.2024/11:00:33 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '52.20 °C' by user 'snmpd' [SNMP] +11.04.2024/11:00:34 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (39.80 °C) +11.04.2024/11:09:06 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '30.20 °C' by user 'snmpd' [SNMP] +11.04.2024/11:09:08 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.20 °C) +11.04.2024/11:12:21 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '53.70 °C' by user 'snmpd' [SNMP] +11.04.2024/11:12:22 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.60 °C) +11.04.2024/11:17:25 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '33.90 °C' by user 'snmpd' [SNMP] +11.04.2024/11:17:27 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.40 °C) +11.04.2024/11:23:54 [3.001] Quit Alarm Message... +11.04.2024/11:32:51 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '53.00 °C' by user 'snmpd' [SNMP] +11.04.2024/11:32:53 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.30 °C) +11.04.2024/11:33:11 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +11.04.2024/11:33:45 [3.001] Quit Alarm Message... +11.04.2024/11:34:05 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +11.04.2024/11:34:09 [3.001] Quit Alarm Message... +11.04.2024/11:34:11 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +11.04.2024/11:34:19 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, 0.06 g, 1.50 g) +11.04.2024/11:34:21 [3.001] Quit Alarm Message... +11.04.2024/11:34:25 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.18 g, -0.43 g, 0.93 g) +11.04.2024/11:43:09 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '15.60 °C' by user 'snmpd' [SNMP] +11.04.2024/11:43:10 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.30 °C) +11.04.2024/11:43:15 [3.001] Quit Alarm Message... +11.04.2024/11:51:24 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +11.04.2024/11:52:08 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +11.04.2024/11:55:28 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '72.80 °C' by user 'snmpd' [SNMP] +11.04.2024/11:55:28 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.30 °C) +11.04.2024/12:00:59 [3.001] Quit Alarm Message... +11.04.2024/12:07:00 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +11.04.2024/12:07:06 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 1.00 g) +11.04.2024/12:08:42 [5.004] Device 2 (CMCIII-IO3) @1.00, Lost +11.04.2024/12:08:56 [5.005] Device 2 (CMCIII-IO3) @1.02, Changed +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_1: Off (0 ) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_2: Off (0 ) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_3: Off (0 ) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_4: Off (0 ) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_5: Off (0 ) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_6: Off (0 ) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_7: Off (0 ) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Input_8: Off (0 ) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_1: Off (Off) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_2: Off (Off) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_3: Off (Off) +11.04.2024/12:08:57 [4.010] Device 2 (CMCIII-IO3) @1.02, Output_4: Off (Off) +11.04.2024/12:09:01 [5.002] Device 2 (CMCIII-IO3) @1.02, OK +11.04.2024/12:25:39 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +11.04.2024/12:25:44 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +11.04.2024/12:27:01 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '11.90 °C' by user 'snmpd' [SNMP] +11.04.2024/12:27:02 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.20 °C) +11.04.2024/12:27:17 [3.001] Quit Alarm Message... +11.04.2024/12:38:27 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '61.00 °C' by user 'snmpd' [SNMP] +11.04.2024/12:38:27 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.20 °C) +11.04.2024/12:45:55 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '30.90 °C' by user 'snmpd' [SNMP] +11.04.2024/12:45:56 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.40 °C) +11.04.2024/12:46:13 [3.001] Quit Alarm Message... +11.04.2024/12:50:53 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '55.10 °C' by user 'snmpd' [SNMP] +11.04.2024/12:50:54 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.30 °C) +11.04.2024/12:52:31 [3.001] Quit Alarm Message... +11.04.2024/13:06:27 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '24.30 °C' by user 'snmpd' [SNMP] +11.04.2024/13:06:27 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.20 °C) +11.04.2024/13:08:05 [3.001] Quit Alarm Message... +11.04.2024/13:20:34 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '51.40 °C' by user 'snmpd' [SNMP] +11.04.2024/13:20:35 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.20 °C) +11.04.2024/13:25:10 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '12.50 °C' by user 'snmpd' [SNMP] +11.04.2024/13:25:11 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.40 °C) +11.04.2024/13:25:39 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '80.00 °C' by user 'snmpd' [SNMP] +11.04.2024/13:25:40 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.50 °C) +11.04.2024/13:27:46 [3.001] Quit Alarm Message... +11.04.2024/13:44:58 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +11.04.2024/14:13:05 [1.001] User 'admin' (local / Group 'admins' / IP 192.168.5.54) logged in +11.04.2024/14:59:50 [1.000] User 'admin' session (IP 192.168.5.54) terminated (Timeout) +11.04.2024/15:22:24 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '23.50 °C' by user 'snmpd' [SNMP] +11.04.2024/15:22:25 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.40 °C) +11.04.2024/15:22:44 [3.001] Quit Alarm Message... +11.04.2024/15:43:17 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '63.90 °C' by user 'snmpd' [SNMP] +11.04.2024/15:43:17 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (40.40 °C) +11.04.2024/15:43:27 [3.001] Quit Alarm Message... +11.04.2024/15:43:31 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '-5.00 °C' by user 'snmpd' [SNMP] +11.04.2024/15:43:32 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (40.50 °C) +11.04.2024/15:43:48 [3.001] Quit Alarm Message... +12.04.2024/08:02:58 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +12.04.2024/08:03:04 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +12.04.2024/08:07:45 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.37 g, 1.50 g) +12.04.2024/08:07:54 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +12.04.2024/08:11:27 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +12.04.2024/08:11:39 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.18 g, -0.43 g, 0.93 g) +12.04.2024/08:11:47 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.37 g, 1.50 g) +12.04.2024/08:11:55 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.18 g, -0.37 g, 1.00 g) +12.04.2024/08:17:01 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +12.04.2024/08:17:12 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.18 g, -0.43 g, 0.93 g) +12.04.2024/08:17:14 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.37 g, 1.50 g) +12.04.2024/08:17:28 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +12.04.2024/08:18:14 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +12.04.2024/08:18:20 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +12.04.2024/08:18:25 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +12.04.2024/08:18:33 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.37 g, 0.93 g) +12.04.2024/08:18:33 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, 1.50 g, 1.50 g) +12.04.2024/08:19:07 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 1.00 g) +12.04.2024/08:19:08 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.37 g, 1.50 g) +12.04.2024/08:19:14 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +12.04.2024/08:19:16 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.37 g, 1.50 g) +12.04.2024/08:19:22 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +12.04.2024/09:14:44 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '50.70 °C' by user 'snmpd' [SNMP] +12.04.2024/09:14:45 [4.006] Device 1 (CMCIII-PU) @1.01, Temperature: High Warn (39.60 °C) +12.04.2024/09:35:10 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +12.04.2024/09:35:15 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +12.04.2024/09:47:19 [3.001] Quit Alarm Message... +12.04.2024/09:58:18 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighWarning' changed to '52.20 °C' by user 'snmpd' [SNMP] +12.04.2024/09:58:20 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (39.80 °C) +12.04.2024/10:18:47 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.37 g, 1.50 g) +12.04.2024/10:19:02 [3.001] Quit Alarm Message... +12.04.2024/10:19:02 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/08:18:00 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '31.00 °C' by user 'snmpd' [SNMP] +15.04.2024/08:18:00 [4.008] Device 1 (CMCIII-PU) @1.01, Temperature: Too High (38.90 °C) +15.04.2024/08:18:17 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtHighAlarm' changed to '51.00 °C' by user 'snmpd' [SNMP] +15.04.2024/08:18:18 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (39.00 °C) +15.04.2024/09:00:27 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtLowWarning' changed to '38.00 °C' by user 'snmpd' [SNMP] +15.04.2024/09:01:14 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtLowWarning' changed to '40.00 °C' by user 'snmpd' [SNMP] +15.04.2024/09:01:14 [4.009] Device 1 (CMCIII-PU) @1.01, Temperature: Low Warn (38.90 °C) +15.04.2024/09:01:25 [2.000] Device 1 (CMCIII-PU), Variable 'Temperature.SetPtLowWarning' changed to '38.00 °C' by user 'snmpd' [SNMP] +15.04.2024/09:04:45 [3.001] Quit Alarm Message... +15.04.2024/09:34:53 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +15.04.2024/09:34:59 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:36:03 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +15.04.2024/09:36:09 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.37 g, 0.93 g) +15.04.2024/09:37:26 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +15.04.2024/09:37:32 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:38:19 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:38:25 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.37 g, 0.93 g) +15.04.2024/09:38:28 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:38:36 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.37 g, 0.93 g) +15.04.2024/09:38:46 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +15.04.2024/09:38:52 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:38:54 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.37 g, 1.50 g) +15.04.2024/09:39:00 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:39:03 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +15.04.2024/09:39:14 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:39:17 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.37 g, 1.50 g) +15.04.2024/09:39:23 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.18 g, -0.43 g, 0.93 g) +15.04.2024/09:40:09 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +15.04.2024/09:40:15 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:40:18 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.37 g, 1.50 g) +15.04.2024/09:40:24 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:40:26 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +15.04.2024/09:40:31 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:40:32 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:40:43 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:41:07 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.43 g, 1.50 g) +15.04.2024/09:41:14 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.37 g, 0.93 g) +15.04.2024/09:41:45 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.25 g, -0.37 g, 1.50 g) +15.04.2024/09:41:53 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/09:42:33 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +15.04.2024/09:42:44 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/10:47:42 [4.005] Device 5 (CMCIII-VAN) @2.03, Acceleration: Alarm (-0.18 g, -0.43 g, 1.50 g) +15.04.2024/10:47:48 [4.004] Device 5 (CMCIII-VAN) @2.03, Acceleration: OK (-0.25 g, -0.43 g, 0.93 g) +15.04.2024/13:29:22 [4.004] Device 1 (CMCIII-PU) @1.01, Temperature: OK (39.90 °C) + +============================ End of list ============================== diff --git a/src/test/resources/access.db b/src/test/resources/access.db new file mode 100755 index 0000000..c86e353 --- /dev/null +++ b/src/test/resources/access.db @@ -0,0 +1,19 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE Handles(Type TEXT, Code TEXT, User TEXT, Information TEXT, Handle TEXT); +INSERT INTO Handles VALUES('Crd','0000000056D71A54','AccessUser','','39075098,39075250,39075252,39075248'); +INSERT INTO Handles VALUES('Crd','0000000000000000','','','39075098'); +INSERT INTO Handles VALUES('Crd','','','','39075098'); +INSERT INTO Handles VALUES('Crd','00000000462039EF','AccessUser','','39075250,39075252'); +INSERT INTO Handles VALUES('Crd','00000000DEB453F4','','','39075250'); +INSERT INTO Handles VALUES('Crd','00000000266B5443','','','39075250'); +INSERT INTO Handles VALUES('Key','00000000','admin','','39075250,39075252'); +INSERT INTO Handles VALUES('Crd','000000000000ABCD','admin','Info 1','39075250'); +CREATE TABLE Keypads(Keypad TEXT, Handle TEXT); +INSERT INTO Keypads VALUES('39075248','39075098,39075250,39075252,39075248'); +INSERT INTO Keypads VALUES('39075252','39075098,39075250,39075252,39075248'); +INSERT INTO Keypads VALUES('39075098','39075250'); +INSERT INTO Keypads VALUES('39075250','39075250,39075252,39075098'); +CREATE TABLE Options(eyes4 TEXT, way2 TEXT, timeout1 TEXT, timeout2 TEXT); +INSERT INTO Options VALUES('1','0','10','30'); +COMMIT; diff --git a/src/test/resources/access1.db b/src/test/resources/access1.db new file mode 100755 index 0000000..397e853 --- /dev/null +++ b/src/test/resources/access1.db @@ -0,0 +1,11 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE Handles(Type TEXT, Code TEXT, User TEXT, Information TEXT, Handle TEXT); +CREATE TABLE Keypads(Keypad TEXT, Handle TEXT); +INSERT INTO Keypads VALUES('39075248','39075098,39075250,39075252,39075248'); +INSERT INTO Keypads VALUES('39075252','39075098,39075250,39075252,39075248'); +INSERT INTO Keypads VALUES('39075098','39075250'); +INSERT INTO Keypads VALUES('39075250','39075250,39075252,39075098'); +CREATE TABLE Options(eyes4 TEXT, way2 TEXT, timeout1 TEXT, timeout2 TEXT); +INSERT INTO Options VALUES('0','1','100','60'); +COMMIT; diff --git a/src/test/resources/access2.db b/src/test/resources/access2.db new file mode 100755 index 0000000..1c82d76 --- /dev/null +++ b/src/test/resources/access2.db @@ -0,0 +1,3 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +COMMIT; diff --git a/src/test/resources/discovery/rittal_pdu.snmprec b/src/test/resources/discovery/rittal_pdu.snmprec new file mode 100755 index 0000000..2b18934 --- /dev/null +++ b/src/test/resources/discovery/rittal_pdu.snmprec @@ -0,0 +1,9874 @@ +.1.3.6.1.2.1.1.1.0::Rittal PDU SN 34604114 HW REV.0406 - SW V7.19.00 +.1.3.6.1.2.1.1.2.0::1.3.6.1.4.1.2606.7 +.1.3.6.1.2.1.1.3.0::13 days, 23:48:36.45 +.1.3.6.1.2.1.1.4.0::Not me +.1.3.6.1.2.1.1.5.0::PDU Controllers Name +.1.3.6.1.2.1.1.6.0::Limburg Office +.1.3.6.1.2.1.1.7.0::64 +.1.3.6.1.2.1.1.8.0::0:00:00.33 +.1.3.6.1.4.1.2606.7.1.1.0::1 +.1.3.6.1.4.1.2606.7.1.2.0::4 +.1.3.6.1.4.1.2606.7.1.3.0::1.25 +.1.3.6.1.4.1.2606.7.1.4.0::30104 +.1.3.6.1.4.1.2606.7.2.1.0::1 +.1.3.6.1.4.1.2606.7.2.2.0::https://192.168.10.199 +.1.3.6.1.4.1.2606.7.2.3.0::REV.0406 +.1.3.6.1.4.1.2606.7.2.4.0::V7.19.00 +.1.3.6.1.4.1.2606.7.2.5.0::4.19.184-g2034d6f083 +.1.3.6.1.4.1.2606.7.2.6.0::34604114 +.1.3.6.1.4.1.2606.7.2.7.0::06.2022 +.1.3.6.1.4.1.2606.7.2.8.0::9 +.1.3.6.1.4.1.2606.7.2.9.0::1 +.1.3.6.1.4.1.2606.7.2.10.0::0 +.1.3.6.1.4.1.2606.7.2.11.0::0 +.1.3.6.1.4.1.2606.7.2.12.0::1159474 +.1.3.6.1.4.1.2606.7.2.13.0::8 +.1.3.6.1.4.1.2606.7.2.14.1.2.1::134 +.1.3.6.1.4.1.2606.7.2.14.1.2.5::140 +.1.3.6.1.4.1.2606.7.2.14.1.2.10::126 +.1.3.6.1.4.1.2606.7.3.1.0::0 +.1.3.6.1.4.1.2606.7.3.2.1.0::1 +.1.3.6.1.4.1.2606.7.3.2.2.0::1 +.1.3.6.1.4.1.2606.7.3.2.3.0::1 +.1.3.6.1.4.1.2606.7.3.2.4.0::2 +.1.3.6.1.4.1.2606.7.3.2.5.0::2 +.1.3.6.1.4.1.2606.7.3.2.6.0::3 +.1.3.6.1.4.1.2606.7.3.2.7.0::27 +.1.3.6.1.4.1.2606.7.3.2.8.0::19.07.2023 +.1.3.6.1.4.1.2606.7.3.2.9.0::06:33:53 +.1.3.6.1.4.1.2606.7.3.2.10.0::c0 +.1.3.6.1.4.1.2606.7.3.2.11.0::80 +.1.3.6.1.4.1.2606.7.3.2.12.0::443 +.1.3.6.1.4.1.2606.7.3.2.13.0::2 +.1.3.6.1.4.1.2606.7.3.2.14.0::21 +.1.3.6.1.4.1.2606.7.3.2.15.0::2 +.1.3.6.1.4.1.2606.7.3.2.16.0::2222 +.1.3.6.1.4.1.2606.7.3.2.17.0::2 +.1.3.6.1.4.1.2606.7.3.2.18.0::23 +.1.3.6.1.4.1.2606.7.3.2.19.0::1 +.1.3.6.1.4.1.2606.7.3.2.20.0::1 +.1.3.6.1.4.1.2606.7.3.2.21.0::4840 +.1.3.6.1.4.1.2606.7.3.2.22.0::1 +.1.3.6.1.4.1.2606.7.3.4.1.0::16 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.1::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.2::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.3::2 + +.1.3.6.1.4.1.2606.7.3.4.2.1.2.4::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.5::2 + +.1.3.6.1.4.1.2606.7.3.4.2.1.2.6::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.7::2 + +.1.3.6.1.4.1.2606.7.3.4.2.1.2.8::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.9::2 + +.1.3.6.1.4.1.2606.7.3.4.2.1.2.10::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.11::2 + +.1.3.6.1.4.1.2606.7.3.4.2.1.2.12::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.13::2 + +.1.3.6.1.4.1.2606.7.3.4.2.1.2.14::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.2.15::2 + +.1.3.6.1.4.1.2606.7.3.4.2.1.2.16::2 +.1.3.6.1.4.1.2606.7.3.4.2.1.3.1:: + +.1.3.6.1.4.1.2606.7.3.4.2.1.3.2:: +.1.3.6.1.4.1.2606.7.3.4.2.1.3.3:: + +.1.3.6.1.4.1.2606.7.3.4.2.1.3.4:: +.1.3.6.1.4.1.2606.7.3.4.2.1.3.5:: + +.1.3.6.1.4.1.2606.7.3.4.2.1.3.6:: +.1.3.6.1.4.1.2606.7.3.4.2.1.3.7:: + +.1.3.6.1.4.1.2606.7.3.4.2.1.3.8:: +.1.3.6.1.4.1.2606.7.3.4.2.1.3.9:: + +.1.3.6.1.4.1.2606.7.3.4.2.1.3.10:: +.1.3.6.1.4.1.2606.7.3.4.2.1.3.11:: + +.1.3.6.1.4.1.2606.7.3.4.2.1.3.12:: +.1.3.6.1.4.1.2606.7.3.4.2.1.3.13:: + +.1.3.6.1.4.1.2606.7.3.4.2.1.3.14:: +.1.3.6.1.4.1.2606.7.3.4.2.1.3.15:: + +.1.3.6.1.4.1.2606.7.3.4.2.1.3.16:: +.1.3.6.1.4.1.2606.7.3.5.1.0::1 + +.1.3.6.1.4.1.2606.7.3.5.2.0:: +.1.3.6.1.4.1.2606.7.3.5.3.0::25 + +.1.3.6.1.4.1.2606.7.3.5.4.0::1 +.1.3.6.1.4.1.2606.7.3.5.5.0:: + +.1.3.6.1.4.1.2606.7.3.5.6.0:: +.1.3.6.1.4.1.2606.7.3.5.7.0::192.168.0.200@rittal.com + +.1.3.6.1.4.1.2606.7.3.5.8.0:: +.1.3.6.1.4.1.2606.7.3.5.9.0::16 + +.1.3.6.1.4.1.2606.7.3.5.10.1.2.1::1 +.1.3.6.1.4.1.2606.7.3.5.10.1.2.2::1 + +.1.3.6.1.4.1.2606.7.3.5.10.1.2.3::1 +.1.3.6.1.4.1.2606.7.3.5.10.1.2.4::1 + +.1.3.6.1.4.1.2606.7.3.5.10.1.2.5::1 +.1.3.6.1.4.1.2606.7.3.5.10.1.2.6::1 + +.1.3.6.1.4.1.2606.7.3.5.10.1.2.7::1 +.1.3.6.1.4.1.2606.7.3.5.10.1.2.8::1 + +.1.3.6.1.4.1.2606.7.3.5.10.1.2.9::1 +.1.3.6.1.4.1.2606.7.3.5.10.1.2.10::1 + +.1.3.6.1.4.1.2606.7.3.5.10.1.2.11::1 +.1.3.6.1.4.1.2606.7.3.5.10.1.2.12::1 + +.1.3.6.1.4.1.2606.7.3.5.10.1.2.13::1 +.1.3.6.1.4.1.2606.7.3.5.10.1.2.14::1 + +.1.3.6.1.4.1.2606.7.3.5.10.1.2.15::1 +.1.3.6.1.4.1.2606.7.3.5.10.1.2.16::1 + +.1.3.6.1.4.1.2606.7.3.5.10.1.3.1:: +.1.3.6.1.4.1.2606.7.3.5.10.1.3.2:: + +.1.3.6.1.4.1.2606.7.3.5.10.1.3.3:: +.1.3.6.1.4.1.2606.7.3.5.10.1.3.4:: + +.1.3.6.1.4.1.2606.7.3.5.10.1.3.5:: +.1.3.6.1.4.1.2606.7.3.5.10.1.3.6:: + +.1.3.6.1.4.1.2606.7.3.5.10.1.3.7:: +.1.3.6.1.4.1.2606.7.3.5.10.1.3.8:: + +.1.3.6.1.4.1.2606.7.3.5.10.1.3.9:: +.1.3.6.1.4.1.2606.7.3.5.10.1.3.10:: + +.1.3.6.1.4.1.2606.7.3.5.10.1.3.11:: +.1.3.6.1.4.1.2606.7.3.5.10.1.3.12:: + +.1.3.6.1.4.1.2606.7.3.5.10.1.3.13:: +.1.3.6.1.4.1.2606.7.3.5.10.1.3.14:: + +.1.3.6.1.4.1.2606.7.3.5.10.1.3.15:: +.1.3.6.1.4.1.2606.7.3.5.10.1.3.16:: + +.1.3.6.1.4.1.2606.7.3.6.1.0::1 +.1.3.6.1.4.1.2606.7.3.6.2.0:: + +.1.3.6.1.4.1.2606.7.3.6.3.0:: +.1.3.6.1.4.1.2606.7.3.6.4.0:: + +.1.3.6.1.4.1.2606.7.3.6.5.0:: +.1.3.6.1.4.1.2606.7.3.6.6.0::16 + +.1.3.6.1.4.1.2606.7.3.6.7.1.2.1::1 +.1.3.6.1.4.1.2606.7.3.6.7.1.2.2::1 + +.1.3.6.1.4.1.2606.7.3.6.7.1.2.3::1 +.1.3.6.1.4.1.2606.7.3.6.7.1.2.4::1 + +.1.3.6.1.4.1.2606.7.3.6.7.1.2.5::1 +.1.3.6.1.4.1.2606.7.3.6.7.1.2.6::1 + +.1.3.6.1.4.1.2606.7.3.6.7.1.2.7::1 +.1.3.6.1.4.1.2606.7.3.6.7.1.2.8::1 + +.1.3.6.1.4.1.2606.7.3.6.7.1.2.9::1 +.1.3.6.1.4.1.2606.7.3.6.7.1.2.10::1 + +.1.3.6.1.4.1.2606.7.3.6.7.1.2.11::1 +.1.3.6.1.4.1.2606.7.3.6.7.1.2.12::1 + +.1.3.6.1.4.1.2606.7.3.6.7.1.2.13::1 +.1.3.6.1.4.1.2606.7.3.6.7.1.2.14::1 + +.1.3.6.1.4.1.2606.7.3.6.7.1.2.15::1 +.1.3.6.1.4.1.2606.7.3.6.7.1.2.16::1 + +.1.3.6.1.4.1.2606.7.3.6.7.1.3.1:: +.1.3.6.1.4.1.2606.7.3.6.7.1.3.2:: + +.1.3.6.1.4.1.2606.7.3.6.7.1.3.3:: +.1.3.6.1.4.1.2606.7.3.6.7.1.3.4:: + +.1.3.6.1.4.1.2606.7.3.6.7.1.3.5:: +.1.3.6.1.4.1.2606.7.3.6.7.1.3.6:: + +.1.3.6.1.4.1.2606.7.3.6.7.1.3.7:: +.1.3.6.1.4.1.2606.7.3.6.7.1.3.8:: + +.1.3.6.1.4.1.2606.7.3.6.7.1.3.9:: +.1.3.6.1.4.1.2606.7.3.6.7.1.3.10:: + +.1.3.6.1.4.1.2606.7.3.6.7.1.3.11:: +.1.3.6.1.4.1.2606.7.3.6.7.1.3.12:: + +.1.3.6.1.4.1.2606.7.3.6.7.1.3.13:: +.1.3.6.1.4.1.2606.7.3.6.7.1.3.14:: + +.1.3.6.1.4.1.2606.7.3.6.7.1.3.15:: +.1.3.6.1.4.1.2606.7.3.6.7.1.3.16:: + +.1.3.6.1.4.1.2606.7.3.7.1.0::1 +.1.3.6.1.4.1.2606.7.3.7.2.0::1 + +.1.3.6.1.4.1.2606.7.3.7.3.0:: +.1.3.6.1.4.1.2606.7.3.7.4.0:: + +.1.3.6.1.4.1.2606.7.3.8.1.0::1 +.1.3.6.1.4.1.2606.7.3.8.2.0::27 + +.1.3.6.1.4.1.2606.7.3.8.3.0:: +.1.3.6.1.4.1.2606.7.3.8.4.0:: + +.1.3.6.1.4.1.2606.7.3.9.1.0::1 +.1.3.6.1.4.1.2606.7.3.9.2.0:: + +.1.3.6.1.4.1.2606.7.3.9.3.0:: +.1.3.6.1.4.1.2606.7.3.9.4.0:: + +.1.3.6.1.4.1.2606.7.3.9.5.0:: + +.1.3.6.1.4.1.2606.7.3.9.6.0::(&(objectClass=user)(sAMAccountName=%L)) + +.1.3.6.1.4.1.2606.7.3.9.7.0::dn +.1.3.6.1.4.1.2606.7.3.9.8.0:: + +.1.3.6.1.4.1.2606.7.3.9.9.0::(&(objectClass=group)(member=%U)) + +.1.3.6.1.4.1.2606.7.3.9.10.0::dn +.1.3.6.1.4.1.2606.7.3.10.1.0::40 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.1::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.2::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.3::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.4::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.5::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.6::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.7::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.8::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.9::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.10::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.11::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.12::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.13::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.14::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.15::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.16::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.17::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.18::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.19::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.20::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.21::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.22::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.23::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.24::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.25::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.26::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.27::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.28::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.29::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.30::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.31::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.32::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.33::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.34::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.35::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.36::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.37::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.38::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.2.39::0.0.0.0 +.1.3.6.1.4.1.2606.7.3.10.2.1.2.40::0.0.0.0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.1::Server_01 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.2::Server_02 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.3::Server_03 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.4::Server_04 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.5::Server_05 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.6::Server_06 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.7::Server_07 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.8::Server_08 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.9::Server_09 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.10::Server_10 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.11::Server_11 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.12::Server_12 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.13::Server_13 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.14::Server_14 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.15::Server_15 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.16::Server_16 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.17::Server_17 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.18::Server_18 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.19::Server_19 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.20::Server_20 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.21::Server_21 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.22::Server_22 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.23::Server_23 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.24::Server_24 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.25::Server_25 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.26::Server_26 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.27::Server_27 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.28::Server_28 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.29::Server_29 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.30::Server_30 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.31::Server_31 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.32::Server_32 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.33::Server_33 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.34::Server_34 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.35::Server_35 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.36::Server_36 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.37::Server_37 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.38::Server_38 + +.1.3.6.1.4.1.2606.7.3.10.2.1.3.39::Server_39 +.1.3.6.1.4.1.2606.7.3.10.2.1.3.40::Server_40 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.1::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.2::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.3::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.4::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.5::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.6::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.7::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.8::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.9::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.10::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.11::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.12::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.13::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.14::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.15::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.16::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.17::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.18::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.19::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.20::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.21::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.22::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.23::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.24::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.25::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.26::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.27::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.28::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.29::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.30::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.31::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.32::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.33::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.34::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.35::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.36::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.37::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.38::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.4.39::6003 +.1.3.6.1.4.1.2606.7.3.10.2.1.4.40::6003 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.1::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.2::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.3::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.4::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.5::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.6::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.7::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.8::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.9::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.10::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.11::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.12::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.13::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.14::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.15::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.16::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.17::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.18::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.19::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.20::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.21::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.22::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.23::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.24::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.25::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.26::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.27::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.28::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.29::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.30::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.31::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.32::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.33::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.34::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.35::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.36::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.37::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.38::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.5.39::0 +.1.3.6.1.4.1.2606.7.3.10.2.1.5.40::0 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.1::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.2::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.3::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.4::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.5::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.6::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.7::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.8::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.9::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.10::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.11::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.12::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.13::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.14::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.15::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.16::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.17::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.18::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.19::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.20::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.21::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.22::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.23::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.24::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.25::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.26::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.27::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.28::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.29::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.30::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.31::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.32::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.33::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.34::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.35::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.36::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.37::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.38::1 + +.1.3.6.1.4.1.2606.7.3.10.2.1.6.39::1 +.1.3.6.1.4.1.2606.7.3.10.2.1.6.40::1 + +.1.3.6.1.4.1.2606.7.3.11.1.0::1 +.1.3.6.1.4.1.2606.7.3.11.2.0::502 + +.1.3.6.1.4.1.2606.7.3.11.3.0::12 +.1.3.6.1.4.1.2606.7.3.11.4.1.2.1::1 + +.1.3.6.1.4.1.2606.7.3.11.4.1.2.2::1 +.1.3.6.1.4.1.2606.7.3.11.4.1.2.3::1 + +.1.3.6.1.4.1.2606.7.3.11.4.1.2.4::1 +.1.3.6.1.4.1.2606.7.3.11.4.1.2.5::1 + +.1.3.6.1.4.1.2606.7.3.11.4.1.2.6::1 +.1.3.6.1.4.1.2606.7.3.11.4.1.2.7::1 + +.1.3.6.1.4.1.2606.7.3.11.4.1.2.8::1 +.1.3.6.1.4.1.2606.7.3.11.4.1.2.9::1 + +.1.3.6.1.4.1.2606.7.3.11.4.1.2.10::1 +.1.3.6.1.4.1.2606.7.3.11.4.1.2.11::1 + +.1.3.6.1.4.1.2606.7.3.11.4.1.2.12::1 +.1.3.6.1.4.1.2606.7.3.11.4.1.3.1:: + +.1.3.6.1.4.1.2606.7.3.11.4.1.3.2:: +.1.3.6.1.4.1.2606.7.3.11.4.1.3.3:: + +.1.3.6.1.4.1.2606.7.3.11.4.1.3.4:: +.1.3.6.1.4.1.2606.7.3.11.4.1.3.5:: + +.1.3.6.1.4.1.2606.7.3.11.4.1.3.6:: +.1.3.6.1.4.1.2606.7.3.11.4.1.3.7:: + +.1.3.6.1.4.1.2606.7.3.11.4.1.3.8:: +.1.3.6.1.4.1.2606.7.3.11.4.1.3.9:: + +.1.3.6.1.4.1.2606.7.3.11.4.1.3.10:: +.1.3.6.1.4.1.2606.7.3.11.4.1.3.11:: + +.1.3.6.1.4.1.2606.7.3.11.4.1.3.12:: +.1.3.6.1.4.1.2606.7.3.12.1.0::1 + +.1.3.6.1.4.1.2606.7.3.12.2.0:: +.1.3.6.1.4.1.2606.7.3.12.3.0::1812 + +.1.3.6.1.4.1.2606.7.3.12.4.0:: +.1.3.6.1.4.1.2606.7.3.12.5.0::1 + +.1.3.6.1.4.1.2606.7.3.12.6.0::2 +.1.3.6.1.4.1.2606.7.3.12.7.0::2 + +.1.3.6.1.4.1.2606.7.3.13.1.0::1 +.1.3.6.1.4.1.2606.7.3.13.2.0:: + +.1.3.6.1.4.1.2606.7.3.13.3.0:: +.1.3.6.1.4.1.2606.7.3.13.4.0:: + +.1.3.6.1.4.1.2606.7.3.13.5.0::10 +.1.3.6.1.4.1.2606.7.3.13.6.0::8 + +.1.3.6.1.4.1.2606.7.3.13.7.0::1 +.1.3.6.1.4.1.2606.7.4.1.1.1.0::1 + +.1.3.6.1.4.1.2606.7.4.1.1.2.0::7 +.1.3.6.1.4.1.2606.7.4.1.1.3.0::605798 + +.1.3.6.1.4.1.2606.7.4.1.1.4.0::32 +.1.3.6.1.4.1.2606.7.4.1.1.5.0::0 + +.1.3.6.1.4.1.2606.7.4.1.1.6.0::1159503 +.1.3.6.1.4.1.2606.7.4.1.2.1.2.1::PDU-Controller + +.1.3.6.1.4.1.2606.7.4.1.2.1.2.2::PDU-MET +.1.3.6.1.4.1.2606.7.4.1.2.1.2.3::CMCIII-GRF2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.2.4::CMCIII-GRF2 +.1.3.6.1.4.1.2606.7.4.1.2.1.2.5::CMCIII-GRF2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.2.6::CMCIII-GRF2 +.1.3.6.1.4.1.2606.7.4.1.2.1.2.7::CMCIII-TMP + +.1.3.6.1.4.1.2606.7.4.1.2.1.3.1::PDU-Controller +.1.3.6.1.4.1.2606.7.4.1.2.1.3.2::PDU-MET + +.1.3.6.1.4.1.2606.7.4.1.2.1.3.3::CMCIII-GRF2-3 + +.1.3.6.1.4.1.2606.7.4.1.2.1.3.4::CMCIII-GRF2-4 + +.1.3.6.1.4.1.2606.7.4.1.2.1.3.5::CMCIII-GRF2-2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.3.6::CMCIII-GRF2-1 +.1.3.6.1.4.1.2606.7.4.1.2.1.3.7::CMCIII-TMP-2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.4.1::1.3.6.1.4.1.2606.7.7.4.33536 + +.1.3.6.1.4.1.2606.7.4.1.2.1.4.2::1.3.6.1.4.1.2606.7.7.4.33792 + +.1.3.6.1.4.1.2606.7.4.1.2.1.4.3::1.3.6.1.4.1.2606.7.7.4.6144 + +.1.3.6.1.4.1.2606.7.4.1.2.1.4.4::1.3.6.1.4.1.2606.7.7.4.6144 + +.1.3.6.1.4.1.2606.7.4.1.2.1.4.5::1.3.6.1.4.1.2606.7.7.4.6144 + +.1.3.6.1.4.1.2606.7.4.1.2.1.4.6::1.3.6.1.4.1.2606.7.7.4.6144 + +.1.3.6.1.4.1.2606.7.4.1.2.1.4.7::1.3.6.1.4.1.2606.7.7.4.768 + +.1.3.6.1.4.1.2606.7.4.1.2.1.5.1::0 +.1.3.6.1.4.1.2606.7.4.1.2.1.5.2::0 + +.1.3.6.1.4.1.2606.7.4.1.2.1.5.3::0 +.1.3.6.1.4.1.2606.7.4.1.2.1.5.4::0 + +.1.3.6.1.4.1.2606.7.4.1.2.1.5.5::0 +.1.3.6.1.4.1.2606.7.4.1.2.1.5.6::0 + +.1.3.6.1.4.1.2606.7.4.1.2.1.5.7::0 +.1.3.6.1.4.1.2606.7.4.1.2.1.6.1::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.6.2::2 +.1.3.6.1.4.1.2606.7.4.1.2.1.6.3::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.6.4::2 +.1.3.6.1.4.1.2606.7.4.1.2.1.6.5::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.6.6::2 +.1.3.6.1.4.1.2606.7.4.1.2.1.6.7::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.7.1::343069 +.1.3.6.1.4.1.2606.7.4.1.2.1.7.2::7979218 + +.1.3.6.1.4.1.2606.7.4.1.2.1.7.3::7030.202 +.1.3.6.1.4.1.2606.7.4.1.2.1.7.4::7030.202 + +.1.3.6.1.4.1.2606.7.4.1.2.1.7.5::7030.202 +.1.3.6.1.4.1.2606.7.4.1.2.1.7.6::7030.202 + +.1.3.6.1.4.1.2606.7.4.1.2.1.7.7::7030.110 +.1.3.6.1.4.1.2606.7.4.1.2.1.8.1::Franks office + +.1.3.6.1.4.1.2606.7.4.1.2.1.8.2::Location +.1.3.6.1.4.1.2606.7.4.1.2.1.8.3::CMCIII Network + +.1.3.6.1.4.1.2606.7.4.1.2.1.8.4::CMCIII Network + +.1.3.6.1.4.1.2606.7.4.1.2.1.8.5::CMCIII Network + +.1.3.6.1.4.1.2606.7.4.1.2.1.8.6::CMCIII Network + +.1.3.6.1.4.1.2606.7.4.1.2.1.8.7::CMCIII Network +.1.3.6.1.4.1.2606.7.4.1.2.1.9.1::1 + +.1.3.6.1.4.1.2606.7.4.1.2.1.9.2::1 +.1.3.6.1.4.1.2606.7.4.1.2.1.9.3::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.9.4::2 +.1.3.6.1.4.1.2606.7.4.1.2.1.9.5::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.9.6::2 +.1.3.6.1.4.1.2606.7.4.1.2.1.9.7::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.10.1::1 +.1.3.6.1.4.1.2606.7.4.1.2.1.10.2::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.10.3::1 +.1.3.6.1.4.1.2606.7.4.1.2.1.10.4::2 + +.1.3.6.1.4.1.2606.7.4.1.2.1.10.5::3 +.1.3.6.1.4.1.2606.7.4.1.2.1.10.6::4 + +.1.3.6.1.4.1.2606.7.4.1.2.1.10.7::5 +.1.3.6.1.4.1.2606.7.4.1.2.1.11.1::V7.19.00 + +.1.3.6.1.4.1.2606.7.4.1.2.1.11.2::V23 +.1.3.6.1.4.1.2606.7.4.1.2.1.11.3::V12.007 + +.1.3.6.1.4.1.2606.7.4.1.2.1.11.4::V12.007 +.1.3.6.1.4.1.2606.7.4.1.2.1.11.5::V12.007 + +.1.3.6.1.4.1.2606.7.4.1.2.1.11.6::V12.007 +.1.3.6.1.4.1.2606.7.4.1.2.1.11.7::V12.012 + +.1.3.6.1.4.1.2606.7.4.1.2.1.12.1::REV.0406 +.1.3.6.1.4.1.2606.7.4.1.2.1.12.2::REV.0100 + +.1.3.6.1.4.1.2606.7.4.1.2.1.12.3::V0104 +.1.3.6.1.4.1.2606.7.4.1.2.1.12.4::V0104 + +.1.3.6.1.4.1.2606.7.4.1.2.1.12.5::V0104 +.1.3.6.1.4.1.2606.7.4.1.2.1.12.6::V0104 + +.1.3.6.1.4.1.2606.7.4.1.2.1.12.7::V0202 +.1.3.6.1.4.1.2606.7.4.1.2.1.13.1::34604114 + +.1.3.6.1.4.1.2606.7.4.1.2.1.13.2::31476049 +.1.3.6.1.4.1.2606.7.4.1.2.1.13.3::39075098 + +.1.3.6.1.4.1.2606.7.4.1.2.1.13.4::39075250 +.1.3.6.1.4.1.2606.7.4.1.2.1.13.5::39075252 + +.1.3.6.1.4.1.2606.7.4.1.2.1.13.6::39075248 +.1.3.6.1.4.1.2606.7.4.1.2.1.13.7::63543663 + +.1.3.6.1.4.1.2606.7.4.1.2.1.14.1::06/2022 +.1.3.6.1.4.1.2606.7.4.1.2.1.14.2::08/2022 + +.1.3.6.1.4.1.2606.7.4.1.2.1.14.3::07/2023 +.1.3.6.1.4.1.2606.7.4.1.2.1.14.4::07/2023 + +.1.3.6.1.4.1.2606.7.4.1.2.1.14.5::07/2023 +.1.3.6.1.4.1.2606.7.4.1.2.1.14.6::07/2023 + +.1.3.6.1.4.1.2606.7.4.1.2.1.14.7::50/2017 +.1.3.6.1.4.1.2606.7.4.1.2.1.15.1::1159510 + +.1.3.6.1.4.1.2606.7.4.1.2.1.15.2::1159510 +.1.3.6.1.4.1.2606.7.4.1.2.1.15.3::1159507 + +.1.3.6.1.4.1.2606.7.4.1.2.1.15.4::1159509 +.1.3.6.1.4.1.2606.7.4.1.2.1.15.5::1159508 + +.1.3.6.1.4.1.2606.7.4.1.2.1.15.6::1159506 +.1.3.6.1.4.1.2606.7.4.1.2.1.15.7::1159509 + +.1.3.6.1.4.1.2606.7.4.1.2.1.16.1::https://192.168.10.199 +.1.3.6.1.4.1.2606.7.4.1.2.1.16.2:: + +.1.3.6.1.4.1.2606.7.4.1.2.1.16.3:: +.1.3.6.1.4.1.2606.7.4.1.2.1.16.4:: + +.1.3.6.1.4.1.2606.7.4.1.2.1.16.5:: +.1.3.6.1.4.1.2606.7.4.1.2.1.16.6:: + +.1.3.6.1.4.1.2606.7.4.1.2.1.16.7:: +.1.3.6.1.4.1.2606.7.4.1.2.1.17.1::48 + +.1.3.6.1.4.1.2606.7.4.1.2.1.17.2::158 +.1.3.6.1.4.1.2606.7.4.1.2.1.17.3::24 + +.1.3.6.1.4.1.2606.7.4.1.2.1.17.4::24 +.1.3.6.1.4.1.2606.7.4.1.2.1.17.5::24 + +.1.3.6.1.4.1.2606.7.4.1.2.1.17.6::24 +.1.3.6.1.4.1.2606.7.4.1.2.1.17.7::10 + +.1.3.6.1.4.1.2606.7.4.1.2.1.18.1::10 +.1.3.6.1.4.1.2606.7.4.1.2.1.18.2::25 + +.1.3.6.1.4.1.2606.7.4.1.2.1.18.3::3 +.1.3.6.1.4.1.2606.7.4.1.2.1.18.4::3 + +.1.3.6.1.4.1.2606.7.4.1.2.1.18.5::3 +.1.3.6.1.4.1.2606.7.4.1.2.1.18.6::3 + +.1.3.6.1.4.1.2606.7.4.1.2.1.18.7::1 + +.1.3.6.1.4.1.2606.7.4.1.2.1.19.1::Device 1 (PDU-Controller) @1.01, OK + +.1.3.6.1.4.1.2606.7.4.1.2.1.19.2::Device 2 (PDU-MET) @1.02, OK + +.1.3.6.1.4.1.2606.7.4.1.2.1.19.3::Device 3 (CMCIII-GRF2-3) @2.01, OK + +.1.3.6.1.4.1.2606.7.4.1.2.1.19.4::Device 4 (CMCIII-GRF2-4) @2.02, OK + +.1.3.6.1.4.1.2606.7.4.1.2.1.19.5::Device 5 (CMCIII-GRF2-2) @2.03, OK + +.1.3.6.1.4.1.2606.7.4.1.2.1.19.6::Device 6 (CMCIII-GRF2-1) @2.04, OK + +.1.3.6.1.4.1.2606.7.4.1.2.1.19.7::Device 7 (CMCIII-TMP-2) @2.05, OK + +.1.3.6.1.4.1.2606.7.4.1.2.1.20.1::0 +.1.3.6.1.4.1.2606.7.4.1.2.1.20.2::0 + +.1.3.6.1.4.1.2606.7.4.1.2.1.20.3::60 +.1.3.6.1.4.1.2606.7.4.1.2.1.20.4::60 + +.1.3.6.1.4.1.2606.7.4.1.2.1.20.5::60 +.1.3.6.1.4.1.2606.7.4.1.2.1.20.6::60 + +.1.3.6.1.4.1.2606.7.4.1.2.1.20.7::25 +.1.3.6.1.4.1.2606.7.4.1.2.1.21.1::0 + +.1.3.6.1.4.1.2606.7.4.1.2.1.21.2::0 +.1.3.6.1.4.1.2606.7.4.1.2.1.21.3::140 + +.1.3.6.1.4.1.2606.7.4.1.2.1.21.4::140 +.1.3.6.1.4.1.2606.7.4.1.2.1.21.5::140 + +.1.3.6.1.4.1.2606.7.4.1.2.1.21.6::140 +.1.3.6.1.4.1.2606.7.4.1.2.1.21.7::25 + +.1.3.6.1.4.1.2606.7.4.1.2.1.22.1::1000 +.1.3.6.1.4.1.2606.7.4.1.2.1.22.2::101000 + +.1.3.6.1.4.1.2606.7.4.1.2.1.22.3::2000 +.1.3.6.1.4.1.2606.7.4.1.2.1.22.4::102000 + +.1.3.6.1.4.1.2606.7.4.1.2.1.22.5::202000 +.1.3.6.1.4.1.2606.7.4.1.2.1.22.6::302000 + +.1.3.6.1.4.1.2606.7.4.1.2.1.22.7::402000 +.1.3.6.1.4.1.2606.7.4.1.2.1.23.1:: + +.1.3.6.1.4.1.2606.7.4.1.2.1.23.2::2BADBC1DZXEAAXXXXXXA18B02X00X00X00X00G + +.1.3.6.1.4.1.2606.7.4.1.2.1.23.3:: +.1.3.6.1.4.1.2606.7.4.1.2.1.23.4:: + +.1.3.6.1.4.1.2606.7.4.1.2.1.23.5:: +.1.3.6.1.4.1.2606.7.4.1.2.1.23.6:: + +.1.3.6.1.4.1.2606.7.4.1.2.1.23.7:: +.1.3.6.1.4.1.2606.7.4.2.1.1.0::312 + +.1.3.6.1.4.1.2606.7.4.2.1.2.0::32 +.1.3.6.1.4.1.2606.7.4.2.1.3.0::659912 + +.1.3.6.1.4.1.2606.7.4.2.1.4.0::1159515 +.1.3.6.1.4.1.2606.7.4.2.1.5.0::20:00:02:00 + +.1.3.6.1.4.1.2606.7.4.2.1.6.0::10 +.1.3.6.1.4.1.2606.7.4.2.1.7.0::300 + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.1::Input.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.2::Input.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.3::Input.Logic + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.4::Input.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.5::Input.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.6::Input.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.7::Output.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.8::Output.Relay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.9::Output.Logic + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.10::Output.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.11::Output.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.12::System.V24 Port.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.13::System.V24 Port.Message + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.14::System.V24 Port.Signal + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.15::System.V24 Port.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.16::System.V24 Port.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.17::System.PoE.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.18::System.PoE.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.19::System.PoE.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.20::System Health.Temperature.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.21::System Health.Temperature.Error Info + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.22::System Health.Temperature.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.23::System Health.Temperature.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.24::System Health.Current.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.25::System Health.Current.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.26::System Health.Current.Error Info + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.27::System Health.Current.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.28::System Health.Current.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.29::System Health.Supply.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.30::System Health.Supply.Error Info + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.31::System Health.Supply.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.32::System Health.Supply.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.33::Memory.USB-Stick.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.34::Memory.USB-Stick.Size + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.35::Memory.USB-Stick.Usage + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.36::Memory.USB-Stick.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.37::Memory.USB-Stick.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.38::Memory.USB-Stick.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.39::Webcam.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.40::Webcam.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.41::Webcam.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.42::Webcam.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.43::Login.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.44::Login.Attempts + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.45::Login.User Count + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.46::Login.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.47::Login.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.1.48::Login.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.1::Total.Frequency.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.2::Total.Neutral Current.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.3::Total.Neutral Current.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.4::Total.Neutral Current.SetPtHighAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.5::Total.Neutral Current.SetPtHighWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.6::Total.Neutral Current.SetPtLowWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.7::Total.Neutral Current.SetPtLowAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.8::Total.Neutral Current.Hysteresis + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.9::Total.Neutral Current.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.10::Total.Neutral Current.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.11::Total.Power.Active.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.12::Total.Power.Active.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.13::Total.Power.Active.SetPtHighAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.14::Total.Power.Active.SetPtHighWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.15::Total.Power.Active.SetPtLowWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.16::Total.Power.Active.SetPtLowAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.17::Total.Power.Active.Hysteresis + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.18::Total.Power.Active.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.19::Total.Power.Active.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.20::Total.Energy.Active.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.21::Total.Energy.Active.Runtime.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.22::Total.Energy.Active Custom.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.23::Total.Energy.Active Custom.Runtime.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.24::Total.Mounting Position + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.25::Phase L1.Voltage.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.26::Phase L1.Voltage.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.27::Phase L1.Voltage.SetPtHighAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.28::Phase L1.Voltage.SetPtHighWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.29::Phase L1.Voltage.SetPtLowWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.30::Phase L1.Voltage.SetPtLowAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.31::Phase L1.Voltage.Hysteresis + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.32::Phase L1.Voltage.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.33::Phase L1.Voltage.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.34::Phase L1.Voltage.CrestFactor.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.35::Phase L1.Current.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.36::Phase L1.Current.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.37::Phase L1.Current.SetPtHighAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.38::Phase L1.Current.SetPtHighWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.39::Phase L1.Current.SetPtLowWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.40::Phase L1.Current.SetPtLowAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.41::Phase L1.Current.Hysteresis + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.42::Phase L1.Current.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.43::Phase L1.Current.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.44::Phase L1.Power.Factor.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.45::Phase L1.Power.Active.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.46::Phase L1.Power.Active.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.47::Phase L1.Power.Active.SetPtHighAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.48::Phase L1.Power.Active.SetPtHighWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.49::Phase L1.Power.Active.SetPtLowWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.50::Phase L1.Power.Active.SetPtLowAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.51::Phase L1.Power.Active.Hysteresis + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.52::Phase L1.Power.Active.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.53::Phase L1.Power.Active.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.54::Phase L1.Power.Reactive.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.55::Phase L1.Power.Apparent.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.56::Phase L1.Energy.Active.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.57::Phase L1.Energy.Active Custom.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.58::Phase L1.Energy.Apparent.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.59::Sockets.Socket 01.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.60::Sockets.Socket 01.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.61::Sockets.Socket 01.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.62::Sockets.Socket 01.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.63::Sockets.Socket 01.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.64::Sockets.Socket 02.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.65::Sockets.Socket 02.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.66::Sockets.Socket 02.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.67::Sockets.Socket 02.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.68::Sockets.Socket 02.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.69::Sockets.Socket 03.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.70::Sockets.Socket 03.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.71::Sockets.Socket 03.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.72::Sockets.Socket 03.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.73::Sockets.Socket 03.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.74::Sockets.Socket 04.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.75::Sockets.Socket 04.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.76::Sockets.Socket 04.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.77::Sockets.Socket 04.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.78::Sockets.Socket 04.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.79::Sockets.Socket 05.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.80::Sockets.Socket 05.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.81::Sockets.Socket 05.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.82::Sockets.Socket 05.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.83::Sockets.Socket 05.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.84::Sockets.Socket 06.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.85::Sockets.Socket 06.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.86::Sockets.Socket 06.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.87::Sockets.Socket 06.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.88::Sockets.Socket 06.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.89::Sockets.Socket 07.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.90::Sockets.Socket 07.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.91::Sockets.Socket 07.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.92::Sockets.Socket 07.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.93::Sockets.Socket 07.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.94::Sockets.Socket 08.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.95::Sockets.Socket 08.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.96::Sockets.Socket 08.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.97::Sockets.Socket 08.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.98::Sockets.Socket 08.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.99::Sockets.Socket 09.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.100::Sockets.Socket 09.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.101::Sockets.Socket 09.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.102::Sockets.Socket 09.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.103::Sockets.Socket 09.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.104::Sockets.Socket 10.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.105::Sockets.Socket 10.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.106::Sockets.Socket 10.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.107::Sockets.Socket 10.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.108::Sockets.Socket 10.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.109::Sockets.Socket 11.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.110::Sockets.Socket 11.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.111::Sockets.Socket 11.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.112::Sockets.Socket 11.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.113::Sockets.Socket 11.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.114::Sockets.Socket 12.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.115::Sockets.Socket 12.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.116::Sockets.Socket 12.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.117::Sockets.Socket 12.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.118::Sockets.Socket 12.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.119::Sockets.Socket 13.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.120::Sockets.Socket 13.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.121::Sockets.Socket 13.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.122::Sockets.Socket 13.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.123::Sockets.Socket 13.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.124::Sockets.Socket 14.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.125::Sockets.Socket 14.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.126::Sockets.Socket 14.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.127::Sockets.Socket 14.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.128::Sockets.Socket 14.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.129::Sockets.Socket 15.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.130::Sockets.Socket 15.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.131::Sockets.Socket 15.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.132::Sockets.Socket 15.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.133::Sockets.Socket 15.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.134::Sockets.Socket 16.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.135::Sockets.Socket 16.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.136::Sockets.Socket 16.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.137::Sockets.Socket 16.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.138::Sockets.Socket 16.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.139::Sockets.Socket 17.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.140::Sockets.Socket 17.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.141::Sockets.Socket 17.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.142::Sockets.Socket 17.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.143::Sockets.Socket 17.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.144::Sockets.Socket 18.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.145::Sockets.Socket 18.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.146::Sockets.Socket 18.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.147::Sockets.Socket 18.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.148::Sockets.Socket 18.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.149::Sockets.Socket 19.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.150::Sockets.Socket 19.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.151::Sockets.Socket 19.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.152::Sockets.Socket 19.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.153::Sockets.Socket 19.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.154::Sockets.Socket 20.General.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.155::Sockets.Socket 20.General.Circuit + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.156::Sockets.Socket 20.General.Socket Type + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.157::Sockets.Socket 20.General.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.2.158::Sockets.Socket 20.General.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.1::Access.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.2::Access.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.3::Access.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.4::Access.Sensitivity + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.5::Access.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.6::Access.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.7::Access.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.8::Handle.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.9::Handle.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.10::Handle.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.11::Handle.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.12::Handle.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.13::Handle.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.14::KeyPad.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.15::KeyPad.KeyCode + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.16::KeyPad.KeyCommand + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.17::KeyPad.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.18::KeyPad.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.19::KeyPad.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.20::LED.Mode +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.21::LED.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.22::LED.Red +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.23::LED.Green + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.3.24::LED.Blue + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.1::Access.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.2::Access.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.3::Access.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.4::Access.Sensitivity + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.5::Access.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.6::Access.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.7::Access.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.8::Handle.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.9::Handle.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.10::Handle.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.11::Handle.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.12::Handle.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.13::Handle.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.14::KeyPad.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.15::KeyPad.KeyCode + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.16::KeyPad.KeyCommand + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.17::KeyPad.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.18::KeyPad.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.19::KeyPad.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.20::LED.Mode +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.21::LED.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.22::LED.Red +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.23::LED.Green + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.4.24::LED.Blue + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.1::Access.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.2::Access.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.3::Access.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.4::Access.Sensitivity + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.5::Access.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.6::Access.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.7::Access.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.8::Handle.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.9::Handle.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.10::Handle.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.11::Handle.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.12::Handle.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.13::Handle.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.14::KeyPad.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.15::KeyPad.KeyCode + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.16::KeyPad.KeyCommand + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.17::KeyPad.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.18::KeyPad.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.19::KeyPad.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.20::LED.Mode +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.21::LED.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.22::LED.Red +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.23::LED.Green + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.5.24::LED.Blue + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.1::Access.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.2::Access.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.3::Access.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.4::Access.Sensitivity + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.5::Access.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.6::Access.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.7::Access.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.8::Handle.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.9::Handle.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.10::Handle.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.11::Handle.Delay + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.12::Handle.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.13::Handle.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.14::KeyPad.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.15::KeyPad.KeyCode + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.16::KeyPad.KeyCommand + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.17::KeyPad.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.18::KeyPad.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.19::KeyPad.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.20::LED.Mode +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.21::LED.Command + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.22::LED.Red +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.23::LED.Green + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.6.24::LED.Blue + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.1::Temperature.DescName + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.2::Temperature.Value + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.3::Temperature.Offset + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.4::Temperature.SetPtHighAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.5::Temperature.SetPtHighWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.6::Temperature.SetPtLowWarning + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.7::Temperature.SetPtLowAlarm + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.8::Temperature.Hysteresis + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.9::Temperature.Status + +.1.3.6.1.4.1.2606.7.4.2.2.1.3.7.10::Temperature.Category + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.1::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.3::15 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.4::21 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.5::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.6::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.7::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.8::20 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.9::15 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.10::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.11::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.12::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.13::95 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.15::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.16::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.17::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.18::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.19::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.20::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.21::38 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.22::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.23::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.25::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.26::38 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.27::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.28::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.29::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.30::38 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.31::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.32::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.33::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.34::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.35::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.36::81 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.37::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.38::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.39::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.40::81 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.41::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.42::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.43::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.44::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.45::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.46::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.47::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.1.48::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.2::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.5::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.6::9 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.7::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.8::6 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.9::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.10::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.13::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.14::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.15::9 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.16::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.17::6 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.18::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.19::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.24::93 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.25::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.26::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.27::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.28::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.29::9 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.30::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.31::6 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.32::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.33::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.34::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.35::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.36::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.37::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.38::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.39::9 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.40::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.41::6 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.42::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.43::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.44::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.45::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.46::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.47::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.48::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.49::9 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.50::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.51::6 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.52::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.53::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.54::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.55::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.56::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.57::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.58::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.59::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.60::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.61::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.62::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.63::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.64::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.65::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.66::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.67::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.68::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.69::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.70::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.71::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.72::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.73::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.74::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.75::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.76::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.77::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.78::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.79::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.80::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.81::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.82::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.83::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.84::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.85::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.86::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.87::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.88::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.89::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.90::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.91::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.92::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.93::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.94::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.95::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.96::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.97::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.98::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.99::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.100::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.101::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.102::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.103::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.104::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.105::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.106::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.107::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.108::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.109::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.110::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.111::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.112::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.113::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.114::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.115::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.116::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.117::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.118::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.119::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.120::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.121::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.122::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.123::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.124::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.125::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.126::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.127::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.128::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.129::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.130::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.131::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.132::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.133::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.134::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.135::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.136::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.137::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.138::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.139::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.140::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.141::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.142::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.143::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.144::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.145::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.146::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.147::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.148::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.149::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.150::42 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.151::44 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.152::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.153::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.154::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.155::42 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.156::44 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.157::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.2.158::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.1::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.2::81 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.4::30 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.5::21 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.6::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.7::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.8::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.9::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.11::21 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.12::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.13::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.14::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.15::80 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.16::83 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.17::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.18::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.19::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.20::157 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.21::151 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.3.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.1::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.2::81 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.4::30 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.5::21 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.6::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.7::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.8::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.9::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.11::21 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.12::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.13::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.14::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.15::80 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.16::83 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.17::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.18::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.19::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.20::157 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.21::151 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.4.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.1::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.2::81 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.4::30 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.5::21 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.6::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.7::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.8::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.9::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.11::21 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.12::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.13::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.14::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.15::80 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.16::83 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.17::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.18::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.19::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.20::157 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.21::151 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.5.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.1::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.2::81 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.4::30 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.5::21 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.6::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.7::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.8::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.9::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.11::21 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.12::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.13::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.14::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.15::80 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.16::83 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.17::81 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.18::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.19::14 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.20::157 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.21::151 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.6.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.1::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.3::18 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.5::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.6::9 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.7::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.8::6 + +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.9::7 +.1.3.6.1.4.1.2606.7.4.2.2.1.4.7.10::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.1:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.2:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.3:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.4::s + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.5:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.6:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.7:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.8:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.9:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.10:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.11:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.12:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.13:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.14::% + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.15:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.16:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.17:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.18:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.19:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.20:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.21:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.22:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.23:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.24:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.25:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.26:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.27:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.28:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.29:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.30:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.31:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.32:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.33:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.34::GB + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.35::% +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.36:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.37:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.38:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.39:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.40:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.41:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.42:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.43:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.44:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.45:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.46::s + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.47:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.1.48:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.1::Hz +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.2:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.3::A +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.4::A + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.5::A +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.6::A + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.7::A +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.8::% + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.9:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.10:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.11:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.12::W + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.13::W +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.14::W + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.15::W +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.16::W + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.17::% +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.18:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.19:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.20::kWh + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.21::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.22::kWh + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.23::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.24:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.25:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.26::V + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.27::V +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.28::V + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.29::V +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.30::V + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.31::% +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.32:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.33:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.34:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.35:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.36::A + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.37::A +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.38::A + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.39::A +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.40::A + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.41::% +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.42:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.43:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.44:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.45:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.46::W + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.47::W +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.48::W + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.49::W +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.50::W + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.51::% +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.52:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.53:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.54::var + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.55::VA +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.56::kWh + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.57::kWh +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.58::kVAh + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.59:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.60:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.61:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.62:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.63:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.64:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.65:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.66:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.67:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.68:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.69:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.70:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.71:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.72:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.73:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.74:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.75:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.76:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.77:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.78:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.79:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.80:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.81:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.82:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.83:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.84:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.85:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.86:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.87:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.88:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.89:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.90:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.91:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.92:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.93:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.94:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.95:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.96:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.97:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.98:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.99:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.100:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.101:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.102:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.103:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.104:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.105:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.106:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.107:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.108:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.109:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.110:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.111:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.112:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.113:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.114:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.115:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.116:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.117:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.118:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.119:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.120:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.121:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.122:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.123:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.124:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.125:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.126:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.127:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.128:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.129:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.130:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.131:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.132:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.133:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.134:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.135:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.136:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.137:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.138:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.139:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.140:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.141:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.142:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.143:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.144:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.145:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.146:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.147:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.148:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.149:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.150:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.151:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.152:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.153:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.154:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.155:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.156:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.157:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.2.158:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.1:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.2:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.3:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.4:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.5::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.6:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.7:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.8:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.9:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.10:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.11::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.12:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.13:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.14:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.15:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.16:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.17:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.18:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.19:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.20:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.21:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.22:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.23:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.3.24:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.1:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.2:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.3:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.4:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.5::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.6:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.7:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.8:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.9:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.10:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.11::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.12:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.13:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.14:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.15:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.16:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.17:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.18:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.19:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.20:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.21:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.22:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.23:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.4.24:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.1:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.2:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.3:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.4:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.5::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.6:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.7:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.8:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.9:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.10:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.11::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.12:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.13:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.14:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.15:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.16:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.17:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.18:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.19:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.20:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.21:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.22:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.23:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.5.24:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.1:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.2:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.3:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.4:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.5::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.6:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.7:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.8:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.9:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.10:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.11::s +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.12:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.13:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.14:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.15:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.16:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.17:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.18:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.19:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.20:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.21:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.22:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.23:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.6.24:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.1:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.2::degree C + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.3::degree C +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.4::degree C + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.5::degree C +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.6::degree C + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.7::degree C +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.8::% + +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.9:: +.1.3.6.1.4.1.2606.7.4.2.2.1.5.7.10:: + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.3::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.5::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.7::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.8::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.10::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.12::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.13::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.15::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.17::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.18::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.20::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.21::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.22::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.24::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.25::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.26::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.27::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.28::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.29::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.30::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.31::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.32::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.33::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.34::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.35::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.36::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.37::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.38::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.39::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.40::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.41::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.42::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.43::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.44::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.45::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.46::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.47::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.1.48::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.2::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.11::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.15::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.17::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.18::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.24::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.25::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.26::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.27::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.28::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.29::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.30::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.31::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.32::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.33::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.34::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.35::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.36::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.37::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.38::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.39::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.40::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.41::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.42::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.43::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.44::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.45::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.46::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.47::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.48::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.49::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.50::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.51::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.52::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.53::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.54::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.55::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.56::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.57::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.58::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.59::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.60::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.61::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.62::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.63::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.64::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.65::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.66::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.67::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.68::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.69::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.70::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.71::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.72::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.73::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.74::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.75::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.76::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.77::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.78::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.79::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.80::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.81::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.82::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.83::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.84::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.85::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.86::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.87::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.88::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.89::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.90::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.91::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.92::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.93::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.94::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.95::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.96::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.97::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.98::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.99::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.100::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.101::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.102::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.103::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.104::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.105::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.106::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.107::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.108::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.109::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.110::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.111::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.112::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.113::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.114::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.115::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.116::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.117::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.118::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.119::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.120::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.121::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.122::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.123::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.124::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.125::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.126::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.127::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.128::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.129::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.130::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.131::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.132::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.133::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.134::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.135::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.136::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.137::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.138::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.139::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.140::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.141::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.142::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.143::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.144::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.145::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.146::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.147::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.148::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.149::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.150::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.151::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.152::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.153::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.154::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.155::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.156::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.157::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.2.158::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.2::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.6::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.12::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.17::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.18::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.20::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.21::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.3.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.2::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.6::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.12::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.17::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.18::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.20::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.21::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.4.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.2::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.6::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.12::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.17::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.18::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.20::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.21::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.5.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.2::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.6::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.12::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.17::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.18::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.20::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.21::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.6.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.6.7.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.2::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.4::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.14::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.23::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.26::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.27::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.28::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.29::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.30::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.31::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.32::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.33::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.34::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.35::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.36::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.37::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.38::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.39::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.40::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.41::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.42::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.43::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.44::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.45::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.46::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.47::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.1.48::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.1::-10 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.3::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.4::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.5::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.6::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.7::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.8::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.12::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.13::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.14::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.15::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.17::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.20::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.21::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.22::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.26::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.27::-10 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.28::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.29::-10 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.30::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.31::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.32::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.33::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.34::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.35::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.36::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.37::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.38::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.39::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.40::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.41::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.42::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.43::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.44::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.45::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.46::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.47::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.48::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.49::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.50::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.51::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.52::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.53::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.54::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.55::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.56::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.57::-10 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.58::-10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.59::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.60::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.61::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.62::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.63::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.64::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.65::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.66::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.67::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.68::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.69::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.70::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.71::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.72::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.73::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.74::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.75::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.76::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.77::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.78::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.79::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.80::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.81::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.82::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.83::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.84::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.85::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.86::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.87::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.88::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.89::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.90::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.91::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.92::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.93::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.94::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.95::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.96::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.97::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.98::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.99::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.100::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.101::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.102::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.103::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.104::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.105::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.106::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.107::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.108::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.109::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.110::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.111::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.112::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.113::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.114::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.115::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.116::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.117::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.118::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.119::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.120::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.121::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.122::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.123::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.124::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.125::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.126::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.127::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.128::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.129::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.130::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.131::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.132::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.133::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.134::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.135::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.136::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.137::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.138::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.139::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.140::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.141::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.142::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.143::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.144::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.145::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.146::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.147::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.148::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.149::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.150::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.151::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.152::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.153::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.154::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.155::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.156::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.157::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.2.158::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.3.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.4.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.5.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.6.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.2::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.3::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.4::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.5::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.6::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.7::-100 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.8::-100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.7.7.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.1::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.2::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.3::enum: 0,1,2,3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.4::integer: min 0, max 1200, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.5::enum: 1,4,5,10,11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.6::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.7::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.8::enum: 0,1 +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.9::enum: 0,1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.10::enum: 1,4,5,10,11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.11::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.12::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.13::enum: 0-15 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.14::integer: min 0, max 100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.15::enum: 1,3,4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.16::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.17::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.18::enum: 1,3,4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.19::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.20::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.21::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.22::enum: 1,4,6,8 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.23::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.24::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.25::enum: 4,13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.26::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.27::enum: 1,4,5,6,8 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.28::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.29::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.30::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.31::enum: 1,4,7,9 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.32::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.33::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.34::integer: min 0, max 9999, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.35::integer: min 0, max 100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.36::enum: 4,9 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.37::enum: 1,4,6,8,27,30 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.38::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.39::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.40::enum: 4,10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.41::enum: 1,4,5,19 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.42::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.43::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.44::integer: min 0, max 100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.45::integer: min 0, max 32, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.46::integer: min 0, max 3600, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.47::enum: 1,4,10,5,33 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.1.48::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.1::integer: min 0, max 650, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.2::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.3::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.4::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.5::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.6::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.7::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.8::integer: min 0, max 2000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.9::enum: 1,3,4,6,7,8,9,21 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.10::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.11::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.12::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.13::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.14::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.15::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.16::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.17::integer: min 0, max 2000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.18::enum: 1,3,4,6,7,8,9,21 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.19::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.20::integer: min 0, max 2000000000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.21::integer: min 0, max 2000000000, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.22::integer: min 0, max 2000000000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.23::integer: min 0, max 2000000000, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.24::enum: 0,1,2,3,4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.25::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.26::integer: min 0, max 4000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.27::integer: min 0, max 4000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.28::integer: min 0, max 4000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.29::integer: min 0, max 4000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.30::integer: min 0, max 4000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.31::integer: min 0, max 2000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.32::enum: 1,3,4,6,7,8,9,21 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.33::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.34::integer: min 0, max 10000, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.35::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.36::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.37::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.38::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.39::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.40::integer: min 0, max 3500, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.41::integer: min 0, max 2000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.42::enum: 1,3,4,6,7,8,9,21 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.43::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.44::integer: min -100, max 100, scale /100, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.45::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.46::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.47::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.48::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.49::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.50::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.51::integer: min 0, max 2000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.52::enum: 1,3,4,6,7,8,9,21 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.53::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.54::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.55::integer: min 0, max 9100, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.56::integer: min 0, max 2000000000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.57::integer: min 0, max 2000000000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.58::integer: min 0, max 2000000000, scale /10, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.59::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.60::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.61::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.62::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.63::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.64::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.65::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.66::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.67::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.68::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.69::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.70::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.71::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.72::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.73::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.74::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.75::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.76::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.77::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.78::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.79::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.80::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.81::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.82::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.83::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.84::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.85::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.86::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.87::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.88::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.89::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.90::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.91::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.92::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.93::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.94::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.95::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.96::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.97::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.98::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.99::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.100::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.101::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.102::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.103::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.104::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.105::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.106::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.107::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.108::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.109::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.110::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.111::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.112::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.113::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.114::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.115::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.116::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.117::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.118::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.119::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.120::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.121::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.122::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.123::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.124::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.125::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.126::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.127::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.128::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.129::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.130::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.131::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.132::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.133::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.134::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.135::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.136::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.137::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.138::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.139::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.140::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.141::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.142::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.143::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.144::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.145::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.146::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.147::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.148::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.149::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.150::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.151::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.152::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.153::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.154::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.155::regexp: ^([-_ a-zA-Z0-9]{0,5})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.156::enum: 0-12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.157::enum: 1,10,11,21,37 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.2.158::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.1::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.2::enum: 6,7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.3::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.4::integer: min 0, max 3, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.5::integer: min 0, max 240, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.6::enum: 5,13,16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.7::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.8::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.9::enum: 0,1,2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.10::integer: min 0, max 1, scale *1, step 0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.11::integer: min 5, max 120, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.12::enum: 5,14,15,27 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.13::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.14::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.15::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.16::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.17::enum: 11,12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.18::enum: 10,27,28 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.19::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.20::enum: 0,1,2,3,4,5,6 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.21::enum: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.22::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.23::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.3.24::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.1::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.2::enum: 6,7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.3::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.4::integer: min 0, max 3, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.5::integer: min 0, max 240, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.6::enum: 5,13,16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.7::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.8::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.9::enum: 0,1,2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.10::integer: min 0, max 1, scale *1, step 0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.11::integer: min 5, max 120, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.12::enum: 5,14,15,27 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.13::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.14::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.15::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.16::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.17::enum: 11,12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.18::enum: 10,27,28 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.19::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.20::enum: 0,1,2,3,4,5,6 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.21::enum: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.22::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.23::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.4.24::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.1::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.2::enum: 6,7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.3::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.4::integer: min 0, max 3, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.5::integer: min 0, max 240, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.6::enum: 5,13,16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.7::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.8::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.9::enum: 0,1,2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.10::integer: min 0, max 1, scale *1, step 0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.11::integer: min 5, max 120, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.12::enum: 5,14,15,27 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.13::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.14::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.15::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.16::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.17::enum: 11,12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.18::enum: 10,27,28 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.19::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.20::enum: 0,1,2,3,4,5,6 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.21::enum: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.22::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.23::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.5.24::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.1::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.2::enum: 6,7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.3::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.4::integer: min 0, max 3, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.5::integer: min 0, max 240, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.6::enum: 5,13,16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.7::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.8::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.9::enum: 0,1,2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.10::integer: min 0, max 1, scale *1, step 0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.11::integer: min 5, max 120, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.12::enum: 5,14,15,27 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.13::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.14::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.15::regexp: ^([-_ a-zA-Z0-9]{0,40})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.16::integer: min 0, max 1, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.17::enum: 11,12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.18::enum: 10,27,28 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.19::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.20::enum: 0,1,2,3,4,5,6 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.21::enum: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.22::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.23::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.6.24::integer: min 0, max 255, scale *1, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.1::regexp: ^([-_ a-zA-Z0-9]{0,20})$ + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.2::integer: min -4000, max 8000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.3::integer: min -1000, max 1000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.4::integer: min -4000, max 8000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.5::integer: min -4000, max 8000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.6::integer: min -4000, max 8000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.7::integer: min -4000, max 8000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.8::integer: min 0, max 2000, scale /100, step 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.9::enum: 1,4,6,7,8,9 + +.1.3.6.1.4.1.2606.7.4.2.2.1.8.7.10::integer: min 0, max 255, scale none, step 1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.2::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.6::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.14::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.19::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.26::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.27::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.28::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.29::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.30::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.31::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.32::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.33::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.34::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.35::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.36::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.37::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.38::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.39::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.40::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.41::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.42::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.43::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.44::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.45::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.46::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.47::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.1.48::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.1::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.6::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.7::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.8::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.12::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.13::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.14::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.15::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.17::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.19::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.20::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.21::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.26::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.27::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.28::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.29::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.30::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.31::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.32::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.33::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.34::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.35::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.36::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.37::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.38::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.39::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.40::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.41::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.42::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.43::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.44::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.45::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.46::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.47::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.48::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.49::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.50::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.51::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.52::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.53::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.54::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.55::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.56::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.57::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.58::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.59::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.60::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.61::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.62::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.63::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.64::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.65::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.66::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.67::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.68::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.69::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.70::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.71::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.72::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.73::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.74::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.75::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.76::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.77::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.78::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.79::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.80::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.81::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.82::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.83::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.84::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.85::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.86::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.87::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.88::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.89::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.90::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.91::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.92::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.93::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.94::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.95::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.96::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.97::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.98::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.99::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.100::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.101::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.102::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.103::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.104::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.105::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.106::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.107::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.108::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.109::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.110::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.111::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.112::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.113::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.114::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.115::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.116::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.117::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.118::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.119::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.120::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.121::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.122::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.123::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.124::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.125::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.126::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.127::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.128::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.129::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.130::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.131::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.132::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.133::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.134::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.135::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.136::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.137::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.138::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.139::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.140::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.141::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.142::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.143::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.144::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.145::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.146::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.147::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.148::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.149::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.150::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.151::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.152::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.153::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.154::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.155::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.156::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.157::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.2.158::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.7::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.13::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.19::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.3.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.7::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.13::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.19::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.4.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.7::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.13::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.19::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.5.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.3::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.4::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.5::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.7::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.11::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.13::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.19::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.22::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.23::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.6.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.2::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.3::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.4::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.5::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.6::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.7::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.8::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.9.7.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.1::Input +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.3::0:Off / 1:On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.4::1.0 s + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.5::Off +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.6::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.7::Alarm Relay +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.8::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.9::0:Off / 1:On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.10::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.11::16 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.12::V24 unit + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.13::no SMS unit found + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.14::0 % +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.15::n.a. + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.16::16 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.17::PoE + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.18::n.a. +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.19::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.20::System Temperature + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.21::none +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.22::OK + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.23::16 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.24::System Current + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.25::-- +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.26::none + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.27::OK +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.28::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.29::System Supply +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.30::none + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.31::OK +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.32::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.33::USB-Stick +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.34::0.0 GB + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.35::0 % +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.36::-- + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.37::n.a. +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.38::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.39::Webcam +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.40::-- + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.41::n.a. +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.42::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.43::Login +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.44::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.45::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.46::0 s + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.47::Off +.1.3.6.1.4.1.2606.7.4.2.2.1.10.1.48::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.1::50.0 Hz + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.2::Neutral Current + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.3::0.00 A +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.4::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.5::0.00 A +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.6::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.7::0.00 A +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.8::5.00 % + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.9::OK +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.10::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.11::Power Active +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.12::0 W + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.13::0 W +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.14::0 W + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.15::0 W +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.16::0 W + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.17::5.00 % +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.18::OK + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.19::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.20::11.7 kWh + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.21::23946711 s + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.22::11.7 kWh + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.23::23946708 s + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.24::Vertical up + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.25::Voltage L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.26::233.9 V + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.27::260.0 V +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.28::250.0 V + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.29::210.0 V +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.30::200.0 V + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.31::5.00 % +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.32::OK + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.33::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.34::1.38 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.35::Current L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.36::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.37::0.00 A +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.38::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.39::0.00 A +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.40::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.41::5.00 % +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.42::OK + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.43::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.44::-1.00 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.45::Power L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.46::0 W + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.47::0 W +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.48::0 W + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.49::0 W +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.50::0 W + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.51::5.00 % +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.52::OK + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.53::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.54::0 var + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.55::0 VA +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.56::11.7 kWh + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.57::11.7 kWh +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.58::0.0 kVAh + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.59::Socket 01 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.60::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.61::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.62::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.63::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.64::Socket 02 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.65::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.66::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.67::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.68::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.69::Socket 03 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.70::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.71::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.72::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.73::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.74::Socket 04 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.75::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.76::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.77::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.78::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.79::Socket 05 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.80::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.81::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.82::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.83::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.84::Socket 06 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.85::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.86::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.87::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.88::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.89::Socket 07 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.90::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.91::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.92::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.93::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.94::Socket 08 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.95::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.96::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.97::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.98::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.99::Socket 09 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.100::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.101::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.102::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.103::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.104::Socket 10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.105::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.106::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.107::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.108::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.109::Socket 11 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.110::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.111::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.112::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.113::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.114::Socket 12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.115::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.116::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.117::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.118::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.119::Socket 13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.120::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.121::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.122::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.123::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.124::Socket 14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.125::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.126::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.127::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.128::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.129::Socket 15 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.130::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.131::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.132::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.133::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.134::Socket 16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.135::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.136::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.137::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.138::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.139::Socket 17 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.140::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.141::C13 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.142::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.143::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.144::Socket 18 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.145::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.146::C13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.147::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.148::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.149::Socket 19 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.150::L1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.151::C19 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.152::On + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.153::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.154::Socket 20 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.155::L1 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.156::C19 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.157::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.2.158::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.1::Access +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.2::Closed + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.5::0 s +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.6::Closed + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.7::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.8::Handle1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.9::Lock +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.11::5 s +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.12::Locked + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.13::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.14::Keypad + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.17::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.18::Inactive + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.19::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.20::Access + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.21::Off +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.23::50 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.3.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.1::Access +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.2::Closed + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.5::0 s +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.6::Closed + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.7::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.8::Handle2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.9::Lock +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.11::5 s +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.12::Locked + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.13::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.14::Keypad + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.17::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.18::Active + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.19::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.20::Access + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.21::Off +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.23::50 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.4.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.1::Access +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.2::Closed + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.5::0 s +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.6::Closed + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.7::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.8::Handle + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.9::Lock +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.11::20 s +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.12::Locked + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.13::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.14::Keypad + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.17::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.18::Active + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.19::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.20::Access + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.21::Off +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.23::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.5.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.1::Access +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.2::Closed + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.5::0 s +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.6::Closed + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.7::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.8::Handle + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.9::Lock +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.11::5 s +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.12::Locked + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.13::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.14::Keypad + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.17::On +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.18::Active + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.19::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.20::Access + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.21::White +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.23::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.10.6.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.1::Temperature + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.2::24.80 degree C + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.3::0.00 degree C + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.4::40.00 degree C + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.5::27.80 degree C + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.6::10.00 degree C + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.7::5.00 degree C +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.8::0.00 % + +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.9::OK +.1.3.6.1.4.1.2606.7.4.2.2.1.10.7.10::80 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.1::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.4::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.5::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.6::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.8::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.10::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.11::16 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.15::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.16::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.18::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.19::16 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.22::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.23::16 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.25::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.26::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.27::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.28::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.29::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.30::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.31::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.32::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.33::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.34::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.35::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.36::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.37::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.38::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.39::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.40::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.41::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.42::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.43::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.44::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.45::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.46::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.47::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.1.48::16 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.1::500 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.8::500 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.10::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.17::500 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.18::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.19::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.20::117 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.21::23946738 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.22::117 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.23::23946738 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.24::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.26::2336 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.27::2600 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.28::2500 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.29::2100 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.30::2000 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.31::500 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.32::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.33::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.34::139 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.35::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.36::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.37::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.38::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.39::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.40::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.41::500 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.42::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.43::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.44::100 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.45::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.46::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.47::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.48::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.49::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.50::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.51::500 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.52::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.53::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.54::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.55::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.56::117 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.57::117 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.58::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.59::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.60::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.61::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.62::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.63::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.64::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.65::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.66::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.67::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.68::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.69::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.70::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.71::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.72::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.73::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.74::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.75::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.76::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.77::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.78::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.79::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.80::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.81::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.82::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.83::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.84::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.85::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.86::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.87::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.88::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.89::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.90::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.91::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.92::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.93::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.94::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.95::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.96::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.97::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.98::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.99::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.100::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.101::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.102::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.103::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.104::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.105::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.106::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.107::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.108::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.109::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.110::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.111::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.112::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.113::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.114::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.115::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.116::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.117::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.118::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.119::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.120::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.121::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.122::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.123::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.124::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.125::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.126::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.127::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.128::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.129::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.130::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.131::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.132::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.133::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.134::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.135::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.136::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.137::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.138::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.139::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.140::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.141::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.142::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.143::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.144::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.145::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.146::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.147::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.148::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.149::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.150::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.151::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.152::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.153::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.154::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.155::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.156::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.157::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.2.158::4 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.2::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.6::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.7::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.11::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.12::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.13::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.17::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.18::27 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.19::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.20::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.23::50 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.3.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.2::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.6::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.7::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.11::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.12::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.13::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.16::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.17::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.18::28 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.19::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.20::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.23::50 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.4.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.2::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.6::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.7::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.11::20 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.12::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.13::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.17::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.18::28 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.19::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.20::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.23::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.5.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.2::7 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.6::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.7::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.10::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.11::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.12::14 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.13::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.17::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.18::28 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.19::192 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.20::1 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.21::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.23::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.6.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.2::2480 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.4::4000 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.5::2780 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.6::1000 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.7::500 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.9::4 +.1.3.6.1.4.1.2606.7.4.2.2.1.11.7.10::80 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.8::605797 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.10::605797 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.23::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.26::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.27::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.28::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.29::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.30::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.31::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.32::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.33::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.34::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.35::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.36::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.37::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.38::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.39::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.40::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.41::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.42::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.43::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.44::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.45::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.46::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.47::1 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.1.48::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.1::1158876 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.21::1159730 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.23::1159727 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.26::1159731 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.27::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.28::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.29::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.30::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.31::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.32::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.33::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.34::1159731 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.35::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.36::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.37::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.38::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.39::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.40::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.41::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.42::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.43::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.44::1159732 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.45::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.46::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.47::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.48::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.49::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.50::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.51::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.52::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.53::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.54::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.55::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.56::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.57::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.58::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.59::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.60::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.61::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.62::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.63::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.64::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.65::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.66::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.67::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.68::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.69::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.70::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.71::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.72::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.73::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.74::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.75::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.76::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.77::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.78::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.79::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.80::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.81::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.82::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.83::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.84::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.85::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.86::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.87::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.88::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.89::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.90::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.91::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.92::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.93::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.94::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.95::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.96::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.97::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.98::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.99::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.100::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.101::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.102::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.103::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.104::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.105::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.106::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.107::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.108::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.109::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.110::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.111::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.112::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.113::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.114::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.115::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.116::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.117::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.118::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.119::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.120::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.121::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.122::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.123::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.124::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.125::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.126::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.127::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.128::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.129::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.130::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.131::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.132::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.133::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.134::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.135::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.136::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.137::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.138::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.139::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.140::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.141::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.142::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.143::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.144::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.145::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.146::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.147::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.148::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.149::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.150::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.151::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.152::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.153::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.154::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.155::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.156::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.157::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.2.158::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.1::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.2::88124 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.3::88124 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.4::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.5::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.6::88124 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.7::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.8::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.9::659918 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.10::87759 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.11::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.12::659918 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.13::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.14::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.15::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.16::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.17::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.18::76879 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.19::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.20::502762 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.21::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.22::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.23::10 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.3.24::10 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.1::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.2::87909 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.3::87910 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.4::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.5::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.6::87910 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.7::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.8::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.9::659927 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.10::659923 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.11::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.12::659927 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.13::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.14::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.15::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.16::659913 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.17::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.18::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.19::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.20::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.21::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.22::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.23::11 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.4.24::11 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.1::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.2::87920 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.3::87921 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.4::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.5::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.6::87921 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.7::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.8::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.9::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.10::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.11::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.12::19 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.13::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.14::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.15::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.16::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.17::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.18::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.19::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.20::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.21::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.22::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.23::12 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.5.24::12 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.1::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.2::87929 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.3::87930 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.4::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.5::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.6::87930 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.7::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.8::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.9::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.10::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.11::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.12::19 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.13::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.14::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.15::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.16::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.17::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.18::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.19::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.20::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.21::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.22::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.23::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.6.24::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.1::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.2::1159490 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.3::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.4::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.5::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.6::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.7::13 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.8::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.9::605796 +.1.3.6.1.4.1.2606.7.4.2.2.1.12.7.10::13 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.3::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.6::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.7::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.9::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.11::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.12::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.15::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.16::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.17::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.19::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.20::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.23::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.24::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.25::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.26::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.27::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.28::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.29::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.30::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.31::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.32::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.33::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.34::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.35::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.36::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.37::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.38::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.39::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.40::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.41::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.42::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.43::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.44::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.45::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.46::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.47::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.1.48::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.2::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.5::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.6::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.7::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.10::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.11::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.13::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.16::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.17::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.19::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.22::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.23::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.25::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.26::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.27::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.28::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.29::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.30::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.31::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.32::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.33::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.34::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.35::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.36::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.37::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.38::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.39::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.40::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.41::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.42::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.43::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.44::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.45::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.46::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.47::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.48::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.49::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.50::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.51::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.52::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.53::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.54::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.55::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.56::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.57::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.58::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.59::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.60::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.61::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.62::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.63::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.64::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.65::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.66::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.67::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.68::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.69::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.70::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.71::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.72::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.73::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.74::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.75::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.76::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.77::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.78::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.79::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.80::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.81::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.82::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.83::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.84::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.85::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.86::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.87::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.88::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.89::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.90::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.91::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.92::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.93::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.94::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.95::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.96::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.97::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.98::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.99::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.100::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.101::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.102::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.103::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.104::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.105::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.106::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.107::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.108::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.109::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.110::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.111::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.112::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.113::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.114::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.115::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.116::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.117::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.118::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.119::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.120::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.121::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.122::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.123::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.124::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.125::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.126::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.127::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.128::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.129::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.130::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.131::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.132::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.133::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.134::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.135::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.136::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.137::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.138::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.139::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.140::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.141::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.142::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.143::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.144::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.145::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.146::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.147::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.148::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.149::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.150::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.151::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.152::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.153::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.154::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.155::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.156::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.157::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.2.158::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.2::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.5::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.7::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.9::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.11::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.13::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.16::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.17::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.19::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.20::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.21::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.22::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.23::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.3.24::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.2::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.5::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.7::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.9::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.11::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.13::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.16::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.17::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.19::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.20::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.21::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.22::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.23::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.4.24::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.2::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.5::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.7::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.9::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.11::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.13::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.16::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.17::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.19::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.20::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.21::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.22::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.23::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.5.24::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.2::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.5::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.7::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.9::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.11::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.13::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.14::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.15::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.16::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.17::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.19::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.20::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.21::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.22::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.23::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.6.24::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.1::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.3::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.4::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.5::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.6::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.7::3 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.8::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.13.7.10::3 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.5::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.10::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.15::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.17::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.25::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.26::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.27::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.28::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.29::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.30::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.31::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.32::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.33::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.34::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.35::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.36::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.37::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.38::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.39::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.40::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.41::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.42::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.43::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.44::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.45::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.46::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.47::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.1.48::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.15::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.17::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.25::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.26::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.27::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.28::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.29::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.30::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.31::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.32::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.33::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.34::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.35::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.36::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.37::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.38::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.39::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.40::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.41::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.42::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.43::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.44::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.45::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.46::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.47::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.48::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.49::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.50::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.51::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.52::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.53::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.54::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.55::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.56::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.57::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.58::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.59::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.60::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.61::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.62::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.63::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.64::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.65::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.66::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.67::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.68::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.69::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.70::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.71::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.72::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.73::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.74::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.75::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.76::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.77::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.78::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.79::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.80::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.81::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.82::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.83::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.84::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.85::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.86::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.87::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.88::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.89::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.90::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.91::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.92::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.93::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.94::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.95::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.96::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.97::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.98::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.99::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.100::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.101::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.102::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.103::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.104::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.105::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.106::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.107::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.108::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.109::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.110::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.111::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.112::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.113::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.114::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.115::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.116::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.117::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.118::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.119::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.120::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.121::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.122::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.123::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.124::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.125::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.126::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.127::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.128::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.129::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.130::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.131::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.132::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.133::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.134::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.135::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.136::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.137::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.138::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.139::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.140::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.141::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.142::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.143::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.144::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.145::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.146::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.147::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.148::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.149::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.150::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.151::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.152::5 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.153::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.154::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.155::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.156::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.157::5 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.2.158::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.15::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.17::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.3.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.15::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.17::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.4.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.15::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.17::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.5.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.11::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.12::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.13::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.14::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.15::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.16::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.17::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.18::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.19::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.20::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.21::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.22::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.23::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.6.24::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.1::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.2::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.3::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.4::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.5::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.6::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.7::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.8::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.9::2 +.1.3.6.1.4.1.2606.7.4.2.2.1.14.7.10::2 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.2::1001 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.14::1002 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.22::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.23::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.26::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.27::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.28::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.29::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.30::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.31::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.32::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.33::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.34::1003 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.35::1004 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.36::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.37::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.38::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.39::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.40::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.41::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.42::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.43::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.44::1005 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.45::1006 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.46::1007 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.47::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.1.48::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.1::101001 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.3::101002 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.10::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.12::101003 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.20::101004 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.21::101005 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.22::101006 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.23::101007 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.24::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.25::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.26::101008 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.27::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.28::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.29::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.30::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.31::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.32::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.33::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.34::101009 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.35::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.36::101010 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.37::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.38::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.39::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.40::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.41::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.42::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.43::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.44::101011 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.45::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.46::101012 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.47::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.48::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.49::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.50::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.51::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.52::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.53::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.54::101013 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.55::101014 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.56::101015 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.57::101016 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.58::101017 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.59::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.60::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.61::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.62::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.63::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.64::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.65::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.66::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.67::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.68::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.69::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.70::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.71::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.72::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.73::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.74::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.75::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.76::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.77::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.78::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.79::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.80::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.81::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.82::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.83::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.84::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.85::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.86::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.87::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.88::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.89::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.90::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.91::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.92::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.93::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.94::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.95::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.96::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.97::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.98::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.99::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.100::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.101::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.102::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.103::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.104::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.105::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.106::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.107::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.108::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.109::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.110::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.111::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.112::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.113::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.114::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.115::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.116::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.117::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.118::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.119::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.120::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.121::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.122::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.123::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.124::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.125::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.126::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.127::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.128::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.129::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.130::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.131::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.132::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.133::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.134::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.135::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.136::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.137::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.138::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.139::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.140::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.141::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.142::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.143::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.144::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.145::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.146::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.147::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.148::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.149::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.150::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.151::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.152::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.153::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.154::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.155::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.156::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.157::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.2.158::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.3::2001 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.10::2002 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.22::2003 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.23::2004 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.3.24::2005 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.3::102001 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.10::102002 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.22::102003 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.23::102004 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.4.24::102005 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.3::202001 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.10::202002 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.22::202003 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.23::202004 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.5.24::202005 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.2::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.3::302001 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.10::302002 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.11::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.12::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.13::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.14::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.15::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.16::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.17::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.18::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.19::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.20::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.21::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.22::302003 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.23::302004 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.6.24::302005 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.1::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.2::402001 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.3::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.4::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.5::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.6::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.7::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.8::0 + +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.9::0 +.1.3.6.1.4.1.2606.7.4.2.2.1.15.7.10::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.1::Input +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.7::Alarm Relay + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.12::V24 unit +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.17::PoE + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.20::System Temperature + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.24::System Current + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.29::System Supply + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.33::USB-Stick +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.39::Webcam + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.1.43::Login + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.2::Neutral Current + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.11::Power Active + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.25::Voltage L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.35::Current L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.45::Power L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.59::Socket 01 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.64::Socket 02 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.69::Socket 03 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.74::Socket 04 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.79::Socket 05 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.84::Socket 06 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.89::Socket 07 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.94::Socket 08 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.99::Socket 09 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.104::Socket 10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.109::Socket 11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.114::Socket 12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.119::Socket 13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.124::Socket 14 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.129::Socket 15 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.134::Socket 16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.139::Socket 17 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.144::Socket 18 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.149::Socket 19 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.2.154::Socket 20 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.3.1::Access + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.3.8::Handle1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.3.14::Keypad + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.4.1::Access +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.4.8::Handle2 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.4.14::Keypad +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.5.1::Access + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.5.8::Handle +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.5.14::Keypad + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.6.1::Access +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.6.8::Handle + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.6.14::Keypad + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.1.7.1::Temperature +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.1.2::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.1.14::0 % +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.1.34::0.0 GB + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.1.35::0 % +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.1.44::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.1.45::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.1.46::0 s + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.1::50.0 Hz +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.3::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.12::0 W +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.20::11.7 kWh + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.21::23946862 s + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.22::11.7 kWh + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.23::23946858 s + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.26::233.9 V +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.34::1.38 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.36::0.00 A +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.44::-1.00 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.46::0 W +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.54::0 var + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.55::0 VA +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.56::11.7 kWh + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.57::11.7 kWh + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.2.58::0.0 kVAh +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.3.3::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.3.10::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.3.22::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.3.23::50 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.3.24::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.4.3::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.4.10::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.4.22::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.4.23::50 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.4.24::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.5.3::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.5.10::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.5.22::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.5.23::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.5.24::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.6.3::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.6.10::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.6.22::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.6.23::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.6.24::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.2.7.2::24.80 degree C + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.3.2.4::0.00 A +.1.3.6.1.4.1.2606.7.4.2.3.1.4.3.2.13::0 W + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.3.2.27::260.0 V +.1.3.6.1.4.1.2606.7.4.2.3.1.4.3.2.37::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.3.2.47::0 W + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.3.7.4::40.00 degree C + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.4.2.5::0.00 A +.1.3.6.1.4.1.2606.7.4.2.3.1.4.4.2.14::0 W + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.4.2.28::250.0 V +.1.3.6.1.4.1.2606.7.4.2.3.1.4.4.2.38::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.4.2.48::0 W + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.4.7.5::27.80 degree C + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.5.2.7::0.00 A +.1.3.6.1.4.1.2606.7.4.2.3.1.4.5.2.16::0 W + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.5.2.30::200.0 V +.1.3.6.1.4.1.2606.7.4.2.3.1.4.5.2.40::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.5.2.50::0 W +.1.3.6.1.4.1.2606.7.4.2.3.1.4.5.7.7::5.00 degree C + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.6.2.8::5.00 % +.1.3.6.1.4.1.2606.7.4.2.3.1.4.6.2.17::5.00 % + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.6.2.31::5.00 % +.1.3.6.1.4.1.2606.7.4.2.3.1.4.6.2.41::5.00 % + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.6.2.51::5.00 % +.1.3.6.1.4.1.2606.7.4.2.3.1.4.6.7.8::0.00 % + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.5::Off +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.10::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.15::n.a. +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.18::n.a. + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.22::OK +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.27::OK + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.31::OK +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.37::n.a. + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.41::n.a. +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.1.47::Off + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.9::OK +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.18::OK + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.32::OK +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.42::OK + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.52::OK +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.62::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.67::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.72::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.77::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.82::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.87::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.92::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.97::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.102::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.107::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.112::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.117::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.122::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.127::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.132::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.137::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.142::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.147::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.152::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.2.157::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.3.6::Closed + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.3.12::Locked +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.3.18::Inactive + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.4.6::Closed +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.4.12::Locked + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.4.18::Active +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.5.6::Closed + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.5.12::Locked +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.5.18::Active + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.6.6::Closed +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.6.12::Locked + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.6.18::Active +.1.3.6.1.4.1.2606.7.4.2.3.1.4.7.7.9::OK + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.9.2.6::0.00 A +.1.3.6.1.4.1.2606.7.4.2.3.1.4.9.2.15::0 W + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.9.2.29::210.0 V +.1.3.6.1.4.1.2606.7.4.2.3.1.4.9.2.39::0.00 A + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.9.2.49::0 W + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.9.7.6::10.00 degree C + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.6::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.11::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.16::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.19::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.23::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.28::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.32::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.38::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.42::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.1.48::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.10::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.19::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.33::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.43::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.53::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.63::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.68::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.73::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.78::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.83::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.88::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.93::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.98::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.103::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.108::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.113::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.118::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.123::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.128::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.133::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.138::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.143::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.148::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.153::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.2.158::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.3.7::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.3.13::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.3.19::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.4.7::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.4.13::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.4.19::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.5.7::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.5.13::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.5.19::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.6.7::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.6.13::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.6.19::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.14.7.10::80 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.15.1.3::0:Off / 1:On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.15.1.9::0:Off / 1:On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.18.7.3::0.00 degree C +.1.3.6.1.4.1.2606.7.4.2.3.1.4.20.1.8::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.1.4::1.0 s +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.3.5::0 s + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.3.11::5 s +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.4.5::0 s + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.4.11::5 s +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.5.5::0 s + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.5.11::20 s +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.6.5::0 s + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.21.6.11::5 s +.1.3.6.1.4.1.2606.7.4.2.3.1.4.30.3.4::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.30.4.4::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.30.5.4::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.30.6.4::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.38.1.21::none + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.38.1.26::none +.1.3.6.1.4.1.2606.7.4.2.3.1.4.38.1.30::none + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.60::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.65::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.70::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.75::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.80::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.85::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.90::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.95::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.100::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.105::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.110::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.115::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.120::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.125::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.130::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.135::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.140::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.145::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.150::L1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.42.2.155::L1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.61::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.66::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.71::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.76::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.81::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.86::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.91::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.96::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.101::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.106::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.111::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.116::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.121::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.126::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.131::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.136::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.141::C13 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.146::C13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.151::C19 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.44.2.156::C19 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.80.3.15::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.80.4.15::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.80.5.15::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.80.6.15::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.1.25::-- +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.1.36::-- + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.1.40::-- +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.3.2::Closed + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.3.9::Lock +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.3.17::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.4.2::Closed +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.4.9::Lock + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.4.17::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.5.2::Closed + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.5.9::Lock +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.5.17::On + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.6.2::Closed +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.6.9::Lock + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.81.6.17::On +.1.3.6.1.4.1.2606.7.4.2.3.1.4.83.3.16::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.83.4.16::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.83.5.16::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.83.6.16::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.4.93.2.24::Vertical up + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.95.1.13::no SMS unit found + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.151.3.21::Off +.1.3.6.1.4.1.2606.7.4.2.3.1.4.151.4.21::Off + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.151.5.21::Off +.1.3.6.1.4.1.2606.7.4.2.3.1.4.151.6.21::White + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.157.3.20::Access + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.157.4.20::Access + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.157.5.20::Access + +.1.3.6.1.4.1.2606.7.4.2.3.1.4.157.6.20::Access +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.1::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.7::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.12::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.17::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.20::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.24::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.29::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.33::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.39::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.1.43::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.2::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.11::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.25::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.35::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.45::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.59::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.64::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.69::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.74::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.79::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.84::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.89::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.94::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.99::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.104::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.109::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.114::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.119::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.124::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.129::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.134::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.139::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.144::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.149::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.2.154::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.3.1::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.3.8::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.3.14::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.4.1::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.4.8::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.4.14::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.5.1::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.5.8::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.5.14::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.6.1::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.6.8::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.6.14::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.1.7.1::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.1.2::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.1.14::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.1.34::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.1.35::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.1.44::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.1.45::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.1.46::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.1::500 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.3::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.12::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.20::117 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.21::23946886 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.22::117 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.23::23946878 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.26::2338 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.34::138 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.36::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.44::100 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.46::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.54::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.55::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.56::117 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.57::117 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.2.58::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.3.3::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.3.10::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.3.22::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.3.23::50 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.3.24::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.4.3::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.4.10::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.4.22::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.4.23::50 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.4.24::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.5.3::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.5.10::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.5.22::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.5.23::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.5.24::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.6.3::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.6.10::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.6.22::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.6.23::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.6.24::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.2.7.2::2490 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.3.2.4::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.3.2.13::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.3.2.27::2600 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.3.2.37::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.3.2.47::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.3.7.4::4000 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.4.2.5::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.4.2.14::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.4.2.28::2500 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.4.2.38::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.4.2.48::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.4.7.5::2780 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.5.2.7::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.5.2.16::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.5.2.30::2000 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.5.2.40::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.5.2.50::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.5.7.7::500 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.6.2.8::500 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.6.2.17::500 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.6.2.31::500 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.6.2.41::500 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.6.2.51::500 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.6.7.8::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.5::10 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.10::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.15::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.18::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.22::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.27::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.31::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.37::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.41::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.1.47::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.9::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.18::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.32::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.42::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.52::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.62::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.67::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.72::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.77::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.82::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.87::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.92::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.97::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.102::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.107::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.112::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.117::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.122::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.127::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.132::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.137::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.142::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.147::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.152::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.2.157::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.3.6::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.3.12::14 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.3.18::27 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.4.6::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.4.12::14 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.4.18::28 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.5.6::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.5.12::14 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.5.18::28 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.6.6::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.6.12::14 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.6.18::28 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.7.7.9::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.9.2.6::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.9.2.15::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.9.2.29::2100 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.9.2.39::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.9.2.49::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.9.7.6::1000 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.6::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.11::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.16::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.19::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.23::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.28::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.32::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.38::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.42::16 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.1.48::16 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.10::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.19::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.33::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.43::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.53::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.63::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.68::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.73::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.78::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.83::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.88::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.93::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.98::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.103::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.108::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.113::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.118::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.123::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.128::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.133::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.138::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.143::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.148::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.153::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.2.158::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.3.7::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.3.13::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.3.19::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.4.7::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.4.13::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.4.19::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.5.7::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.5.13::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.5.19::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.6.7::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.6.13::192 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.6.19::192 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.14.7.10::80 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.15.1.3::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.15.1.9::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.18.7.3::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.20.1.8::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.1.4::10 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.3.5::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.3.11::5 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.4.5::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.4.11::5 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.5.5::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.5.11::20 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.6.5::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.21.6.11::5 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.30.3.4::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.30.4.4::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.30.5.4::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.30.6.4::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.38.1.21::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.38.1.26::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.38.1.30::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.60::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.65::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.70::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.75::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.80::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.85::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.90::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.95::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.100::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.105::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.110::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.115::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.120::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.125::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.130::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.135::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.140::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.145::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.150::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.42.2.155::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.61::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.66::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.71::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.76::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.81::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.86::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.91::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.96::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.101::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.106::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.111::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.116::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.121::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.126::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.131::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.136::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.141::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.146::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.151::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.44.2.156::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.80.3.15::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.80.4.15::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.80.5.15::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.80.6.15::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.1.25::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.1.36::4 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.1.40::4 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.3.2::7 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.3.9::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.3.17::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.4.2::7 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.4.9::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.4.17::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.5.2::7 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.5.9::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.5.17::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.6.2::7 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.6.9::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.81.6.17::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.83.3.16::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.83.4.16::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.83.5.16::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.83.6.16::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.93.2.24::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.95.1.13::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.151.3.21::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.151.4.21::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.151.5.21::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.151.6.21::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.157.3.20::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.157.4.20::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.5.157.5.20::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.5.157.6.20::1 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.1::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.7::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.12::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.17::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.20::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.24::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.29::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.33::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.39::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.1.43::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.2::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.11::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.25::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.35::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.45::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.59::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.64::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.69::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.74::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.79::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.84::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.89::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.94::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.99::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.104::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.109::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.114::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.119::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.124::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.129::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.134::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.139::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.144::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.149::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.2.154::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.3.1::10 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.3.8::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.3.14::10 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.4.1::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.4.8::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.4.14::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.5.1::12 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.5.8::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.5.14::12 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.6.1::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.6.8::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.6.14::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.1.7.1::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.1.2::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.1.14::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.1.34::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.1.35::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.1.44::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.1.45::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.1.46::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.1::1158876 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.3::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.12::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.20::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.21::1159874 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.22::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.23::1159871 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.26::1159874 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.34::1159873 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.36::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.44::1159871 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.46::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.54::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.55::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.56::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.57::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.2.58::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.3.3::88124 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.3.10::87759 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.3.22::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.3.23::10 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.3.24::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.4.3::87910 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.4.10::659923 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.4.22::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.4.23::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.4.24::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.5.3::87921 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.5.10::12 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.5.22::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.5.23::12 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.5.24::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.6.3::87930 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.6.10::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.6.22::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.6.23::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.6.24::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.2.7.2::1159863 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.3.2.4::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.3.2.13::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.3.2.27::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.3.2.37::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.3.2.47::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.3.7.4::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.4.2.5::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.4.2.14::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.4.2.28::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.4.2.38::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.4.2.48::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.4.7.5::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.5.2.7::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.5.2.16::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.5.2.30::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.5.2.40::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.5.2.50::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.5.7.7::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.6.2.8::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.6.2.17::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.6.2.31::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.6.2.41::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.6.2.51::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.6.7.8::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.5::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.10::605797 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.15::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.18::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.22::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.27::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.31::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.37::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.41::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.1.47::1 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.9::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.18::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.32::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.42::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.52::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.62::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.67::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.72::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.77::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.82::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.87::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.92::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.97::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.102::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.107::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.112::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.117::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.122::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.127::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.132::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.137::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.142::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.147::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.152::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.2.157::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.3.6::88124 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.3.12::659918 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.3.18::76879 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.4.6::87910 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.4.12::659927 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.4.18::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.5.6::87921 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.5.12::19 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.5.18::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.6.6::87930 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.6.12::19 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.6.18::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.7.7.9::605796 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.9.2.6::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.9.2.15::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.9.2.29::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.9.2.39::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.9.2.49::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.9.7.6::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.6::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.11::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.16::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.19::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.23::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.28::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.32::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.38::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.42::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.1.48::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.10::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.19::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.33::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.43::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.53::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.63::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.68::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.73::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.78::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.83::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.88::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.93::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.98::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.103::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.108::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.113::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.118::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.123::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.128::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.133::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.138::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.143::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.148::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.153::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.2.158::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.3.7::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.3.13::10 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.3.19::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.4.7::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.4.13::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.4.19::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.5.7::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.5.13::12 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.5.19::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.6.7::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.6.13::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.6.19::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.14.7.10::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.15.1.3::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.15.1.9::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.18.7.3::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.20.1.8::605797 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.1.4::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.3.5::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.3.11::10 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.4.5::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.4.11::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.5.5::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.5.11::12 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.6.5::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.21.6.11::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.30.3.4::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.30.4.4::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.30.5.4::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.30.6.4::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.38.1.21::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.38.1.26::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.38.1.30::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.60::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.65::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.70::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.75::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.80::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.85::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.90::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.95::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.100::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.105::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.110::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.115::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.120::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.125::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.130::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.135::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.140::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.145::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.150::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.42.2.155::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.61::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.66::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.71::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.76::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.81::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.86::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.91::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.96::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.101::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.106::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.111::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.116::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.121::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.126::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.131::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.136::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.141::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.146::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.151::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.44.2.156::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.80.3.15::10 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.80.4.15::11 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.80.5.15::12 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.80.6.15::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.1.25::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.1.36::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.1.40::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.3.2::88124 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.3.9::659918 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.3.17::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.4.2::87909 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.4.9::659927 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.4.17::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.5.2::87920 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.5.9::12 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.5.17::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.6.2::87929 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.6.9::13 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.81.6.17::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.83.3.16::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.83.4.16::659913 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.83.5.16::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.83.6.16::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.93.2.24::0 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.95.1.13::0 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.151.3.21::10 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.151.4.21::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.151.5.21::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.151.6.21::13 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.157.3.20::502762 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.157.4.20::11 +.1.3.6.1.4.1.2606.7.4.2.3.1.6.157.5.20::12 + +.1.3.6.1.4.1.2606.7.4.2.3.1.6.157.6.20::13 +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.1.5::Off + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.1.10::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.1.47::Off + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.62::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.67::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.72::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.77::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.82::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.87::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.92::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.97::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.102::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.107::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.112::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.117::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.122::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.127::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.132::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.137::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.142::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.147::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.152::On +.1.3.6.1.4.1.2606.7.4.2.4.1.4.5.2.157::On + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.1.5::10 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.1.10::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.1.47::10 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.62::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.67::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.72::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.77::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.82::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.87::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.92::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.97::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.102::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.107::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.112::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.117::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.122::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.127::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.132::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.137::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.142::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.147::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.152::11 + +.1.3.6.1.4.1.2606.7.4.2.4.1.5.5.2.157::11 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.1.5::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.1.10::605797 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.1.47::1 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.62::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.67::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.72::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.77::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.82::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.87::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.92::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.97::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.102::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.107::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.112::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.117::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.122::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.127::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.132::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.137::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.142::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.147::0 + +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.152::0 +.1.3.6.1.4.1.2606.7.4.2.4.1.6.5.2.157::0 + +.1.3.6.1.4.1.2606.7.4.2.5.1.4.2.21.1159897::23946936 + +.1.3.6.1.4.1.2606.7.4.2.5.1.4.2.23.1159890::23946928 + +.1.3.6.1.4.1.2606.7.4.2.5.1.4.2.26.1159897::2310 + +.1.3.6.1.4.1.2606.7.4.2.5.1.4.2.34.1159896::139 + +.1.3.6.1.4.1.2606.7.4.2.5.1.4.2.44.1159896::100 + +.1.3.6.1.4.1.2606.7.4.2.5.1.4.7.2.1159863::2480 +.1.3.6.1.4.1.2606.7.4.3.1.1.0::1 + +.1.3.6.1.4.1.2606.7.4.3.1.2.0::48 +.1.3.6.1.4.1.2606.7.4.3.1.3.0::605798 + +.1.3.6.1.4.1.2606.7.4.3.1.4.0::32 +.1.3.6.1.4.1.2606.7.4.3.1.5.0::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.1::Input +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.2::Alarm Relay + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.3::V24 unit +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.4::PoE + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.5::System Temperature + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.6::System Current + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.7::System Supply + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.8::USB-Stick +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.9::Webcam + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.1.10::Login +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.1::Neutral Current + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.2::Power Active + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.3::Voltage L1 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.4::Current L1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.5::Power L1 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.6::Socket 01 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.7::Socket 02 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.8::Socket 03 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.9::Socket 04 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.10::Socket 05 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.11::Socket 06 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.12::Socket 07 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.13::Socket 08 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.14::Socket 09 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.15::Socket 10 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.16::Socket 11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.17::Socket 12 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.18::Socket 13 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.19::Socket 14 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.20::Socket 15 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.21::Socket 16 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.22::Socket 17 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.23::Socket 18 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.24::Socket 19 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.2.25::Socket 20 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.3.1::Access + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.3.2::Handle1 +.1.3.6.1.4.1.2606.7.4.3.2.1.3.3.3::Keypad + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.4.1::Access +.1.3.6.1.4.1.2606.7.4.3.2.1.3.4.2::Handle2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.4.3::Keypad +.1.3.6.1.4.1.2606.7.4.3.2.1.3.5.1::Access + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.5.2::Handle +.1.3.6.1.4.1.2606.7.4.3.2.1.3.5.3::Keypad + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.6.1::Access +.1.3.6.1.4.1.2606.7.4.3.2.1.3.6.2::Handle + +.1.3.6.1.4.1.2606.7.4.3.2.1.3.6.3::Keypad +.1.3.6.1.4.1.2606.7.4.3.2.1.3.7.1::Temperature + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.1::10 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.2::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.3::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.4::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.5::4 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.6::4 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.7::4 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.8::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.9::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.1.10::10 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.1::4 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.2::4 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.3::4 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.4::4 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.5::4 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.6::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.7::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.8::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.9::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.10::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.11::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.12::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.13::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.14::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.15::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.16::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.17::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.18::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.19::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.20::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.21::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.22::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.23::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.24::11 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.2.25::11 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.3.1::13 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.3.2::14 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.3.3::27 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.4.1::13 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.4.2::14 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.4.3::28 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.5.1::13 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.5.2::14 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.5.3::28 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.6.1::13 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.6.2::14 + +.1.3.6.1.4.1.2606.7.4.3.2.1.4.6.3::28 +.1.3.6.1.4.1.2606.7.4.3.2.1.4.7.1::4 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.4::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.5::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.6::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.7::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.8::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.9::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.1.10::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.4::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.5::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.6::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.7::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.8::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.9::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.10::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.11::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.12::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.13::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.14::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.15::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.16::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.17::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.18::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.19::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.20::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.21::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.22::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.23::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.24::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.2.25::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.3.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.3.2::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.3.3::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.4.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.4.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.4.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.5.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.5.2::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.5.3::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.6.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.6.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.5.6.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.5.7.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.4::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.5::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.6::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.7::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.8::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.9::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.1.10::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.4::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.5::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.6::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.7::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.8::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.9::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.10::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.11::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.12::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.13::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.14::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.15::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.16::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.17::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.18::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.19::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.20::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.21::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.22::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.23::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.24::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.2.25::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.3.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.3.2::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.3.3::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.4.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.4.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.4.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.5.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.5.2::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.5.3::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.6.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.6.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.6.6.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.6.7.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.1::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.2::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.3::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.4::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.5::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.6::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.7::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.8::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.9::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.1.10::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.1::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.2::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.3::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.4::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.5::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.6::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.7::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.8::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.9::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.10::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.11::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.12::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.13::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.14::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.15::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.16::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.17::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.18::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.19::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.20::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.21::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.22::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.23::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.24::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.2.25::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.3.1::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.3.2::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.3.3::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.4.1::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.4.2::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.4.3::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.5.1::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.5.2::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.5.3::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.6.1::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.6.2::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.7.6.3::ff:ff +.1.3.6.1.4.1.2606.7.4.3.2.1.7.7.1::ff:ff + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.1::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.2::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.3::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.4::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.5::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.6::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.7::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.8::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.9::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.1.10::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.1::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.2::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.3::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.4::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.5::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.6::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.7::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.8::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.9::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.10::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.11::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.12::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.13::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.14::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.15::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.16::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.17::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.18::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.19::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.20::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.21::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.22::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.23::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.24::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.2.25::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.3.1::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.3.2::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.3.3::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.4.1::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.4.2::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.4.3::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.5.1::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.5.2::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.5.3::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.6.1::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.6.2::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.8.6.3::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.8.7.1::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.1::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.2::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.3::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.4::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.5::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.6::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.7::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.8::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.9::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.1.10::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.1::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.2::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.3::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.4::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.5::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.6::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.7::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.8::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.9::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.10::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.11::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.12::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.13::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.14::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.15::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.16::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.17::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.18::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.19::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.20::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.21::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.22::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.23::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.24::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.2.25::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.3.1::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.3.2::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.3.3::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.4.1::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.4.2::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.4.3::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.5.1::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.5.2::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.5.3::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.6.1::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.6.2::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.9.6.3::00:00 +.1.3.6.1.4.1.2606.7.4.3.2.1.9.7.1::00:00 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.1::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.2::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.3::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.4::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.5::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.6::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.7::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.8::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.9::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.1.10::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.1::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.2::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.3::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.4::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.5::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.6::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.7::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.8::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.9::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.10::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.11::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.12::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.13::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.14::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.15::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.16::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.17::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.18::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.19::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.20::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.21::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.22::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.23::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.24::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.2.25::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.3.1::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.3.2::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.3.3::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.4.1::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.4.2::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.4.3::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.5.1::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.5.2::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.5.3::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.6.1::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.6.2::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.10.6.3::1 +.1.3.6.1.4.1.2606.7.4.3.2.1.10.7.1::1 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.1::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.2::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.3::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.4::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.5::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.6::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.7::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.8::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.9::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.1.10::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.1::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.2::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.3::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.4::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.5::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.6::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.7::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.8::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.9::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.10::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.11::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.12::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.13::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.14::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.15::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.16::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.17::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.18::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.19::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.20::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.21::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.22::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.23::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.24::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.2.25::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.3.1::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.3.2::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.3.3::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.4.1::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.4.2::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.4.3::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.5.1::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.5.2::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.5.3::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.6.1::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.6.2::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.11.6.3::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.11.7.1::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.1::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.2::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.3::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.4::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.5::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.6::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.7::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.8::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.9::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.1.10::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.1::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.2::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.3::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.4::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.5::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.6::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.7::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.8::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.9::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.10::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.11::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.12::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.13::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.14::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.15::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.16::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.17::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.18::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.19::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.20::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.21::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.22::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.23::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.24::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.2.25::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.3.1::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.3.2::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.3.3::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.4.1::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.4.2::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.4.3::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.5.1::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.5.2::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.5.3::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.6.1::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.6.2::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.12.6.3::0 +.1.3.6.1.4.1.2606.7.4.3.2.1.12.7.1::0 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.1::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.2::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.4::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.5::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.6::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.7::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.8::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.9::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.1.10::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.4::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.5::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.6::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.7::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.8::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.9::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.10::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.11::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.12::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.13::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.14::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.15::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.16::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.17::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.18::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.19::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.20::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.21::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.22::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.23::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.24::5 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.2.25::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.3.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.3.2::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.3.3::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.4.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.4.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.4.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.5.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.5.2::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.5.3::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.6.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.6.2::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.13.6.3::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.13.7.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.1::5 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.2::10 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.3::15 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.4::18 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.5::22 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.6::27 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.7::31 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.8::37 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.9::41 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.1.10::47 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.1::9 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.2::18 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.3::32 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.4::42 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.5::52 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.6::62 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.7::67 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.8::72 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.9::77 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.10::82 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.11::87 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.12::92 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.13::97 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.14::102 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.15::107 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.16::112 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.17::117 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.18::122 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.19::127 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.20::132 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.21::137 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.22::142 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.23::147 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.24::152 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.2.25::157 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.3.1::6 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.3.2::12 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.3.3::18 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.4.1::6 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.4.2::12 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.4.3::18 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.5.1::6 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.5.2::12 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.5.3::18 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.6.1::6 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.6.2::12 + +.1.3.6.1.4.1.2606.7.4.3.2.1.14.6.3::18 +.1.3.6.1.4.1.2606.7.4.3.2.1.14.7.1::9 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.1::2 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.2::8 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.3::14 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.4::14 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.5::14 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.6::14 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.7::14 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.8::35 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.9::35 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.1.10::46 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.1::3 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.2::12 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.3::26 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.4::36 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.5::46 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.6::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.7::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.8::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.9::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.10::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.11::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.12::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.13::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.14::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.15::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.16::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.17::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.18::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.19::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.20::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.21::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.22::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.23::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.24::58 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.2.25::58 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.3.1::3 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.3.2::10 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.3.3::10 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.4.1::3 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.4.2::10 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.4.3::10 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.5.1::3 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.5.2::10 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.5.3::10 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.6.1::3 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.6.2::10 + +.1.3.6.1.4.1.2606.7.4.3.2.1.15.6.3::10 +.1.3.6.1.4.1.2606.7.4.3.2.1.15.7.1::2 + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.1::Device 1 (PDU-Controller) @1.01, Input: Off (0 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.2::Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.3::Device 1 (PDU-Controller) @1.01, V24 unit: n.a. (no SMS unit found, 0 %) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.4::Device 1 (PDU-Controller) @1.01, PoE: n.a. () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.5::Device 1 (PDU-Controller) @1.01, System Temperature: OK (none) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.6::Device 1 (PDU-Controller) @1.01, System Current: OK (none) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.7::Device 1 (PDU-Controller) @1.01, System Supply: OK (none) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.8::Device 1 (PDU-Controller) @1.01, USB-Stick: n.a. (0.0 GB, 0 %) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.9::Device 1 (PDU-Controller) @1.01, Webcam: n.a. () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.1.10::Device 1 (PDU-Controller) @1.01, Login: Off (0 , 0 , 0 s) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.1::Device 2 (PDU-MET) @1.02, Neutral Current: OK (0.00 A) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.2::Device 2 (PDU-MET) @1.02, Power Active: OK (0 W) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.3::Device 2 (PDU-MET) @1.02, Voltage L1: OK (234.0 V) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.4::Device 2 (PDU-MET) @1.02, Current L1: OK (0.00 A) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.5::Device 2 (PDU-MET) @1.02, Power L1: OK (0 W) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.6::Device 2 (PDU-MET) @1.02, Socket 01: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.7::Device 2 (PDU-MET) @1.02, Socket 02: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.8::Device 2 (PDU-MET) @1.02, Socket 03: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.9::Device 2 (PDU-MET) @1.02, Socket 04: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.10::Device 2 (PDU-MET) @1.02, Socket 05: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.11::Device 2 (PDU-MET) @1.02, Socket 06: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.12::Device 2 (PDU-MET) @1.02, Socket 07: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.13::Device 2 (PDU-MET) @1.02, Socket 08: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.14::Device 2 (PDU-MET) @1.02, Socket 09: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.15::Device 2 (PDU-MET) @1.02, Socket 10: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.16::Device 2 (PDU-MET) @1.02, Socket 11: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.17::Device 2 (PDU-MET) @1.02, Socket 12: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.18::Device 2 (PDU-MET) @1.02, Socket 13: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.19::Device 2 (PDU-MET) @1.02, Socket 14: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.20::Device 2 (PDU-MET) @1.02, Socket 15: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.21::Device 2 (PDU-MET) @1.02, Socket 16: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.22::Device 2 (PDU-MET) @1.02, Socket 17: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.23::Device 2 (PDU-MET) @1.02, Socket 18: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.24::Device 2 (PDU-MET) @1.02, Socket 19: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.2.25::Device 2 (PDU-MET) @1.02, Socket 20: On () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.3.1::Device 3 (CMCIII-GRF2-3) @2.01, Access: Closed (0 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.3.2::Device 3 (CMCIII-GRF2-3) @2.01, Handle1: Locked (0 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.3.3::Device 3 (CMCIII-GRF2-3) @2.01, Keypad: Inactive () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.4.1::Device 4 (CMCIII-GRF2-4) @2.02, Access: Closed (0 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.4.2::Device 4 (CMCIII-GRF2-4) @2.02, Handle2: Locked (0 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.4.3::Device 4 (CMCIII-GRF2-4) @2.02, Keypad: Active () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.5.1::Device 5 (CMCIII-GRF2-2) @2.03, Access: Closed (0 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.5.2::Device 5 (CMCIII-GRF2-2) @2.03, Handle: Locked (1 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.5.3::Device 5 (CMCIII-GRF2-2) @2.03, Keypad: Active () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.6.1::Device 6 (CMCIII-GRF2-1) @2.04, Access: Closed (0 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.6.2::Device 6 (CMCIII-GRF2-1) @2.04, Handle: Locked (1 ) + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.6.3::Device 6 (CMCIII-GRF2-1) @2.04, Keypad: Active () + +.1.3.6.1.4.1.2606.7.4.3.2.1.16.7.1::Device 7 (CMCIII-TMP-2) @2.05, Temperature: OK (24.80 degree C) + +.1.3.6.1.4.1.2606.7.4.4.1.1.0::1 +.1.3.6.1.4.1.2606.7.4.4.1.2.0::0 + +.1.3.6.1.4.1.2606.7.4.4.1.3.0::0 +.1.3.6.1.4.1.2606.7.4.4.1.4.0::0 + +.1.3.6.1.4.1.2606.7.4.4.1.5.0::0 +.1.3.6.1.4.1.2606.7.4.4.1.6.0::0 + +.1.3.6.1.4.1.2606.7.4.5.1.1.0::2 +.1.3.6.1.4.1.2606.7.4.5.1.2.0::28 + +.1.3.6.1.4.1.2606.7.4.5.1.3.0::0 +.1.3.6.1.4.1.2606.7.4.5.2.1.2.1::28 + +.1.3.6.1.4.1.2606.7.4.5.2.1.2.2::28 +.1.3.6.1.4.1.2606.7.4.5.2.1.3.1::661 + +.1.3.6.1.4.1.2606.7.4.5.2.1.3.2::23528 +.1.3.6.1.4.1.2606.7.4.5.2.1.4.1::10178 + +.1.3.6.1.4.1.2606.7.4.5.2.1.4.2::60689 +.1.3.6.1.4.1.2606.7.4.5.2.1.5.1::cmcIIIDevList.csv +.1.3.6.1.4.1.2606.7.4.5.2.1.5.2::cmcIIIVarList.csv +.1.3.6.1.4.1.2606.7.5.1.0::1 +.1.3.6.1.4.1.2606.7.5.2.0::; diff --git a/src/test/resources/discovery/synology.snmprec b/src/test/resources/discovery/synology.snmprec new file mode 100755 index 0000000..b8b9012 --- /dev/null +++ b/src/test/resources/discovery/synology.snmprec @@ -0,0 +1,3445 @@ +.1.3.6.1.2.1.1.1.0::Linux SynNAS 4.4.302+ #69057 SMP Mon Nov 13 14:19:11 CST 2023 x86_64 +.1.3.6.1.2.1.1.2.0::1.3.6.1.4.1.8072.3.2.10 +.1.3.6.1.2.1.1.3.0::579950852 +.1.3.6.1.2.1.1.4.0::Test +.1.3.6.1.2.1.1.5.0::SynologyTest +.1.3.6.1.2.1.1.6.0::Limburg +.1.3.6.1.2.1.1.8.0::89 +.1.3.6.1.2.1.1.9.1.2.1::1.3.6.1.6.3.10.3.1.1 +.1.3.6.1.2.1.1.9.1.2.2::1.3.6.1.6.3.11.3.1.1 +.1.3.6.1.2.1.1.9.1.2.3::1.3.6.1.6.3.15.2.1.1 +.1.3.6.1.2.1.1.9.1.2.4::1.3.6.1.6.3.1 +.1.3.6.1.2.1.1.9.1.2.5::1.3.6.1.6.3.16.2.2.1 +.1.3.6.1.2.1.1.9.1.2.6::.1.3.6.1.2.1.49 +.1.3.6.1.2.1.1.9.1.2.7::.1.3.6.1.2.1.50 +.1.3.6.1.2.1.1.9.1.2.8::.1.3.6.1.2.1.4 +.1.3.6.1.2.1.1.9.1.2.9::1.3.6.1.6.3.13.3.1.3 +.1.3.6.1.2.1.1.9.1.2.10::.1.3.6.1.2.1.92 +.1.3.6.1.2.1.1.9.1.3.1::The SNMP Management Architecture MIB. +.1.3.6.1.2.1.1.9.1.3.2::The MIB for Message Processing and Dispatching. +.1.3.6.1.2.1.1.9.1.3.3::The management information definitions for the SNMP User-based Security Model. +.1.3.6.1.2.1.1.9.1.3.4::The MIB module for SNMPv2 entities +.1.3.6.1.2.1.1.9.1.3.5::View-based Access Control Model for SNMP. +.1.3.6.1.2.1.1.9.1.3.6::The MIB module for managing TCP implementations +.1.3.6.1.2.1.1.9.1.3.7::The MIB module for managing UDP implementations +.1.3.6.1.2.1.1.9.1.3.8::The MIB module for managing IP and ICMP implementations +.1.3.6.1.2.1.1.9.1.3.9::The MIB modules for managing SNMP Notification, plus filtering. +.1.3.6.1.2.1.1.9.1.3.10::The MIB module for logging SNMP Notifications. +.1.3.6.1.2.1.1.9.1.4.1::89 +.1.3.6.1.2.1.1.9.1.4.2::89 +.1.3.6.1.2.1.1.9.1.4.3::89 +.1.3.6.1.2.1.1.9.1.4.4::89 +.1.3.6.1.2.1.1.9.1.4.5::89 +.1.3.6.1.2.1.1.9.1.4.6::89 +.1.3.6.1.2.1.1.9.1.4.7::89 +.1.3.6.1.2.1.1.9.1.4.8::89 +.1.3.6.1.2.1.1.9.1.4.9::89 +.1.3.6.1.2.1.1.9.1.4.10::89 +.1.3.6.1.2.1.2.1.0::5 +.1.3.6.1.2.1.2.2.1.1.1::1 +.1.3.6.1.2.1.2.2.1.1.2::2 +.1.3.6.1.2.1.2.2.1.1.3::3 +.1.3.6.1.2.1.2.2.1.1.4::4 +.1.3.6.1.2.1.2.2.1.1.5::5 +.1.3.6.1.2.1.2.2.1.2.1::lo +.1.3.6.1.2.1.2.2.1.2.2::sit0 +.1.3.6.1.2.1.2.2.1.2.3::eth0 +.1.3.6.1.2.1.2.2.1.2.4::eth1 +.1.3.6.1.2.1.2.2.1.2.5::docker0 +.1.3.6.1.2.1.2.2.1.3.1::softwareLoopback(24) +.1.3.6.1.2.1.2.2.1.3.2::tunnel(131) +.1.3.6.1.2.1.2.2.1.3.3::ethernetCsmacd(6) +.1.3.6.1.2.1.2.2.1.3.4::ethernetCsmacd(6) +.1.3.6.1.2.1.2.2.1.3.5::ethernetCsmacd(6) +.1.3.6.1.2.1.2.2.1.4.1::65536 +.1.3.6.1.2.1.2.2.1.4.2::1480 +.1.3.6.1.2.1.2.2.1.4.3::1500 +.1.3.6.1.2.1.2.2.1.4.4::1500 +.1.3.6.1.2.1.2.2.1.4.5::1500 +.1.3.6.1.2.1.2.2.1.5.1::10000000 +.1.3.6.1.2.1.2.2.1.5.2::0 +.1.3.6.1.2.1.2.2.1.5.3::1000000000 +.1.3.6.1.2.1.2.2.1.5.4::0 +.1.3.6.1.2.1.2.2.1.5.5::0 +.1.3.6.1.2.1.2.2.1.6.1:: +.1.3.6.1.2.1.2.2.1.6.2:: +.1.3.6.1.2.1.2.2.1.6.3::90:9:d0:35:41:bd +.1.3.6.1.2.1.2.2.1.6.4::90:9:d0:35:41:be +.1.3.6.1.2.1.2.2.1.6.5::2:42:2f:68:d7:71 +.1.3.6.1.2.1.2.2.1.7.1::up(1) +.1.3.6.1.2.1.2.2.1.7.2::down(2) +.1.3.6.1.2.1.2.2.1.7.3::up(1) +.1.3.6.1.2.1.2.2.1.7.4::up(1) +.1.3.6.1.2.1.2.2.1.7.5::up(1) +.1.3.6.1.2.1.2.2.1.8.1::up(1) +.1.3.6.1.2.1.2.2.1.8.2::down(2) +.1.3.6.1.2.1.2.2.1.8.3::up(1) +.1.3.6.1.2.1.2.2.1.8.4::down(2) +.1.3.6.1.2.1.2.2.1.8.5::down(2) +.1.3.6.1.2.1.2.2.1.9.1::45 +.1.3.6.1.2.1.2.2.1.9.2::45 +.1.3.6.1.2.1.2.2.1.9.3::45 +.1.3.6.1.2.1.2.2.1.9.4::45 +.1.3.6.1.2.1.2.2.1.9.5::45 +.1.3.6.1.2.1.2.2.1.10.1::11175296 +.1.3.6.1.2.1.2.2.1.10.2::0 +.1.3.6.1.2.1.2.2.1.10.3::2928247435 +.1.3.6.1.2.1.2.2.1.10.4::0 +.1.3.6.1.2.1.2.2.1.10.5::0 +.1.3.6.1.2.1.2.2.1.11.1::82427 +.1.3.6.1.2.1.2.2.1.11.2::0 +.1.3.6.1.2.1.2.2.1.11.3::11691079 +.1.3.6.1.2.1.2.2.1.11.4::0 +.1.3.6.1.2.1.2.2.1.11.5::0 +.1.3.6.1.2.1.2.2.1.12.1::0 +.1.3.6.1.2.1.2.2.1.12.2::0 +.1.3.6.1.2.1.2.2.1.12.3::5607163 +.1.3.6.1.2.1.2.2.1.12.4::0 +.1.3.6.1.2.1.2.2.1.12.5::0 +.1.3.6.1.2.1.2.2.1.13.1::0 +.1.3.6.1.2.1.2.2.1.13.2::0 +.1.3.6.1.2.1.2.2.1.13.3::0 +.1.3.6.1.2.1.2.2.1.13.4::0 +.1.3.6.1.2.1.2.2.1.13.5::0 +.1.3.6.1.2.1.2.2.1.14.1::0 +.1.3.6.1.2.1.2.2.1.14.2::0 +.1.3.6.1.2.1.2.2.1.14.3::0 +.1.3.6.1.2.1.2.2.1.14.4::0 +.1.3.6.1.2.1.2.2.1.14.5::0 +.1.3.6.1.2.1.2.2.1.15.1::0 +.1.3.6.1.2.1.2.2.1.15.2::0 +.1.3.6.1.2.1.2.2.1.15.3::0 +.1.3.6.1.2.1.2.2.1.15.4::0 +.1.3.6.1.2.1.2.2.1.15.5::0 +.1.3.6.1.2.1.2.2.1.16.1::11175296 +.1.3.6.1.2.1.2.2.1.16.2::0 +.1.3.6.1.2.1.2.2.1.16.3::193602356 +.1.3.6.1.2.1.2.2.1.16.4::0 +.1.3.6.1.2.1.2.2.1.16.5::0 +.1.3.6.1.2.1.2.2.1.17.1::82427 +.1.3.6.1.2.1.2.2.1.17.2::0 +.1.3.6.1.2.1.2.2.1.17.3::785673 +.1.3.6.1.2.1.2.2.1.17.4::0 +.1.3.6.1.2.1.2.2.1.17.5::0 +.1.3.6.1.2.1.2.2.1.18.1::0 +.1.3.6.1.2.1.2.2.1.18.2::0 +.1.3.6.1.2.1.2.2.1.18.3::0 +.1.3.6.1.2.1.2.2.1.18.4::0 +.1.3.6.1.2.1.2.2.1.18.5::0 +.1.3.6.1.2.1.2.2.1.19.1::0 +.1.3.6.1.2.1.2.2.1.19.2::0 +.1.3.6.1.2.1.2.2.1.19.3::0 +.1.3.6.1.2.1.2.2.1.19.4::0 +.1.3.6.1.2.1.2.2.1.19.5::0 +.1.3.6.1.2.1.2.2.1.20.1::0 +.1.3.6.1.2.1.2.2.1.20.2::0 +.1.3.6.1.2.1.2.2.1.20.3::0 +.1.3.6.1.2.1.2.2.1.20.4::0 +.1.3.6.1.2.1.2.2.1.20.5::0 +.1.3.6.1.2.1.2.2.1.21.1::0 +.1.3.6.1.2.1.2.2.1.21.2::0 +.1.3.6.1.2.1.2.2.1.21.3::0 +.1.3.6.1.2.1.2.2.1.21.4::0 +.1.3.6.1.2.1.2.2.1.21.5::0 +.1.3.6.1.2.1.2.2.1.22.1::0.0 +.1.3.6.1.2.1.2.2.1.22.2::0.0 +.1.3.6.1.2.1.2.2.1.22.3::0.0 +.1.3.6.1.2.1.2.2.1.22.4::0.0 +.1.3.6.1.2.1.2.2.1.22.5::0.0 +.1.3.6.1.2.1.3.1.1.1.3.1.192.168.178.1::3 +.1.3.6.1.2.1.3.1.1.1.3.1.192.168.178.20::3 +.1.3.6.1.2.1.3.1.1.1.3.1.192.168.178.24::3 +.1.3.6.1.2.1.3.1.1.1.3.1.192.168.178.26::3 +.1.3.6.1.2.1.3.1.1.1.3.1.192.168.178.33::3 +.1.3.6.1.2.1.3.1.1.1.3.1.192.168.178.64::3 +.1.3.6.1.2.1.3.1.1.3.3.1.192.168.178.1::192.168.178.1 +.1.3.6.1.2.1.3.1.1.3.3.1.192.168.178.20::192.168.178.20 +.1.3.6.1.2.1.3.1.1.3.3.1.192.168.178.24::192.168.178.24 +.1.3.6.1.2.1.3.1.1.3.3.1.192.168.178.26::192.168.178.26 +.1.3.6.1.2.1.3.1.1.3.3.1.192.168.178.33::192.168.178.33 +.1.3.6.1.2.1.3.1.1.3.3.1.192.168.178.64::192.168.178.64 +.1.3.6.1.2.1.4.1.0::forwarding(1) +.1.3.6.1.2.1.4.2.0::64 +.1.3.6.1.2.1.4.3.0::10198482 +.1.3.6.1.2.1.4.4.0::0 +.1.3.6.1.2.1.4.5.0::1 +.1.3.6.1.2.1.4.6.0::0 +.1.3.6.1.2.1.4.7.0::0 +.1.3.6.1.2.1.4.8.0::0 +.1.3.6.1.2.1.4.9.0::10198448 +.1.3.6.1.2.1.4.10.0::810639 +.1.3.6.1.2.1.4.11.0::0 +.1.3.6.1.2.1.4.12.0::0 +.1.3.6.1.2.1.4.13.0::0 +.1.3.6.1.2.1.4.14.0::66 +.1.3.6.1.2.1.4.15.0::33 +.1.3.6.1.2.1.4.16.0::0 +.1.3.6.1.2.1.4.17.0::2206 +.1.3.6.1.2.1.4.18.0::0 +.1.3.6.1.2.1.4.19.0::5323 +.1.3.6.1.2.1.4.20.1.1.127.0.0.1::127.0.0.1 +.1.3.6.1.2.1.4.20.1.1.169.254.202.23::169.254.202.23 +.1.3.6.1.2.1.4.20.1.1.172.17.0.1::172.17.0.1 +.1.3.6.1.2.1.4.20.1.1.192.168.178.43::192.168.178.43 +.1.3.6.1.2.1.4.20.1.2.127.0.0.1::1 +.1.3.6.1.2.1.4.20.1.2.169.254.202.23::4 +.1.3.6.1.2.1.4.20.1.2.172.17.0.1::5 +.1.3.6.1.2.1.4.20.1.2.192.168.178.43::3 +.1.3.6.1.2.1.4.20.1.3.127.0.0.1::255.0.0.0 +.1.3.6.1.2.1.4.20.1.3.169.254.202.23::255.255.0.0 +.1.3.6.1.2.1.4.20.1.3.172.17.0.1::255.255.0.0 +.1.3.6.1.2.1.4.20.1.3.192.168.178.43::255.255.255.0 +.1.3.6.1.2.1.4.20.1.4.127.0.0.1::0 +.1.3.6.1.2.1.4.20.1.4.169.254.202.23::1 +.1.3.6.1.2.1.4.20.1.4.172.17.0.1::1 +.1.3.6.1.2.1.4.20.1.4.192.168.178.43::1 +.1.3.6.1.2.1.4.21.1.1.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.4.21.1.1.169.254.0.0::169.254.0.0 +.1.3.6.1.2.1.4.21.1.1.172.17.0.0::172.17.0.0 +.1.3.6.1.2.1.4.21.1.1.192.168.178.0::192.168.178.0 +.1.3.6.1.2.1.4.21.1.2.0.0.0.0::3 +.1.3.6.1.2.1.4.21.1.2.169.254.0.0::4 +.1.3.6.1.2.1.4.21.1.2.172.17.0.0::5 +.1.3.6.1.2.1.4.21.1.2.192.168.178.0::3 +.1.3.6.1.2.1.4.21.1.3.0.0.0.0::1 +.1.3.6.1.2.1.4.21.1.3.169.254.0.0::0 +.1.3.6.1.2.1.4.21.1.3.172.17.0.0::0 +.1.3.6.1.2.1.4.21.1.3.192.168.178.0::0 +.1.3.6.1.2.1.4.21.1.7.0.0.0.0::192.168.178.1 +.1.3.6.1.2.1.4.21.1.7.169.254.0.0::0.0.0.0 +.1.3.6.1.2.1.4.21.1.7.172.17.0.0::0.0.0.0 +.1.3.6.1.2.1.4.21.1.7.192.168.178.0::0.0.0.0 +.1.3.6.1.2.1.4.21.1.8.0.0.0.0::4 +.1.3.6.1.2.1.4.21.1.8.169.254.0.0::3 +.1.3.6.1.2.1.4.21.1.8.172.17.0.0::3 +.1.3.6.1.2.1.4.21.1.8.192.168.178.0::3 +.1.3.6.1.2.1.4.21.1.9.0.0.0.0::2 +.1.3.6.1.2.1.4.21.1.9.169.254.0.0::2 +.1.3.6.1.2.1.4.21.1.9.172.17.0.0::2 +.1.3.6.1.2.1.4.21.1.9.192.168.178.0::2 +.1.3.6.1.2.1.4.21.1.11.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.4.21.1.11.169.254.0.0::255.255.0.0 +.1.3.6.1.2.1.4.21.1.11.172.17.0.0::255.255.0.0 +.1.3.6.1.2.1.4.21.1.11.192.168.178.0::255.255.255.0 +.1.3.6.1.2.1.4.21.1.13.0.0.0.0::0.0 +.1.3.6.1.2.1.4.21.1.13.169.254.0.0::0.0 +.1.3.6.1.2.1.4.21.1.13.172.17.0.0::0.0 +.1.3.6.1.2.1.4.21.1.13.192.168.178.0::0.0 +.1.3.6.1.2.1.4.22.1.1.3.192.168.178.1::3 +.1.3.6.1.2.1.4.22.1.1.3.192.168.178.20::3 +.1.3.6.1.2.1.4.22.1.1.3.192.168.178.24::3 +.1.3.6.1.2.1.4.22.1.1.3.192.168.178.26::3 +.1.3.6.1.2.1.4.22.1.1.3.192.168.178.33::3 +.1.3.6.1.2.1.4.22.1.1.3.192.168.178.64::3 +.1.3.6.1.2.1.4.22.1.2.3.192.168.178.1::b0:f2:8:dc:f4:d +.1.3.6.1.2.1.4.22.1.2.3.192.168.178.20::a4:83:e7:b0:be:82 +.1.3.6.1.2.1.4.22.1.2.3.192.168.178.24::ec:5c:68:c1:38:35 +.1.3.6.1.2.1.4.22.1.2.3.192.168.178.26::84:1b:77:17:3c:e3 +.1.3.6.1.2.1.4.22.1.2.3.192.168.178.33::1c:57:dc:67:f9:2 +.1.3.6.1.2.1.4.22.1.2.3.192.168.178.64::fc:34:97:69:ae:bd +.1.3.6.1.2.1.4.22.1.3.3.192.168.178.1::192.168.178.1 +.1.3.6.1.2.1.4.22.1.3.3.192.168.178.20::192.168.178.20 +.1.3.6.1.2.1.4.22.1.3.3.192.168.178.24::192.168.178.24 +.1.3.6.1.2.1.4.22.1.3.3.192.168.178.26::192.168.178.26 +.1.3.6.1.2.1.4.22.1.3.3.192.168.178.33::192.168.178.33 +.1.3.6.1.2.1.4.22.1.3.3.192.168.178.64::192.168.178.64 +.1.3.6.1.2.1.4.22.1.4.3.192.168.178.1::3 +.1.3.6.1.2.1.4.22.1.4.3.192.168.178.20::3 +.1.3.6.1.2.1.4.22.1.4.3.192.168.178.24::3 +.1.3.6.1.2.1.4.22.1.4.3.192.168.178.26::3 +.1.3.6.1.2.1.4.22.1.4.3.192.168.178.33::3 +.1.3.6.1.2.1.4.22.1.4.3.192.168.178.64::3 +.1.3.6.1.2.1.4.23.0::0 +.1.3.6.1.2.1.4.24.4.1.1.0.0.0.0.0.0.0.0.0.192.168.178.1::0.0.0.0 +.1.3.6.1.2.1.4.24.4.1.1.169.254.0.0.255.255.0.0.0.0.0.0.0::169.254.0.0 +.1.3.6.1.2.1.4.24.4.1.1.172.17.0.0.255.255.0.0.0.0.0.0.0::172.17.0.0 +.1.3.6.1.2.1.4.24.4.1.1.192.168.178.0.255.255.255.0.0.0.0.0.0::192.168.178.0 +.1.3.6.1.2.1.4.24.4.1.2.0.0.0.0.0.0.0.0.0.192.168.178.1::0.0.0.0 +.1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.255.255.0.0.0.0.0.0.0::255.255.0.0 +.1.3.6.1.2.1.4.24.4.1.2.172.17.0.0.255.255.0.0.0.0.0.0.0::255.255.0.0 +.1.3.6.1.2.1.4.24.4.1.2.192.168.178.0.255.255.255.0.0.0.0.0.0::255.255.255.0 +.1.3.6.1.2.1.4.24.4.1.3.0.0.0.0.0.0.0.0.0.192.168.178.1::0 +.1.3.6.1.2.1.4.24.4.1.3.169.254.0.0.255.255.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.3.172.17.0.0.255.255.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.3.192.168.178.0.255.255.255.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.4.0.0.0.0.0.0.0.0.0.192.168.178.1::192.168.178.1 +.1.3.6.1.2.1.4.24.4.1.4.169.254.0.0.255.255.0.0.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.4.24.4.1.4.172.17.0.0.255.255.0.0.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.4.24.4.1.4.192.168.178.0.255.255.255.0.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.4.24.4.1.5.0.0.0.0.0.0.0.0.0.192.168.178.1::3 +.1.3.6.1.2.1.4.24.4.1.5.169.254.0.0.255.255.0.0.0.0.0.0.0::4 +.1.3.6.1.2.1.4.24.4.1.5.172.17.0.0.255.255.0.0.0.0.0.0.0::5 +.1.3.6.1.2.1.4.24.4.1.5.192.168.178.0.255.255.255.0.0.0.0.0.0::3 +.1.3.6.1.2.1.4.24.4.1.6.0.0.0.0.0.0.0.0.0.192.168.178.1::4 +.1.3.6.1.2.1.4.24.4.1.6.169.254.0.0.255.255.0.0.0.0.0.0.0::3 +.1.3.6.1.2.1.4.24.4.1.6.172.17.0.0.255.255.0.0.0.0.0.0.0::3 +.1.3.6.1.2.1.4.24.4.1.6.192.168.178.0.255.255.255.0.0.0.0.0.0::3 +.1.3.6.1.2.1.4.24.4.1.7.0.0.0.0.0.0.0.0.0.192.168.178.1::2 +.1.3.6.1.2.1.4.24.4.1.7.169.254.0.0.255.255.0.0.0.0.0.0.0::2 +.1.3.6.1.2.1.4.24.4.1.7.172.17.0.0.255.255.0.0.0.0.0.0.0::2 +.1.3.6.1.2.1.4.24.4.1.7.192.168.178.0.255.255.255.0.0.0.0.0.0::2 +.1.3.6.1.2.1.4.24.4.1.9.0.0.0.0.0.0.0.0.0.192.168.178.1::0.0 +.1.3.6.1.2.1.4.24.4.1.9.169.254.0.0.255.255.0.0.0.0.0.0.0::0.0 +.1.3.6.1.2.1.4.24.4.1.9.172.17.0.0.255.255.0.0.0.0.0.0.0::0.0 +.1.3.6.1.2.1.4.24.4.1.9.192.168.178.0.255.255.255.0.0.0.0.0.0::0.0 +.1.3.6.1.2.1.4.24.4.1.10.0.0.0.0.0.0.0.0.0.192.168.178.1::0 +.1.3.6.1.2.1.4.24.4.1.10.169.254.0.0.255.255.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.10.172.17.0.0.255.255.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.10.192.168.178.0.255.255.255.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.11.0.0.0.0.0.0.0.0.0.192.168.178.1::0 +.1.3.6.1.2.1.4.24.4.1.11.169.254.0.0.255.255.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.11.172.17.0.0.255.255.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.11.192.168.178.0.255.255.255.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.4.1.12.0.0.0.0.0.0.0.0.0.192.168.178.1::-1 +.1.3.6.1.2.1.4.24.4.1.12.169.254.0.0.255.255.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.12.172.17.0.0.255.255.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.12.192.168.178.0.255.255.255.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.13.0.0.0.0.0.0.0.0.0.192.168.178.1::-1 +.1.3.6.1.2.1.4.24.4.1.13.169.254.0.0.255.255.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.13.172.17.0.0.255.255.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.13.192.168.178.0.255.255.255.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.14.0.0.0.0.0.0.0.0.0.192.168.178.1::-1 +.1.3.6.1.2.1.4.24.4.1.14.169.254.0.0.255.255.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.14.172.17.0.0.255.255.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.14.192.168.178.0.255.255.255.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.15.0.0.0.0.0.0.0.0.0.192.168.178.1::-1 +.1.3.6.1.2.1.4.24.4.1.15.169.254.0.0.255.255.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.15.172.17.0.0.255.255.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.15.192.168.178.0.255.255.255.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.4.1.16.0.0.0.0.0.0.0.0.0.192.168.178.1::1 +.1.3.6.1.2.1.4.24.4.1.16.169.254.0.0.255.255.0.0.0.0.0.0.0::1 +.1.3.6.1.2.1.4.24.4.1.16.172.17.0.0.255.255.0.0.0.0.0.0.0::1 +.1.3.6.1.2.1.4.24.4.1.16.192.168.178.0.255.255.255.0.0.0.0.0.0::1 +.1.3.6.1.2.1.4.24.6.0::5 +.1.3.6.1.2.1.4.24.7.1.7.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::3 +.1.3.6.1.2.1.4.24.7.1.7.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::4 +.1.3.6.1.2.1.4.24.7.1.7.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::5 +.1.3.6.1.2.1.4.24.7.1.7.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::3 +.1.3.6.1.2.1.4.24.7.1.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::1 +.1.3.6.1.2.1.4.24.7.1.8.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::4 +.1.3.6.1.2.1.4.24.7.1.8.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::3 +.1.3.6.1.2.1.4.24.7.1.8.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::3 +.1.3.6.1.2.1.4.24.7.1.8.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::3 +.1.3.6.1.2.1.4.24.7.1.8.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::3 +.1.3.6.1.2.1.4.24.7.1.9.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::2 +.1.3.6.1.2.1.4.24.7.1.9.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::2 +.1.3.6.1.2.1.4.24.7.1.9.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::2 +.1.3.6.1.2.1.4.24.7.1.9.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::2 +.1.3.6.1.2.1.4.24.7.1.9.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::2 +.1.3.6.1.2.1.4.24.7.1.10.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::0 +.1.3.6.1.2.1.4.24.7.1.10.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.10.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.10.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.10.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.11.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::0 +.1.3.6.1.2.1.4.24.7.1.11.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.11.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.11.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.11.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.12.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::0 +.1.3.6.1.2.1.4.24.7.1.12.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.12.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.12.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.12.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::0 +.1.3.6.1.2.1.4.24.7.1.13.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::-1 +.1.3.6.1.2.1.4.24.7.1.13.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.13.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.13.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.13.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.14.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::-1 +.1.3.6.1.2.1.4.24.7.1.14.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.14.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.14.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.14.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.15.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::-1 +.1.3.6.1.2.1.4.24.7.1.15.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.15.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.15.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.15.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.16.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::-1 +.1.3.6.1.2.1.4.24.7.1.16.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.16.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.16.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.16.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::-1 +.1.3.6.1.2.1.4.24.7.1.17.1.4.0.0.0.0.0.2.0.0.1.4.192.168.178.1::1 +.1.3.6.1.2.1.4.24.7.1.17.1.4.169.254.0.0.16.3.0.0.4.1.4.0.0.0.0::1 +.1.3.6.1.2.1.4.24.7.1.17.1.4.172.17.0.0.16.3.0.0.5.1.4.0.0.0.0::1 +.1.3.6.1.2.1.4.24.7.1.17.1.4.192.168.178.0.24.3.0.0.3.1.4.0.0.0.0::1 +.1.3.6.1.2.1.4.24.7.1.17.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128.3.0.0.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0::1 +.1.3.6.1.2.1.4.25.0::2 +.1.3.6.1.2.1.4.26.0::64 +.1.3.6.1.2.1.4.31.1.1.3.1::10198212 +.1.3.6.1.2.1.4.31.1.1.3.2::9335 +.1.3.6.1.2.1.4.31.1.1.4.1::10198212 +.1.3.6.1.2.1.4.31.1.1.4.2::9335 +.1.3.6.1.2.1.4.31.1.1.5.1::2410997096 +.1.3.6.1.2.1.4.31.1.1.5.2::670845 +.1.3.6.1.2.1.4.31.1.1.6.1::2410997096 +.1.3.6.1.2.1.4.31.1.1.6.2::670845 +.1.3.6.1.2.1.4.31.1.1.7.1::0 +.1.3.6.1.2.1.4.31.1.1.7.2::0 +.1.3.6.1.2.1.4.31.1.1.8.1::0 +.1.3.6.1.2.1.4.31.1.1.8.2::0 +.1.3.6.1.2.1.4.31.1.1.9.1::1 +.1.3.6.1.2.1.4.31.1.1.9.2::0 +.1.3.6.1.2.1.4.31.1.1.10.1::0 +.1.3.6.1.2.1.4.31.1.1.10.2::0 +.1.3.6.1.2.1.4.31.1.1.11.1::0 +.1.3.6.1.2.1.4.31.1.1.11.2::0 +.1.3.6.1.2.1.4.31.1.1.12.1::0 +.1.3.6.1.2.1.4.31.1.1.12.2::0 +.1.3.6.1.2.1.4.31.1.1.13.1::0 +.1.3.6.1.2.1.4.31.1.1.13.2::0 +.1.3.6.1.2.1.4.31.1.1.14.1::66 +.1.3.6.1.2.1.4.31.1.1.14.2::0 +.1.3.6.1.2.1.4.31.1.1.15.1::33 +.1.3.6.1.2.1.4.31.1.1.15.2::0 +.1.3.6.1.2.1.4.31.1.1.16.1::0 +.1.3.6.1.2.1.4.31.1.1.16.2::0 +.1.3.6.1.2.1.4.31.1.1.17.1::0 +.1.3.6.1.2.1.4.31.1.1.17.2::9322 +.1.3.6.1.2.1.4.31.1.1.18.1::10198178 +.1.3.6.1.2.1.4.31.1.1.18.2::13 +.1.3.6.1.2.1.4.31.1.1.19.1::10198178 +.1.3.6.1.2.1.4.31.1.1.19.2::13 +.1.3.6.1.2.1.4.31.1.1.20.1::810469 +.1.3.6.1.2.1.4.31.1.1.20.2::22 +.1.3.6.1.2.1.4.31.1.1.21.1::810469 +.1.3.6.1.2.1.4.31.1.1.21.2::22 +.1.3.6.1.2.1.4.31.1.1.22.1::0 +.1.3.6.1.2.1.4.31.1.1.22.2::3598 +.1.3.6.1.2.1.4.31.1.1.23.1::0 +.1.3.6.1.2.1.4.31.1.1.23.2::0 +.1.3.6.1.2.1.4.31.1.1.24.1::0 +.1.3.6.1.2.1.4.31.1.1.24.2::0 +.1.3.6.1.2.1.4.31.1.1.25.1::0 +.1.3.6.1.2.1.4.31.1.1.25.2::9 +.1.3.6.1.2.1.4.31.1.1.26.1::2206 +.1.3.6.1.2.1.4.31.1.1.26.2::0 +.1.3.6.1.2.1.4.31.1.1.27.1::2206 +.1.3.6.1.2.1.4.31.1.1.27.2::0 +.1.3.6.1.2.1.4.31.1.1.28.1::0 +.1.3.6.1.2.1.4.31.1.1.28.2::0 +.1.3.6.1.2.1.4.31.1.1.29.1::5323 +.1.3.6.1.2.1.4.31.1.1.29.2::0 +.1.3.6.1.2.1.4.31.1.1.30.1::813586 +.1.3.6.1.2.1.4.31.1.1.30.2::4294963711 +.1.3.6.1.2.1.4.31.1.1.31.1::813586 +.1.3.6.1.2.1.4.31.1.1.31.2::184467 +.1.3.6.1.2.1.4.31.1.1.32.1::197108893 +.1.3.6.1.2.1.4.31.1.1.32.2::1489 +.1.3.6.1.2.1.4.31.1.1.33.1::197108893 +.1.3.6.1.2.1.4.31.1.1.33.2::1489 +.1.3.6.1.2.1.4.31.1.1.34.1::5889677 +.1.3.6.1.2.1.4.31.1.1.34.2::0 +.1.3.6.1.2.1.4.31.1.1.35.1::5889677 +.1.3.6.1.2.1.4.31.1.1.35.2::0 +.1.3.6.1.2.1.4.31.1.1.36.1::1507995334 +.1.3.6.1.2.1.4.31.1.1.36.2::0 +.1.3.6.1.2.1.4.31.1.1.37.1::1507995334 +.1.3.6.1.2.1.4.31.1.1.37.2::0 +.1.3.6.1.2.1.4.31.1.1.38.1::346547 +.1.3.6.1.2.1.4.31.1.1.38.2::0 +.1.3.6.1.2.1.4.31.1.1.39.1::346547 +.1.3.6.1.2.1.4.31.1.1.39.2::0 +.1.3.6.1.2.1.4.31.1.1.40.1::52414730 +.1.3.6.1.2.1.4.31.1.1.40.2::0 +.1.3.6.1.2.1.4.31.1.1.41.1::52414730 +.1.3.6.1.2.1.4.31.1.1.41.2::0 +.1.3.6.1.2.1.4.31.1.1.42.1::3924465 +.1.3.6.1.2.1.4.31.1.1.43.1::3924465 +.1.3.6.1.2.1.4.31.1.1.44.1::121856 +.1.3.6.1.2.1.4.31.1.1.45.1::121856 +.1.3.6.1.2.1.4.31.1.1.46.1::45 +.1.3.6.1.2.1.4.31.1.1.46.2::45 +.1.3.6.1.2.1.4.31.1.1.47.1::60000 +.1.3.6.1.2.1.4.31.1.1.47.2::60000 +.1.3.6.1.2.1.4.31.2.0::45 +.1.3.6.1.2.1.4.31.3.1.3.2.1::13 +.1.3.6.1.2.1.4.31.3.1.3.2.2::0 +.1.3.6.1.2.1.4.31.3.1.3.2.3::9322 +.1.3.6.1.2.1.4.31.3.1.3.2.4::0 +.1.3.6.1.2.1.4.31.3.1.3.2.5::0 +.1.3.6.1.2.1.4.31.3.1.4.2.1::13 +.1.3.6.1.2.1.4.31.3.1.4.2.2::0 +.1.3.6.1.2.1.4.31.3.1.4.2.3::9322 +.1.3.6.1.2.1.4.31.3.1.4.2.4::0 +.1.3.6.1.2.1.4.31.3.1.4.2.5::0 +.1.3.6.1.2.1.4.31.3.1.5.2.1::805 +.1.3.6.1.2.1.4.31.3.1.5.2.2::0 +.1.3.6.1.2.1.4.31.3.1.5.2.3::670040 +.1.3.6.1.2.1.4.31.3.1.5.2.4::0 +.1.3.6.1.2.1.4.31.3.1.5.2.5::0 +.1.3.6.1.2.1.4.31.3.1.6.2.1::805 +.1.3.6.1.2.1.4.31.3.1.6.2.2::0 +.1.3.6.1.2.1.4.31.3.1.6.2.3::670040 +.1.3.6.1.2.1.4.31.3.1.6.2.4::0 +.1.3.6.1.2.1.4.31.3.1.6.2.5::0 +.1.3.6.1.2.1.4.31.3.1.7.2.1::0 +.1.3.6.1.2.1.4.31.3.1.7.2.2::0 +.1.3.6.1.2.1.4.31.3.1.7.2.3::0 +.1.3.6.1.2.1.4.31.3.1.7.2.4::0 +.1.3.6.1.2.1.4.31.3.1.7.2.5::0 +.1.3.6.1.2.1.4.31.3.1.8.2.1::0 +.1.3.6.1.2.1.4.31.3.1.8.2.2::0 +.1.3.6.1.2.1.4.31.3.1.8.2.3::0 +.1.3.6.1.2.1.4.31.3.1.8.2.4::0 +.1.3.6.1.2.1.4.31.3.1.8.2.5::0 +.1.3.6.1.2.1.4.31.3.1.9.2.1::0 +.1.3.6.1.2.1.4.31.3.1.9.2.2::0 +.1.3.6.1.2.1.4.31.3.1.9.2.3::0 +.1.3.6.1.2.1.4.31.3.1.9.2.4::0 +.1.3.6.1.2.1.4.31.3.1.9.2.5::0 +.1.3.6.1.2.1.4.31.3.1.10.2.1::0 +.1.3.6.1.2.1.4.31.3.1.10.2.2::0 +.1.3.6.1.2.1.4.31.3.1.10.2.3::0 +.1.3.6.1.2.1.4.31.3.1.10.2.4::0 +.1.3.6.1.2.1.4.31.3.1.10.2.5::0 +.1.3.6.1.2.1.4.31.3.1.11.2.1::0 +.1.3.6.1.2.1.4.31.3.1.11.2.2::0 +.1.3.6.1.2.1.4.31.3.1.11.2.3::0 +.1.3.6.1.2.1.4.31.3.1.11.2.4::0 +.1.3.6.1.2.1.4.31.3.1.11.2.5::0 +.1.3.6.1.2.1.4.31.3.1.12.2.1::0 +.1.3.6.1.2.1.4.31.3.1.12.2.2::0 +.1.3.6.1.2.1.4.31.3.1.12.2.3::0 +.1.3.6.1.2.1.4.31.3.1.12.2.4::0 +.1.3.6.1.2.1.4.31.3.1.12.2.5::0 +.1.3.6.1.2.1.4.31.3.1.13.2.1::0 +.1.3.6.1.2.1.4.31.3.1.13.2.2::0 +.1.3.6.1.2.1.4.31.3.1.13.2.3::0 +.1.3.6.1.2.1.4.31.3.1.13.2.4::0 +.1.3.6.1.2.1.4.31.3.1.13.2.5::0 +.1.3.6.1.2.1.4.31.3.1.14.2.1::0 +.1.3.6.1.2.1.4.31.3.1.14.2.2::0 +.1.3.6.1.2.1.4.31.3.1.14.2.3::0 +.1.3.6.1.2.1.4.31.3.1.14.2.4::0 +.1.3.6.1.2.1.4.31.3.1.14.2.5::0 +.1.3.6.1.2.1.4.31.3.1.15.2.1::0 +.1.3.6.1.2.1.4.31.3.1.15.2.2::0 +.1.3.6.1.2.1.4.31.3.1.15.2.3::0 +.1.3.6.1.2.1.4.31.3.1.15.2.4::0 +.1.3.6.1.2.1.4.31.3.1.15.2.5::0 +.1.3.6.1.2.1.4.31.3.1.16.2.1::0 +.1.3.6.1.2.1.4.31.3.1.16.2.2::0 +.1.3.6.1.2.1.4.31.3.1.16.2.3::0 +.1.3.6.1.2.1.4.31.3.1.16.2.4::0 +.1.3.6.1.2.1.4.31.3.1.16.2.5::0 +.1.3.6.1.2.1.4.31.3.1.17.2.1::0 +.1.3.6.1.2.1.4.31.3.1.17.2.2::0 +.1.3.6.1.2.1.4.31.3.1.17.2.3::9322 +.1.3.6.1.2.1.4.31.3.1.17.2.4::0 +.1.3.6.1.2.1.4.31.3.1.17.2.5::0 +.1.3.6.1.2.1.4.31.3.1.18.2.1::13 +.1.3.6.1.2.1.4.31.3.1.18.2.2::0 +.1.3.6.1.2.1.4.31.3.1.18.2.3::0 +.1.3.6.1.2.1.4.31.3.1.18.2.4::0 +.1.3.6.1.2.1.4.31.3.1.18.2.5::0 +.1.3.6.1.2.1.4.31.3.1.19.2.1::13 +.1.3.6.1.2.1.4.31.3.1.19.2.2::0 +.1.3.6.1.2.1.4.31.3.1.19.2.3::0 +.1.3.6.1.2.1.4.31.3.1.19.2.4::0 +.1.3.6.1.2.1.4.31.3.1.19.2.5::0 +.1.3.6.1.2.1.4.31.3.1.20.2.1::13 +.1.3.6.1.2.1.4.31.3.1.20.2.2::0 +.1.3.6.1.2.1.4.31.3.1.20.2.3::9 +.1.3.6.1.2.1.4.31.3.1.20.2.4::0 +.1.3.6.1.2.1.4.31.3.1.20.2.5::0 +.1.3.6.1.2.1.4.31.3.1.21.2.1::13 +.1.3.6.1.2.1.4.31.3.1.21.2.2::0 +.1.3.6.1.2.1.4.31.3.1.21.2.3::9 +.1.3.6.1.2.1.4.31.3.1.21.2.4::0 +.1.3.6.1.2.1.4.31.3.1.21.2.5::0 +.1.3.6.1.2.1.4.31.3.1.23.2.1::0 +.1.3.6.1.2.1.4.31.3.1.23.2.2::0 +.1.3.6.1.2.1.4.31.3.1.23.2.3::0 +.1.3.6.1.2.1.4.31.3.1.23.2.4::0 +.1.3.6.1.2.1.4.31.3.1.23.2.5::0 +.1.3.6.1.2.1.4.31.3.1.24.2.1::0 +.1.3.6.1.2.1.4.31.3.1.24.2.2::0 +.1.3.6.1.2.1.4.31.3.1.24.2.3::0 +.1.3.6.1.2.1.4.31.3.1.24.2.4::0 +.1.3.6.1.2.1.4.31.3.1.24.2.5::0 +.1.3.6.1.2.1.4.31.3.1.25.2.1::0 +.1.3.6.1.2.1.4.31.3.1.25.2.2::0 +.1.3.6.1.2.1.4.31.3.1.25.2.3::9 +.1.3.6.1.2.1.4.31.3.1.25.2.4::0 +.1.3.6.1.2.1.4.31.3.1.25.2.5::0 +.1.3.6.1.2.1.4.31.3.1.26.2.1::0 +.1.3.6.1.2.1.4.31.3.1.26.2.2::0 +.1.3.6.1.2.1.4.31.3.1.26.2.3::0 +.1.3.6.1.2.1.4.31.3.1.26.2.4::0 +.1.3.6.1.2.1.4.31.3.1.26.2.5::0 +.1.3.6.1.2.1.4.31.3.1.27.2.1::0 +.1.3.6.1.2.1.4.31.3.1.27.2.2::0 +.1.3.6.1.2.1.4.31.3.1.27.2.3::0 +.1.3.6.1.2.1.4.31.3.1.27.2.4::0 +.1.3.6.1.2.1.4.31.3.1.27.2.5::0 +.1.3.6.1.2.1.4.31.3.1.28.2.1::0 +.1.3.6.1.2.1.4.31.3.1.28.2.2::0 +.1.3.6.1.2.1.4.31.3.1.28.2.3::0 +.1.3.6.1.2.1.4.31.3.1.28.2.4::0 +.1.3.6.1.2.1.4.31.3.1.28.2.5::0 +.1.3.6.1.2.1.4.31.3.1.29.2.1::0 +.1.3.6.1.2.1.4.31.3.1.29.2.2::0 +.1.3.6.1.2.1.4.31.3.1.29.2.3::0 +.1.3.6.1.2.1.4.31.3.1.29.2.4::0 +.1.3.6.1.2.1.4.31.3.1.29.2.5::0 +.1.3.6.1.2.1.4.31.3.1.30.2.1::13 +.1.3.6.1.2.1.4.31.3.1.30.2.2::0 +.1.3.6.1.2.1.4.31.3.1.30.2.3::0 +.1.3.6.1.2.1.4.31.3.1.30.2.4::0 +.1.3.6.1.2.1.4.31.3.1.30.2.5::0 +.1.3.6.1.2.1.4.31.3.1.31.2.1::13 +.1.3.6.1.2.1.4.31.3.1.31.2.2::0 +.1.3.6.1.2.1.4.31.3.1.31.2.3::0 +.1.3.6.1.2.1.4.31.3.1.31.2.4::0 +.1.3.6.1.2.1.4.31.3.1.31.2.5::0 +.1.3.6.1.2.1.4.31.3.1.32.2.1::805 +.1.3.6.1.2.1.4.31.3.1.32.2.2::0 +.1.3.6.1.2.1.4.31.3.1.32.2.3::684 +.1.3.6.1.2.1.4.31.3.1.32.2.4::0 +.1.3.6.1.2.1.4.31.3.1.32.2.5::0 +.1.3.6.1.2.1.4.31.3.1.33.2.1::805 +.1.3.6.1.2.1.4.31.3.1.33.2.2::0 +.1.3.6.1.2.1.4.31.3.1.33.2.3::684 +.1.3.6.1.2.1.4.31.3.1.33.2.4::0 +.1.3.6.1.2.1.4.31.3.1.33.2.5::0 +.1.3.6.1.2.1.4.31.3.1.34.2.1::0 +.1.3.6.1.2.1.4.31.3.1.34.2.2::0 +.1.3.6.1.2.1.4.31.3.1.34.2.3::0 +.1.3.6.1.2.1.4.31.3.1.34.2.4::0 +.1.3.6.1.2.1.4.31.3.1.34.2.5::0 +.1.3.6.1.2.1.4.31.3.1.35.2.1::0 +.1.3.6.1.2.1.4.31.3.1.35.2.2::0 +.1.3.6.1.2.1.4.31.3.1.35.2.3::0 +.1.3.6.1.2.1.4.31.3.1.35.2.4::0 +.1.3.6.1.2.1.4.31.3.1.35.2.5::0 +.1.3.6.1.2.1.4.31.3.1.36.2.1::0 +.1.3.6.1.2.1.4.31.3.1.36.2.2::0 +.1.3.6.1.2.1.4.31.3.1.36.2.3::0 +.1.3.6.1.2.1.4.31.3.1.36.2.4::0 +.1.3.6.1.2.1.4.31.3.1.36.2.5::0 +.1.3.6.1.2.1.4.31.3.1.37.2.1::0 +.1.3.6.1.2.1.4.31.3.1.37.2.2::0 +.1.3.6.1.2.1.4.31.3.1.37.2.3::0 +.1.3.6.1.2.1.4.31.3.1.37.2.4::0 +.1.3.6.1.2.1.4.31.3.1.37.2.5::0 +.1.3.6.1.2.1.4.31.3.1.38.2.1::0 +.1.3.6.1.2.1.4.31.3.1.38.2.2::0 +.1.3.6.1.2.1.4.31.3.1.38.2.3::0 +.1.3.6.1.2.1.4.31.3.1.38.2.4::0 +.1.3.6.1.2.1.4.31.3.1.38.2.5::0 +.1.3.6.1.2.1.4.31.3.1.39.2.1::0 +.1.3.6.1.2.1.4.31.3.1.39.2.2::0 +.1.3.6.1.2.1.4.31.3.1.39.2.3::0 +.1.3.6.1.2.1.4.31.3.1.39.2.4::0 +.1.3.6.1.2.1.4.31.3.1.39.2.5::0 +.1.3.6.1.2.1.4.31.3.1.40.2.1::0 +.1.3.6.1.2.1.4.31.3.1.40.2.2::0 +.1.3.6.1.2.1.4.31.3.1.40.2.3::0 +.1.3.6.1.2.1.4.31.3.1.40.2.4::0 +.1.3.6.1.2.1.4.31.3.1.40.2.5::0 +.1.3.6.1.2.1.4.31.3.1.41.2.1::0 +.1.3.6.1.2.1.4.31.3.1.41.2.2::0 +.1.3.6.1.2.1.4.31.3.1.41.2.3::0 +.1.3.6.1.2.1.4.31.3.1.41.2.4::0 +.1.3.6.1.2.1.4.31.3.1.41.2.5::0 +.1.3.6.1.2.1.4.31.3.1.46.2.1::45 +.1.3.6.1.2.1.4.31.3.1.46.2.2::45 +.1.3.6.1.2.1.4.31.3.1.46.2.3::45 +.1.3.6.1.2.1.4.31.3.1.46.2.4::45 +.1.3.6.1.2.1.4.31.3.1.46.2.5::45 +.1.3.6.1.2.1.4.31.3.1.47.2.1::60000 +.1.3.6.1.2.1.4.31.3.1.47.2.2::60000 +.1.3.6.1.2.1.4.31.3.1.47.2.3::60000 +.1.3.6.1.2.1.4.31.3.1.47.2.4::60000 +.1.3.6.1.2.1.4.31.3.1.47.2.5::60000 +.1.3.6.1.2.1.4.32.1.5.1.1.4.127.0.0.0.8::2 +.1.3.6.1.2.1.4.32.1.5.1.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128::2 +.1.3.6.1.2.1.4.32.1.5.3.1.4.192.168.178.0.24::2 +.1.3.6.1.2.1.4.32.1.5.4.1.4.169.254.0.0.16::3 +.1.3.6.1.2.1.4.32.1.5.5.1.4.172.17.0.0.16::2 +.1.3.6.1.2.1.4.32.1.6.1.1.4.127.0.0.0.8::1 +.1.3.6.1.2.1.4.32.1.6.1.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128::1 +.1.3.6.1.2.1.4.32.1.6.3.1.4.192.168.178.0.24::1 +.1.3.6.1.2.1.4.32.1.6.4.1.4.169.254.0.0.16::1 +.1.3.6.1.2.1.4.32.1.6.5.1.4.172.17.0.0.16::1 +.1.3.6.1.2.1.4.32.1.7.1.1.4.127.0.0.0.8::2 +.1.3.6.1.2.1.4.32.1.7.1.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128::2 +.1.3.6.1.2.1.4.32.1.7.3.1.4.192.168.178.0.24::2 +.1.3.6.1.2.1.4.32.1.7.4.1.4.169.254.0.0.16::2 +.1.3.6.1.2.1.4.32.1.7.5.1.4.172.17.0.0.16::2 +.1.3.6.1.2.1.4.32.1.8.1.1.4.127.0.0.0.8::4294967295 +.1.3.6.1.2.1.4.32.1.8.1.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128::4294967295 +.1.3.6.1.2.1.4.32.1.8.3.1.4.192.168.178.0.24::4294967295 +.1.3.6.1.2.1.4.32.1.8.4.1.4.169.254.0.0.16::4294967295 +.1.3.6.1.2.1.4.32.1.8.5.1.4.172.17.0.0.16::4294967295 +.1.3.6.1.2.1.4.32.1.9.1.1.4.127.0.0.0.8::4294967295 +.1.3.6.1.2.1.4.32.1.9.1.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128::4294967295 +.1.3.6.1.2.1.4.32.1.9.3.1.4.192.168.178.0.24::4294967295 +.1.3.6.1.2.1.4.32.1.9.4.1.4.169.254.0.0.16::4294967295 +.1.3.6.1.2.1.4.32.1.9.5.1.4.172.17.0.0.16::4294967295 +.1.3.6.1.2.1.4.33.0::1692128316 +.1.3.6.1.2.1.4.34.1.3.1.4.127.0.0.1::1 +.1.3.6.1.2.1.4.34.1.3.1.4.169.254.202.23::4 +.1.3.6.1.2.1.4.34.1.3.1.4.169.254.255.255::4 +.1.3.6.1.2.1.4.34.1.3.1.4.172.17.0.1::5 +.1.3.6.1.2.1.4.34.1.3.1.4.172.17.255.255::5 +.1.3.6.1.2.1.4.34.1.3.1.4.192.168.178.43::3 +.1.3.6.1.2.1.4.34.1.3.1.4.192.168.178.255::3 +.1.3.6.1.2.1.4.34.1.3.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::1 +.1.3.6.1.2.1.4.34.1.4.1.4.127.0.0.1::1 +.1.3.6.1.2.1.4.34.1.4.1.4.169.254.202.23::1 +.1.3.6.1.2.1.4.34.1.4.1.4.169.254.255.255::3 +.1.3.6.1.2.1.4.34.1.4.1.4.172.17.0.1::1 +.1.3.6.1.2.1.4.34.1.4.1.4.172.17.255.255::3 +.1.3.6.1.2.1.4.34.1.4.1.4.192.168.178.43::1 +.1.3.6.1.2.1.4.34.1.4.1.4.192.168.178.255::3 +.1.3.6.1.2.1.4.34.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::1 +.1.3.6.1.2.1.4.34.1.5.1.4.127.0.0.1::.1.3.6.1.2.1.4.32.1.5.1.1.4.127.0.0.0.8 +.1.3.6.1.2.1.4.34.1.5.1.4.169.254.202.23::.1.3.6.1.2.1.4.32.1.5.4.1.4.169.254.0.0.16 +.1.3.6.1.2.1.4.34.1.5.1.4.169.254.255.255::.1.3.6.1.2.1.4.32.1.5.4.1.4.169.254.0.0.16 +.1.3.6.1.2.1.4.34.1.5.1.4.172.17.0.1::.1.3.6.1.2.1.4.32.1.5.5.1.4.172.17.0.0.16 +.1.3.6.1.2.1.4.34.1.5.1.4.172.17.255.255::.1.3.6.1.2.1.4.32.1.5.5.1.4.172.17.0.0.16 +.1.3.6.1.2.1.4.34.1.5.1.4.192.168.178.43::.1.3.6.1.2.1.4.32.1.5.3.1.4.192.168.178.0.24 +.1.3.6.1.2.1.4.34.1.5.1.4.192.168.178.255::.1.3.6.1.2.1.4.32.1.5.3.1.4.192.168.178.0.24 +.1.3.6.1.2.1.4.34.1.5.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::.1.3.6.1.2.1.4.32.1.5.1.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.128 +.1.3.6.1.2.1.4.34.1.6.1.4.127.0.0.1::2 +.1.3.6.1.2.1.4.34.1.6.1.4.169.254.202.23::6 +.1.3.6.1.2.1.4.34.1.6.1.4.169.254.255.255::6 +.1.3.6.1.2.1.4.34.1.6.1.4.172.17.0.1::2 +.1.3.6.1.2.1.4.34.1.6.1.4.172.17.255.255::2 +.1.3.6.1.2.1.4.34.1.6.1.4.192.168.178.43::2 +.1.3.6.1.2.1.4.34.1.6.1.4.192.168.178.255::2 +.1.3.6.1.2.1.4.34.1.6.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::2 +.1.3.6.1.2.1.4.34.1.7.1.4.127.0.0.1::1 +.1.3.6.1.2.1.4.34.1.7.1.4.169.254.202.23::1 +.1.3.6.1.2.1.4.34.1.7.1.4.169.254.255.255::1 +.1.3.6.1.2.1.4.34.1.7.1.4.172.17.0.1::1 +.1.3.6.1.2.1.4.34.1.7.1.4.172.17.255.255::1 +.1.3.6.1.2.1.4.34.1.7.1.4.192.168.178.43::1 +.1.3.6.1.2.1.4.34.1.7.1.4.192.168.178.255::1 +.1.3.6.1.2.1.4.34.1.7.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::1 +.1.3.6.1.2.1.4.34.1.8.1.4.127.0.0.1::45 +.1.3.6.1.2.1.4.34.1.8.1.4.169.254.202.23::45 +.1.3.6.1.2.1.4.34.1.8.1.4.169.254.255.255::45 +.1.3.6.1.2.1.4.34.1.8.1.4.172.17.0.1::45 +.1.3.6.1.2.1.4.34.1.8.1.4.172.17.255.255::45 +.1.3.6.1.2.1.4.34.1.8.1.4.192.168.178.43::45 +.1.3.6.1.2.1.4.34.1.8.1.4.192.168.178.255::45 +.1.3.6.1.2.1.4.34.1.8.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::45 +.1.3.6.1.2.1.4.34.1.9.1.4.127.0.0.1::45 +.1.3.6.1.2.1.4.34.1.9.1.4.169.254.202.23::45 +.1.3.6.1.2.1.4.34.1.9.1.4.169.254.255.255::45 +.1.3.6.1.2.1.4.34.1.9.1.4.172.17.0.1::45 +.1.3.6.1.2.1.4.34.1.9.1.4.172.17.255.255::45 +.1.3.6.1.2.1.4.34.1.9.1.4.192.168.178.43::45 +.1.3.6.1.2.1.4.34.1.9.1.4.192.168.178.255::45 +.1.3.6.1.2.1.4.34.1.9.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::45 +.1.3.6.1.2.1.4.34.1.10.1.4.127.0.0.1::1 +.1.3.6.1.2.1.4.34.1.10.1.4.169.254.202.23::1 +.1.3.6.1.2.1.4.34.1.10.1.4.169.254.255.255::1 +.1.3.6.1.2.1.4.34.1.10.1.4.172.17.0.1::1 +.1.3.6.1.2.1.4.34.1.10.1.4.172.17.255.255::1 +.1.3.6.1.2.1.4.34.1.10.1.4.192.168.178.43::1 +.1.3.6.1.2.1.4.34.1.10.1.4.192.168.178.255::1 +.1.3.6.1.2.1.4.34.1.10.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::1 +.1.3.6.1.2.1.4.34.1.11.1.4.127.0.0.1::2 +.1.3.6.1.2.1.4.34.1.11.1.4.169.254.202.23::2 +.1.3.6.1.2.1.4.34.1.11.1.4.169.254.255.255::2 +.1.3.6.1.2.1.4.34.1.11.1.4.172.17.0.1::2 +.1.3.6.1.2.1.4.34.1.11.1.4.172.17.255.255::2 +.1.3.6.1.2.1.4.34.1.11.1.4.192.168.178.43::2 +.1.3.6.1.2.1.4.34.1.11.1.4.192.168.178.255::2 +.1.3.6.1.2.1.4.34.1.11.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1::2 +.1.3.6.1.2.1.4.35.1.4.3.1.4.192.168.178.1::b0:f2:8:dc:f4:d +.1.3.6.1.2.1.4.35.1.4.3.1.4.192.168.178.20::a4:83:e7:b0:be:82 +.1.3.6.1.2.1.4.35.1.4.3.1.4.192.168.178.24::ec:5c:68:c1:38:35 +.1.3.6.1.2.1.4.35.1.4.3.1.4.192.168.178.26::84:1b:77:17:3c:e3 +.1.3.6.1.2.1.4.35.1.4.3.1.4.192.168.178.33::1c:57:dc:67:f9:2 +.1.3.6.1.2.1.4.35.1.4.3.1.4.192.168.178.64::fc:34:97:69:ae:bd +.1.3.6.1.2.1.4.35.1.5.3.1.4.192.168.178.1::579951122 +.1.3.6.1.2.1.4.35.1.5.3.1.4.192.168.178.20::579951122 +.1.3.6.1.2.1.4.35.1.5.3.1.4.192.168.178.24::579951122 +.1.3.6.1.2.1.4.35.1.5.3.1.4.192.168.178.26::579951122 +.1.3.6.1.2.1.4.35.1.5.3.1.4.192.168.178.33::579951122 +.1.3.6.1.2.1.4.35.1.5.3.1.4.192.168.178.64::579951122 +.1.3.6.1.2.1.4.35.1.6.3.1.4.192.168.178.1::3 +.1.3.6.1.2.1.4.35.1.6.3.1.4.192.168.178.20::3 +.1.3.6.1.2.1.4.35.1.6.3.1.4.192.168.178.24::3 +.1.3.6.1.2.1.4.35.1.6.3.1.4.192.168.178.26::3 +.1.3.6.1.2.1.4.35.1.6.3.1.4.192.168.178.33::3 +.1.3.6.1.2.1.4.35.1.6.3.1.4.192.168.178.64::3 +.1.3.6.1.2.1.4.35.1.7.3.1.4.192.168.178.1::2 +.1.3.6.1.2.1.4.35.1.7.3.1.4.192.168.178.20::3 +.1.3.6.1.2.1.4.35.1.7.3.1.4.192.168.178.24::2 +.1.3.6.1.2.1.4.35.1.7.3.1.4.192.168.178.26::2 +.1.3.6.1.2.1.4.35.1.7.3.1.4.192.168.178.33::2 +.1.3.6.1.2.1.4.35.1.7.3.1.4.192.168.178.64::2 +.1.3.6.1.2.1.4.35.1.8.3.1.4.192.168.178.1::1 +.1.3.6.1.2.1.4.35.1.8.3.1.4.192.168.178.20::1 +.1.3.6.1.2.1.4.35.1.8.3.1.4.192.168.178.24::1 +.1.3.6.1.2.1.4.35.1.8.3.1.4.192.168.178.26::1 +.1.3.6.1.2.1.4.35.1.8.3.1.4.192.168.178.33::1 +.1.3.6.1.2.1.4.35.1.8.3.1.4.192.168.178.64::1 +.1.3.6.1.2.1.4.37.1.4.1.4.192.168.178.1.3::65535 +.1.3.6.1.2.1.4.37.1.5.1.4.192.168.178.1.3::0 +.1.3.6.1.2.1.5.1.0::568 +.1.3.6.1.2.1.5.2.0::63 +.1.3.6.1.2.1.5.3.0::568 +.1.3.6.1.2.1.5.4.0::0 +.1.3.6.1.2.1.5.5.0::0 +.1.3.6.1.2.1.5.6.0::0 +.1.3.6.1.2.1.5.7.0::0 +.1.3.6.1.2.1.5.8.0::0 +.1.3.6.1.2.1.5.9.0::0 +.1.3.6.1.2.1.5.10.0::0 +.1.3.6.1.2.1.5.11.0::0 +.1.3.6.1.2.1.5.12.0::0 +.1.3.6.1.2.1.5.13.0::0 +.1.3.6.1.2.1.5.14.0::568 +.1.3.6.1.2.1.5.15.0::0 +.1.3.6.1.2.1.5.16.0::568 +.1.3.6.1.2.1.5.17.0::0 +.1.3.6.1.2.1.5.18.0::0 +.1.3.6.1.2.1.5.19.0::0 +.1.3.6.1.2.1.5.20.0::0 +.1.3.6.1.2.1.5.21.0::0 +.1.3.6.1.2.1.5.22.0::0 +.1.3.6.1.2.1.5.23.0::0 +.1.3.6.1.2.1.5.24.0::0 +.1.3.6.1.2.1.5.25.0::0 +.1.3.6.1.2.1.5.26.0::0 +.1.3.6.1.2.1.5.29.1.2.1::568 +.1.3.6.1.2.1.5.29.1.2.2::0 +.1.3.6.1.2.1.5.29.1.3.1::63 +.1.3.6.1.2.1.5.29.1.3.2::0 +.1.3.6.1.2.1.5.29.1.4.1::568 +.1.3.6.1.2.1.5.29.1.4.2::9 +.1.3.6.1.2.1.5.29.1.5.1::0 +.1.3.6.1.2.1.5.29.1.5.2::0 +.1.3.6.1.2.1.5.30.1.3.1.0::0 +.1.3.6.1.2.1.5.30.1.3.1.3::568 +.1.3.6.1.2.1.5.30.1.3.1.4::0 +.1.3.6.1.2.1.5.30.1.3.1.5::0 +.1.3.6.1.2.1.5.30.1.3.1.8::0 +.1.3.6.1.2.1.5.30.1.3.1.11::0 +.1.3.6.1.2.1.5.30.1.3.1.12::0 +.1.3.6.1.2.1.5.30.1.3.1.13::0 +.1.3.6.1.2.1.5.30.1.3.1.14::0 +.1.3.6.1.2.1.5.30.1.3.1.17::0 +.1.3.6.1.2.1.5.30.1.3.1.18::0 +.1.3.6.1.2.1.5.30.1.4.1.0::0 +.1.3.6.1.2.1.5.30.1.4.1.3::568 +.1.3.6.1.2.1.5.30.1.4.1.4::0 +.1.3.6.1.2.1.5.30.1.4.1.5::0 +.1.3.6.1.2.1.5.30.1.4.1.8::0 +.1.3.6.1.2.1.5.30.1.4.1.11::0 +.1.3.6.1.2.1.5.30.1.4.1.12::0 +.1.3.6.1.2.1.5.30.1.4.1.13::0 +.1.3.6.1.2.1.5.30.1.4.1.14::0 +.1.3.6.1.2.1.5.30.1.4.1.17::0 +.1.3.6.1.2.1.5.30.1.4.1.18::0 +.1.3.6.1.2.1.5.30.1.4.2.143::9 +.1.3.6.1.2.1.6.1.0::1 +.1.3.6.1.2.1.6.2.0::200 +.1.3.6.1.2.1.6.3.0::120000 +.1.3.6.1.2.1.6.4.0::-1 +.1.3.6.1.2.1.6.5.0::2613 +.1.3.6.1.2.1.6.6.0::3830 +.1.3.6.1.2.1.6.7.0::8 +.1.3.6.1.2.1.6.8.0::119 +.1.3.6.1.2.1.6.9.0::3 +.1.3.6.1.2.1.6.10.0::318455 +.1.3.6.1.2.1.6.11.0::314971 +.1.3.6.1.2.1.6.12.0::131 +.1.3.6.1.2.1.6.13.1.1.0.0.0.0.80.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.0.0.0.0.139.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.0.0.0.0.161.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.0.0.0.0.443.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.0.0.0.0.445.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.0.0.0.0.5000.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.0.0.0.0.5001.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.0.0.0.0.5357.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.127.0.0.1.161.127.0.0.1.37078::5 +.1.3.6.1.2.1.6.13.1.1.127.0.0.1.512.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.127.0.0.1.5432.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.127.0.0.1.33304.0.0.0.0.0::2 +.1.3.6.1.2.1.6.13.1.1.127.0.0.1.37078.127.0.0.1.161::5 +.1.3.6.1.2.1.6.13.1.1.192.168.178.43.445.192.168.178.64.51538::5 +.1.3.6.1.2.1.6.13.1.2.0.0.0.0.80.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.2.0.0.0.0.139.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.2.0.0.0.0.161.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.2.0.0.0.0.443.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.2.0.0.0.0.445.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.2.0.0.0.0.5000.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.2.0.0.0.0.5001.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.2.0.0.0.0.5357.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.2.127.0.0.1.161.127.0.0.1.37078::127.0.0.1 +.1.3.6.1.2.1.6.13.1.2.127.0.0.1.512.0.0.0.0.0::127.0.0.1 +.1.3.6.1.2.1.6.13.1.2.127.0.0.1.5432.0.0.0.0.0::127.0.0.1 +.1.3.6.1.2.1.6.13.1.2.127.0.0.1.33304.0.0.0.0.0::127.0.0.1 +.1.3.6.1.2.1.6.13.1.2.127.0.0.1.37078.127.0.0.1.161::127.0.0.1 +.1.3.6.1.2.1.6.13.1.2.192.168.178.43.445.192.168.178.64.51538::192.168.178.43 +.1.3.6.1.2.1.6.13.1.3.0.0.0.0.80.0.0.0.0.0::80 +.1.3.6.1.2.1.6.13.1.3.0.0.0.0.139.0.0.0.0.0::139 +.1.3.6.1.2.1.6.13.1.3.0.0.0.0.161.0.0.0.0.0::161 +.1.3.6.1.2.1.6.13.1.3.0.0.0.0.443.0.0.0.0.0::443 +.1.3.6.1.2.1.6.13.1.3.0.0.0.0.445.0.0.0.0.0::445 +.1.3.6.1.2.1.6.13.1.3.0.0.0.0.5000.0.0.0.0.0::5000 +.1.3.6.1.2.1.6.13.1.3.0.0.0.0.5001.0.0.0.0.0::5001 +.1.3.6.1.2.1.6.13.1.3.0.0.0.0.5357.0.0.0.0.0::5357 +.1.3.6.1.2.1.6.13.1.3.127.0.0.1.161.127.0.0.1.37078::161 +.1.3.6.1.2.1.6.13.1.3.127.0.0.1.512.0.0.0.0.0::512 +.1.3.6.1.2.1.6.13.1.3.127.0.0.1.5432.0.0.0.0.0::5432 +.1.3.6.1.2.1.6.13.1.3.127.0.0.1.33304.0.0.0.0.0::33304 +.1.3.6.1.2.1.6.13.1.3.127.0.0.1.37078.127.0.0.1.161::37078 +.1.3.6.1.2.1.6.13.1.3.192.168.178.43.445.192.168.178.64.51538::445 +.1.3.6.1.2.1.6.13.1.4.0.0.0.0.80.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.0.0.0.0.139.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.0.0.0.0.161.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.0.0.0.0.443.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.0.0.0.0.445.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.0.0.0.0.5000.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.0.0.0.0.5001.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.0.0.0.0.5357.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.127.0.0.1.161.127.0.0.1.37078::127.0.0.1 +.1.3.6.1.2.1.6.13.1.4.127.0.0.1.512.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.127.0.0.1.5432.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.127.0.0.1.33304.0.0.0.0.0::0.0.0.0 +.1.3.6.1.2.1.6.13.1.4.127.0.0.1.37078.127.0.0.1.161::127.0.0.1 +.1.3.6.1.2.1.6.13.1.4.192.168.178.43.445.192.168.178.64.51538::192.168.178.64 +.1.3.6.1.2.1.6.13.1.5.0.0.0.0.80.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.0.0.0.0.139.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.0.0.0.0.161.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.0.0.0.0.443.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.0.0.0.0.445.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.0.0.0.0.5000.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.0.0.0.0.5001.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.0.0.0.0.5357.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.127.0.0.1.161.127.0.0.1.37078::37078 +.1.3.6.1.2.1.6.13.1.5.127.0.0.1.512.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.127.0.0.1.5432.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.127.0.0.1.33304.0.0.0.0.0::0 +.1.3.6.1.2.1.6.13.1.5.127.0.0.1.37078.127.0.0.1.161::161 +.1.3.6.1.2.1.6.13.1.5.192.168.178.43.445.192.168.178.64.51538::51538 +.1.3.6.1.2.1.6.14.0::1 +.1.3.6.1.2.1.6.15.0::183 +.1.3.6.1.2.1.6.19.1.7.1.4.127.0.0.1.161.1.4.127.0.0.1.37078::5 +.1.3.6.1.2.1.6.19.1.7.1.4.127.0.0.1.37078.1.4.127.0.0.1.161::5 +.1.3.6.1.2.1.6.19.1.7.1.4.192.168.178.43.445.1.4.192.168.178.64.51538::5 +.1.3.6.1.2.1.6.19.1.8.1.4.127.0.0.1.161.1.4.127.0.0.1.37078::24690 +.1.3.6.1.2.1.6.19.1.8.1.4.127.0.0.1.37078.1.4.127.0.0.1.161::24714 +.1.3.6.1.2.1.6.19.1.8.1.4.192.168.178.43.445.1.4.192.168.178.64.51538::31527 +.1.3.6.1.2.1.6.20.1.4.1.4.0.0.0.0.80::31896 +.1.3.6.1.2.1.6.20.1.4.1.4.0.0.0.0.139::31768 +.1.3.6.1.2.1.6.20.1.4.1.4.0.0.0.0.161::24690 +.1.3.6.1.2.1.6.20.1.4.1.4.0.0.0.0.443::31896 +.1.3.6.1.2.1.6.20.1.4.1.4.0.0.0.0.445::31768 +.1.3.6.1.2.1.6.20.1.4.1.4.0.0.0.0.5000::31896 +.1.3.6.1.2.1.6.20.1.4.1.4.0.0.0.0.5001::31896 +.1.3.6.1.2.1.6.20.1.4.1.4.0.0.0.0.5357::31896 +.1.3.6.1.2.1.6.20.1.4.1.4.127.0.0.1.512::18141 +.1.3.6.1.2.1.6.20.1.4.1.4.127.0.0.1.5432::16577 +.1.3.6.1.2.1.6.20.1.4.1.4.127.0.0.1.33304::21085 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.80::31896 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.139::31768 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.161::24690 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.443::31896 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.445::31768 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3261::0 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3263::0 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3264::0 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3265::15330 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5000::31896 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5001::31896 +.1.3.6.1.2.1.6.20.1.4.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5357::31896 +.1.3.6.1.2.1.7.1.0::6226145 +.1.3.6.1.2.1.7.2.0::0 +.1.3.6.1.2.1.7.3.0::0 +.1.3.6.1.2.1.7.4.0::486410 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.68::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.123::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.137::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.138::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.161::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.1900::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.3702::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.5353::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.9997::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.9998::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.9999::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.0.0.0.0.57878::0.0.0.0 +.1.3.6.1.2.1.7.5.1.1.127.0.0.1.323::127.0.0.1 +.1.3.6.1.2.1.7.5.1.1.192.168.178.43.137::192.168.178.43 +.1.3.6.1.2.1.7.5.1.1.192.168.178.43.138::192.168.178.43 +.1.3.6.1.2.1.7.5.1.1.192.168.178.255.137::192.168.178.255 +.1.3.6.1.2.1.7.5.1.1.192.168.178.255.138::192.168.178.255 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.68::68 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.123::123 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.137::137 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.138::138 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.161::161 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.1900::1900 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.3702::3702 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.5353::5353 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.9997::9997 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.9998::9998 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.9999::9999 +.1.3.6.1.2.1.7.5.1.2.0.0.0.0.57878::57878 +.1.3.6.1.2.1.7.5.1.2.127.0.0.1.323::323 +.1.3.6.1.2.1.7.5.1.2.192.168.178.43.137::137 +.1.3.6.1.2.1.7.5.1.2.192.168.178.43.138::138 +.1.3.6.1.2.1.7.5.1.2.192.168.178.255.137::137 +.1.3.6.1.2.1.7.5.1.2.192.168.178.255.138::138 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.68.1.4.0.0.0.0.0.23517::9104 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.68.1.4.0.0.0.0.0.24577::9084 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.123.1.4.0.0.0.0.0.27854::9747 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.137.1.4.0.0.0.0.0.18687076::31588 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.138.1.4.0.0.0.0.0.18687077::31588 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.161.1.4.0.0.0.0.0.18580563::24690 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.1900.1.4.0.0.0.0.0.18688225::31830 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.3702.1.4.0.0.0.0.0.18687281::31705 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.5353.1.4.0.0.0.0.0.18688070::31780 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.9997.1.4.0.0.0.0.0.25687::9159 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.9998.1.4.0.0.0.0.0.25686::9159 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.9999.1.4.0.0.0.0.0.25685::9159 +.1.3.6.1.2.1.7.7.1.8.1.4.0.0.0.0.57878.1.4.0.0.0.0.0.18688072::31780 +.1.3.6.1.2.1.7.7.1.8.1.4.127.0.0.1.323.1.4.0.0.0.0.0.27852::9747 +.1.3.6.1.2.1.7.7.1.8.1.4.192.168.178.43.137.1.4.0.0.0.0.0.18687098::31588 +.1.3.6.1.2.1.7.7.1.8.1.4.192.168.178.43.138.1.4.0.0.0.0.0.18687100::31588 +.1.3.6.1.2.1.7.7.1.8.1.4.192.168.178.255.137.1.4.0.0.0.0.0.18687099::31588 +.1.3.6.1.2.1.7.7.1.8.1.4.192.168.178.255.138.1.4.0.0.0.0.0.18687101::31588 +.1.3.6.1.2.1.7.7.1.8.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.123.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.27855::9747 +.1.3.6.1.2.1.7.7.1.8.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.161.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.18580564::24690 +.1.3.6.1.2.1.7.7.1.8.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3702.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.18687283::31705 +.1.3.6.1.2.1.7.7.1.8.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5353.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.18688071::31780 +.1.3.6.1.2.1.7.7.1.8.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.35855.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.18688073::31780 +.1.3.6.1.2.1.7.7.1.8.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.323.2.16.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.27853::9747 +.1.3.6.1.2.1.11.1.0::64426 +.1.3.6.1.2.1.11.2.0::64426 +.1.3.6.1.2.1.11.3.0::0 +.1.3.6.1.2.1.11.4.0::0 +.1.3.6.1.2.1.11.5.0::0 +.1.3.6.1.2.1.11.6.0::0 +.1.3.6.1.2.1.11.8.0::0 +.1.3.6.1.2.1.11.9.0::0 +.1.3.6.1.2.1.11.10.0::0 +.1.3.6.1.2.1.11.11.0::0 +.1.3.6.1.2.1.11.12.0::0 +.1.3.6.1.2.1.11.13.0::351715 +.1.3.6.1.2.1.11.14.0::0 +.1.3.6.1.2.1.11.15.0::24713 +.1.3.6.1.2.1.11.16.0::37509 +.1.3.6.1.2.1.11.17.0::0 +.1.3.6.1.2.1.11.18.0::0 +.1.3.6.1.2.1.11.19.0::0 +.1.3.6.1.2.1.11.20.0::0 +.1.3.6.1.2.1.11.21.0::0 +.1.3.6.1.2.1.11.22.0::0 +.1.3.6.1.2.1.11.24.0::0 +.1.3.6.1.2.1.11.25.0::0 +.1.3.6.1.2.1.11.26.0::0 +.1.3.6.1.2.1.11.27.0::0 +.1.3.6.1.2.1.11.28.0::64450 +.1.3.6.1.2.1.11.29.0::0 +.1.3.6.1.2.1.11.30.0::2 +.1.3.6.1.2.1.11.31.0::0 +.1.3.6.1.2.1.11.32.0::0 +.1.3.6.1.2.1.25.1.1.0::683225982 +.1.3.6.1.2.1.25.1.2.0::2024-4-16,14:31:26.0,+2:0 +.1.3.6.1.2.1.25.1.3.0::393216 +.1.3.6.1.2.1.25.1.5.0::0 +.1.3.6.1.2.1.25.1.6.0::318 +.1.3.6.1.2.1.25.1.7.0::0 +.1.3.6.1.2.1.25.2.2.0::18391348 +.1.3.6.1.2.1.25.2.3.1.1.1::1 +.1.3.6.1.2.1.25.2.3.1.1.3::3 +.1.3.6.1.2.1.25.2.3.1.1.6::6 +.1.3.6.1.2.1.25.2.3.1.1.7::7 +.1.3.6.1.2.1.25.2.3.1.1.8::8 +.1.3.6.1.2.1.25.2.3.1.1.10::10 +.1.3.6.1.2.1.25.2.3.1.1.11::11 +.1.3.6.1.2.1.25.2.3.1.1.31::31 +.1.3.6.1.2.1.25.2.3.1.1.36::36 +.1.3.6.1.2.1.25.2.3.1.1.38::38 +.1.3.6.1.2.1.25.2.3.1.1.39::39 +.1.3.6.1.2.1.25.2.3.1.1.50::50 +.1.3.6.1.2.1.25.2.3.1.1.53::53 +.1.3.6.1.2.1.25.2.3.1.1.54::54 +.1.3.6.1.2.1.25.2.3.1.1.56::56 +.1.3.6.1.2.1.25.2.3.1.1.57::57 +.1.3.6.1.2.1.25.2.3.1.2.1::.1.3.6.1.2.1.25.2.1.2 +.1.3.6.1.2.1.25.2.3.1.2.3::.1.3.6.1.2.1.25.2.1.3 +.1.3.6.1.2.1.25.2.3.1.2.6::.1.3.6.1.2.1.25.2.1.1 +.1.3.6.1.2.1.25.2.3.1.2.7::.1.3.6.1.2.1.25.2.1.1 +.1.3.6.1.2.1.25.2.3.1.2.8::.1.3.6.1.2.1.25.2.1.1 +.1.3.6.1.2.1.25.2.3.1.2.10::.1.3.6.1.2.1.25.2.1.3 +.1.3.6.1.2.1.25.2.3.1.2.11::.1.3.6.1.2.1.25.2.1.1 +.1.3.6.1.2.1.25.2.3.1.2.31::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.2.36::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.2.38::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.2.39::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.2.50::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.2.53::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.2.54::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.2.56::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.2.57::.1.3.6.1.2.1.25.2.1.4 +.1.3.6.1.2.1.25.2.3.1.3.1::Physical memory +.1.3.6.1.2.1.25.2.3.1.3.3::Virtual memory +.1.3.6.1.2.1.25.2.3.1.3.6::Memory buffers +.1.3.6.1.2.1.25.2.3.1.3.7::Cached memory +.1.3.6.1.2.1.25.2.3.1.3.8::Shared memory +.1.3.6.1.2.1.25.2.3.1.3.10::Swap space +.1.3.6.1.2.1.25.2.3.1.3.11::Available memory +.1.3.6.1.2.1.25.2.3.1.3.31::/ +.1.3.6.1.2.1.25.2.3.1.3.36::/dev/shm +.1.3.6.1.2.1.25.2.3.1.3.38::/run +.1.3.6.1.2.1.25.2.3.1.3.39::/sys/fs/cgroup +.1.3.6.1.2.1.25.2.3.1.3.50::/tmp +.1.3.6.1.2.1.25.2.3.1.3.53::/volume1 +.1.3.6.1.2.1.25.2.3.1.3.54::/volume2 +.1.3.6.1.2.1.25.2.3.1.3.56::/volume2/@docker +.1.3.6.1.2.1.25.2.3.1.3.57::/volume2/@docker/btrfs +.1.3.6.1.2.1.25.2.3.1.4.1::1024 +.1.3.6.1.2.1.25.2.3.1.4.3::1024 +.1.3.6.1.2.1.25.2.3.1.4.6::1024 +.1.3.6.1.2.1.25.2.3.1.4.7::1024 +.1.3.6.1.2.1.25.2.3.1.4.8::1024 +.1.3.6.1.2.1.25.2.3.1.4.10::1024 +.1.3.6.1.2.1.25.2.3.1.4.11::1024 +.1.3.6.1.2.1.25.2.3.1.4.31::4096 +.1.3.6.1.2.1.25.2.3.1.4.36::4096 +.1.3.6.1.2.1.25.2.3.1.4.38::4096 +.1.3.6.1.2.1.25.2.3.1.4.39::4096 +.1.3.6.1.2.1.25.2.3.1.4.50::4096 +.1.3.6.1.2.1.25.2.3.1.4.53::4096 +.1.3.6.1.2.1.25.2.3.1.4.54::4096 +.1.3.6.1.2.1.25.2.3.1.4.56::4096 +.1.3.6.1.2.1.25.2.3.1.4.57::4096 +.1.3.6.1.2.1.25.2.3.1.5.1::18391348 +.1.3.6.1.2.1.25.2.3.1.5.3::31525096 +.1.3.6.1.2.1.25.2.3.1.5.6::18391348 +.1.3.6.1.2.1.25.2.3.1.5.7::1533284 +.1.3.6.1.2.1.25.2.3.1.5.8::113008 +.1.3.6.1.2.1.25.2.3.1.5.10::13133748 +.1.3.6.1.2.1.25.2.3.1.5.11::16264060 +.1.3.6.1.2.1.25.2.3.1.5.31::2047838 +.1.3.6.1.2.1.25.2.3.1.5.36::2298918 +.1.3.6.1.2.1.25.2.3.1.5.38::2298918 +.1.3.6.1.2.1.25.2.3.1.5.39::2298918 +.1.3.6.1.2.1.25.2.3.1.5.50::2298918 +.1.3.6.1.2.1.25.2.3.1.5.53::75493540 +.1.3.6.1.2.1.25.2.3.1.5.54::251658240 +.1.3.6.1.2.1.25.2.3.1.5.56::251658240 +.1.3.6.1.2.1.25.2.3.1.5.57::251658240 +.1.3.6.1.2.1.25.2.3.1.6.1::2125356 +.1.3.6.1.2.1.25.2.3.1.6.3::2125356 +.1.3.6.1.2.1.25.2.3.1.6.6::64908 +.1.3.6.1.2.1.25.2.3.1.6.7::1533284 +.1.3.6.1.2.1.25.2.3.1.6.8::113008 +.1.3.6.1.2.1.25.2.3.1.6.10::0 +.1.3.6.1.2.1.25.2.3.1.6.11::0 +.1.3.6.1.2.1.25.2.3.1.6.31::345905 +.1.3.6.1.2.1.25.2.3.1.6.36::61 +.1.3.6.1.2.1.25.2.3.1.6.38::3999 +.1.3.6.1.2.1.25.2.3.1.6.39::0 +.1.3.6.1.2.1.25.2.3.1.6.50::175 +.1.3.6.1.2.1.25.2.3.1.6.53::339908 +.1.3.6.1.2.1.25.2.3.1.6.54::99754 +.1.3.6.1.2.1.25.2.3.1.6.56::99754 +.1.3.6.1.2.1.25.2.3.1.6.57::99754 +.1.3.6.1.2.1.25.3.2.1.1.196608::196608 +.1.3.6.1.2.1.25.3.2.1.1.196609::196609 +.1.3.6.1.2.1.25.3.2.1.1.196610::196610 +.1.3.6.1.2.1.25.3.2.1.1.196611::196611 +.1.3.6.1.2.1.25.3.2.1.1.262145::262145 +.1.3.6.1.2.1.25.3.2.1.1.262146::262146 +.1.3.6.1.2.1.25.3.2.1.1.262147::262147 +.1.3.6.1.2.1.25.3.2.1.1.262148::262148 +.1.3.6.1.2.1.25.3.2.1.1.262149::262149 +.1.3.6.1.2.1.25.3.2.1.1.393248::393248 +.1.3.6.1.2.1.25.3.2.1.1.393249::393249 +.1.3.6.1.2.1.25.3.2.1.1.393250::393250 +.1.3.6.1.2.1.25.3.2.1.1.393280::393280 +.1.3.6.1.2.1.25.3.2.1.1.393296::393296 +.1.3.6.1.2.1.25.3.2.1.1.393312::393312 +.1.3.6.1.2.1.25.3.2.1.1.786432::786432 +.1.3.6.1.2.1.25.3.2.1.2.196608::.1.3.6.1.2.1.25.3.1.3 +.1.3.6.1.2.1.25.3.2.1.2.196609::.1.3.6.1.2.1.25.3.1.3 +.1.3.6.1.2.1.25.3.2.1.2.196610::.1.3.6.1.2.1.25.3.1.3 +.1.3.6.1.2.1.25.3.2.1.2.196611::.1.3.6.1.2.1.25.3.1.3 +.1.3.6.1.2.1.25.3.2.1.2.262145::.1.3.6.1.2.1.25.3.1.4 +.1.3.6.1.2.1.25.3.2.1.2.262146::.1.3.6.1.2.1.25.3.1.4 +.1.3.6.1.2.1.25.3.2.1.2.262147::.1.3.6.1.2.1.25.3.1.4 +.1.3.6.1.2.1.25.3.2.1.2.262148::.1.3.6.1.2.1.25.3.1.4 +.1.3.6.1.2.1.25.3.2.1.2.262149::.1.3.6.1.2.1.25.3.1.4 +.1.3.6.1.2.1.25.3.2.1.2.393248::.1.3.6.1.2.1.25.3.1.6 +.1.3.6.1.2.1.25.3.2.1.2.393249::.1.3.6.1.2.1.25.3.1.6 +.1.3.6.1.2.1.25.3.2.1.2.393250::.1.3.6.1.2.1.25.3.1.6 +.1.3.6.1.2.1.25.3.2.1.2.393280::.1.3.6.1.2.1.25.3.1.6 +.1.3.6.1.2.1.25.3.2.1.2.393296::.1.3.6.1.2.1.25.3.1.6 +.1.3.6.1.2.1.25.3.2.1.2.393312::.1.3.6.1.2.1.25.3.1.6 +.1.3.6.1.2.1.25.3.2.1.2.786432::.1.3.6.1.2.1.25.3.1.12 +.1.3.6.1.2.1.25.3.2.1.3.196608::AuthenticAMD|AMD Ryzen Embedded R1600 +.1.3.6.1.2.1.25.3.2.1.3.196609::AuthenticAMD|AMD Ryzen Embedded R1600 +.1.3.6.1.2.1.25.3.2.1.3.196610::AuthenticAMD|AMD Ryzen Embedded R1600 +.1.3.6.1.2.1.25.3.2.1.3.196611::AuthenticAMD|AMD Ryzen Embedded R1600 +.1.3.6.1.2.1.25.3.2.1.3.262145::network interface lo +.1.3.6.1.2.1.25.3.2.1.3.262146::network interface sit0 +.1.3.6.1.2.1.25.3.2.1.3.262147::network interface eth0 +.1.3.6.1.2.1.25.3.2.1.3.262148::network interface eth1 +.1.3.6.1.2.1.25.3.2.1.3.262149::network interface docker0 +.1.3.6.1.2.1.25.3.2.1.3.393248::RAID disk (/dev/md0) +.1.3.6.1.2.1.25.3.2.1.3.393249::RAID disk (/dev/md1) +.1.3.6.1.2.1.25.3.2.1.3.393250::RAID disk (/dev/md2) +.1.3.6.1.2.1.25.3.2.1.3.393280::LVM volume (vg1-volume_2) +.1.3.6.1.2.1.25.3.2.1.3.393296::LVM volume (vg1-volume_1) +.1.3.6.1.2.1.25.3.2.1.3.393312::LVM volume (vg1-syno_vg_reserved_area) +.1.3.6.1.2.1.25.3.2.1.3.786432::Guessing that there's a floating point co-processor +.1.3.6.1.2.1.25.3.2.1.4.196608::0.0 +.1.3.6.1.2.1.25.3.2.1.4.196609::0.0 +.1.3.6.1.2.1.25.3.2.1.4.196610::0.0 +.1.3.6.1.2.1.25.3.2.1.4.196611::0.0 +.1.3.6.1.2.1.25.3.2.1.4.262145::0.0 +.1.3.6.1.2.1.25.3.2.1.4.262146::0.0 +.1.3.6.1.2.1.25.3.2.1.4.262147::0.0 +.1.3.6.1.2.1.25.3.2.1.4.262148::0.0 +.1.3.6.1.2.1.25.3.2.1.4.262149::0.0 +.1.3.6.1.2.1.25.3.2.1.4.393248::0.0 +.1.3.6.1.2.1.25.3.2.1.4.393249::0.0 +.1.3.6.1.2.1.25.3.2.1.4.393250::0.0 +.1.3.6.1.2.1.25.3.2.1.4.393280::0.0 +.1.3.6.1.2.1.25.3.2.1.4.393296::0.0 +.1.3.6.1.2.1.25.3.2.1.4.393312::0.0 +.1.3.6.1.2.1.25.3.2.1.4.786432::0.0 +.1.3.6.1.2.1.25.3.2.1.5.196608::2 +.1.3.6.1.2.1.25.3.2.1.5.196609::2 +.1.3.6.1.2.1.25.3.2.1.5.196610::2 +.1.3.6.1.2.1.25.3.2.1.5.196611::2 +.1.3.6.1.2.1.25.3.2.1.5.262145::2 +.1.3.6.1.2.1.25.3.2.1.5.262146::5 +.1.3.6.1.2.1.25.3.2.1.5.262147::2 +.1.3.6.1.2.1.25.3.2.1.5.262148::2 +.1.3.6.1.2.1.25.3.2.1.5.262149::2 +.1.3.6.1.2.1.25.3.2.1.6.262145::0 +.1.3.6.1.2.1.25.3.2.1.6.262146::0 +.1.3.6.1.2.1.25.3.2.1.6.262147::0 +.1.3.6.1.2.1.25.3.2.1.6.262148::0 +.1.3.6.1.2.1.25.3.2.1.6.262149::0 +.1.3.6.1.2.1.25.3.3.1.1.196608::0.0 +.1.3.6.1.2.1.25.3.3.1.1.196609::0.0 +.1.3.6.1.2.1.25.3.3.1.1.196610::0.0 +.1.3.6.1.2.1.25.3.3.1.1.196611::0.0 +.1.3.6.1.2.1.25.3.3.1.2.196608::0 +.1.3.6.1.2.1.25.3.3.1.2.196609::1 +.1.3.6.1.2.1.25.3.3.1.2.196610::3 +.1.3.6.1.2.1.25.3.3.1.2.196611::1 +.1.3.6.1.2.1.25.3.4.1.1.262145::1 +.1.3.6.1.2.1.25.3.4.1.1.262146::2 +.1.3.6.1.2.1.25.3.4.1.1.262147::3 +.1.3.6.1.2.1.25.3.4.1.1.262148::4 +.1.3.6.1.2.1.25.3.4.1.1.262149::5 +.1.3.6.1.2.1.25.3.6.1.1.393248::1 +.1.3.6.1.2.1.25.3.6.1.1.393249::1 +.1.3.6.1.2.1.25.3.6.1.1.393250::1 +.1.3.6.1.2.1.25.3.6.1.1.393280::1 +.1.3.6.1.2.1.25.3.6.1.1.393296::1 +.1.3.6.1.2.1.25.3.6.1.1.393312::1 +.1.3.6.1.2.1.25.3.6.1.2.393248::2 +.1.3.6.1.2.1.25.3.6.1.2.393249::2 +.1.3.6.1.2.1.25.3.6.1.2.393250::2 +.1.3.6.1.2.1.25.3.6.1.2.393280::2 +.1.3.6.1.2.1.25.3.6.1.2.393296::2 +.1.3.6.1.2.1.25.3.6.1.2.393312::2 +.1.3.6.1.2.1.25.3.6.1.3.393248::2 +.1.3.6.1.2.1.25.3.6.1.3.393249::2 +.1.3.6.1.2.1.25.3.6.1.3.393250::2 +.1.3.6.1.2.1.25.3.6.1.3.393280::2 +.1.3.6.1.2.1.25.3.6.1.3.393296::2 +.1.3.6.1.2.1.25.3.6.1.3.393312::2 +.1.3.6.1.2.1.25.3.6.1.4.393248::8388544 +.1.3.6.1.2.1.25.3.6.1.4.393249::2097088 +.1.3.6.1.2.1.25.3.6.1.4.393250::1748810560 +.1.3.6.1.2.1.25.3.6.1.4.393280::1048576000 +.1.3.6.1.2.1.25.3.6.1.4.393296::314572800 +.1.3.6.1.2.1.25.3.6.1.4.393312::12288 +.1.3.6.1.2.1.25.3.7.1.1.393248.1::1 +.1.3.6.1.2.1.25.3.7.1.1.393249.1::1 +.1.3.6.1.2.1.25.3.7.1.1.393250.1::1 +.1.3.6.1.2.1.25.3.7.1.1.393280.1::1 +.1.3.6.1.2.1.25.3.7.1.1.393296.1::1 +.1.3.6.1.2.1.25.3.7.1.1.393312.1::1 +.1.3.6.1.2.1.25.3.7.1.4.393248.1::8191352 +.1.3.6.1.2.1.25.3.7.1.4.393249.1::-1 +.1.3.6.1.2.1.25.3.7.1.4.393250.1::-1 +.1.3.6.1.2.1.25.3.7.1.4.393280.1::-1 +.1.3.6.1.2.1.25.3.7.1.4.393296.1::-1 +.1.3.6.1.2.1.25.3.7.1.4.393312.1::-1 +.1.3.6.1.2.1.25.3.7.1.5.393248.1::1 +.1.3.6.1.2.1.25.3.7.1.5.393249.1::-1 +.1.3.6.1.2.1.25.3.7.1.5.393250.1::-1 +.1.3.6.1.2.1.25.3.7.1.5.393280.1::-1 +.1.3.6.1.2.1.25.3.7.1.5.393296.1::-1 +.1.3.6.1.2.1.25.3.7.1.5.393312.1::-1 +.1.3.6.1.2.1.25.3.8.1.1.1::1 +.1.3.6.1.2.1.25.3.8.1.1.6::6 +.1.3.6.1.2.1.25.3.8.1.1.8::8 +.1.3.6.1.2.1.25.3.8.1.1.9::9 +.1.3.6.1.2.1.25.3.8.1.1.20::20 +.1.3.6.1.2.1.25.3.8.1.1.23::23 +.1.3.6.1.2.1.25.3.8.1.1.24::24 +.1.3.6.1.2.1.25.3.8.1.1.26::26 +.1.3.6.1.2.1.25.3.8.1.1.27::27 +.1.3.6.1.2.1.25.3.8.1.4.1::.1.3.6.1.2.1.25.3.9.23 +.1.3.6.1.2.1.25.3.8.1.4.6::.1.3.6.1.2.1.25.3.9.1 +.1.3.6.1.2.1.25.3.8.1.4.8::.1.3.6.1.2.1.25.3.9.1 +.1.3.6.1.2.1.25.3.8.1.4.9::.1.3.6.1.2.1.25.3.9.1 +.1.3.6.1.2.1.25.3.8.1.4.20::.1.3.6.1.2.1.25.3.9.1 +.1.3.6.1.2.1.25.3.8.1.4.23::.1.3.6.1.2.1.25.3.9.1 +.1.3.6.1.2.1.25.3.8.1.4.24::.1.3.6.1.2.1.25.3.9.1 +.1.3.6.1.2.1.25.3.8.1.4.26::.1.3.6.1.2.1.25.3.9.1 +.1.3.6.1.2.1.25.3.8.1.4.27::.1.3.6.1.2.1.25.3.9.1 +.1.3.6.1.2.1.25.3.8.1.5.1::1 +.1.3.6.1.2.1.25.3.8.1.5.6::1 +.1.3.6.1.2.1.25.3.8.1.5.8::1 +.1.3.6.1.2.1.25.3.8.1.5.9::2 +.1.3.6.1.2.1.25.3.8.1.5.20::1 +.1.3.6.1.2.1.25.3.8.1.5.23::1 +.1.3.6.1.2.1.25.3.8.1.5.24::1 +.1.3.6.1.2.1.25.3.8.1.5.26::1 +.1.3.6.1.2.1.25.3.8.1.5.27::1 +.1.3.6.1.2.1.25.3.8.1.6.1::1 +.1.3.6.1.2.1.25.3.8.1.6.6::2 +.1.3.6.1.2.1.25.3.8.1.6.8::2 +.1.3.6.1.2.1.25.3.8.1.6.9::2 +.1.3.6.1.2.1.25.3.8.1.6.20::2 +.1.3.6.1.2.1.25.3.8.1.6.23::2 +.1.3.6.1.2.1.25.3.8.1.6.24::2 +.1.3.6.1.2.1.25.3.8.1.6.26::2 +.1.3.6.1.2.1.25.3.8.1.6.27::2 +.1.3.6.1.2.1.25.3.8.1.7.1::31 +.1.3.6.1.2.1.25.3.8.1.7.6::36 +.1.3.6.1.2.1.25.3.8.1.7.8::38 +.1.3.6.1.2.1.25.3.8.1.7.9::39 +.1.3.6.1.2.1.25.3.8.1.7.20::50 +.1.3.6.1.2.1.25.3.8.1.7.23::53 +.1.3.6.1.2.1.25.3.8.1.7.24::54 +.1.3.6.1.2.1.25.3.8.1.7.26::56 +.1.3.6.1.2.1.25.3.8.1.7.27::57 +.1.3.6.1.2.1.25.3.8.1.8.1::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.8.6::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.8.8::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.8.9::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.8.20::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.8.23::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.8.24::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.8.26::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.8.27::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.1::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.6::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.8::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.9::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.20::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.23::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.24::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.26::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.3.8.1.9.27::0-1-1,0:0:0.0 +.1.3.6.1.2.1.25.4.2.1.1.1::1 +.1.3.6.1.2.1.25.4.2.1.1.2::2 +.1.3.6.1.2.1.25.4.2.1.1.3::3 +.1.3.6.1.2.1.25.4.2.1.1.5::5 +.1.3.6.1.2.1.25.4.2.1.1.7::7 +.1.3.6.1.2.1.25.4.2.1.1.8::8 +.1.3.6.1.2.1.25.4.2.1.1.9::9 +.1.3.6.1.2.1.25.4.2.1.1.10::10 +.1.3.6.1.2.1.25.4.2.1.1.11::11 +.1.3.6.1.2.1.25.4.2.1.1.12::12 +.1.3.6.1.2.1.25.4.2.1.1.13::13 +.1.3.6.1.2.1.25.4.2.1.1.15::15 +.1.3.6.1.2.1.25.4.2.1.1.16::16 +.1.3.6.1.2.1.25.4.2.1.1.17::17 +.1.3.6.1.2.1.25.4.2.1.1.18::18 +.1.3.6.1.2.1.25.4.2.1.1.20::20 +.1.3.6.1.2.1.25.4.2.1.1.21::21 +.1.3.6.1.2.1.25.4.2.1.1.22::22 +.1.3.6.1.2.1.25.4.2.1.1.23::23 +.1.3.6.1.2.1.25.4.2.1.1.25::25 +.1.3.6.1.2.1.25.4.2.1.1.26::26 +.1.3.6.1.2.1.25.4.2.1.1.27::27 +.1.3.6.1.2.1.25.4.2.1.1.30::30 +.1.3.6.1.2.1.25.4.2.1.1.187::187 +.1.3.6.1.2.1.25.4.2.1.1.188::188 +.1.3.6.1.2.1.25.4.2.1.1.191::191 +.1.3.6.1.2.1.25.4.2.1.1.192::192 +.1.3.6.1.2.1.25.4.2.1.1.193::193 +.1.3.6.1.2.1.25.4.2.1.1.194::194 +.1.3.6.1.2.1.25.4.2.1.1.196::196 +.1.3.6.1.2.1.25.4.2.1.1.364::364 +.1.3.6.1.2.1.25.4.2.1.1.379::379 +.1.3.6.1.2.1.25.4.2.1.1.543::543 +.1.3.6.1.2.1.25.4.2.1.1.628::628 +.1.3.6.1.2.1.25.4.2.1.1.684::684 +.1.3.6.1.2.1.25.4.2.1.1.817::817 +.1.3.6.1.2.1.25.4.2.1.1.3462::3462 +.1.3.6.1.2.1.25.4.2.1.1.3463::3463 +.1.3.6.1.2.1.25.4.2.1.1.3464::3464 +.1.3.6.1.2.1.25.4.2.1.1.3465::3465 +.1.3.6.1.2.1.25.4.2.1.1.3466::3466 +.1.3.6.1.2.1.25.4.2.1.1.3467::3467 +.1.3.6.1.2.1.25.4.2.1.1.3468::3468 +.1.3.6.1.2.1.25.4.2.1.1.3469::3469 +.1.3.6.1.2.1.25.4.2.1.1.3470::3470 +.1.3.6.1.2.1.25.4.2.1.1.3471::3471 +.1.3.6.1.2.1.25.4.2.1.1.3472::3472 +.1.3.6.1.2.1.25.4.2.1.1.3473::3473 +.1.3.6.1.2.1.25.4.2.1.1.3474::3474 +.1.3.6.1.2.1.25.4.2.1.1.3475::3475 +.1.3.6.1.2.1.25.4.2.1.1.3476::3476 +.1.3.6.1.2.1.25.4.2.1.1.3477::3477 +.1.3.6.1.2.1.25.4.2.1.1.3478::3478 +.1.3.6.1.2.1.25.4.2.1.1.3557::3557 +.1.3.6.1.2.1.25.4.2.1.1.3648::3648 +.1.3.6.1.2.1.25.4.2.1.1.3801::3801 +.1.3.6.1.2.1.25.4.2.1.1.3802::3802 +.1.3.6.1.2.1.25.4.2.1.1.3818::3818 +.1.3.6.1.2.1.25.4.2.1.1.3827::3827 +.1.3.6.1.2.1.25.4.2.1.1.3849::3849 +.1.3.6.1.2.1.25.4.2.1.1.3858::3858 +.1.3.6.1.2.1.25.4.2.1.1.3880::3880 +.1.3.6.1.2.1.25.4.2.1.1.3883::3883 +.1.3.6.1.2.1.25.4.2.1.1.3894::3894 +.1.3.6.1.2.1.25.4.2.1.1.3895::3895 +.1.3.6.1.2.1.25.4.2.1.1.3905::3905 +.1.3.6.1.2.1.25.4.2.1.1.3906::3906 +.1.3.6.1.2.1.25.4.2.1.1.3923::3923 +.1.3.6.1.2.1.25.4.2.1.1.3924::3924 +.1.3.6.1.2.1.25.4.2.1.1.3926::3926 +.1.3.6.1.2.1.25.4.2.1.1.3949::3949 +.1.3.6.1.2.1.25.4.2.1.1.3952::3952 +.1.3.6.1.2.1.25.4.2.1.1.3955::3955 +.1.3.6.1.2.1.25.4.2.1.1.4085::4085 +.1.3.6.1.2.1.25.4.2.1.1.4086::4086 +.1.3.6.1.2.1.25.4.2.1.1.4159::4159 +.1.3.6.1.2.1.25.4.2.1.1.4160::4160 +.1.3.6.1.2.1.25.4.2.1.1.4636::4636 +.1.3.6.1.2.1.25.4.2.1.1.4649::4649 +.1.3.6.1.2.1.25.4.2.1.1.4740::4740 +.1.3.6.1.2.1.25.4.2.1.1.4757::4757 +.1.3.6.1.2.1.25.4.2.1.1.4766::4766 +.1.3.6.1.2.1.25.4.2.1.1.4775::4775 +.1.3.6.1.2.1.25.4.2.1.1.4784::4784 +.1.3.6.1.2.1.25.4.2.1.1.4785::4785 +.1.3.6.1.2.1.25.4.2.1.1.4786::4786 +.1.3.6.1.2.1.25.4.2.1.1.5048::5048 +.1.3.6.1.2.1.25.4.2.1.1.5714::5714 +.1.3.6.1.2.1.25.4.2.1.1.5772::5772 +.1.3.6.1.2.1.25.4.2.1.1.6209::6209 +.1.3.6.1.2.1.25.4.2.1.1.6275::6275 +.1.3.6.1.2.1.25.4.2.1.1.6276::6276 +.1.3.6.1.2.1.25.4.2.1.1.6277::6277 +.1.3.6.1.2.1.25.4.2.1.1.6481::6481 +.1.3.6.1.2.1.25.4.2.1.1.6583::6583 +.1.3.6.1.2.1.25.4.2.1.1.6588::6588 +.1.3.6.1.2.1.25.4.2.1.1.6634::6634 +.1.3.6.1.2.1.25.4.2.1.1.6639::6639 +.1.3.6.1.2.1.25.4.2.1.1.6644::6644 +.1.3.6.1.2.1.25.4.2.1.1.6674::6674 +.1.3.6.1.2.1.25.4.2.1.1.6675::6675 +.1.3.6.1.2.1.25.4.2.1.1.6676::6676 +.1.3.6.1.2.1.25.4.2.1.1.6677::6677 +.1.3.6.1.2.1.25.4.2.1.1.6679::6679 +.1.3.6.1.2.1.25.4.2.1.1.6680::6680 +.1.3.6.1.2.1.25.4.2.1.1.6681::6681 +.1.3.6.1.2.1.25.4.2.1.1.6682::6682 +.1.3.6.1.2.1.25.4.2.1.1.6683::6683 +.1.3.6.1.2.1.25.4.2.1.1.6695::6695 +.1.3.6.1.2.1.25.4.2.1.1.6714::6714 +.1.3.6.1.2.1.25.4.2.1.1.6718::6718 +.1.3.6.1.2.1.25.4.2.1.1.6719::6719 +.1.3.6.1.2.1.25.4.2.1.1.6720::6720 +.1.3.6.1.2.1.25.4.2.1.1.6729::6729 +.1.3.6.1.2.1.25.4.2.1.1.6733::6733 +.1.3.6.1.2.1.25.4.2.1.1.6736::6736 +.1.3.6.1.2.1.25.4.2.1.1.6739::6739 +.1.3.6.1.2.1.25.4.2.1.1.6742::6742 +.1.3.6.1.2.1.25.4.2.1.1.6746::6746 +.1.3.6.1.2.1.25.4.2.1.1.6749::6749 +.1.3.6.1.2.1.25.4.2.1.1.6752::6752 +.1.3.6.1.2.1.25.4.2.1.1.6772::6772 +.1.3.6.1.2.1.25.4.2.1.1.6780::6780 +.1.3.6.1.2.1.25.4.2.1.1.6784::6784 +.1.3.6.1.2.1.25.4.2.1.1.6805::6805 +.1.3.6.1.2.1.25.4.2.1.1.6812::6812 +.1.3.6.1.2.1.25.4.2.1.1.6866::6866 +.1.3.6.1.2.1.25.4.2.1.1.6893::6893 +.1.3.6.1.2.1.25.4.2.1.1.6902::6902 +.1.3.6.1.2.1.25.4.2.1.1.6989::6989 +.1.3.6.1.2.1.25.4.2.1.1.7004::7004 +.1.3.6.1.2.1.25.4.2.1.1.7018::7018 +.1.3.6.1.2.1.25.4.2.1.1.7044::7044 +.1.3.6.1.2.1.25.4.2.1.1.7045::7045 +.1.3.6.1.2.1.25.4.2.1.1.7046::7046 +.1.3.6.1.2.1.25.4.2.1.1.7054::7054 +.1.3.6.1.2.1.25.4.2.1.1.7104::7104 +.1.3.6.1.2.1.25.4.2.1.1.7155::7155 +.1.3.6.1.2.1.25.4.2.1.1.7164::7164 +.1.3.6.1.2.1.25.4.2.1.1.7178::7178 +.1.3.6.1.2.1.25.4.2.1.1.7368::7368 +.1.3.6.1.2.1.25.4.2.1.1.7816::7816 +.1.3.6.1.2.1.25.4.2.1.1.7819::7819 +.1.3.6.1.2.1.25.4.2.1.1.8255::8255 +.1.3.6.1.2.1.25.4.2.1.1.8256::8256 +.1.3.6.1.2.1.25.4.2.1.1.8261::8261 +.1.3.6.1.2.1.25.4.2.1.1.8388::8388 +.1.3.6.1.2.1.25.4.2.1.1.8389::8389 +.1.3.6.1.2.1.25.4.2.1.1.8390::8390 +.1.3.6.1.2.1.25.4.2.1.1.8391::8391 +.1.3.6.1.2.1.25.4.2.1.1.8404::8404 +.1.3.6.1.2.1.25.4.2.1.1.8405::8405 +.1.3.6.1.2.1.25.4.2.1.1.8406::8406 +.1.3.6.1.2.1.25.4.2.1.1.8407::8407 +.1.3.6.1.2.1.25.4.2.1.1.8420::8420 +.1.3.6.1.2.1.25.4.2.1.1.8424::8424 +.1.3.6.1.2.1.25.4.2.1.1.8434::8434 +.1.3.6.1.2.1.25.4.2.1.1.8525::8525 +.1.3.6.1.2.1.25.4.2.1.1.8545::8545 +.1.3.6.1.2.1.25.4.2.1.1.8565::8565 +.1.3.6.1.2.1.25.4.2.1.1.8578::8578 +.1.3.6.1.2.1.25.4.2.1.1.8833::8833 +.1.3.6.1.2.1.25.4.2.1.1.8843::8843 +.1.3.6.1.2.1.25.4.2.1.1.8844::8844 +.1.3.6.1.2.1.25.4.2.1.1.8845::8845 +.1.3.6.1.2.1.25.4.2.1.1.8876::8876 +.1.3.6.1.2.1.25.4.2.1.1.8877::8877 +.1.3.6.1.2.1.25.4.2.1.1.8880::8880 +.1.3.6.1.2.1.25.4.2.1.1.8881::8881 +.1.3.6.1.2.1.25.4.2.1.1.8883::8883 +.1.3.6.1.2.1.25.4.2.1.1.8886::8886 +.1.3.6.1.2.1.25.4.2.1.1.9013::9013 +.1.3.6.1.2.1.25.4.2.1.1.9022::9022 +.1.3.6.1.2.1.25.4.2.1.1.9038::9038 +.1.3.6.1.2.1.25.4.2.1.1.9047::9047 +.1.3.6.1.2.1.25.4.2.1.1.9084::9084 +.1.3.6.1.2.1.25.4.2.1.1.9104::9104 +.1.3.6.1.2.1.25.4.2.1.1.9159::9159 +.1.3.6.1.2.1.25.4.2.1.1.9167::9167 +.1.3.6.1.2.1.25.4.2.1.1.9182::9182 +.1.3.6.1.2.1.25.4.2.1.1.9234::9234 +.1.3.6.1.2.1.25.4.2.1.1.9249::9249 +.1.3.6.1.2.1.25.4.2.1.1.9250::9250 +.1.3.6.1.2.1.25.4.2.1.1.9251::9251 +.1.3.6.1.2.1.25.4.2.1.1.9252::9252 +.1.3.6.1.2.1.25.4.2.1.1.9253::9253 +.1.3.6.1.2.1.25.4.2.1.1.9411::9411 +.1.3.6.1.2.1.25.4.2.1.1.9433::9433 +.1.3.6.1.2.1.25.4.2.1.1.9435::9435 +.1.3.6.1.2.1.25.4.2.1.1.9554::9554 +.1.3.6.1.2.1.25.4.2.1.1.9555::9555 +.1.3.6.1.2.1.25.4.2.1.1.9556::9556 +.1.3.6.1.2.1.25.4.2.1.1.9557::9557 +.1.3.6.1.2.1.25.4.2.1.1.9558::9558 +.1.3.6.1.2.1.25.4.2.1.1.9559::9559 +.1.3.6.1.2.1.25.4.2.1.1.9560::9560 +.1.3.6.1.2.1.25.4.2.1.1.9561::9561 +.1.3.6.1.2.1.25.4.2.1.1.9562::9562 +.1.3.6.1.2.1.25.4.2.1.1.9563::9563 +.1.3.6.1.2.1.25.4.2.1.1.9564::9564 +.1.3.6.1.2.1.25.4.2.1.1.9565::9565 +.1.3.6.1.2.1.25.4.2.1.1.9566::9566 +.1.3.6.1.2.1.25.4.2.1.1.9567::9567 +.1.3.6.1.2.1.25.4.2.1.1.9568::9568 +.1.3.6.1.2.1.25.4.2.1.1.9569::9569 +.1.3.6.1.2.1.25.4.2.1.1.9570::9570 +.1.3.6.1.2.1.25.4.2.1.1.9571::9571 +.1.3.6.1.2.1.25.4.2.1.1.9572::9572 +.1.3.6.1.2.1.25.4.2.1.1.9573::9573 +.1.3.6.1.2.1.25.4.2.1.1.9575::9575 +.1.3.6.1.2.1.25.4.2.1.1.9576::9576 +.1.3.6.1.2.1.25.4.2.1.1.9577::9577 +.1.3.6.1.2.1.25.4.2.1.1.9578::9578 +.1.3.6.1.2.1.25.4.2.1.1.9579::9579 +.1.3.6.1.2.1.25.4.2.1.1.9580::9580 +.1.3.6.1.2.1.25.4.2.1.1.9581::9581 +.1.3.6.1.2.1.25.4.2.1.1.9582::9582 +.1.3.6.1.2.1.25.4.2.1.1.9583::9583 +.1.3.6.1.2.1.25.4.2.1.1.9584::9584 +.1.3.6.1.2.1.25.4.2.1.1.9585::9585 +.1.3.6.1.2.1.25.4.2.1.1.9587::9587 +.1.3.6.1.2.1.25.4.2.1.1.9588::9588 +.1.3.6.1.2.1.25.4.2.1.1.9589::9589 +.1.3.6.1.2.1.25.4.2.1.1.9590::9590 +.1.3.6.1.2.1.25.4.2.1.1.9591::9591 +.1.3.6.1.2.1.25.4.2.1.1.9592::9592 +.1.3.6.1.2.1.25.4.2.1.1.9593::9593 +.1.3.6.1.2.1.25.4.2.1.1.9594::9594 +.1.3.6.1.2.1.25.4.2.1.1.9595::9595 +.1.3.6.1.2.1.25.4.2.1.1.9596::9596 +.1.3.6.1.2.1.25.4.2.1.1.9597::9597 +.1.3.6.1.2.1.25.4.2.1.1.9598::9598 +.1.3.6.1.2.1.25.4.2.1.1.9599::9599 +.1.3.6.1.2.1.25.4.2.1.1.9600::9600 +.1.3.6.1.2.1.25.4.2.1.1.9601::9601 +.1.3.6.1.2.1.25.4.2.1.1.9602::9602 +.1.3.6.1.2.1.25.4.2.1.1.9603::9603 +.1.3.6.1.2.1.25.4.2.1.1.9604::9604 +.1.3.6.1.2.1.25.4.2.1.1.9605::9605 +.1.3.6.1.2.1.25.4.2.1.1.9607::9607 +.1.3.6.1.2.1.25.4.2.1.1.9608::9608 +.1.3.6.1.2.1.25.4.2.1.1.9609::9609 +.1.3.6.1.2.1.25.4.2.1.1.9610::9610 +.1.3.6.1.2.1.25.4.2.1.1.9611::9611 +.1.3.6.1.2.1.25.4.2.1.1.9612::9612 +.1.3.6.1.2.1.25.4.2.1.1.9613::9613 +.1.3.6.1.2.1.25.4.2.1.1.9614::9614 +.1.3.6.1.2.1.25.4.2.1.1.9615::9615 +.1.3.6.1.2.1.25.4.2.1.1.9616::9616 +.1.3.6.1.2.1.25.4.2.1.1.9617::9617 +.1.3.6.1.2.1.25.4.2.1.1.9618::9618 +.1.3.6.1.2.1.25.4.2.1.1.9619::9619 +.1.3.6.1.2.1.25.4.2.1.1.9626::9626 +.1.3.6.1.2.1.25.4.2.1.1.9627::9627 +.1.3.6.1.2.1.25.4.2.1.1.9747::9747 +.1.3.6.1.2.1.25.4.2.1.1.10481::10481 +.1.3.6.1.2.1.25.4.2.1.1.10515::10515 +.1.3.6.1.2.1.25.4.2.1.1.10606::10606 +.1.3.6.1.2.1.25.4.2.1.1.10663::10663 +.1.3.6.1.2.1.25.4.2.1.1.10664::10664 +.1.3.6.1.2.1.25.4.2.1.1.10665::10665 +.1.3.6.1.2.1.25.4.2.1.1.10667::10667 +.1.3.6.1.2.1.25.4.2.1.1.10668::10668 +.1.3.6.1.2.1.25.4.2.1.1.10669::10669 +.1.3.6.1.2.1.25.4.2.1.1.10716::10716 +.1.3.6.1.2.1.25.4.2.1.1.10778::10778 +.1.3.6.1.2.1.25.4.2.1.1.10948::10948 +.1.3.6.1.2.1.25.4.2.1.1.10982::10982 +.1.3.6.1.2.1.25.4.2.1.1.11059::11059 +.1.3.6.1.2.1.25.4.2.1.1.11119::11119 +.1.3.6.1.2.1.25.4.2.1.1.11156::11156 +.1.3.6.1.2.1.25.4.2.1.1.11446::11446 +.1.3.6.1.2.1.25.4.2.1.1.12835::12835 +.1.3.6.1.2.1.25.4.2.1.1.15180::15180 +.1.3.6.1.2.1.25.4.2.1.1.15181::15181 +.1.3.6.1.2.1.25.4.2.1.1.15182::15182 +.1.3.6.1.2.1.25.4.2.1.1.15330::15330 +.1.3.6.1.2.1.25.4.2.1.1.15332::15332 +.1.3.6.1.2.1.25.4.2.1.1.15543::15543 +.1.3.6.1.2.1.25.4.2.1.1.15648::15648 +.1.3.6.1.2.1.25.4.2.1.1.15694::15694 +.1.3.6.1.2.1.25.4.2.1.1.15909::15909 +.1.3.6.1.2.1.25.4.2.1.1.15974::15974 +.1.3.6.1.2.1.25.4.2.1.1.16107::16107 +.1.3.6.1.2.1.25.4.2.1.1.16577::16577 +.1.3.6.1.2.1.25.4.2.1.1.16798::16798 +.1.3.6.1.2.1.25.4.2.1.1.16799::16799 +.1.3.6.1.2.1.25.4.2.1.1.16800::16800 +.1.3.6.1.2.1.25.4.2.1.1.16801::16801 +.1.3.6.1.2.1.25.4.2.1.1.17054::17054 +.1.3.6.1.2.1.25.4.2.1.1.17068::17068 +.1.3.6.1.2.1.25.4.2.1.1.17253::17253 +.1.3.6.1.2.1.25.4.2.1.1.18141::18141 +.1.3.6.1.2.1.25.4.2.1.1.19721::19721 +.1.3.6.1.2.1.25.4.2.1.1.19806::19806 +.1.3.6.1.2.1.25.4.2.1.1.19807::19807 +.1.3.6.1.2.1.25.4.2.1.1.21078::21078 +.1.3.6.1.2.1.25.4.2.1.1.21085::21085 +.1.3.6.1.2.1.25.4.2.1.1.21790::21790 +.1.3.6.1.2.1.25.4.2.1.1.21999::21999 +.1.3.6.1.2.1.25.4.2.1.1.24690::24690 +.1.3.6.1.2.1.25.4.2.1.1.24714::24714 +.1.3.6.1.2.1.25.4.2.1.1.31039::31039 +.1.3.6.1.2.1.25.4.2.1.1.31048::31048 +.1.3.6.1.2.1.25.4.2.1.1.31059::31059 +.1.3.6.1.2.1.25.4.2.1.1.31527::31527 +.1.3.6.1.2.1.25.4.2.1.1.31588::31588 +.1.3.6.1.2.1.25.4.2.1.1.31705::31705 +.1.3.6.1.2.1.25.4.2.1.1.31710::31710 +.1.3.6.1.2.1.25.4.2.1.1.31768::31768 +.1.3.6.1.2.1.25.4.2.1.1.31780::31780 +.1.3.6.1.2.1.25.4.2.1.1.31830::31830 +.1.3.6.1.2.1.25.4.2.1.1.31893::31893 +.1.3.6.1.2.1.25.4.2.1.1.31894::31894 +.1.3.6.1.2.1.25.4.2.1.1.31895::31895 +.1.3.6.1.2.1.25.4.2.1.1.31896::31896 +.1.3.6.1.2.1.25.4.2.1.1.31921::31921 +.1.3.6.1.2.1.25.4.2.1.1.31922::31922 +.1.3.6.1.2.1.25.4.2.1.3.1::0.0 +.1.3.6.1.2.1.25.4.2.1.3.2::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3::0.0 +.1.3.6.1.2.1.25.4.2.1.3.5::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10::0.0 +.1.3.6.1.2.1.25.4.2.1.3.11::0.0 +.1.3.6.1.2.1.25.4.2.1.3.12::0.0 +.1.3.6.1.2.1.25.4.2.1.3.13::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15::0.0 +.1.3.6.1.2.1.25.4.2.1.3.16::0.0 +.1.3.6.1.2.1.25.4.2.1.3.17::0.0 +.1.3.6.1.2.1.25.4.2.1.3.18::0.0 +.1.3.6.1.2.1.25.4.2.1.3.20::0.0 +.1.3.6.1.2.1.25.4.2.1.3.21::0.0 +.1.3.6.1.2.1.25.4.2.1.3.22::0.0 +.1.3.6.1.2.1.25.4.2.1.3.23::0.0 +.1.3.6.1.2.1.25.4.2.1.3.25::0.0 +.1.3.6.1.2.1.25.4.2.1.3.26::0.0 +.1.3.6.1.2.1.25.4.2.1.3.27::0.0 +.1.3.6.1.2.1.25.4.2.1.3.30::0.0 +.1.3.6.1.2.1.25.4.2.1.3.187::0.0 +.1.3.6.1.2.1.25.4.2.1.3.188::0.0 +.1.3.6.1.2.1.25.4.2.1.3.191::0.0 +.1.3.6.1.2.1.25.4.2.1.3.192::0.0 +.1.3.6.1.2.1.25.4.2.1.3.193::0.0 +.1.3.6.1.2.1.25.4.2.1.3.194::0.0 +.1.3.6.1.2.1.25.4.2.1.3.196::0.0 +.1.3.6.1.2.1.25.4.2.1.3.364::0.0 +.1.3.6.1.2.1.25.4.2.1.3.379::0.0 +.1.3.6.1.2.1.25.4.2.1.3.543::0.0 +.1.3.6.1.2.1.25.4.2.1.3.628::0.0 +.1.3.6.1.2.1.25.4.2.1.3.684::0.0 +.1.3.6.1.2.1.25.4.2.1.3.817::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3462::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3463::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3464::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3465::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3466::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3467::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3468::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3469::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3470::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3471::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3472::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3473::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3474::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3475::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3476::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3477::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3478::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3557::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3648::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3801::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3802::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3818::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3827::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3849::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3858::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3880::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3883::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3894::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3895::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3905::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3906::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3923::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3924::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3926::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3949::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3952::0.0 +.1.3.6.1.2.1.25.4.2.1.3.3955::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4085::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4086::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4159::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4160::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4636::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4649::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4740::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4757::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4766::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4775::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4784::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4785::0.0 +.1.3.6.1.2.1.25.4.2.1.3.4786::0.0 +.1.3.6.1.2.1.25.4.2.1.3.5048::0.0 +.1.3.6.1.2.1.25.4.2.1.3.5714::0.0 +.1.3.6.1.2.1.25.4.2.1.3.5772::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6209::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6275::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6276::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6277::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6481::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6583::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6588::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6634::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6639::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6644::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6674::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6675::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6676::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6677::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6679::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6680::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6681::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6682::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6683::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6695::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6714::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6718::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6719::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6720::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6729::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6733::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6736::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6739::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6742::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6746::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6749::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6752::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6772::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6780::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6784::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6805::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6812::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6866::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6893::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6902::0.0 +.1.3.6.1.2.1.25.4.2.1.3.6989::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7004::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7018::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7044::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7045::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7046::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7054::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7104::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7155::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7164::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7178::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7368::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7816::0.0 +.1.3.6.1.2.1.25.4.2.1.3.7819::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8255::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8256::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8261::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8388::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8389::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8390::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8391::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8404::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8405::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8406::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8407::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8420::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8424::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8434::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8525::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8545::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8565::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8578::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8833::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8843::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8844::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8845::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8876::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8877::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8880::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8881::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8883::0.0 +.1.3.6.1.2.1.25.4.2.1.3.8886::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9013::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9022::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9038::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9047::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9084::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9104::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9159::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9167::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9182::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9234::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9249::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9250::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9251::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9252::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9253::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9411::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9433::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9435::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9554::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9555::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9556::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9557::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9558::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9559::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9560::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9561::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9562::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9563::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9564::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9565::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9566::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9567::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9568::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9569::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9570::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9571::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9572::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9573::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9575::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9576::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9577::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9578::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9579::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9580::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9581::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9582::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9583::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9584::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9585::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9587::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9588::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9589::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9590::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9591::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9592::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9593::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9594::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9595::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9596::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9597::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9598::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9599::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9600::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9601::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9602::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9603::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9604::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9605::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9607::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9608::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9609::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9610::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9611::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9612::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9613::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9614::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9615::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9616::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9617::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9618::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9619::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9626::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9627::0.0 +.1.3.6.1.2.1.25.4.2.1.3.9747::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10481::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10515::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10606::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10663::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10664::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10665::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10667::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10668::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10669::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10716::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10778::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10948::0.0 +.1.3.6.1.2.1.25.4.2.1.3.10982::0.0 +.1.3.6.1.2.1.25.4.2.1.3.11059::0.0 +.1.3.6.1.2.1.25.4.2.1.3.11119::0.0 +.1.3.6.1.2.1.25.4.2.1.3.11156::0.0 +.1.3.6.1.2.1.25.4.2.1.3.11446::0.0 +.1.3.6.1.2.1.25.4.2.1.3.12835::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15180::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15181::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15182::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15330::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15332::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15543::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15648::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15694::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15909::0.0 +.1.3.6.1.2.1.25.4.2.1.3.15974::0.0 +.1.3.6.1.2.1.25.4.2.1.3.16107::0.0 +.1.3.6.1.2.1.25.4.2.1.3.16577::0.0 +.1.3.6.1.2.1.25.4.2.1.3.16798::0.0 +.1.3.6.1.2.1.25.4.2.1.3.16799::0.0 +.1.3.6.1.2.1.25.4.2.1.3.16800::0.0 +.1.3.6.1.2.1.25.4.2.1.3.16801::0.0 +.1.3.6.1.2.1.25.4.2.1.3.17054::0.0 +.1.3.6.1.2.1.25.4.2.1.3.17068::0.0 +.1.3.6.1.2.1.25.4.2.1.3.17253::0.0 +.1.3.6.1.2.1.25.4.2.1.3.18141::0.0 +.1.3.6.1.2.1.25.4.2.1.3.19721::0.0 +.1.3.6.1.2.1.25.4.2.1.3.19806::0.0 +.1.3.6.1.2.1.25.4.2.1.3.19807::0.0 +.1.3.6.1.2.1.25.4.2.1.3.21078::0.0 +.1.3.6.1.2.1.25.4.2.1.3.21085::0.0 +.1.3.6.1.2.1.25.4.2.1.3.21790::0.0 +.1.3.6.1.2.1.25.4.2.1.3.21999::0.0 +.1.3.6.1.2.1.25.4.2.1.3.24690::0.0 +.1.3.6.1.2.1.25.4.2.1.3.24714::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31039::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31048::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31059::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31527::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31588::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31705::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31710::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31768::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31780::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31830::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31893::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31894::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31895::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31896::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31921::0.0 +.1.3.6.1.2.1.25.4.2.1.3.31922::0.0 +.1.3.6.1.2.1.25.4.2.1.6.1::4 +.1.3.6.1.2.1.25.4.2.1.6.2::2 +.1.3.6.1.2.1.25.4.2.1.6.3::2 +.1.3.6.1.2.1.25.4.2.1.6.5::2 +.1.3.6.1.2.1.25.4.2.1.6.7::2 +.1.3.6.1.2.1.25.4.2.1.6.8::2 +.1.3.6.1.2.1.25.4.2.1.6.9::2 +.1.3.6.1.2.1.25.4.2.1.6.10::2 +.1.3.6.1.2.1.25.4.2.1.6.11::2 +.1.3.6.1.2.1.25.4.2.1.6.12::2 +.1.3.6.1.2.1.25.4.2.1.6.13::2 +.1.3.6.1.2.1.25.4.2.1.6.15::2 +.1.3.6.1.2.1.25.4.2.1.6.16::2 +.1.3.6.1.2.1.25.4.2.1.6.17::2 +.1.3.6.1.2.1.25.4.2.1.6.18::2 +.1.3.6.1.2.1.25.4.2.1.6.20::2 +.1.3.6.1.2.1.25.4.2.1.6.21::2 +.1.3.6.1.2.1.25.4.2.1.6.22::2 +.1.3.6.1.2.1.25.4.2.1.6.23::2 +.1.3.6.1.2.1.25.4.2.1.6.25::2 +.1.3.6.1.2.1.25.4.2.1.6.26::2 +.1.3.6.1.2.1.25.4.2.1.6.27::2 +.1.3.6.1.2.1.25.4.2.1.6.30::2 +.1.3.6.1.2.1.25.4.2.1.6.187::2 +.1.3.6.1.2.1.25.4.2.1.6.188::2 +.1.3.6.1.2.1.25.4.2.1.6.191::2 +.1.3.6.1.2.1.25.4.2.1.6.192::2 +.1.3.6.1.2.1.25.4.2.1.6.193::2 +.1.3.6.1.2.1.25.4.2.1.6.194::2 +.1.3.6.1.2.1.25.4.2.1.6.196::2 +.1.3.6.1.2.1.25.4.2.1.6.364::2 +.1.3.6.1.2.1.25.4.2.1.6.379::2 +.1.3.6.1.2.1.25.4.2.1.6.543::2 +.1.3.6.1.2.1.25.4.2.1.6.628::2 +.1.3.6.1.2.1.25.4.2.1.6.684::2 +.1.3.6.1.2.1.25.4.2.1.6.817::2 +.1.3.6.1.2.1.25.4.2.1.6.3462::2 +.1.3.6.1.2.1.25.4.2.1.6.3463::2 +.1.3.6.1.2.1.25.4.2.1.6.3464::2 +.1.3.6.1.2.1.25.4.2.1.6.3465::2 +.1.3.6.1.2.1.25.4.2.1.6.3466::2 +.1.3.6.1.2.1.25.4.2.1.6.3467::2 +.1.3.6.1.2.1.25.4.2.1.6.3468::2 +.1.3.6.1.2.1.25.4.2.1.6.3469::2 +.1.3.6.1.2.1.25.4.2.1.6.3470::2 +.1.3.6.1.2.1.25.4.2.1.6.3471::2 +.1.3.6.1.2.1.25.4.2.1.6.3472::2 +.1.3.6.1.2.1.25.4.2.1.6.3473::2 +.1.3.6.1.2.1.25.4.2.1.6.3474::2 +.1.3.6.1.2.1.25.4.2.1.6.3475::2 +.1.3.6.1.2.1.25.4.2.1.6.3476::2 +.1.3.6.1.2.1.25.4.2.1.6.3477::2 +.1.3.6.1.2.1.25.4.2.1.6.3478::2 +.1.3.6.1.2.1.25.4.2.1.6.3557::2 +.1.3.6.1.2.1.25.4.2.1.6.3648::2 +.1.3.6.1.2.1.25.4.2.1.6.3801::2 +.1.3.6.1.2.1.25.4.2.1.6.3802::2 +.1.3.6.1.2.1.25.4.2.1.6.3818::2 +.1.3.6.1.2.1.25.4.2.1.6.3827::2 +.1.3.6.1.2.1.25.4.2.1.6.3849::2 +.1.3.6.1.2.1.25.4.2.1.6.3858::2 +.1.3.6.1.2.1.25.4.2.1.6.3880::2 +.1.3.6.1.2.1.25.4.2.1.6.3883::2 +.1.3.6.1.2.1.25.4.2.1.6.3894::2 +.1.3.6.1.2.1.25.4.2.1.6.3895::2 +.1.3.6.1.2.1.25.4.2.1.6.3905::2 +.1.3.6.1.2.1.25.4.2.1.6.3906::2 +.1.3.6.1.2.1.25.4.2.1.6.3923::2 +.1.3.6.1.2.1.25.4.2.1.6.3924::2 +.1.3.6.1.2.1.25.4.2.1.6.3926::2 +.1.3.6.1.2.1.25.4.2.1.6.3949::2 +.1.3.6.1.2.1.25.4.2.1.6.3952::2 +.1.3.6.1.2.1.25.4.2.1.6.3955::2 +.1.3.6.1.2.1.25.4.2.1.6.4085::2 +.1.3.6.1.2.1.25.4.2.1.6.4086::2 +.1.3.6.1.2.1.25.4.2.1.6.4159::2 +.1.3.6.1.2.1.25.4.2.1.6.4160::2 +.1.3.6.1.2.1.25.4.2.1.6.4636::2 +.1.3.6.1.2.1.25.4.2.1.6.4649::2 +.1.3.6.1.2.1.25.4.2.1.6.4740::2 +.1.3.6.1.2.1.25.4.2.1.6.4757::4 +.1.3.6.1.2.1.25.4.2.1.6.4766::2 +.1.3.6.1.2.1.25.4.2.1.6.4775::4 +.1.3.6.1.2.1.25.4.2.1.6.4784::2 +.1.3.6.1.2.1.25.4.2.1.6.4785::2 +.1.3.6.1.2.1.25.4.2.1.6.4786::2 +.1.3.6.1.2.1.25.4.2.1.6.5048::2 +.1.3.6.1.2.1.25.4.2.1.6.5714::2 +.1.3.6.1.2.1.25.4.2.1.6.5772::2 +.1.3.6.1.2.1.25.4.2.1.6.6209::2 +.1.3.6.1.2.1.25.4.2.1.6.6275::2 +.1.3.6.1.2.1.25.4.2.1.6.6276::2 +.1.3.6.1.2.1.25.4.2.1.6.6277::2 +.1.3.6.1.2.1.25.4.2.1.6.6481::2 +.1.3.6.1.2.1.25.4.2.1.6.6583::2 +.1.3.6.1.2.1.25.4.2.1.6.6588::2 +.1.3.6.1.2.1.25.4.2.1.6.6634::4 +.1.3.6.1.2.1.25.4.2.1.6.6639::2 +.1.3.6.1.2.1.25.4.2.1.6.6644::4 +.1.3.6.1.2.1.25.4.2.1.6.6674::2 +.1.3.6.1.2.1.25.4.2.1.6.6675::2 +.1.3.6.1.2.1.25.4.2.1.6.6676::2 +.1.3.6.1.2.1.25.4.2.1.6.6677::2 +.1.3.6.1.2.1.25.4.2.1.6.6679::2 +.1.3.6.1.2.1.25.4.2.1.6.6680::2 +.1.3.6.1.2.1.25.4.2.1.6.6681::2 +.1.3.6.1.2.1.25.4.2.1.6.6682::2 +.1.3.6.1.2.1.25.4.2.1.6.6683::2 +.1.3.6.1.2.1.25.4.2.1.6.6695::2 +.1.3.6.1.2.1.25.4.2.1.6.6714::2 +.1.3.6.1.2.1.25.4.2.1.6.6718::2 +.1.3.6.1.2.1.25.4.2.1.6.6719::2 +.1.3.6.1.2.1.25.4.2.1.6.6720::2 +.1.3.6.1.2.1.25.4.2.1.6.6729::2 +.1.3.6.1.2.1.25.4.2.1.6.6733::2 +.1.3.6.1.2.1.25.4.2.1.6.6736::2 +.1.3.6.1.2.1.25.4.2.1.6.6739::2 +.1.3.6.1.2.1.25.4.2.1.6.6742::2 +.1.3.6.1.2.1.25.4.2.1.6.6746::2 +.1.3.6.1.2.1.25.4.2.1.6.6749::2 +.1.3.6.1.2.1.25.4.2.1.6.6752::2 +.1.3.6.1.2.1.25.4.2.1.6.6772::2 +.1.3.6.1.2.1.25.4.2.1.6.6780::2 +.1.3.6.1.2.1.25.4.2.1.6.6784::2 +.1.3.6.1.2.1.25.4.2.1.6.6805::4 +.1.3.6.1.2.1.25.4.2.1.6.6812::2 +.1.3.6.1.2.1.25.4.2.1.6.6866::2 +.1.3.6.1.2.1.25.4.2.1.6.6893::2 +.1.3.6.1.2.1.25.4.2.1.6.6902::4 +.1.3.6.1.2.1.25.4.2.1.6.6989::4 +.1.3.6.1.2.1.25.4.2.1.6.7004::4 +.1.3.6.1.2.1.25.4.2.1.6.7018::2 +.1.3.6.1.2.1.25.4.2.1.6.7044::2 +.1.3.6.1.2.1.25.4.2.1.6.7045::2 +.1.3.6.1.2.1.25.4.2.1.6.7046::2 +.1.3.6.1.2.1.25.4.2.1.6.7054::2 +.1.3.6.1.2.1.25.4.2.1.6.7104::4 +.1.3.6.1.2.1.25.4.2.1.6.7155::4 +.1.3.6.1.2.1.25.4.2.1.6.7164::2 +.1.3.6.1.2.1.25.4.2.1.6.7178::4 +.1.3.6.1.2.1.25.4.2.1.6.7368::4 +.1.3.6.1.2.1.25.4.2.1.6.7816::4 +.1.3.6.1.2.1.25.4.2.1.6.7819::4 +.1.3.6.1.2.1.25.4.2.1.6.8255::4 +.1.3.6.1.2.1.25.4.2.1.6.8256::4 +.1.3.6.1.2.1.25.4.2.1.6.8261::4 +.1.3.6.1.2.1.25.4.2.1.6.8388::4 +.1.3.6.1.2.1.25.4.2.1.6.8389::4 +.1.3.6.1.2.1.25.4.2.1.6.8390::4 +.1.3.6.1.2.1.25.4.2.1.6.8391::4 +.1.3.6.1.2.1.25.4.2.1.6.8404::4 +.1.3.6.1.2.1.25.4.2.1.6.8405::4 +.1.3.6.1.2.1.25.4.2.1.6.8406::4 +.1.3.6.1.2.1.25.4.2.1.6.8407::4 +.1.3.6.1.2.1.25.4.2.1.6.8420::4 +.1.3.6.1.2.1.25.4.2.1.6.8424::4 +.1.3.6.1.2.1.25.4.2.1.6.8434::4 +.1.3.6.1.2.1.25.4.2.1.6.8525::4 +.1.3.6.1.2.1.25.4.2.1.6.8545::4 +.1.3.6.1.2.1.25.4.2.1.6.8565::4 +.1.3.6.1.2.1.25.4.2.1.6.8578::4 +.1.3.6.1.2.1.25.4.2.1.6.8833::2 +.1.3.6.1.2.1.25.4.2.1.6.8843::2 +.1.3.6.1.2.1.25.4.2.1.6.8844::2 +.1.3.6.1.2.1.25.4.2.1.6.8845::2 +.1.3.6.1.2.1.25.4.2.1.6.8876::2 +.1.3.6.1.2.1.25.4.2.1.6.8877::2 +.1.3.6.1.2.1.25.4.2.1.6.8880::2 +.1.3.6.1.2.1.25.4.2.1.6.8881::2 +.1.3.6.1.2.1.25.4.2.1.6.8883::2 +.1.3.6.1.2.1.25.4.2.1.6.8886::2 +.1.3.6.1.2.1.25.4.2.1.6.9013::2 +.1.3.6.1.2.1.25.4.2.1.6.9022::2 +.1.3.6.1.2.1.25.4.2.1.6.9038::2 +.1.3.6.1.2.1.25.4.2.1.6.9047::2 +.1.3.6.1.2.1.25.4.2.1.6.9084::4 +.1.3.6.1.2.1.25.4.2.1.6.9104::4 +.1.3.6.1.2.1.25.4.2.1.6.9159::4 +.1.3.6.1.2.1.25.4.2.1.6.9167::4 +.1.3.6.1.2.1.25.4.2.1.6.9182::4 +.1.3.6.1.2.1.25.4.2.1.6.9234::2 +.1.3.6.1.2.1.25.4.2.1.6.9249::2 +.1.3.6.1.2.1.25.4.2.1.6.9250::2 +.1.3.6.1.2.1.25.4.2.1.6.9251::2 +.1.3.6.1.2.1.25.4.2.1.6.9252::2 +.1.3.6.1.2.1.25.4.2.1.6.9253::2 +.1.3.6.1.2.1.25.4.2.1.6.9411::4 +.1.3.6.1.2.1.25.4.2.1.6.9433::2 +.1.3.6.1.2.1.25.4.2.1.6.9435::2 +.1.3.6.1.2.1.25.4.2.1.6.9554::2 +.1.3.6.1.2.1.25.4.2.1.6.9555::2 +.1.3.6.1.2.1.25.4.2.1.6.9556::2 +.1.3.6.1.2.1.25.4.2.1.6.9557::2 +.1.3.6.1.2.1.25.4.2.1.6.9558::2 +.1.3.6.1.2.1.25.4.2.1.6.9559::2 +.1.3.6.1.2.1.25.4.2.1.6.9560::2 +.1.3.6.1.2.1.25.4.2.1.6.9561::2 +.1.3.6.1.2.1.25.4.2.1.6.9562::2 +.1.3.6.1.2.1.25.4.2.1.6.9563::2 +.1.3.6.1.2.1.25.4.2.1.6.9564::2 +.1.3.6.1.2.1.25.4.2.1.6.9565::2 +.1.3.6.1.2.1.25.4.2.1.6.9566::2 +.1.3.6.1.2.1.25.4.2.1.6.9567::2 +.1.3.6.1.2.1.25.4.2.1.6.9568::2 +.1.3.6.1.2.1.25.4.2.1.6.9569::2 +.1.3.6.1.2.1.25.4.2.1.6.9570::2 +.1.3.6.1.2.1.25.4.2.1.6.9571::2 +.1.3.6.1.2.1.25.4.2.1.6.9572::2 +.1.3.6.1.2.1.25.4.2.1.6.9573::2 +.1.3.6.1.2.1.25.4.2.1.6.9575::2 +.1.3.6.1.2.1.25.4.2.1.6.9576::2 +.1.3.6.1.2.1.25.4.2.1.6.9577::2 +.1.3.6.1.2.1.25.4.2.1.6.9578::2 +.1.3.6.1.2.1.25.4.2.1.6.9579::2 +.1.3.6.1.2.1.25.4.2.1.6.9580::2 +.1.3.6.1.2.1.25.4.2.1.6.9581::2 +.1.3.6.1.2.1.25.4.2.1.6.9582::2 +.1.3.6.1.2.1.25.4.2.1.6.9583::2 +.1.3.6.1.2.1.25.4.2.1.6.9584::2 +.1.3.6.1.2.1.25.4.2.1.6.9585::2 +.1.3.6.1.2.1.25.4.2.1.6.9587::2 +.1.3.6.1.2.1.25.4.2.1.6.9588::2 +.1.3.6.1.2.1.25.4.2.1.6.9589::2 +.1.3.6.1.2.1.25.4.2.1.6.9590::2 +.1.3.6.1.2.1.25.4.2.1.6.9591::2 +.1.3.6.1.2.1.25.4.2.1.6.9592::2 +.1.3.6.1.2.1.25.4.2.1.6.9593::2 +.1.3.6.1.2.1.25.4.2.1.6.9594::2 +.1.3.6.1.2.1.25.4.2.1.6.9595::2 +.1.3.6.1.2.1.25.4.2.1.6.9596::2 +.1.3.6.1.2.1.25.4.2.1.6.9597::2 +.1.3.6.1.2.1.25.4.2.1.6.9598::2 +.1.3.6.1.2.1.25.4.2.1.6.9599::2 +.1.3.6.1.2.1.25.4.2.1.6.9600::2 +.1.3.6.1.2.1.25.4.2.1.6.9601::2 +.1.3.6.1.2.1.25.4.2.1.6.9602::2 +.1.3.6.1.2.1.25.4.2.1.6.9603::2 +.1.3.6.1.2.1.25.4.2.1.6.9604::2 +.1.3.6.1.2.1.25.4.2.1.6.9605::2 +.1.3.6.1.2.1.25.4.2.1.6.9607::2 +.1.3.6.1.2.1.25.4.2.1.6.9608::2 +.1.3.6.1.2.1.25.4.2.1.6.9609::2 +.1.3.6.1.2.1.25.4.2.1.6.9610::2 +.1.3.6.1.2.1.25.4.2.1.6.9611::2 +.1.3.6.1.2.1.25.4.2.1.6.9612::2 +.1.3.6.1.2.1.25.4.2.1.6.9613::2 +.1.3.6.1.2.1.25.4.2.1.6.9614::2 +.1.3.6.1.2.1.25.4.2.1.6.9615::2 +.1.3.6.1.2.1.25.4.2.1.6.9616::2 +.1.3.6.1.2.1.25.4.2.1.6.9617::2 +.1.3.6.1.2.1.25.4.2.1.6.9618::2 +.1.3.6.1.2.1.25.4.2.1.6.9619::2 +.1.3.6.1.2.1.25.4.2.1.6.9626::2 +.1.3.6.1.2.1.25.4.2.1.6.9627::2 +.1.3.6.1.2.1.25.4.2.1.6.9747::4 +.1.3.6.1.2.1.25.4.2.1.6.10481::4 +.1.3.6.1.2.1.25.4.2.1.6.10515::4 +.1.3.6.1.2.1.25.4.2.1.6.10606::4 +.1.3.6.1.2.1.25.4.2.1.6.10663::4 +.1.3.6.1.2.1.25.4.2.1.6.10664::4 +.1.3.6.1.2.1.25.4.2.1.6.10665::4 +.1.3.6.1.2.1.25.4.2.1.6.10667::4 +.1.3.6.1.2.1.25.4.2.1.6.10668::4 +.1.3.6.1.2.1.25.4.2.1.6.10669::4 +.1.3.6.1.2.1.25.4.2.1.6.10716::4 +.1.3.6.1.2.1.25.4.2.1.6.10778::4 +.1.3.6.1.2.1.25.4.2.1.6.10948::4 +.1.3.6.1.2.1.25.4.2.1.6.10982::4 +.1.3.6.1.2.1.25.4.2.1.6.11059::4 +.1.3.6.1.2.1.25.4.2.1.6.11119::4 +.1.3.6.1.2.1.25.4.2.1.6.11156::4 +.1.3.6.1.2.1.25.4.2.1.6.11446::4 +.1.3.6.1.2.1.25.4.2.1.6.12835::2 +.1.3.6.1.2.1.25.4.2.1.6.15180::2 +.1.3.6.1.2.1.25.4.2.1.6.15181::2 +.1.3.6.1.2.1.25.4.2.1.6.15182::2 +.1.3.6.1.2.1.25.4.2.1.6.15330::4 +.1.3.6.1.2.1.25.4.2.1.6.15332::4 +.1.3.6.1.2.1.25.4.2.1.6.15543::4 +.1.3.6.1.2.1.25.4.2.1.6.15648::4 +.1.3.6.1.2.1.25.4.2.1.6.15694::4 +.1.3.6.1.2.1.25.4.2.1.6.15909::4 +.1.3.6.1.2.1.25.4.2.1.6.15974::4 +.1.3.6.1.2.1.25.4.2.1.6.16107::4 +.1.3.6.1.2.1.25.4.2.1.6.16577::4 +.1.3.6.1.2.1.25.4.2.1.6.16798::4 +.1.3.6.1.2.1.25.4.2.1.6.16799::4 +.1.3.6.1.2.1.25.4.2.1.6.16800::4 +.1.3.6.1.2.1.25.4.2.1.6.16801::4 +.1.3.6.1.2.1.25.4.2.1.6.17054::4 +.1.3.6.1.2.1.25.4.2.1.6.17068::4 +.1.3.6.1.2.1.25.4.2.1.6.17253::4 +.1.3.6.1.2.1.25.4.2.1.6.18141::4 +.1.3.6.1.2.1.25.4.2.1.6.19721::4 +.1.3.6.1.2.1.25.4.2.1.6.19806::4 +.1.3.6.1.2.1.25.4.2.1.6.19807::4 +.1.3.6.1.2.1.25.4.2.1.6.21078::4 +.1.3.6.1.2.1.25.4.2.1.6.21085::4 +.1.3.6.1.2.1.25.4.2.1.6.21790::4 +.1.3.6.1.2.1.25.4.2.1.6.21999::4 +.1.3.6.1.2.1.25.4.2.1.6.24690::4 +.1.3.6.1.2.1.25.4.2.1.6.24714::4 +.1.3.6.1.2.1.25.4.2.1.6.31039::2 +.1.3.6.1.2.1.25.4.2.1.6.31048::2 +.1.3.6.1.2.1.25.4.2.1.6.31059::2 +.1.3.6.1.2.1.25.4.2.1.6.31527::4 +.1.3.6.1.2.1.25.4.2.1.6.31588::4 +.1.3.6.1.2.1.25.4.2.1.6.31705::4 +.1.3.6.1.2.1.25.4.2.1.6.31710::4 +.1.3.6.1.2.1.25.4.2.1.6.31768::4 +.1.3.6.1.2.1.25.4.2.1.6.31780::4 +.1.3.6.1.2.1.25.4.2.1.6.31830::4 +.1.3.6.1.2.1.25.4.2.1.6.31893::4 +.1.3.6.1.2.1.25.4.2.1.6.31894::4 +.1.3.6.1.2.1.25.4.2.1.6.31895::4 +.1.3.6.1.2.1.25.4.2.1.6.31896::4 +.1.3.6.1.2.1.25.4.2.1.6.31921::4 +.1.3.6.1.2.1.25.4.2.1.6.31922::4 +.1.3.6.1.2.1.25.4.2.1.7.1::2 +.1.3.6.1.2.1.25.4.2.1.7.2::2 +.1.3.6.1.2.1.25.4.2.1.7.3::2 +.1.3.6.1.2.1.25.4.2.1.7.5::2 +.1.3.6.1.2.1.25.4.2.1.7.7::2 +.1.3.6.1.2.1.25.4.2.1.7.8::2 +.1.3.6.1.2.1.25.4.2.1.7.9::2 +.1.3.6.1.2.1.25.4.2.1.7.10::2 +.1.3.6.1.2.1.25.4.2.1.7.11::2 +.1.3.6.1.2.1.25.4.2.1.7.12::2 +.1.3.6.1.2.1.25.4.2.1.7.13::2 +.1.3.6.1.2.1.25.4.2.1.7.15::2 +.1.3.6.1.2.1.25.4.2.1.7.16::2 +.1.3.6.1.2.1.25.4.2.1.7.17::2 +.1.3.6.1.2.1.25.4.2.1.7.18::2 +.1.3.6.1.2.1.25.4.2.1.7.20::2 +.1.3.6.1.2.1.25.4.2.1.7.21::2 +.1.3.6.1.2.1.25.4.2.1.7.22::2 +.1.3.6.1.2.1.25.4.2.1.7.23::2 +.1.3.6.1.2.1.25.4.2.1.7.25::2 +.1.3.6.1.2.1.25.4.2.1.7.26::2 +.1.3.6.1.2.1.25.4.2.1.7.27::2 +.1.3.6.1.2.1.25.4.2.1.7.30::2 +.1.3.6.1.2.1.25.4.2.1.7.187::2 +.1.3.6.1.2.1.25.4.2.1.7.188::2 +.1.3.6.1.2.1.25.4.2.1.7.191::2 +.1.3.6.1.2.1.25.4.2.1.7.192::2 +.1.3.6.1.2.1.25.4.2.1.7.193::2 +.1.3.6.1.2.1.25.4.2.1.7.194::2 +.1.3.6.1.2.1.25.4.2.1.7.196::2 +.1.3.6.1.2.1.25.4.2.1.7.364::2 +.1.3.6.1.2.1.25.4.2.1.7.379::2 +.1.3.6.1.2.1.25.4.2.1.7.543::2 +.1.3.6.1.2.1.25.4.2.1.7.628::2 +.1.3.6.1.2.1.25.4.2.1.7.684::2 +.1.3.6.1.2.1.25.4.2.1.7.817::2 +.1.3.6.1.2.1.25.4.2.1.7.3462::2 +.1.3.6.1.2.1.25.4.2.1.7.3463::2 +.1.3.6.1.2.1.25.4.2.1.7.3464::2 +.1.3.6.1.2.1.25.4.2.1.7.3465::2 +.1.3.6.1.2.1.25.4.2.1.7.3466::2 +.1.3.6.1.2.1.25.4.2.1.7.3467::2 +.1.3.6.1.2.1.25.4.2.1.7.3468::2 +.1.3.6.1.2.1.25.4.2.1.7.3469::2 +.1.3.6.1.2.1.25.4.2.1.7.3470::2 +.1.3.6.1.2.1.25.4.2.1.7.3471::2 +.1.3.6.1.2.1.25.4.2.1.7.3472::2 +.1.3.6.1.2.1.25.4.2.1.7.3473::2 +.1.3.6.1.2.1.25.4.2.1.7.3474::2 +.1.3.6.1.2.1.25.4.2.1.7.3475::2 +.1.3.6.1.2.1.25.4.2.1.7.3476::2 +.1.3.6.1.2.1.25.4.2.1.7.3477::2 +.1.3.6.1.2.1.25.4.2.1.7.3478::2 +.1.3.6.1.2.1.25.4.2.1.7.3557::2 +.1.3.6.1.2.1.25.4.2.1.7.3648::2 +.1.3.6.1.2.1.25.4.2.1.7.3801::2 +.1.3.6.1.2.1.25.4.2.1.7.3802::2 +.1.3.6.1.2.1.25.4.2.1.7.3818::2 +.1.3.6.1.2.1.25.4.2.1.7.3827::2 +.1.3.6.1.2.1.25.4.2.1.7.3849::2 +.1.3.6.1.2.1.25.4.2.1.7.3858::2 +.1.3.6.1.2.1.25.4.2.1.7.3880::2 +.1.3.6.1.2.1.25.4.2.1.7.3883::2 +.1.3.6.1.2.1.25.4.2.1.7.3894::2 +.1.3.6.1.2.1.25.4.2.1.7.3895::2 +.1.3.6.1.2.1.25.4.2.1.7.3905::2 +.1.3.6.1.2.1.25.4.2.1.7.3906::2 +.1.3.6.1.2.1.25.4.2.1.7.3923::2 +.1.3.6.1.2.1.25.4.2.1.7.3924::2 +.1.3.6.1.2.1.25.4.2.1.7.3926::2 +.1.3.6.1.2.1.25.4.2.1.7.3949::2 +.1.3.6.1.2.1.25.4.2.1.7.3952::2 +.1.3.6.1.2.1.25.4.2.1.7.3955::2 +.1.3.6.1.2.1.25.4.2.1.7.4085::2 +.1.3.6.1.2.1.25.4.2.1.7.4086::2 +.1.3.6.1.2.1.25.4.2.1.7.4159::2 +.1.3.6.1.2.1.25.4.2.1.7.4160::2 +.1.3.6.1.2.1.25.4.2.1.7.4636::2 +.1.3.6.1.2.1.25.4.2.1.7.4649::2 +.1.3.6.1.2.1.25.4.2.1.7.4740::2 +.1.3.6.1.2.1.25.4.2.1.7.4757::2 +.1.3.6.1.2.1.25.4.2.1.7.4766::2 +.1.3.6.1.2.1.25.4.2.1.7.4775::2 +.1.3.6.1.2.1.25.4.2.1.7.4784::2 +.1.3.6.1.2.1.25.4.2.1.7.4785::2 +.1.3.6.1.2.1.25.4.2.1.7.4786::2 +.1.3.6.1.2.1.25.4.2.1.7.5048::2 +.1.3.6.1.2.1.25.4.2.1.7.5714::2 +.1.3.6.1.2.1.25.4.2.1.7.5772::2 +.1.3.6.1.2.1.25.4.2.1.7.6209::2 +.1.3.6.1.2.1.25.4.2.1.7.6275::2 +.1.3.6.1.2.1.25.4.2.1.7.6276::2 +.1.3.6.1.2.1.25.4.2.1.7.6277::2 +.1.3.6.1.2.1.25.4.2.1.7.6481::2 +.1.3.6.1.2.1.25.4.2.1.7.6583::2 +.1.3.6.1.2.1.25.4.2.1.7.6588::2 +.1.3.6.1.2.1.25.4.2.1.7.6634::2 +.1.3.6.1.2.1.25.4.2.1.7.6639::2 +.1.3.6.1.2.1.25.4.2.1.7.6644::2 +.1.3.6.1.2.1.25.4.2.1.7.6674::2 +.1.3.6.1.2.1.25.4.2.1.7.6675::2 +.1.3.6.1.2.1.25.4.2.1.7.6676::2 +.1.3.6.1.2.1.25.4.2.1.7.6677::2 +.1.3.6.1.2.1.25.4.2.1.7.6679::2 +.1.3.6.1.2.1.25.4.2.1.7.6680::2 +.1.3.6.1.2.1.25.4.2.1.7.6681::2 +.1.3.6.1.2.1.25.4.2.1.7.6682::2 +.1.3.6.1.2.1.25.4.2.1.7.6683::2 +.1.3.6.1.2.1.25.4.2.1.7.6695::2 +.1.3.6.1.2.1.25.4.2.1.7.6714::2 +.1.3.6.1.2.1.25.4.2.1.7.6718::2 +.1.3.6.1.2.1.25.4.2.1.7.6719::2 +.1.3.6.1.2.1.25.4.2.1.7.6720::2 +.1.3.6.1.2.1.25.4.2.1.7.6729::2 +.1.3.6.1.2.1.25.4.2.1.7.6733::2 +.1.3.6.1.2.1.25.4.2.1.7.6736::2 +.1.3.6.1.2.1.25.4.2.1.7.6739::2 +.1.3.6.1.2.1.25.4.2.1.7.6742::2 +.1.3.6.1.2.1.25.4.2.1.7.6746::2 +.1.3.6.1.2.1.25.4.2.1.7.6749::2 +.1.3.6.1.2.1.25.4.2.1.7.6752::2 +.1.3.6.1.2.1.25.4.2.1.7.6772::2 +.1.3.6.1.2.1.25.4.2.1.7.6780::2 +.1.3.6.1.2.1.25.4.2.1.7.6784::2 +.1.3.6.1.2.1.25.4.2.1.7.6805::2 +.1.3.6.1.2.1.25.4.2.1.7.6812::2 +.1.3.6.1.2.1.25.4.2.1.7.6866::2 +.1.3.6.1.2.1.25.4.2.1.7.6893::2 +.1.3.6.1.2.1.25.4.2.1.7.6902::2 +.1.3.6.1.2.1.25.4.2.1.7.6989::2 +.1.3.6.1.2.1.25.4.2.1.7.7004::2 +.1.3.6.1.2.1.25.4.2.1.7.7018::2 +.1.3.6.1.2.1.25.4.2.1.7.7044::2 +.1.3.6.1.2.1.25.4.2.1.7.7045::2 +.1.3.6.1.2.1.25.4.2.1.7.7046::2 +.1.3.6.1.2.1.25.4.2.1.7.7054::2 +.1.3.6.1.2.1.25.4.2.1.7.7104::2 +.1.3.6.1.2.1.25.4.2.1.7.7155::2 +.1.3.6.1.2.1.25.4.2.1.7.7164::2 +.1.3.6.1.2.1.25.4.2.1.7.7178::2 +.1.3.6.1.2.1.25.4.2.1.7.7368::2 +.1.3.6.1.2.1.25.4.2.1.7.7816::2 +.1.3.6.1.2.1.25.4.2.1.7.7819::2 +.1.3.6.1.2.1.25.4.2.1.7.8255::2 +.1.3.6.1.2.1.25.4.2.1.7.8256::2 +.1.3.6.1.2.1.25.4.2.1.7.8261::2 +.1.3.6.1.2.1.25.4.2.1.7.8388::2 +.1.3.6.1.2.1.25.4.2.1.7.8389::2 +.1.3.6.1.2.1.25.4.2.1.7.8390::2 +.1.3.6.1.2.1.25.4.2.1.7.8391::2 +.1.3.6.1.2.1.25.4.2.1.7.8404::2 +.1.3.6.1.2.1.25.4.2.1.7.8405::2 +.1.3.6.1.2.1.25.4.2.1.7.8406::2 +.1.3.6.1.2.1.25.4.2.1.7.8407::2 +.1.3.6.1.2.1.25.4.2.1.7.8420::2 +.1.3.6.1.2.1.25.4.2.1.7.8424::2 +.1.3.6.1.2.1.25.4.2.1.7.8434::2 +.1.3.6.1.2.1.25.4.2.1.7.8525::2 +.1.3.6.1.2.1.25.4.2.1.7.8545::2 +.1.3.6.1.2.1.25.4.2.1.7.8565::2 +.1.3.6.1.2.1.25.4.2.1.7.8578::2 +.1.3.6.1.2.1.25.4.2.1.7.8833::2 +.1.3.6.1.2.1.25.4.2.1.7.8843::2 +.1.3.6.1.2.1.25.4.2.1.7.8844::2 +.1.3.6.1.2.1.25.4.2.1.7.8845::2 +.1.3.6.1.2.1.25.4.2.1.7.8876::2 +.1.3.6.1.2.1.25.4.2.1.7.8877::2 +.1.3.6.1.2.1.25.4.2.1.7.8880::2 +.1.3.6.1.2.1.25.4.2.1.7.8881::2 +.1.3.6.1.2.1.25.4.2.1.7.8883::2 +.1.3.6.1.2.1.25.4.2.1.7.8886::2 +.1.3.6.1.2.1.25.4.2.1.7.9013::2 +.1.3.6.1.2.1.25.4.2.1.7.9022::2 +.1.3.6.1.2.1.25.4.2.1.7.9038::2 +.1.3.6.1.2.1.25.4.2.1.7.9047::2 +.1.3.6.1.2.1.25.4.2.1.7.9084::2 +.1.3.6.1.2.1.25.4.2.1.7.9104::2 +.1.3.6.1.2.1.25.4.2.1.7.9159::2 +.1.3.6.1.2.1.25.4.2.1.7.9167::2 +.1.3.6.1.2.1.25.4.2.1.7.9182::2 +.1.3.6.1.2.1.25.4.2.1.7.9234::2 +.1.3.6.1.2.1.25.4.2.1.7.9249::2 +.1.3.6.1.2.1.25.4.2.1.7.9250::2 +.1.3.6.1.2.1.25.4.2.1.7.9251::2 +.1.3.6.1.2.1.25.4.2.1.7.9252::2 +.1.3.6.1.2.1.25.4.2.1.7.9253::2 +.1.3.6.1.2.1.25.4.2.1.7.9411::2 +.1.3.6.1.2.1.25.4.2.1.7.9433::2 +.1.3.6.1.2.1.25.4.2.1.7.9435::2 +.1.3.6.1.2.1.25.4.2.1.7.9554::2 +.1.3.6.1.2.1.25.4.2.1.7.9555::2 +.1.3.6.1.2.1.25.4.2.1.7.9556::2 +.1.3.6.1.2.1.25.4.2.1.7.9557::2 +.1.3.6.1.2.1.25.4.2.1.7.9558::2 +.1.3.6.1.2.1.25.4.2.1.7.9559::2 +.1.3.6.1.2.1.25.4.2.1.7.9560::2 +.1.3.6.1.2.1.25.4.2.1.7.9561::2 +.1.3.6.1.2.1.25.4.2.1.7.9562::2 +.1.3.6.1.2.1.25.4.2.1.7.9563::2 +.1.3.6.1.2.1.25.4.2.1.7.9564::2 +.1.3.6.1.2.1.25.4.2.1.7.9565::2 +.1.3.6.1.2.1.25.4.2.1.7.9566::2 +.1.3.6.1.2.1.25.4.2.1.7.9567::2 +.1.3.6.1.2.1.25.4.2.1.7.9568::2 +.1.3.6.1.2.1.25.4.2.1.7.9569::2 +.1.3.6.1.2.1.25.4.2.1.7.9570::2 +.1.3.6.1.2.1.25.4.2.1.7.9571::2 +.1.3.6.1.2.1.25.4.2.1.7.9572::2 +.1.3.6.1.2.1.25.4.2.1.7.9573::2 +.1.3.6.1.2.1.25.4.2.1.7.9575::2 +.1.3.6.1.2.1.25.4.2.1.7.9576::2 +.1.3.6.1.2.1.25.4.2.1.7.9577::2 +.1.3.6.1.2.1.25.4.2.1.7.9578::2 +.1.3.6.1.2.1.25.4.2.1.7.9579::2 +.1.3.6.1.2.1.25.4.2.1.7.9580::2 +.1.3.6.1.2.1.25.4.2.1.7.9581::2 +.1.3.6.1.2.1.25.4.2.1.7.9582::2 +.1.3.6.1.2.1.25.4.2.1.7.9583::2 +.1.3.6.1.2.1.25.4.2.1.7.9584::2 +.1.3.6.1.2.1.25.4.2.1.7.9585::2 +.1.3.6.1.2.1.25.4.2.1.7.9587::2 +.1.3.6.1.2.1.25.4.2.1.7.9588::2 +.1.3.6.1.2.1.25.4.2.1.7.9589::2 +.1.3.6.1.2.1.25.4.2.1.7.9590::2 +.1.3.6.1.2.1.25.4.2.1.7.9591::2 +.1.3.6.1.2.1.25.4.2.1.7.9592::2 +.1.3.6.1.2.1.25.4.2.1.7.9593::2 +.1.3.6.1.2.1.25.4.2.1.7.9594::2 +.1.3.6.1.2.1.25.4.2.1.7.9595::2 +.1.3.6.1.2.1.25.4.2.1.7.9596::2 +.1.3.6.1.2.1.25.4.2.1.7.9597::2 +.1.3.6.1.2.1.25.4.2.1.7.9598::2 +.1.3.6.1.2.1.25.4.2.1.7.9599::2 +.1.3.6.1.2.1.25.4.2.1.7.9600::2 +.1.3.6.1.2.1.25.4.2.1.7.9601::2 +.1.3.6.1.2.1.25.4.2.1.7.9602::2 +.1.3.6.1.2.1.25.4.2.1.7.9603::2 +.1.3.6.1.2.1.25.4.2.1.7.9604::2 +.1.3.6.1.2.1.25.4.2.1.7.9605::2 +.1.3.6.1.2.1.25.4.2.1.7.9607::2 +.1.3.6.1.2.1.25.4.2.1.7.9608::2 +.1.3.6.1.2.1.25.4.2.1.7.9609::2 +.1.3.6.1.2.1.25.4.2.1.7.9610::2 +.1.3.6.1.2.1.25.4.2.1.7.9611::2 +.1.3.6.1.2.1.25.4.2.1.7.9612::2 +.1.3.6.1.2.1.25.4.2.1.7.9613::2 +.1.3.6.1.2.1.25.4.2.1.7.9614::2 +.1.3.6.1.2.1.25.4.2.1.7.9615::2 +.1.3.6.1.2.1.25.4.2.1.7.9616::2 +.1.3.6.1.2.1.25.4.2.1.7.9617::2 +.1.3.6.1.2.1.25.4.2.1.7.9618::2 +.1.3.6.1.2.1.25.4.2.1.7.9619::2 +.1.3.6.1.2.1.25.4.2.1.7.9626::2 +.1.3.6.1.2.1.25.4.2.1.7.9627::2 +.1.3.6.1.2.1.25.4.2.1.7.9747::2 +.1.3.6.1.2.1.25.4.2.1.7.10481::2 +.1.3.6.1.2.1.25.4.2.1.7.10515::2 +.1.3.6.1.2.1.25.4.2.1.7.10606::2 +.1.3.6.1.2.1.25.4.2.1.7.10663::2 +.1.3.6.1.2.1.25.4.2.1.7.10664::2 +.1.3.6.1.2.1.25.4.2.1.7.10665::2 +.1.3.6.1.2.1.25.4.2.1.7.10667::2 +.1.3.6.1.2.1.25.4.2.1.7.10668::2 +.1.3.6.1.2.1.25.4.2.1.7.10669::2 +.1.3.6.1.2.1.25.4.2.1.7.10716::2 +.1.3.6.1.2.1.25.4.2.1.7.10778::2 +.1.3.6.1.2.1.25.4.2.1.7.10948::2 +.1.3.6.1.2.1.25.4.2.1.7.10982::2 +.1.3.6.1.2.1.25.4.2.1.7.11059::2 +.1.3.6.1.2.1.25.4.2.1.7.11119::2 +.1.3.6.1.2.1.25.4.2.1.7.11156::2 +.1.3.6.1.2.1.25.4.2.1.7.11446::2 +.1.3.6.1.2.1.25.4.2.1.7.12835::2 +.1.3.6.1.2.1.25.4.2.1.7.15180::2 +.1.3.6.1.2.1.25.4.2.1.7.15181::2 +.1.3.6.1.2.1.25.4.2.1.7.15182::2 +.1.3.6.1.2.1.25.4.2.1.7.15330::2 +.1.3.6.1.2.1.25.4.2.1.7.15332::2 +.1.3.6.1.2.1.25.4.2.1.7.15543::2 +.1.3.6.1.2.1.25.4.2.1.7.15648::2 +.1.3.6.1.2.1.25.4.2.1.7.15694::2 +.1.3.6.1.2.1.25.4.2.1.7.15909::2 +.1.3.6.1.2.1.25.4.2.1.7.15974::2 +.1.3.6.1.2.1.25.4.2.1.7.16107::2 +.1.3.6.1.2.1.25.4.2.1.7.16577::2 +.1.3.6.1.2.1.25.4.2.1.7.16798::2 +.1.3.6.1.2.1.25.4.2.1.7.16799::2 +.1.3.6.1.2.1.25.4.2.1.7.16800::2 +.1.3.6.1.2.1.25.4.2.1.7.16801::2 +.1.3.6.1.2.1.25.4.2.1.7.17054::2 +.1.3.6.1.2.1.25.4.2.1.7.17068::2 +.1.3.6.1.2.1.25.4.2.1.7.17253::2 +.1.3.6.1.2.1.25.4.2.1.7.18141::2 +.1.3.6.1.2.1.25.4.2.1.7.19721::2 +.1.3.6.1.2.1.25.4.2.1.7.19806::2 +.1.3.6.1.2.1.25.4.2.1.7.19807::2 +.1.3.6.1.2.1.25.4.2.1.7.21078::2 +.1.3.6.1.2.1.25.4.2.1.7.21085::2 +.1.3.6.1.2.1.25.4.2.1.7.21790::2 +.1.3.6.1.2.1.25.4.2.1.7.21999::2 +.1.3.6.1.2.1.25.4.2.1.7.24690::1 +.1.3.6.1.2.1.25.4.2.1.7.24714::2 +.1.3.6.1.2.1.25.4.2.1.7.31039::2 +.1.3.6.1.2.1.25.4.2.1.7.31048::2 +.1.3.6.1.2.1.25.4.2.1.7.31059::2 +.1.3.6.1.2.1.25.4.2.1.7.31527::2 +.1.3.6.1.2.1.25.4.2.1.7.31588::2 +.1.3.6.1.2.1.25.4.2.1.7.31705::2 +.1.3.6.1.2.1.25.4.2.1.7.31710::2 +.1.3.6.1.2.1.25.4.2.1.7.31768::2 +.1.3.6.1.2.1.25.4.2.1.7.31780::2 +.1.3.6.1.2.1.25.4.2.1.7.31830::2 +.1.3.6.1.2.1.25.4.2.1.7.31893::2 +.1.3.6.1.2.1.25.4.2.1.7.31894::2 +.1.3.6.1.2.1.25.4.2.1.7.31895::2 +.1.3.6.1.2.1.25.4.2.1.7.31896::2 +.1.3.6.1.2.1.25.4.2.1.7.31921::2 +.1.3.6.1.2.1.25.4.2.1.7.31922::2 +.1.3.6.1.2.1.25.5.1.1.1.1::6789 +.1.3.6.1.2.1.25.5.1.1.1.2::25 +.1.3.6.1.2.1.25.5.1.1.1.3::141 +.1.3.6.1.2.1.25.5.1.1.1.5::0 +.1.3.6.1.2.1.25.5.1.1.1.7::582352 +.1.3.6.1.2.1.25.5.1.1.1.8::0 +.1.3.6.1.2.1.25.5.1.1.1.9::408 +.1.3.6.1.2.1.25.5.1.1.1.10::3022 +.1.3.6.1.2.1.25.5.1.1.1.11::2763 +.1.3.6.1.2.1.25.5.1.1.1.12::361 +.1.3.6.1.2.1.25.5.1.1.1.13::74 +.1.3.6.1.2.1.25.5.1.1.1.15::0 +.1.3.6.1.2.1.25.5.1.1.1.16::2893 +.1.3.6.1.2.1.25.5.1.1.1.17::226 +.1.3.6.1.2.1.25.5.1.1.1.18::725 +.1.3.6.1.2.1.25.5.1.1.1.20::0 +.1.3.6.1.2.1.25.5.1.1.1.21::2909 +.1.3.6.1.2.1.25.5.1.1.1.22::3547 +.1.3.6.1.2.1.25.5.1.1.1.23::1459 +.1.3.6.1.2.1.25.5.1.1.1.25::0 +.1.3.6.1.2.1.25.5.1.1.1.26::0 +.1.3.6.1.2.1.25.5.1.1.1.27::0 +.1.3.6.1.2.1.25.5.1.1.1.30::0 +.1.3.6.1.2.1.25.5.1.1.1.187::557 +.1.3.6.1.2.1.25.5.1.1.1.188::0 +.1.3.6.1.2.1.25.5.1.1.1.191::0 +.1.3.6.1.2.1.25.5.1.1.1.192::0 +.1.3.6.1.2.1.25.5.1.1.1.193::0 +.1.3.6.1.2.1.25.5.1.1.1.194::0 +.1.3.6.1.2.1.25.5.1.1.1.196::0 +.1.3.6.1.2.1.25.5.1.1.1.364::0 +.1.3.6.1.2.1.25.5.1.1.1.379::0 +.1.3.6.1.2.1.25.5.1.1.1.543::0 +.1.3.6.1.2.1.25.5.1.1.1.628::0 +.1.3.6.1.2.1.25.5.1.1.1.684::0 +.1.3.6.1.2.1.25.5.1.1.1.817::0 +.1.3.6.1.2.1.25.5.1.1.1.3462::0 +.1.3.6.1.2.1.25.5.1.1.1.3463::0 +.1.3.6.1.2.1.25.5.1.1.1.3464::0 +.1.3.6.1.2.1.25.5.1.1.1.3465::0 +.1.3.6.1.2.1.25.5.1.1.1.3466::0 +.1.3.6.1.2.1.25.5.1.1.1.3467::0 +.1.3.6.1.2.1.25.5.1.1.1.3468::0 +.1.3.6.1.2.1.25.5.1.1.1.3469::0 +.1.3.6.1.2.1.25.5.1.1.1.3470::0 +.1.3.6.1.2.1.25.5.1.1.1.3471::0 +.1.3.6.1.2.1.25.5.1.1.1.3472::0 +.1.3.6.1.2.1.25.5.1.1.1.3473::0 +.1.3.6.1.2.1.25.5.1.1.1.3474::0 +.1.3.6.1.2.1.25.5.1.1.1.3475::0 +.1.3.6.1.2.1.25.5.1.1.1.3476::0 +.1.3.6.1.2.1.25.5.1.1.1.3477::0 +.1.3.6.1.2.1.25.5.1.1.1.3478::0 +.1.3.6.1.2.1.25.5.1.1.1.3557::0 +.1.3.6.1.2.1.25.5.1.1.1.3648::0 +.1.3.6.1.2.1.25.5.1.1.1.3801::0 +.1.3.6.1.2.1.25.5.1.1.1.3802::0 +.1.3.6.1.2.1.25.5.1.1.1.3818::2 +.1.3.6.1.2.1.25.5.1.1.1.3827::0 +.1.3.6.1.2.1.25.5.1.1.1.3849::1 +.1.3.6.1.2.1.25.5.1.1.1.3858::0 +.1.3.6.1.2.1.25.5.1.1.1.3880::7 +.1.3.6.1.2.1.25.5.1.1.1.3883::0 +.1.3.6.1.2.1.25.5.1.1.1.3894::0 +.1.3.6.1.2.1.25.5.1.1.1.3895::0 +.1.3.6.1.2.1.25.5.1.1.1.3905::0 +.1.3.6.1.2.1.25.5.1.1.1.3906::0 +.1.3.6.1.2.1.25.5.1.1.1.3923::661 +.1.3.6.1.2.1.25.5.1.1.1.3924::598 +.1.3.6.1.2.1.25.5.1.1.1.3926::124185 +.1.3.6.1.2.1.25.5.1.1.1.3949::0 +.1.3.6.1.2.1.25.5.1.1.1.3952::124273 +.1.3.6.1.2.1.25.5.1.1.1.3955::0 +.1.3.6.1.2.1.25.5.1.1.1.4085::0 +.1.3.6.1.2.1.25.5.1.1.1.4086::0 +.1.3.6.1.2.1.25.5.1.1.1.4159::28778 +.1.3.6.1.2.1.25.5.1.1.1.4160::0 +.1.3.6.1.2.1.25.5.1.1.1.4636::20 +.1.3.6.1.2.1.25.5.1.1.1.4649::0 +.1.3.6.1.2.1.25.5.1.1.1.4740::7031 +.1.3.6.1.2.1.25.5.1.1.1.4757::0 +.1.3.6.1.2.1.25.5.1.1.1.4766::0 +.1.3.6.1.2.1.25.5.1.1.1.4775::0 +.1.3.6.1.2.1.25.5.1.1.1.4784::0 +.1.3.6.1.2.1.25.5.1.1.1.4785::0 +.1.3.6.1.2.1.25.5.1.1.1.4786::2225 +.1.3.6.1.2.1.25.5.1.1.1.5048::0 +.1.3.6.1.2.1.25.5.1.1.1.5714::6494 +.1.3.6.1.2.1.25.5.1.1.1.5772::18172 +.1.3.6.1.2.1.25.5.1.1.1.6209::5 +.1.3.6.1.2.1.25.5.1.1.1.6275::0 +.1.3.6.1.2.1.25.5.1.1.1.6276::112 +.1.3.6.1.2.1.25.5.1.1.1.6277::0 +.1.3.6.1.2.1.25.5.1.1.1.6481::0 +.1.3.6.1.2.1.25.5.1.1.1.6583::0 +.1.3.6.1.2.1.25.5.1.1.1.6588::0 +.1.3.6.1.2.1.25.5.1.1.1.6634::21371 +.1.3.6.1.2.1.25.5.1.1.1.6639::0 +.1.3.6.1.2.1.25.5.1.1.1.6644::0 +.1.3.6.1.2.1.25.5.1.1.1.6674::0 +.1.3.6.1.2.1.25.5.1.1.1.6675::0 +.1.3.6.1.2.1.25.5.1.1.1.6676::0 +.1.3.6.1.2.1.25.5.1.1.1.6677::0 +.1.3.6.1.2.1.25.5.1.1.1.6679::0 +.1.3.6.1.2.1.25.5.1.1.1.6680::0 +.1.3.6.1.2.1.25.5.1.1.1.6681::0 +.1.3.6.1.2.1.25.5.1.1.1.6682::0 +.1.3.6.1.2.1.25.5.1.1.1.6683::0 +.1.3.6.1.2.1.25.5.1.1.1.6695::0 +.1.3.6.1.2.1.25.5.1.1.1.6714::0 +.1.3.6.1.2.1.25.5.1.1.1.6718::0 +.1.3.6.1.2.1.25.5.1.1.1.6719::0 +.1.3.6.1.2.1.25.5.1.1.1.6720::1623 +.1.3.6.1.2.1.25.5.1.1.1.6729::0 +.1.3.6.1.2.1.25.5.1.1.1.6733::0 +.1.3.6.1.2.1.25.5.1.1.1.6736::0 +.1.3.6.1.2.1.25.5.1.1.1.6739::0 +.1.3.6.1.2.1.25.5.1.1.1.6742::0 +.1.3.6.1.2.1.25.5.1.1.1.6746::0 +.1.3.6.1.2.1.25.5.1.1.1.6749::0 +.1.3.6.1.2.1.25.5.1.1.1.6752::0 +.1.3.6.1.2.1.25.5.1.1.1.6772::0 +.1.3.6.1.2.1.25.5.1.1.1.6780::0 +.1.3.6.1.2.1.25.5.1.1.1.6784::0 +.1.3.6.1.2.1.25.5.1.1.1.6805::235342 +.1.3.6.1.2.1.25.5.1.1.1.6812::0 +.1.3.6.1.2.1.25.5.1.1.1.6866::0 +.1.3.6.1.2.1.25.5.1.1.1.6893::31238 +.1.3.6.1.2.1.25.5.1.1.1.6902::2 +.1.3.6.1.2.1.25.5.1.1.1.6989::0 +.1.3.6.1.2.1.25.5.1.1.1.7004::118 +.1.3.6.1.2.1.25.5.1.1.1.7018::0 +.1.3.6.1.2.1.25.5.1.1.1.7044::0 +.1.3.6.1.2.1.25.5.1.1.1.7045::0 +.1.3.6.1.2.1.25.5.1.1.1.7046::0 +.1.3.6.1.2.1.25.5.1.1.1.7054::0 +.1.3.6.1.2.1.25.5.1.1.1.7104::2 +.1.3.6.1.2.1.25.5.1.1.1.7155::4133 +.1.3.6.1.2.1.25.5.1.1.1.7164::0 +.1.3.6.1.2.1.25.5.1.1.1.7178::24933 +.1.3.6.1.2.1.25.5.1.1.1.7368::10 +.1.3.6.1.2.1.25.5.1.1.1.7816::0 +.1.3.6.1.2.1.25.5.1.1.1.7819::0 +.1.3.6.1.2.1.25.5.1.1.1.8255::23881 +.1.3.6.1.2.1.25.5.1.1.1.8256::23955 +.1.3.6.1.2.1.25.5.1.1.1.8261::0 +.1.3.6.1.2.1.25.5.1.1.1.8388::0 +.1.3.6.1.2.1.25.5.1.1.1.8389::0 +.1.3.6.1.2.1.25.5.1.1.1.8390::0 +.1.3.6.1.2.1.25.5.1.1.1.8391::0 +.1.3.6.1.2.1.25.5.1.1.1.8404::0 +.1.3.6.1.2.1.25.5.1.1.1.8405::0 +.1.3.6.1.2.1.25.5.1.1.1.8406::0 +.1.3.6.1.2.1.25.5.1.1.1.8407::0 +.1.3.6.1.2.1.25.5.1.1.1.8420::14242 +.1.3.6.1.2.1.25.5.1.1.1.8424::682 +.1.3.6.1.2.1.25.5.1.1.1.8434::290 +.1.3.6.1.2.1.25.5.1.1.1.8525::25386 +.1.3.6.1.2.1.25.5.1.1.1.8545::48293 +.1.3.6.1.2.1.25.5.1.1.1.8565::2920 +.1.3.6.1.2.1.25.5.1.1.1.8578::0 +.1.3.6.1.2.1.25.5.1.1.1.8833::0 +.1.3.6.1.2.1.25.5.1.1.1.8843::0 +.1.3.6.1.2.1.25.5.1.1.1.8844::0 +.1.3.6.1.2.1.25.5.1.1.1.8845::45515 +.1.3.6.1.2.1.25.5.1.1.1.8876::0 +.1.3.6.1.2.1.25.5.1.1.1.8877::0 +.1.3.6.1.2.1.25.5.1.1.1.8880::0 +.1.3.6.1.2.1.25.5.1.1.1.8881::0 +.1.3.6.1.2.1.25.5.1.1.1.8883::0 +.1.3.6.1.2.1.25.5.1.1.1.8886::0 +.1.3.6.1.2.1.25.5.1.1.1.9013::0 +.1.3.6.1.2.1.25.5.1.1.1.9022::0 +.1.3.6.1.2.1.25.5.1.1.1.9038::0 +.1.3.6.1.2.1.25.5.1.1.1.9047::0 +.1.3.6.1.2.1.25.5.1.1.1.9084::1 +.1.3.6.1.2.1.25.5.1.1.1.9104::16519 +.1.3.6.1.2.1.25.5.1.1.1.9159::5129 +.1.3.6.1.2.1.25.5.1.1.1.9167::1089762 +.1.3.6.1.2.1.25.5.1.1.1.9182::73215 +.1.3.6.1.2.1.25.5.1.1.1.9234::0 +.1.3.6.1.2.1.25.5.1.1.1.9249::0 +.1.3.6.1.2.1.25.5.1.1.1.9250::0 +.1.3.6.1.2.1.25.5.1.1.1.9251::0 +.1.3.6.1.2.1.25.5.1.1.1.9252::25 +.1.3.6.1.2.1.25.5.1.1.1.9253::0 +.1.3.6.1.2.1.25.5.1.1.1.9411::9728 +.1.3.6.1.2.1.25.5.1.1.1.9433::0 +.1.3.6.1.2.1.25.5.1.1.1.9435::0 +.1.3.6.1.2.1.25.5.1.1.1.9554::0 +.1.3.6.1.2.1.25.5.1.1.1.9555::0 +.1.3.6.1.2.1.25.5.1.1.1.9556::0 +.1.3.6.1.2.1.25.5.1.1.1.9557::0 +.1.3.6.1.2.1.25.5.1.1.1.9558::0 +.1.3.6.1.2.1.25.5.1.1.1.9559::0 +.1.3.6.1.2.1.25.5.1.1.1.9560::0 +.1.3.6.1.2.1.25.5.1.1.1.9561::0 +.1.3.6.1.2.1.25.5.1.1.1.9562::0 +.1.3.6.1.2.1.25.5.1.1.1.9563::0 +.1.3.6.1.2.1.25.5.1.1.1.9564::0 +.1.3.6.1.2.1.25.5.1.1.1.9565::0 +.1.3.6.1.2.1.25.5.1.1.1.9566::0 +.1.3.6.1.2.1.25.5.1.1.1.9567::0 +.1.3.6.1.2.1.25.5.1.1.1.9568::0 +.1.3.6.1.2.1.25.5.1.1.1.9569::0 +.1.3.6.1.2.1.25.5.1.1.1.9570::0 +.1.3.6.1.2.1.25.5.1.1.1.9571::0 +.1.3.6.1.2.1.25.5.1.1.1.9572::0 +.1.3.6.1.2.1.25.5.1.1.1.9573::0 +.1.3.6.1.2.1.25.5.1.1.1.9575::0 +.1.3.6.1.2.1.25.5.1.1.1.9576::0 +.1.3.6.1.2.1.25.5.1.1.1.9577::0 +.1.3.6.1.2.1.25.5.1.1.1.9578::0 +.1.3.6.1.2.1.25.5.1.1.1.9579::0 +.1.3.6.1.2.1.25.5.1.1.1.9580::0 +.1.3.6.1.2.1.25.5.1.1.1.9581::0 +.1.3.6.1.2.1.25.5.1.1.1.9582::0 +.1.3.6.1.2.1.25.5.1.1.1.9583::0 +.1.3.6.1.2.1.25.5.1.1.1.9584::0 +.1.3.6.1.2.1.25.5.1.1.1.9585::0 +.1.3.6.1.2.1.25.5.1.1.1.9587::0 +.1.3.6.1.2.1.25.5.1.1.1.9588::0 +.1.3.6.1.2.1.25.5.1.1.1.9589::0 +.1.3.6.1.2.1.25.5.1.1.1.9590::0 +.1.3.6.1.2.1.25.5.1.1.1.9591::0 +.1.3.6.1.2.1.25.5.1.1.1.9592::0 +.1.3.6.1.2.1.25.5.1.1.1.9593::0 +.1.3.6.1.2.1.25.5.1.1.1.9594::0 +.1.3.6.1.2.1.25.5.1.1.1.9595::0 +.1.3.6.1.2.1.25.5.1.1.1.9596::0 +.1.3.6.1.2.1.25.5.1.1.1.9597::0 +.1.3.6.1.2.1.25.5.1.1.1.9598::0 +.1.3.6.1.2.1.25.5.1.1.1.9599::0 +.1.3.6.1.2.1.25.5.1.1.1.9600::0 +.1.3.6.1.2.1.25.5.1.1.1.9601::0 +.1.3.6.1.2.1.25.5.1.1.1.9602::0 +.1.3.6.1.2.1.25.5.1.1.1.9603::0 +.1.3.6.1.2.1.25.5.1.1.1.9604::0 +.1.3.6.1.2.1.25.5.1.1.1.9605::0 +.1.3.6.1.2.1.25.5.1.1.1.9607::0 +.1.3.6.1.2.1.25.5.1.1.1.9608::0 +.1.3.6.1.2.1.25.5.1.1.1.9609::0 +.1.3.6.1.2.1.25.5.1.1.1.9610::0 +.1.3.6.1.2.1.25.5.1.1.1.9611::0 +.1.3.6.1.2.1.25.5.1.1.1.9612::0 +.1.3.6.1.2.1.25.5.1.1.1.9613::0 +.1.3.6.1.2.1.25.5.1.1.1.9614::0 +.1.3.6.1.2.1.25.5.1.1.1.9615::0 +.1.3.6.1.2.1.25.5.1.1.1.9616::0 +.1.3.6.1.2.1.25.5.1.1.1.9617::0 +.1.3.6.1.2.1.25.5.1.1.1.9618::879 +.1.3.6.1.2.1.25.5.1.1.1.9619::757 +.1.3.6.1.2.1.25.5.1.1.1.9626::863 +.1.3.6.1.2.1.25.5.1.1.1.9627::709 +.1.3.6.1.2.1.25.5.1.1.1.9747::894 +.1.3.6.1.2.1.25.5.1.1.1.10481::0 +.1.3.6.1.2.1.25.5.1.1.1.10515::20955 +.1.3.6.1.2.1.25.5.1.1.1.10606::3 +.1.3.6.1.2.1.25.5.1.1.1.10663::772 +.1.3.6.1.2.1.25.5.1.1.1.10664::61169 +.1.3.6.1.2.1.25.5.1.1.1.10665::333697 +.1.3.6.1.2.1.25.5.1.1.1.10667::377541 +.1.3.6.1.2.1.25.5.1.1.1.10668::14248 +.1.3.6.1.2.1.25.5.1.1.1.10669::15810 +.1.3.6.1.2.1.25.5.1.1.1.10716::87 +.1.3.6.1.2.1.25.5.1.1.1.10778::0 +.1.3.6.1.2.1.25.5.1.1.1.10948::19418 +.1.3.6.1.2.1.25.5.1.1.1.10982::21701 +.1.3.6.1.2.1.25.5.1.1.1.11059::96340 +.1.3.6.1.2.1.25.5.1.1.1.11119::89 +.1.3.6.1.2.1.25.5.1.1.1.11156::14 +.1.3.6.1.2.1.25.5.1.1.1.11446::691 +.1.3.6.1.2.1.25.5.1.1.1.12835::0 +.1.3.6.1.2.1.25.5.1.1.1.15180::0 +.1.3.6.1.2.1.25.5.1.1.1.15181::0 +.1.3.6.1.2.1.25.5.1.1.1.15182::0 +.1.3.6.1.2.1.25.5.1.1.1.15330::33038 +.1.3.6.1.2.1.25.5.1.1.1.15332::21325 +.1.3.6.1.2.1.25.5.1.1.1.15543::388 +.1.3.6.1.2.1.25.5.1.1.1.15648::3102 +.1.3.6.1.2.1.25.5.1.1.1.15694::6313602 +.1.3.6.1.2.1.25.5.1.1.1.15909::0 +.1.3.6.1.2.1.25.5.1.1.1.15974::0 +.1.3.6.1.2.1.25.5.1.1.1.16107::0 +.1.3.6.1.2.1.25.5.1.1.1.16577::589 +.1.3.6.1.2.1.25.5.1.1.1.16798::202 +.1.3.6.1.2.1.25.5.1.1.1.16799::8894 +.1.3.6.1.2.1.25.5.1.1.1.16800::8804 +.1.3.6.1.2.1.25.5.1.1.1.16801::465 +.1.3.6.1.2.1.25.5.1.1.1.17054::1 +.1.3.6.1.2.1.25.5.1.1.1.17068::87570 +.1.3.6.1.2.1.25.5.1.1.1.17253::78583 +.1.3.6.1.2.1.25.5.1.1.1.18141::0 +.1.3.6.1.2.1.25.5.1.1.1.19721::67483 +.1.3.6.1.2.1.25.5.1.1.1.19806::24620 +.1.3.6.1.2.1.25.5.1.1.1.19807::0 +.1.3.6.1.2.1.25.5.1.1.1.21078::720 +.1.3.6.1.2.1.25.5.1.1.1.21085::10447 +.1.3.6.1.2.1.25.5.1.1.1.21790::18979 +.1.3.6.1.2.1.25.5.1.1.1.21999::0 +.1.3.6.1.2.1.25.5.1.1.1.24690::591720 +.1.3.6.1.2.1.25.5.1.1.1.24714::11254 +.1.3.6.1.2.1.25.5.1.1.1.31039::25 +.1.3.6.1.2.1.25.5.1.1.1.31048::73 +.1.3.6.1.2.1.25.5.1.1.1.31059::115 +.1.3.6.1.2.1.25.5.1.1.1.31527::10 +.1.3.6.1.2.1.25.5.1.1.1.31588::10899 +.1.3.6.1.2.1.25.5.1.1.1.31705::265 +.1.3.6.1.2.1.25.5.1.1.1.31710::77 +.1.3.6.1.2.1.25.5.1.1.1.31768::1711 +.1.3.6.1.2.1.25.5.1.1.1.31780::95155 +.1.3.6.1.2.1.25.5.1.1.1.31830::10407 +.1.3.6.1.2.1.25.5.1.1.1.31893::33 +.1.3.6.1.2.1.25.5.1.1.1.31894::96 +.1.3.6.1.2.1.25.5.1.1.1.31895::58 +.1.3.6.1.2.1.25.5.1.1.1.31896::53 +.1.3.6.1.2.1.25.5.1.1.1.31921::772 +.1.3.6.1.2.1.25.5.1.1.1.31922::759 +.1.3.6.1.2.1.25.5.1.1.2.1::9204 +.1.3.6.1.2.1.25.5.1.1.2.2::0 +.1.3.6.1.2.1.25.5.1.1.2.3::0 +.1.3.6.1.2.1.25.5.1.1.2.5::0 +.1.3.6.1.2.1.25.5.1.1.2.7::0 +.1.3.6.1.2.1.25.5.1.1.2.8::0 +.1.3.6.1.2.1.25.5.1.1.2.9::0 +.1.3.6.1.2.1.25.5.1.1.2.10::0 +.1.3.6.1.2.1.25.5.1.1.2.11::0 +.1.3.6.1.2.1.25.5.1.1.2.12::0 +.1.3.6.1.2.1.25.5.1.1.2.13::0 +.1.3.6.1.2.1.25.5.1.1.2.15::0 +.1.3.6.1.2.1.25.5.1.1.2.16::0 +.1.3.6.1.2.1.25.5.1.1.2.17::0 +.1.3.6.1.2.1.25.5.1.1.2.18::0 +.1.3.6.1.2.1.25.5.1.1.2.20::0 +.1.3.6.1.2.1.25.5.1.1.2.21::0 +.1.3.6.1.2.1.25.5.1.1.2.22::0 +.1.3.6.1.2.1.25.5.1.1.2.23::0 +.1.3.6.1.2.1.25.5.1.1.2.25::0 +.1.3.6.1.2.1.25.5.1.1.2.26::0 +.1.3.6.1.2.1.25.5.1.1.2.27::0 +.1.3.6.1.2.1.25.5.1.1.2.30::0 +.1.3.6.1.2.1.25.5.1.1.2.187::0 +.1.3.6.1.2.1.25.5.1.1.2.188::0 +.1.3.6.1.2.1.25.5.1.1.2.191::0 +.1.3.6.1.2.1.25.5.1.1.2.192::0 +.1.3.6.1.2.1.25.5.1.1.2.193::0 +.1.3.6.1.2.1.25.5.1.1.2.194::0 +.1.3.6.1.2.1.25.5.1.1.2.196::0 +.1.3.6.1.2.1.25.5.1.1.2.364::0 +.1.3.6.1.2.1.25.5.1.1.2.379::0 +.1.3.6.1.2.1.25.5.1.1.2.543::0 +.1.3.6.1.2.1.25.5.1.1.2.628::0 +.1.3.6.1.2.1.25.5.1.1.2.684::0 +.1.3.6.1.2.1.25.5.1.1.2.817::0 +.1.3.6.1.2.1.25.5.1.1.2.3462::0 +.1.3.6.1.2.1.25.5.1.1.2.3463::0 +.1.3.6.1.2.1.25.5.1.1.2.3464::0 +.1.3.6.1.2.1.25.5.1.1.2.3465::0 +.1.3.6.1.2.1.25.5.1.1.2.3466::0 +.1.3.6.1.2.1.25.5.1.1.2.3467::0 +.1.3.6.1.2.1.25.5.1.1.2.3468::0 +.1.3.6.1.2.1.25.5.1.1.2.3469::0 +.1.3.6.1.2.1.25.5.1.1.2.3470::0 +.1.3.6.1.2.1.25.5.1.1.2.3471::0 +.1.3.6.1.2.1.25.5.1.1.2.3472::0 +.1.3.6.1.2.1.25.5.1.1.2.3473::0 +.1.3.6.1.2.1.25.5.1.1.2.3474::0 +.1.3.6.1.2.1.25.5.1.1.2.3475::0 +.1.3.6.1.2.1.25.5.1.1.2.3476::0 +.1.3.6.1.2.1.25.5.1.1.2.3477::0 +.1.3.6.1.2.1.25.5.1.1.2.3478::0 +.1.3.6.1.2.1.25.5.1.1.2.3557::0 +.1.3.6.1.2.1.25.5.1.1.2.3648::0 +.1.3.6.1.2.1.25.5.1.1.2.3801::0 +.1.3.6.1.2.1.25.5.1.1.2.3802::0 +.1.3.6.1.2.1.25.5.1.1.2.3818::0 +.1.3.6.1.2.1.25.5.1.1.2.3827::0 +.1.3.6.1.2.1.25.5.1.1.2.3849::0 +.1.3.6.1.2.1.25.5.1.1.2.3858::0 +.1.3.6.1.2.1.25.5.1.1.2.3880::0 +.1.3.6.1.2.1.25.5.1.1.2.3883::0 +.1.3.6.1.2.1.25.5.1.1.2.3894::0 +.1.3.6.1.2.1.25.5.1.1.2.3895::0 +.1.3.6.1.2.1.25.5.1.1.2.3905::0 +.1.3.6.1.2.1.25.5.1.1.2.3906::0 +.1.3.6.1.2.1.25.5.1.1.2.3923::0 +.1.3.6.1.2.1.25.5.1.1.2.3924::0 +.1.3.6.1.2.1.25.5.1.1.2.3926::0 +.1.3.6.1.2.1.25.5.1.1.2.3949::0 +.1.3.6.1.2.1.25.5.1.1.2.3952::0 +.1.3.6.1.2.1.25.5.1.1.2.3955::0 +.1.3.6.1.2.1.25.5.1.1.2.4085::0 +.1.3.6.1.2.1.25.5.1.1.2.4086::0 +.1.3.6.1.2.1.25.5.1.1.2.4159::0 +.1.3.6.1.2.1.25.5.1.1.2.4160::0 +.1.3.6.1.2.1.25.5.1.1.2.4636::0 +.1.3.6.1.2.1.25.5.1.1.2.4649::0 +.1.3.6.1.2.1.25.5.1.1.2.4740::0 +.1.3.6.1.2.1.25.5.1.1.2.4757::5416 +.1.3.6.1.2.1.25.5.1.1.2.4766::0 +.1.3.6.1.2.1.25.5.1.1.2.4775::5416 +.1.3.6.1.2.1.25.5.1.1.2.4784::0 +.1.3.6.1.2.1.25.5.1.1.2.4785::0 +.1.3.6.1.2.1.25.5.1.1.2.4786::0 +.1.3.6.1.2.1.25.5.1.1.2.5048::0 +.1.3.6.1.2.1.25.5.1.1.2.5714::0 +.1.3.6.1.2.1.25.5.1.1.2.5772::0 +.1.3.6.1.2.1.25.5.1.1.2.6209::0 +.1.3.6.1.2.1.25.5.1.1.2.6275::0 +.1.3.6.1.2.1.25.5.1.1.2.6276::0 +.1.3.6.1.2.1.25.5.1.1.2.6277::0 +.1.3.6.1.2.1.25.5.1.1.2.6481::0 +.1.3.6.1.2.1.25.5.1.1.2.6583::0 +.1.3.6.1.2.1.25.5.1.1.2.6588::0 +.1.3.6.1.2.1.25.5.1.1.2.6634::3156 +.1.3.6.1.2.1.25.5.1.1.2.6639::0 +.1.3.6.1.2.1.25.5.1.1.2.6644::5416 +.1.3.6.1.2.1.25.5.1.1.2.6674::0 +.1.3.6.1.2.1.25.5.1.1.2.6675::0 +.1.3.6.1.2.1.25.5.1.1.2.6676::0 +.1.3.6.1.2.1.25.5.1.1.2.6677::0 +.1.3.6.1.2.1.25.5.1.1.2.6679::0 +.1.3.6.1.2.1.25.5.1.1.2.6680::0 +.1.3.6.1.2.1.25.5.1.1.2.6681::0 +.1.3.6.1.2.1.25.5.1.1.2.6682::0 +.1.3.6.1.2.1.25.5.1.1.2.6683::0 +.1.3.6.1.2.1.25.5.1.1.2.6695::0 +.1.3.6.1.2.1.25.5.1.1.2.6714::0 +.1.3.6.1.2.1.25.5.1.1.2.6718::0 +.1.3.6.1.2.1.25.5.1.1.2.6719::0 +.1.3.6.1.2.1.25.5.1.1.2.6720::0 +.1.3.6.1.2.1.25.5.1.1.2.6729::0 +.1.3.6.1.2.1.25.5.1.1.2.6733::0 +.1.3.6.1.2.1.25.5.1.1.2.6736::0 +.1.3.6.1.2.1.25.5.1.1.2.6739::0 +.1.3.6.1.2.1.25.5.1.1.2.6742::0 +.1.3.6.1.2.1.25.5.1.1.2.6746::0 +.1.3.6.1.2.1.25.5.1.1.2.6749::0 +.1.3.6.1.2.1.25.5.1.1.2.6752::0 +.1.3.6.1.2.1.25.5.1.1.2.6772::0 +.1.3.6.1.2.1.25.5.1.1.2.6780::0 +.1.3.6.1.2.1.25.5.1.1.2.6784::0 +.1.3.6.1.2.1.25.5.1.1.2.6805::4680 +.1.3.6.1.2.1.25.5.1.1.2.6812::0 +.1.3.6.1.2.1.25.5.1.1.2.6866::0 +.1.3.6.1.2.1.25.5.1.1.2.6893::0 +.1.3.6.1.2.1.25.5.1.1.2.6902::2232 +.1.3.6.1.2.1.25.5.1.1.2.6989::5416 +.1.3.6.1.2.1.25.5.1.1.2.7004::2584 +.1.3.6.1.2.1.25.5.1.1.2.7018::0 +.1.3.6.1.2.1.25.5.1.1.2.7044::0 +.1.3.6.1.2.1.25.5.1.1.2.7045::0 +.1.3.6.1.2.1.25.5.1.1.2.7046::0 +.1.3.6.1.2.1.25.5.1.1.2.7054::0 +.1.3.6.1.2.1.25.5.1.1.2.7104::7724 +.1.3.6.1.2.1.25.5.1.1.2.7155::5776 +.1.3.6.1.2.1.25.5.1.1.2.7164::0 +.1.3.6.1.2.1.25.5.1.1.2.7178::32332 +.1.3.6.1.2.1.25.5.1.1.2.7368::3404 +.1.3.6.1.2.1.25.5.1.1.2.7816::6712 +.1.3.6.1.2.1.25.5.1.1.2.7819::6712 +.1.3.6.1.2.1.25.5.1.1.2.8255::9140 +.1.3.6.1.2.1.25.5.1.1.2.8256::9064 +.1.3.6.1.2.1.25.5.1.1.2.8261::276 +.1.3.6.1.2.1.25.5.1.1.2.8388::864 +.1.3.6.1.2.1.25.5.1.1.2.8389::864 +.1.3.6.1.2.1.25.5.1.1.2.8390::864 +.1.3.6.1.2.1.25.5.1.1.2.8391::864 +.1.3.6.1.2.1.25.5.1.1.2.8404::908 +.1.3.6.1.2.1.25.5.1.1.2.8405::908 +.1.3.6.1.2.1.25.5.1.1.2.8406::908 +.1.3.6.1.2.1.25.5.1.1.2.8407::908 +.1.3.6.1.2.1.25.5.1.1.2.8420::9468 +.1.3.6.1.2.1.25.5.1.1.2.8424::2156 +.1.3.6.1.2.1.25.5.1.1.2.8434::11516 +.1.3.6.1.2.1.25.5.1.1.2.8525::6344 +.1.3.6.1.2.1.25.5.1.1.2.8545::2160 +.1.3.6.1.2.1.25.5.1.1.2.8565::9548 +.1.3.6.1.2.1.25.5.1.1.2.8578::12340 +.1.3.6.1.2.1.25.5.1.1.2.8833::0 +.1.3.6.1.2.1.25.5.1.1.2.8843::0 +.1.3.6.1.2.1.25.5.1.1.2.8844::0 +.1.3.6.1.2.1.25.5.1.1.2.8845::0 +.1.3.6.1.2.1.25.5.1.1.2.8876::0 +.1.3.6.1.2.1.25.5.1.1.2.8877::0 +.1.3.6.1.2.1.25.5.1.1.2.8880::0 +.1.3.6.1.2.1.25.5.1.1.2.8881::0 +.1.3.6.1.2.1.25.5.1.1.2.8883::0 +.1.3.6.1.2.1.25.5.1.1.2.8886::0 +.1.3.6.1.2.1.25.5.1.1.2.9013::0 +.1.3.6.1.2.1.25.5.1.1.2.9022::0 +.1.3.6.1.2.1.25.5.1.1.2.9038::0 +.1.3.6.1.2.1.25.5.1.1.2.9047::0 +.1.3.6.1.2.1.25.5.1.1.2.9084::3796 +.1.3.6.1.2.1.25.5.1.1.2.9104::3760 +.1.3.6.1.2.1.25.5.1.1.2.9159::3604 +.1.3.6.1.2.1.25.5.1.1.2.9167::7016 +.1.3.6.1.2.1.25.5.1.1.2.9182::23756 +.1.3.6.1.2.1.25.5.1.1.2.9234::0 +.1.3.6.1.2.1.25.5.1.1.2.9249::0 +.1.3.6.1.2.1.25.5.1.1.2.9250::0 +.1.3.6.1.2.1.25.5.1.1.2.9251::0 +.1.3.6.1.2.1.25.5.1.1.2.9252::0 +.1.3.6.1.2.1.25.5.1.1.2.9253::0 +.1.3.6.1.2.1.25.5.1.1.2.9411::40328 +.1.3.6.1.2.1.25.5.1.1.2.9433::0 +.1.3.6.1.2.1.25.5.1.1.2.9435::0 +.1.3.6.1.2.1.25.5.1.1.2.9554::0 +.1.3.6.1.2.1.25.5.1.1.2.9555::0 +.1.3.6.1.2.1.25.5.1.1.2.9556::0 +.1.3.6.1.2.1.25.5.1.1.2.9557::0 +.1.3.6.1.2.1.25.5.1.1.2.9558::0 +.1.3.6.1.2.1.25.5.1.1.2.9559::0 +.1.3.6.1.2.1.25.5.1.1.2.9560::0 +.1.3.6.1.2.1.25.5.1.1.2.9561::0 +.1.3.6.1.2.1.25.5.1.1.2.9562::0 +.1.3.6.1.2.1.25.5.1.1.2.9563::0 +.1.3.6.1.2.1.25.5.1.1.2.9564::0 +.1.3.6.1.2.1.25.5.1.1.2.9565::0 +.1.3.6.1.2.1.25.5.1.1.2.9566::0 +.1.3.6.1.2.1.25.5.1.1.2.9567::0 +.1.3.6.1.2.1.25.5.1.1.2.9568::0 +.1.3.6.1.2.1.25.5.1.1.2.9569::0 +.1.3.6.1.2.1.25.5.1.1.2.9570::0 +.1.3.6.1.2.1.25.5.1.1.2.9571::0 +.1.3.6.1.2.1.25.5.1.1.2.9572::0 +.1.3.6.1.2.1.25.5.1.1.2.9573::0 +.1.3.6.1.2.1.25.5.1.1.2.9575::0 +.1.3.6.1.2.1.25.5.1.1.2.9576::0 +.1.3.6.1.2.1.25.5.1.1.2.9577::0 +.1.3.6.1.2.1.25.5.1.1.2.9578::0 +.1.3.6.1.2.1.25.5.1.1.2.9579::0 +.1.3.6.1.2.1.25.5.1.1.2.9580::0 +.1.3.6.1.2.1.25.5.1.1.2.9581::0 +.1.3.6.1.2.1.25.5.1.1.2.9582::0 +.1.3.6.1.2.1.25.5.1.1.2.9583::0 +.1.3.6.1.2.1.25.5.1.1.2.9584::0 +.1.3.6.1.2.1.25.5.1.1.2.9585::0 +.1.3.6.1.2.1.25.5.1.1.2.9587::0 +.1.3.6.1.2.1.25.5.1.1.2.9588::0 +.1.3.6.1.2.1.25.5.1.1.2.9589::0 +.1.3.6.1.2.1.25.5.1.1.2.9590::0 +.1.3.6.1.2.1.25.5.1.1.2.9591::0 +.1.3.6.1.2.1.25.5.1.1.2.9592::0 +.1.3.6.1.2.1.25.5.1.1.2.9593::0 +.1.3.6.1.2.1.25.5.1.1.2.9594::0 +.1.3.6.1.2.1.25.5.1.1.2.9595::0 +.1.3.6.1.2.1.25.5.1.1.2.9596::0 +.1.3.6.1.2.1.25.5.1.1.2.9597::0 +.1.3.6.1.2.1.25.5.1.1.2.9598::0 +.1.3.6.1.2.1.25.5.1.1.2.9599::0 +.1.3.6.1.2.1.25.5.1.1.2.9600::0 +.1.3.6.1.2.1.25.5.1.1.2.9601::0 +.1.3.6.1.2.1.25.5.1.1.2.9602::0 +.1.3.6.1.2.1.25.5.1.1.2.9603::0 +.1.3.6.1.2.1.25.5.1.1.2.9604::0 +.1.3.6.1.2.1.25.5.1.1.2.9605::0 +.1.3.6.1.2.1.25.5.1.1.2.9607::0 +.1.3.6.1.2.1.25.5.1.1.2.9608::0 +.1.3.6.1.2.1.25.5.1.1.2.9609::0 +.1.3.6.1.2.1.25.5.1.1.2.9610::0 +.1.3.6.1.2.1.25.5.1.1.2.9611::0 +.1.3.6.1.2.1.25.5.1.1.2.9612::0 +.1.3.6.1.2.1.25.5.1.1.2.9613::0 +.1.3.6.1.2.1.25.5.1.1.2.9614::0 +.1.3.6.1.2.1.25.5.1.1.2.9615::0 +.1.3.6.1.2.1.25.5.1.1.2.9616::0 +.1.3.6.1.2.1.25.5.1.1.2.9617::0 +.1.3.6.1.2.1.25.5.1.1.2.9618::0 +.1.3.6.1.2.1.25.5.1.1.2.9619::0 +.1.3.6.1.2.1.25.5.1.1.2.9626::0 +.1.3.6.1.2.1.25.5.1.1.2.9627::0 +.1.3.6.1.2.1.25.5.1.1.2.9747::3044 +.1.3.6.1.2.1.25.5.1.1.2.10481::13556 +.1.3.6.1.2.1.25.5.1.1.2.10515::7200 +.1.3.6.1.2.1.25.5.1.1.2.10606::16208 +.1.3.6.1.2.1.25.5.1.1.2.10663::5948 +.1.3.6.1.2.1.25.5.1.1.2.10664::7772 +.1.3.6.1.2.1.25.5.1.1.2.10665::10864 +.1.3.6.1.2.1.25.5.1.1.2.10667::12500 +.1.3.6.1.2.1.25.5.1.1.2.10668::12284 +.1.3.6.1.2.1.25.5.1.1.2.10669::6040 +.1.3.6.1.2.1.25.5.1.1.2.10716::7332 +.1.3.6.1.2.1.25.5.1.1.2.10778::100 +.1.3.6.1.2.1.25.5.1.1.2.10948::4064 +.1.3.6.1.2.1.25.5.1.1.2.10982::8200 +.1.3.6.1.2.1.25.5.1.1.2.11059::9360 +.1.3.6.1.2.1.25.5.1.1.2.11119::13276 +.1.3.6.1.2.1.25.5.1.1.2.11156::10560 +.1.3.6.1.2.1.25.5.1.1.2.11446::2572 +.1.3.6.1.2.1.25.5.1.1.2.12835::0 +.1.3.6.1.2.1.25.5.1.1.2.15180::0 +.1.3.6.1.2.1.25.5.1.1.2.15181::0 +.1.3.6.1.2.1.25.5.1.1.2.15182::0 +.1.3.6.1.2.1.25.5.1.1.2.15330::39052 +.1.3.6.1.2.1.25.5.1.1.2.15332::35064 +.1.3.6.1.2.1.25.5.1.1.2.15543::7780 +.1.3.6.1.2.1.25.5.1.1.2.15648::6440 +.1.3.6.1.2.1.25.5.1.1.2.15694::37784 +.1.3.6.1.2.1.25.5.1.1.2.15909::5416 +.1.3.6.1.2.1.25.5.1.1.2.15974::5416 +.1.3.6.1.2.1.25.5.1.1.2.16107::5416 +.1.3.6.1.2.1.25.5.1.1.2.16577::97480 +.1.3.6.1.2.1.25.5.1.1.2.16798::12224 +.1.3.6.1.2.1.25.5.1.1.2.16799::5380 +.1.3.6.1.2.1.25.5.1.1.2.16800::20280 +.1.3.6.1.2.1.25.5.1.1.2.16801::5560 +.1.3.6.1.2.1.25.5.1.1.2.17054::27256 +.1.3.6.1.2.1.25.5.1.1.2.17068::52972 +.1.3.6.1.2.1.25.5.1.1.2.17253::42536 +.1.3.6.1.2.1.25.5.1.1.2.18141::3480 +.1.3.6.1.2.1.25.5.1.1.2.19721::66116 +.1.3.6.1.2.1.25.5.1.1.2.19806::6156 +.1.3.6.1.2.1.25.5.1.1.2.19807::3676 +.1.3.6.1.2.1.25.5.1.1.2.21078::33024 +.1.3.6.1.2.1.25.5.1.1.2.21085::44564 +.1.3.6.1.2.1.25.5.1.1.2.21790::4448 +.1.3.6.1.2.1.25.5.1.1.2.21999::2748 +.1.3.6.1.2.1.25.5.1.1.2.24690::48716 +.1.3.6.1.2.1.25.5.1.1.2.24714::20816 +.1.3.6.1.2.1.25.5.1.1.2.31039::0 +.1.3.6.1.2.1.25.5.1.1.2.31048::0 +.1.3.6.1.2.1.25.5.1.1.2.31059::0 +.1.3.6.1.2.1.25.5.1.1.2.31527::25252 +.1.3.6.1.2.1.25.5.1.1.2.31588::26580 +.1.3.6.1.2.1.25.5.1.1.2.31705::7612 +.1.3.6.1.2.1.25.5.1.1.2.31710::8428 +.1.3.6.1.2.1.25.5.1.1.2.31768::37348 +.1.3.6.1.2.1.25.5.1.1.2.31780::3408 +.1.3.6.1.2.1.25.5.1.1.2.31830::92 +.1.3.6.1.2.1.25.5.1.1.2.31893::7552 +.1.3.6.1.2.1.25.5.1.1.2.31894::7796 +.1.3.6.1.2.1.25.5.1.1.2.31895::7768 +.1.3.6.1.2.1.25.5.1.1.2.31896::7792 +.1.3.6.1.2.1.25.5.1.1.2.31921::12268 +.1.3.6.1.2.1.25.5.1.1.2.31922::7136 +.1.3.6.1.2.1.31.1.1.1.1.1::lo +.1.3.6.1.2.1.31.1.1.1.1.2::sit0 +.1.3.6.1.2.1.31.1.1.1.1.3::eth0 +.1.3.6.1.2.1.31.1.1.1.1.4::eth1 +.1.3.6.1.2.1.31.1.1.1.1.5::docker0 +.1.3.6.1.2.1.31.1.1.1.2.1::0 +.1.3.6.1.2.1.31.1.1.1.2.2::0 +.1.3.6.1.2.1.31.1.1.1.2.3::5607172 +.1.3.6.1.2.1.31.1.1.1.2.4::0 +.1.3.6.1.2.1.31.1.1.1.2.5::0 +.1.3.6.1.2.1.31.1.1.1.3.1::0 +.1.3.6.1.2.1.31.1.1.1.3.2::0 +.1.3.6.1.2.1.31.1.1.1.3.3::0 +.1.3.6.1.2.1.31.1.1.1.3.4::0 +.1.3.6.1.2.1.31.1.1.1.3.5::0 +.1.3.6.1.2.1.31.1.1.1.4.1::0 +.1.3.6.1.2.1.31.1.1.1.4.2::0 +.1.3.6.1.2.1.31.1.1.1.4.3::0 +.1.3.6.1.2.1.31.1.1.1.4.4::0 +.1.3.6.1.2.1.31.1.1.1.4.5::0 +.1.3.6.1.2.1.31.1.1.1.5.1::0 +.1.3.6.1.2.1.31.1.1.1.5.2::0 +.1.3.6.1.2.1.31.1.1.1.5.3::0 +.1.3.6.1.2.1.31.1.1.1.5.4::0 +.1.3.6.1.2.1.31.1.1.1.5.5::0 +.1.3.6.1.2.1.31.1.1.1.6.1::11175296 +.1.3.6.1.2.1.31.1.1.1.6.2::0 +.1.3.6.1.2.1.31.1.1.1.6.3::2928618623 +.1.3.6.1.2.1.31.1.1.1.6.4::0 +.1.3.6.1.2.1.31.1.1.1.6.5::0 +.1.3.6.1.2.1.31.1.1.1.7.1::82427 +.1.3.6.1.2.1.31.1.1.1.7.2::0 +.1.3.6.1.2.1.31.1.1.1.7.3::11695303 +.1.3.6.1.2.1.31.1.1.1.7.4::0 +.1.3.6.1.2.1.31.1.1.1.7.5::0 +.1.3.6.1.2.1.31.1.1.1.8.1::0 +.1.3.6.1.2.1.31.1.1.1.8.2::0 +.1.3.6.1.2.1.31.1.1.1.8.3::5607172 +.1.3.6.1.2.1.31.1.1.1.8.4::0 +.1.3.6.1.2.1.31.1.1.1.8.5::0 +.1.3.6.1.2.1.31.1.1.1.9.1::0 +.1.3.6.1.2.1.31.1.1.1.9.2::0 +.1.3.6.1.2.1.31.1.1.1.9.3::0 +.1.3.6.1.2.1.31.1.1.1.9.4::0 +.1.3.6.1.2.1.31.1.1.1.9.5::0 +.1.3.6.1.2.1.31.1.1.1.10.1::11175296 +.1.3.6.1.2.1.31.1.1.1.10.2::0 +.1.3.6.1.2.1.31.1.1.1.10.3::193980578 +.1.3.6.1.2.1.31.1.1.1.10.4::0 +.1.3.6.1.2.1.31.1.1.1.10.5::0 +.1.3.6.1.2.1.31.1.1.1.11.1::82427 +.1.3.6.1.2.1.31.1.1.1.11.2::0 +.1.3.6.1.2.1.31.1.1.1.11.3::789862 +.1.3.6.1.2.1.31.1.1.1.11.4::0 +.1.3.6.1.2.1.31.1.1.1.11.5::0 +.1.3.6.1.2.1.31.1.1.1.12.1::0 +.1.3.6.1.2.1.31.1.1.1.12.2::0 +.1.3.6.1.2.1.31.1.1.1.12.3::0 +.1.3.6.1.2.1.31.1.1.1.12.4::0 +.1.3.6.1.2.1.31.1.1.1.12.5::0 +.1.3.6.1.2.1.31.1.1.1.13.1::0 +.1.3.6.1.2.1.31.1.1.1.13.2::0 +.1.3.6.1.2.1.31.1.1.1.13.3::0 +.1.3.6.1.2.1.31.1.1.1.13.4::0 +.1.3.6.1.2.1.31.1.1.1.13.5::0 +.1.3.6.1.2.1.31.1.1.1.15.1::10 +.1.3.6.1.2.1.31.1.1.1.15.2::0 +.1.3.6.1.2.1.31.1.1.1.15.3::1000 +.1.3.6.1.2.1.31.1.1.1.15.4::0 +.1.3.6.1.2.1.31.1.1.1.15.5::0 +.1.3.6.1.2.1.31.1.1.1.16.1::2 +.1.3.6.1.2.1.31.1.1.1.16.2::2 +.1.3.6.1.2.1.31.1.1.1.16.3::2 +.1.3.6.1.2.1.31.1.1.1.16.4::2 +.1.3.6.1.2.1.31.1.1.1.16.5::2 +.1.3.6.1.2.1.31.1.1.1.17.1::2 +.1.3.6.1.2.1.31.1.1.1.17.2::1 +.1.3.6.1.2.1.31.1.1.1.17.3::1 +.1.3.6.1.2.1.31.1.1.1.17.4::1 +.1.3.6.1.2.1.31.1.1.1.17.5::1 +.1.3.6.1.2.1.31.1.1.1.18.1:: +.1.3.6.1.2.1.31.1.1.1.18.2:: +.1.3.6.1.2.1.31.1.1.1.18.3:: +.1.3.6.1.2.1.31.1.1.1.18.4:: +.1.3.6.1.2.1.31.1.1.1.18.5:: +.1.3.6.1.2.1.31.1.1.1.19.1::45 +.1.3.6.1.2.1.31.1.1.1.19.2::45 +.1.3.6.1.2.1.31.1.1.1.19.3::45 +.1.3.6.1.2.1.31.1.1.1.19.4::45 +.1.3.6.1.2.1.31.1.1.1.19.5::45 +.1.3.6.1.2.1.31.1.5.0::45 +.1.3.6.1.2.1.55.1.1.0::2 +.1.3.6.1.2.1.55.1.2.0::64 +.1.3.6.1.2.1.55.1.3.0::1 +.1.3.6.1.2.1.55.1.5.1.3.1::0.0 +.1.3.6.1.2.1.55.1.5.1.4.1::65536 +.1.3.6.1.2.1.55.1.5.1.9.1::1 +.1.3.6.1.2.1.55.1.5.1.10.1::1 +.1.3.6.1.2.1.88.1.1.1.0::1 +.1.3.6.1.2.1.88.1.1.2.0::0 +.1.3.6.1.2.1.88.1.1.3.0::0 +.1.3.6.1.2.1.88.1.1.4.0::0 +.1.3.6.1.2.1.88.1.1.5.0::0 +.1.3.6.1.2.1.88.1.2.1.0::0 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.1::.1.3.6.1.2.1.2.2.1.1 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.2::.1.3.6.1.2.1.2.2.1.7 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.3::.1.3.6.1.2.1.2.2.1.8 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.1::.1.3.6.1.2.1.88.2.1.1 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.2::.1.3.6.1.2.1.88.2.1.2 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.3::.1.3.6.1.2.1.88.2.1.3 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.4::.1.3.6.1.2.1.88.2.1.4 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.5::.1.3.6.1.2.1.88.2.1.6 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.1::.1.3.6.1.2.1.88.2.1.1 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.2::.1.3.6.1.2.1.88.2.1.2 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.3::.1.3.6.1.2.1.88.2.1.3 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.4::.1.3.6.1.2.1.88.2.1.4 +.1.3.6.1.2.1.88.1.3.1.1.3.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.5::.1.3.6.1.2.1.88.2.1.5 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.1::1 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.2::1 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.3::1 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.1::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.2::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.3::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.4::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.5::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.1::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.2::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.3::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.4::2 +.1.3.6.1.2.1.88.1.3.1.1.4.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.5::2 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.1::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.2::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.11.95.108.105.110.107.85.112.68.111.119.110.3::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.1::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.2::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.3::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.4::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.97.105.108.5::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.1::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.2::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.3::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.4::1 +.1.3.6.1.2.1.88.1.3.1.1.5.6.95.115.110.109.112.100.12.95.116.114.105.103.103.101.114.70.105.114.101.5::1 +.1.3.6.1.2.1.88.1.4.2.1.2.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110:: +.1.3.6.1.2.1.88.1.4.2.1.2.6.95.115.110.109.112.100.95.108.105.110.107.85.112:: +.1.3.6.1.2.1.88.1.4.2.1.2.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.105.108.117.114.101:: +.1.3.6.1.2.1.88.1.4.2.1.2.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.108.108.105.110.103:: +.1.3.6.1.2.1.88.1.4.2.1.2.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.105.114.101.100:: +.1.3.6.1.2.1.88.1.4.2.1.2.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.82.105.115.105.110.103:: +.1.3.6.1.2.1.88.1.4.2.1.3.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110::0 +.1.3.6.1.2.1.88.1.4.2.1.3.6.95.115.110.109.112.100.95.108.105.110.107.85.112::0 +.1.3.6.1.2.1.88.1.4.2.1.3.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.105.108.117.114.101::0 +.1.3.6.1.2.1.88.1.4.2.1.3.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.108.108.105.110.103::0 +.1.3.6.1.2.1.88.1.4.2.1.3.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.105.114.101.100::0 +.1.3.6.1.2.1.88.1.4.2.1.3.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.82.105.115.105.110.103::0 +.1.3.6.1.2.1.88.1.4.2.1.4.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110::1 +.1.3.6.1.2.1.88.1.4.2.1.4.6.95.115.110.109.112.100.95.108.105.110.107.85.112::1 +.1.3.6.1.2.1.88.1.4.2.1.4.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.105.108.117.114.101::1 +.1.3.6.1.2.1.88.1.4.2.1.4.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.108.108.105.110.103::1 +.1.3.6.1.2.1.88.1.4.2.1.4.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.105.114.101.100::1 +.1.3.6.1.2.1.88.1.4.2.1.4.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.82.105.115.105.110.103::1 +.1.3.6.1.2.1.88.1.4.2.1.5.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110::1 +.1.3.6.1.2.1.88.1.4.2.1.5.6.95.115.110.109.112.100.95.108.105.110.107.85.112::1 +.1.3.6.1.2.1.88.1.4.2.1.5.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.105.108.117.114.101::1 +.1.3.6.1.2.1.88.1.4.2.1.5.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.108.108.105.110.103::1 +.1.3.6.1.2.1.88.1.4.2.1.5.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.105.114.101.100::1 +.1.3.6.1.2.1.88.1.4.2.1.5.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.82.105.115.105.110.103::1 +.1.3.6.1.2.1.88.1.4.3.1.1.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110::1.3.6.1.6.3.1.1.5.3 +.1.3.6.1.2.1.88.1.4.3.1.1.6.95.115.110.109.112.100.95.108.105.110.107.85.112::1.3.6.1.6.3.1.1.5.4 +.1.3.6.1.2.1.88.1.4.3.1.1.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.105.108.117.114.101::.1.3.6.1.2.1.88.2.0.4 +.1.3.6.1.2.1.88.1.4.3.1.1.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.108.108.105.110.103::.1.3.6.1.2.1.88.2.0.3 +.1.3.6.1.2.1.88.1.4.3.1.1.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.105.114.101.100::.1.3.6.1.2.1.88.2.0.1 +.1.3.6.1.2.1.88.1.4.3.1.1.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.82.105.115.105.110.103::.1.3.6.1.2.1.88.2.0.2 +.1.3.6.1.2.1.88.1.4.3.1.2.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110::_snmpd +.1.3.6.1.2.1.88.1.4.3.1.2.6.95.115.110.109.112.100.95.108.105.110.107.85.112::_snmpd +.1.3.6.1.2.1.88.1.4.3.1.2.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.105.108.117.114.101::_snmpd +.1.3.6.1.2.1.88.1.4.3.1.2.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.108.108.105.110.103::_snmpd +.1.3.6.1.2.1.88.1.4.3.1.2.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.105.114.101.100::_snmpd +.1.3.6.1.2.1.88.1.4.3.1.2.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.82.105.115.105.110.103::_snmpd +.1.3.6.1.2.1.88.1.4.3.1.3.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110::_linkUpDown +.1.3.6.1.2.1.88.1.4.3.1.3.6.95.115.110.109.112.100.95.108.105.110.107.85.112::_linkUpDown +.1.3.6.1.2.1.88.1.4.3.1.3.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.105.108.117.114.101::_triggerFail +.1.3.6.1.2.1.88.1.4.3.1.3.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.97.108.108.105.110.103::_triggerFire +.1.3.6.1.2.1.88.1.4.3.1.3.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.70.105.114.101.100::_triggerFire +.1.3.6.1.2.1.88.1.4.3.1.3.6.95.115.110.109.112.100.95.109.116.101.84.114.105.103.103.101.114.82.105.115.105.110.103::_triggerFire +.1.3.6.1.2.1.92.1.1.1.0::1000 +.1.3.6.1.2.1.92.1.1.2.0::1440 +.1.3.6.1.2.1.92.1.2.1.0::0 +.1.3.6.1.2.1.92.1.2.2.0::0 diff --git a/src/test/resources/firmware/11111111-3534-46ff-8a63-44a8dcfa3f57/example.tar b/src/test/resources/firmware/11111111-3534-46ff-8a63-44a8dcfa3f57/example.tar new file mode 100755 index 0000000000000000000000000000000000000000..7ce75fadccaa8ae5a11b5f55fa39ab3a2ac5d2e6 GIT binary patch literal 10240 zcmeIuK?=hl5QSmaJ%uMIqegQc7t>HkXfc+CoW6GFuB$9U|JlsI6M1~P<>fi+Rkv!6 z8flZ#VA^tHlzx9B5g&{jQt}d=kKTw2F^tB_QHA<{Uu(_9S~Hbhr$^cQtiONd{o51W zRo7~7_p-cm(RR#wIZ=D6B7gt_2q1s}0tg_000IagfB*srAbgg$4Ix%&q_`TTCiz4TDlJ$ zb}Csb=jhg^*CcKKMj|0OjX4KNL1S>DmmJi2*=e86v#+Uk#e3J6#rj8CHeqx4l{Z(9 zG*+9czun9D?uxC$U|vs0`T)BkfB*srAb1Vl+%}PWa^Y5>hHxy4tZLy%0c_=o_#GPWoyltHys~&+l9^HSKeGb z(^zyV_IA(nJ7ulIq}E@~^Z|B7009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ S1Q0*~0R#|0009L4RNw>hq#r*3 literal 0 HcmV?d00001 diff --git a/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100755 index 0000000..1f0955d --- /dev/null +++ b/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/src/test/resources/syslog.cmc b/src/test/resources/syslog.cmc new file mode 100755 index 0000000..12a8e57 --- /dev/null +++ b/src/test/resources/syslog.cmc @@ -0,0 +1,2754 @@ +2023-12-13T09:44:16.461983+01:00 pdu-256111c9 CMC_Log: Ethernet: Auto +2023-12-13T09:44:16.482336+01:00 pdu-256111c9 CMC_Log: Application (V7.19.00) started +2023-12-13T09:44:53.300516+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, OK +2023-12-13T09:44:53.303525+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, OK +2023-12-13T09:44:53.305438+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-13T09:44:53.307440+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-13T09:44:53.310915+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, OK +2023-12-13T09:44:53.313986+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, OK +2023-12-13T09:44:53.317274+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, OK +2023-12-13T09:44:53.852023+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Input: Off (0 ) +2023-12-13T09:44:53.859153+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-13T09:44:53.874447+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, System Temperature: OK (none) +2023-12-13T09:44:53.877475+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, System Current: OK (none) +2023-12-13T09:44:53.879428+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, System Supply: OK (none) +2023-12-13T09:44:53.882178+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Login: Off (0 , 0 , 0 s) +2023-12-13T09:44:53.884089+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Neutral Current: OK (0.04 A) +2023-12-13T09:44:53.885438+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Power Active: OK (2 W) +2023-12-13T09:44:54.203235+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Power L1: OK (2 W) +2023-12-13T09:44:54.205983+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 01: On () +2023-12-13T09:44:54.216936+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 02: On () +2023-12-13T09:44:54.228444+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 03: On () +2023-12-13T09:44:54.231144+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 04: On () +2023-12-13T09:44:54.239369+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 05: On () +2023-12-13T09:44:54.243312+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 06: On () +2023-12-13T09:44:54.247227+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 07: On () +2023-12-13T09:44:54.252274+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 08: On () +2023-12-13T09:44:54.256568+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 09: On () +2023-12-13T09:44:54.262478+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 10: On () +2023-12-13T09:44:54.268388+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 11: On () +2023-12-13T09:44:54.275462+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 12: On () +2023-12-13T09:44:54.280216+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 13: On () +2023-12-13T09:44:54.285447+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 14: On () +2023-12-13T09:44:54.288959+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 15: On () +2023-12-13T09:44:54.295388+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 16: On () +2023-12-13T09:44:54.299263+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 17: On () +2023-12-13T09:44:54.304878+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 18: On () +2023-12-13T09:44:54.307480+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 19: On () +2023-12-13T09:44:54.313131+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 20: On () +2023-12-13T09:44:54.630327+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-13T09:44:54.631448+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-13T09:44:54.637971+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-13T09:44:54.957785+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-13T09:44:54.958936+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-13T09:44:54.959788+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-13T09:44:54.966527+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Airflow: OK (0 %) +2023-12-13T09:44:54.974592+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-13T09:44:54.979908+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-13T09:44:54.985544+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-13T09:44:54.989396+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Updat) @2.04, Temperature: OK (22.30 °C) +2023-12-13T09:44:55.272142+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (17.00 °C) +2023-12-13T09:44:55.950751+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-13T10:11:53.720509+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Updat), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-13T10:12:33.332569+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-13T10:18:33.677452+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:18:33.877479+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:18:34.077437+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:18:34.277758+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '12.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:20:53.677517+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '24.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:20:53.877563+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '24.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:20:54.077470+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '24.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:20:54.277438+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '24.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:23:13.677442+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:23:13.877429+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:23:13.977478+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:23:14.177529+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:23:33.677442+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '20.5 V' by user 'snmpd' [SNMP] +2023-12-13T10:23:33.877494+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '20.5 V' by user 'snmpd' [SNMP] +2023-12-13T10:23:34.077501+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '20.5 V' by user 'snmpd' [SNMP] +2023-12-13T10:23:34.178560+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '20.5 V' by user 'snmpd' [SNMP] +2023-12-13T10:25:33.677485+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '11.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:25:33.877527+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '11.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:25:34.077693+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '11.0 V' by user 'snmpd' [SNMP] +2023-12-13T10:25:34.177423+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '11.0 V' by user 'snmpd' [SNMP] +2023-12-13T11:07:33.811481+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T11:07:33.962584+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T11:07:34.161533+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T11:07:34.361692+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T11:09:13.661722+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update123' by user 'snmpd' [SNMP] +2023-12-13T12:31:53.666848+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-13T12:31:53.866451+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-13T12:31:53.966506+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-13T12:31:54.167595+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-13T12:39:33.766476+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-13T12:39:34.066537+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-13T12:39:34.366598+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-13T12:39:34.466561+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-13T12:52:13.528872+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.4 V' by user 'snmpd' [SNMP] +2023-12-13T12:52:13.727675+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.4 V' by user 'snmpd' [SNMP] +2023-12-13T12:52:13.827721+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.4 V' by user 'snmpd' [SNMP] +2023-12-13T12:52:14.027657+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.4 V' by user 'snmpd' [SNMP] +2023-12-13T13:05:33.492248+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update123), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-13T15:49:33.298069+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '2.3 V' by user 'snmpd' [SNMP] +2023-12-13T15:49:33.498169+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '2.3 V' by user 'snmpd' [SNMP] +2023-12-13T15:49:33.697280+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '2.3 V' by user 'snmpd' [SNMP] +2023-12-13T15:49:33.797072+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '2.3 V' by user 'snmpd' [SNMP] +2023-12-13T15:53:33.397325+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '12.1 V' by user 'snmpd' [SNMP] +2023-12-13T15:53:33.497189+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '12.1 V' by user 'snmpd' [SNMP] +2023-12-13T15:53:33.697340+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '12.1 V' by user 'snmpd' [SNMP] +2023-12-13T15:53:33.897097+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '12.1 V' by user 'snmpd' [SNMP] +2023-12-13T15:55:33.259196+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '1.2 V' by user 'snmpd' [SNMP] +2023-12-13T15:55:33.459103+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '1.2 V' by user 'snmpd' [SNMP] +2023-12-13T15:55:33.660059+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '1.2 V' by user 'snmpd' [SNMP] +2023-12-13T15:55:33.860012+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '1.2 V' by user 'snmpd' [SNMP] +2023-12-13T18:07:53.148416+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T18:07:53.348064+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T18:07:53.448231+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T18:07:53.648799+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.0 V' by user 'snmpd' [SNMP] +2023-12-13T18:08:53.148262+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update12' by user 'snmpd' [SNMP] +2023-12-13T23:35:46.638052+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-13T23:43:51.277505+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13T23:43:51.848608+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-13T23:43:55.040136+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-13T23:43:57.650623+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-13T23:44:10.460178+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T08:32:55.224632+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14T08:33:16.446819+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T08:33:17.020935+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14T08:33:18.825679+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T08:33:24.424019+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14T08:46:54.028182+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-14T08:56:36.173797+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-14T09:00:36.172343+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update12' by user 'snmpd' [SNMP] +2023-12-14T09:03:56.235278+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T09:03:56.333271+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T09:03:56.533301+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T09:03:56.633488+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T09:07:36.233318+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14T09:08:36.233424+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '23.3 V' by user 'snmpd' [SNMP] +2023-12-14T09:24:56.198175+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T09:24:56.498564+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T09:35:31.747035+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T09:36:23.404840+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-14T10:18:08.702959+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14T10:18:10.964568+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T10:18:11.689658+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14T10:18:19.026962+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T10:18:50.893976+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14T10:19:05.634684+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T10:19:10.593780+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (22.00 °C) +2023-12-14T10:19:17.929429+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T10:19:21.497534+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12) @2.04, Temperature: OK (21.90 °C) +2023-12-14T10:45:52.811026+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-14T12:53:56.001309+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-14T12:53:56.201330+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-14T12:53:56.301244+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-14T12:53:56.501442+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.2 V' by user 'snmpd' [SNMP] +2023-12-14T12:58:36.701414+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-14T13:06:35.964730+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller), Variable 'System Health.Current.DescName' changed to 'Sascha Test' by user 'snmpd' [SNMP] +2023-12-14T13:18:55.926552+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom-Update12' by user 'snmpd' [SNMP] +2023-12-14T13:24:35.924747+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T13:24:36.124482+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T13:24:36.224379+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T13:24:36.424554+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '22.3 V' by user 'snmpd' [SNMP] +2023-12-14T13:24:55.924584+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14T13:24:56.124366+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14T13:24:56.325409+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14T13:24:56.425292+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '23.0 V' by user 'snmpd' [SNMP] +2023-12-14T13:28:35.924427+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '21.0 V' by user 'snmpd' [SNMP] +2023-12-14T13:39:35.885903+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update12), Description changed to 'CMCIII-TMP-2-front-botom-Update' by user 'snmpd' [SNMP] +2023-12-14T14:57:31.145135+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.162) logged in +2023-12-14T16:12:35.190217+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.162) terminated (Timeout) +2023-12-14T22:54:12.164238+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-14T22:54:30.232308+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T22:54:32.793272+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-14T22:55:08.624293+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-14T22:55:48.402141+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-14T22:56:15.627070+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15T09:21:22.439597+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-15T09:21:37.873532+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15T09:21:52.339555+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-15T11:29:26.936278+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-15T23:33:37.483583+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15T23:33:38.906824+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-15T23:33:54.347727+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15T23:34:45.212047+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-15T23:34:47.448371+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-15T23:51:44.112976+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-16T11:59:25.855631+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T11:59:40.623571+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (22.00 °C) +2023-12-16T12:00:53.655270+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T12:01:07.719861+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (22.00 °C) +2023-12-16T12:01:14.058786+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T12:01:16.284689+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T12:01:27.959316+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T12:01:35.286735+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T12:02:20.752444+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T12:02:43.443883+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T12:02:44.657009+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T12:02:47.091021+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T12:02:49.757416+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T12:46:58.082318+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.90 °C) +2023-12-16T23:41:15.044444+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:41:16.309613+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:41:57.255628+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:42:01.806170+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:42:20.178242+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:42:21.413758+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:42:32.651296+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:42:54.313802+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:43:42.436018+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:43:46.706816+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:43:48.251931+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:43:54.408416+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:43:56.886896+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:44:20.813053+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:44:22.350502+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:44:32.409654+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:44:42.768019+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-16T23:45:06.716917+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-16T23:45:17.063721+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T00:00:10.917836+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (21.90 °C) +2023-12-17T13:04:58.146429+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T13:05:11.281367+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T13:05:30.147938+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T13:05:46.276208+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T13:06:07.941818+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T13:06:40.552440+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T13:06:41.143972+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T13:06:52.177306+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T13:07:01.546639+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T22:38:53.717318+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T22:38:54.969053+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T22:39:09.715084+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T22:39:10.966090+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T22:39:49.107322+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T22:40:12.574214+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T22:40:22.911842+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T22:41:37.166961+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T22:41:45.905236+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T22:42:33.570869+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (21.90 °C) +2023-12-17T22:42:43.001566+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-17T22:43:15.066052+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-17T22:43:19.600682+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: Low Warn (21.90 °C) +2023-12-18T08:15:54.781513+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2023-12-18T08:16:12.529721+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18T08:16:13.131522+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Access: Closed (0 ) +2023-12-18T08:16:19.032932+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18T08:16:20.341348+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-18T08:16:48.331718+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'admin' [Web] +2023-12-18T08:16:49.534687+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (21.70 °C) +2023-12-18T08:17:11.133874+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'admin' [Web] +2023-12-18T08:17:12.046864+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.40 °C) +2023-12-18T08:17:56.230013+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighAlarm' changed to '260.0 V' by user 'admin' [Web] +2023-12-18T08:17:56.232381+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtHighWarning' changed to '240.0 V' by user 'admin' [Web] +2023-12-18T08:17:56.238470+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowWarning' changed to '220.0 V' by user 'admin' [Web] +2023-12-18T08:17:56.242441+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.SetPtLowAlarm' changed to '215.0 V' by user 'admin' [Web] +2023-12-18T08:18:09.532713+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET), Variable 'Phase L1.Voltage.Hysteresis' changed to '2.00 %' by user 'admin' [Web] +2023-12-18T08:18:10.832039+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18T08:23:44.081706+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2023-12-18T08:58:46.808265+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2023-12-18T08:59:07.557206+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '22.20 °C' by user 'admin' [Web] +2023-12-18T08:59:09.194723+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: Low Warn (22.00 °C) +2023-12-18T08:59:09.755631+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18T08:59:23.857046+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'admin' [Web] +2023-12-18T08:59:25.067172+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (22.00 °C) +2023-12-18T08:59:25.756529+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18T09:00:02.408367+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Lost +2023-12-18T09:00:02.587084+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Lost +2023-12-18T09:00:02.745251+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Lost +2023-12-18T09:00:02.960125+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Lost +2023-12-18T09:00:03.102141+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Lost +2023-12-18T09:00:03.655085+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18T09:00:18.054878+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-18T09:00:18.059571+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-18T09:00:18.066762+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, OK +2023-12-18T09:00:18.074387+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, OK +2023-12-18T09:00:18.081134+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, OK +2023-12-18T09:00:18.655032+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18T09:00:18.944147+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-18T09:00:18.945225+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-18T09:00:18.948237+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-18T09:00:19.099237+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-18T09:00:19.100344+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Inactive (1 ) +2023-12-18T09:00:19.108543+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-18T09:00:19.117334+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Airflow: OK (1 %) +2023-12-18T09:00:19.127173+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-18T09:00:19.132053+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-18T09:00:19.138513+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-18T09:00:19.146407+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-18T09:00:19.150889+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (21.90 °C) +2023-12-18T09:00:19.355004+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18T09:00:19.372512+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-18T09:00:45.955311+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18T09:00:46.957012+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-18T09:03:08.529599+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Lost +2023-12-18T09:03:35.822846+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Lost +2023-12-18T09:03:35.970111+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Lost +2023-12-18T09:03:36.119521+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Lost +2023-12-18T09:03:36.328934+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Review) @2.04, Lost +2023-12-18T09:03:50.918565+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-18T09:03:50.931518+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-18T09:03:50.935381+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, OK +2023-12-18T09:03:50.938251+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, OK +2023-12-18T09:03:50.940731+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, OK +2023-12-18T09:03:51.517836+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18T09:03:51.923552+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-18T09:03:51.926134+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-18T09:03:51.929430+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-18T09:03:52.305951+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-18T09:03:52.307031+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Inactive (1 ) +2023-12-18T09:03:52.307862+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-18T09:03:52.308658+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Airflow: OK (1 %) +2023-12-18T09:03:52.315557+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-18T09:03:52.320071+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-18T09:03:52.322888+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-18T09:03:52.326938+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-18T09:03:52.330050+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (21.50 °C) +2023-12-18T09:03:52.419938+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-18T09:03:52.918519+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18T09:04:30.217676+01:00 pdu-256111c9 CMC_Log: Devices reorganized... +2023-12-18T09:04:36.167768+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, OK +2023-12-18T09:04:36.175312+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, OK +2023-12-18T09:04:36.186738+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-18T09:04:36.197435+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-18T09:04:36.210409+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, OK +2023-12-18T09:04:36.217451+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, OK +2023-12-18T09:04:36.227077+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, OK +2023-12-18T09:04:36.717790+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Input: Off (0 ) +2023-12-18T09:04:36.721018+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18T09:04:36.727051+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, System Temperature: OK (none) +2023-12-18T09:04:36.735203+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Sascha Test: OK (none) +2023-12-18T09:04:36.741894+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, System Supply: OK (none) +2023-12-18T09:04:36.749265+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Login: Off (0 , 0 , 0 s) +2023-12-18T09:04:36.756742+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Neutral Current: OK (0.07 A) +2023-12-18T09:04:36.764557+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Power Active: OK (7 W) +2023-12-18T09:04:36.775196+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Power L1: OK (7 W) +2023-12-18T09:04:36.780558+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 01: On () +2023-12-18T09:04:36.788607+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 02: On () +2023-12-18T09:04:36.795979+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 03: On () +2023-12-18T09:04:36.801907+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 04: On () +2023-12-18T09:04:36.810881+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 05: On () +2023-12-18T09:04:36.815783+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 06: On () +2023-12-18T09:04:36.820092+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 07: On () +2023-12-18T09:04:36.825451+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 08: On () +2023-12-18T09:04:36.830602+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 09: On () +2023-12-18T09:04:36.836077+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 10: On () +2023-12-18T09:04:36.839838+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 11: On () +2023-12-18T09:04:36.843841+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 12: On () +2023-12-18T09:04:36.849899+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 13: On () +2023-12-18T09:04:36.852720+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 14: On () +2023-12-18T09:04:36.857689+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 15: On () +2023-12-18T09:04:36.863990+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 16: On () +2023-12-18T09:04:36.869405+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 17: On () +2023-12-18T09:04:36.873659+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 18: On () +2023-12-18T09:04:36.876177+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 19: On () +2023-12-18T09:04:36.885782+01:00 pdu-256111c9 CMC_Log: Device 2 (PDU-MET) @1.02, Socket 20: On () +2023-12-18T09:04:37.289137+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-18T09:04:37.294450+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-18T09:04:37.297905+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-18T09:04:37.902423+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-18T09:04:37.904846+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-18T09:04:37.909609+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-18T09:04:37.915657+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Airflow: OK (0 %) +2023-12-18T09:04:37.929883+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-18T09:04:37.936113+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-18T09:04:37.944235+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-18T09:04:37.956072+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Temperature: OK (22.00 °C) +2023-12-18T09:04:37.959493+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Temperatur: OK (21.50 °C) +2023-12-18T09:04:38.817963+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-18T09:05:00.619525+01:00 pdu-256111c9 CMC_Log: Quit Device Configuration... +2023-12-18T09:24:29.332606+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Lost +2023-12-18T09:24:29.492924+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Lost +2023-12-18T09:24:29.636901+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Lost +2023-12-18T09:24:29.842377+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.04, Lost +2023-12-18T09:24:30.043739+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.05, Lost +2023-12-18T09:24:46.879998+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, OK +2023-12-18T09:24:46.892073+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, OK +2023-12-18T09:24:46.904773+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, OK +2023-12-18T09:24:46.911565+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Changed +2023-12-18T09:24:47.092776+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Changed +2023-12-18T09:24:47.630703+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Access: Alarm (1 ) +2023-12-18T09:24:47.633089+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2023-12-18T09:24:47.637553+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Keypad: Active () +2023-12-18T09:24:47.781099+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Access: Alarm (1 ) +2023-12-18T09:24:47.782215+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2023-12-18T09:24:47.784613+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Keypad: Active () +2023-12-18T09:24:47.787497+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Airflow: OK (1 %) +2023-12-18T09:24:47.793497+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_1: Off (0 ) +2023-12-18T09:24:47.798974+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, Input_2: Off (0 ) +2023-12-18T09:24:47.802021+01:00 pdu-256111c9 CMC_Log: Device 5 (CMCIII-UNI) @2.03, EnergyMeter_1: Inactive (0.000 kWh) +2023-12-18T09:24:47.804675+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (22.00 °C) +2023-12-18T09:24:47.806607+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.80 °C) +2023-12-18T09:25:21.288016+01:00 pdu-256111c9 CMC_Log: Quit Device Configuration... +2023-12-18T09:25:22.580044+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, OK +2023-12-18T09:25:22.583172+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, OK +2023-12-18T09:35:36.742825+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18T09:35:38.348739+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Access: Closed (0 ) +2023-12-18T09:35:50.343006+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Access.Command' changed to 'Closed' by user 'admin' [Web] +2023-12-18T09:35:51.550229+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Access: Closed (0 ) +2023-12-18T09:35:52.242645+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-18T09:41:19.594770+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2023-12-18T13:24:41.477687+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2023-12-18T13:30:36.777398+01:00 pdu-256111c9 CMC_Log: Configuration 'System-Info' changed by user 'admin' [Web] +2023-12-18T13:30:55.080378+01:00 pdu-256111c9 CMC_Log: Configuration 'Syslog-Setup' changed by user 'admin' [Web] +2023-12-18T13:31:03.379518+01:00 pdu-256111c9 CMC_Log: Configuration 'Syslog-Setup' changed by user 'admin' [Web] +2023-12-18T13:31:28.179344+01:00 pdu-256111c9 CMC_Log: Configuration 'Security-Setup' changed by user 'admin' [Web] +2023-12-18T13:31:44.728303+01:00 pdu-256111c9 CMC_Log: Configuration 'Security-Setup' changed by user 'admin' [Web] +2023-12-18T13:32:31.779149+01:00 pdu-256111c9 CMC_Log: Configuration 'Server-Shutdown' changed by user 'admin' [Web] +2023-12-18T13:32:39.779152+01:00 pdu-256111c9 CMC_Log: Configuration 'Server-Shutdown' changed by user 'admin' [Web] +2023-12-18T13:39:32.736252+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2023-12-20T03:15:26.129187+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-20T03:15:26.677704+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-20T04:54:40.517408+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T04:54:42.477362+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T04:56:15.605797+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T04:56:23.579045+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T04:56:34.792730+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T04:56:52.578209+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T04:57:45.530828+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (20.00 °C) +2023-12-20T04:57:52.776420+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T05:00:01.791522+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T05:00:31.552688+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T05:00:33.771174+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T05:00:35.937992+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T05:00:36.778983+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T05:01:04.540679+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T05:01:19.984255+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T05:01:38.849211+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T05:01:54.294933+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T05:12:54.840908+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T05:13:03.769667+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T05:13:24.039827+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T05:13:29.985226+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T05:13:31.239185+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T05:13:32.777608+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-20T05:14:01.542249+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-20T06:08:46.100702+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-20T06:08:46.789773+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-21T03:30:12.266649+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-21T03:30:12.816508+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-21T04:56:33.853705+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T04:56:34.416606+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T04:58:12.565639+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T04:58:14.715640+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T04:59:02.561850+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T04:59:03.819761+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T04:59:06.958856+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T04:59:11.215426+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:00:12.552005+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (20.00 °C) +2023-12-21T05:00:13.810865+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:00:37.151903+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:00:50.824407+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:00:51.659004+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:00:55.913688+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:01:06.272562+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:01:08.915891+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:01:23.655249+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:01:31.619521+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:02:01.052740+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:02:23.817198+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:02:39.957443+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:03:22.015671+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:03:30.995658+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:03:51.909800+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:03:56.463854+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:03:59.316601+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:04:02.415020+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:10:59.470326+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:11:01.947316+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:11:12.670864+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:11:39.506880+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:11:40.080092+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:11:59.216420+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:12:00.476116+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T05:12:21.711176+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-21T05:12:36.182729+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-21T06:00:38.182804+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-21T06:00:38.862159+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-21T10:57:35.562937+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.12) logged in +2023-12-21T11:32:07.390093+01:00 pdu-256111c9 CMC_Log: User 'admin' (IP 10.242.2.12) logged out +2023-12-22T03:02:59.869996+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-22T03:03:00.615896+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-22T04:24:05.790762+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22T04:24:20.647578+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22T04:28:48.347893+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22T05:19:50.901019+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22T05:19:59.141109+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22T05:19:59.701895+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22T05:20:00.536842+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (20.00 °C) +2023-12-22T05:20:04.602406+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22T05:20:14.952447+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22T05:20:27.106495+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22T05:20:49.943558+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22T05:20:59.302725+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22T05:21:13.848121+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22T05:21:16.707557+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22T05:21:43.052069+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2023-12-22T05:21:45.895106+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2023-12-22T06:05:16.491884+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-22T06:05:17.190287+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-22T18:52:31.966257+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-22T18:52:47.266907+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-22T20:02:05.716719+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-22T20:02:59.919062+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-22T20:03:15.880951+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-22T20:09:40.780395+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-23T05:49:13.518880+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-23T05:49:14.065731+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-23T06:52:21.926294+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-23T06:52:22.622953+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-27T04:19:20.931426+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-27T04:19:21.484655+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-27T05:49:21.422699+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-27T05:49:22.108364+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2023-12-28T04:17:02.597326+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2023-12-28T04:17:03.135824+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2023-12-28T05:49:53.029764+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2023-12-28T05:49:53.725235+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-07T05:11:43.564890+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-07T05:11:44.097268+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-07T06:27:11.460666+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:27:15.424116+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:27:45.263251+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:27:59.734701+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:28:01.460703+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:28:18.734807+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (19.90 °C) +2024-01-07T06:31:14.062637+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:31:15.329388+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:31:26.374861+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:31:47.328110+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:31:50.475625+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:33:30.433889+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:33:55.380112+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:34:15.632296+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:37:15.864156+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:37:24.526995+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:37:33.463825+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:39:55.928604+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:40:04.979406+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:41:18.927942+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:41:38.764390+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:43:00.198102+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:43:14.928100+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:43:17.594801+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:43:37.729149+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:43:39.894808+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:44:15.729608+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (20.00 °C) +2024-01-07T06:44:22.092759+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:44:33.120783+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:44:35.996396+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:44:51.425868+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:45:07.993641+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:45:10.229947+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:45:28.694150+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:46:42.329480+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:47:03.290708+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:47:11.233860+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:47:21.995493+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:47:33.034105+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:47:43.098867+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T06:47:51.130624+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: Low Warn (19.90 °C) +2024-01-07T06:48:01.196725+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature: OK (20.00 °C) +2024-01-07T08:05:37.820554+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-07T08:05:38.508424+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-09T14:23:38.820606+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-01-09T15:47:26.136177+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-01-10T01:19:36.771023+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-10T01:19:37.308795+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-10T07:34:04.819576+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-10T07:34:05.503736+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-11T03:39:15.675125+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-11T03:39:16.426231+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-11T05:34:15.395204+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-11T05:34:16.083708+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-11T09:34:00.007518+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.151) logged in +2024-01-11T09:47:26.671313+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.151) logged in +2024-01-11T10:37:25.062530+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.151) terminated (Timeout) +2024-01-15T11:11:28.960073+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-15T12:48:22.544805+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-15T13:45:49.437620+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.184) terminated (Timeout) +2024-01-15T14:14:44.861919+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-15T14:45:21.643226+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtLowAlarm' changed to '3.80 °C' by user 'admin' [Web] +2024-01-15T14:45:56.243275+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.DescName' changed to 'Temperature12345' by user 'admin' [Web] +2024-01-15T16:24:01.181057+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.184) terminated (Timeout) +2024-01-16T07:38:17.805329+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-16T07:38:17.905327+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16T07:38:17.907269+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16T07:38:18.117491+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-16T07:38:18.809433+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-16T07:38:24.107092+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-16T07:38:24.118841+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-16T07:38:24.205301+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16T07:38:24.815312+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-16T07:38:35.714653+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-16T07:38:38.994625+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Alarm (1 ) +2024-01-16T07:38:39.405118+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-16T07:38:40.111770+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-16T07:38:40.805728+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-16T07:38:43.112578+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-16T07:38:46.756938+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-16T07:38:46.806856+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16T07:38:46.817436+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-16T07:38:47.322960+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-16T07:38:48.213584+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-16T07:38:54.310107+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-16T07:39:12.414628+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-16T10:40:50.064390+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.5) logged in +2024-01-16T11:41:59.210677+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.5) terminated (Timeout) +2024-01-17T08:51:27.195501+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.9) logged in +2024-01-17T09:13:30.254539+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.9) terminated (Timeout) +2024-01-17T12:29:19.525399+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-17T15:24:29.632134+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-17T15:24:45.528480+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-17T15:41:21.342735+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '35.00 °C' by user 'snmpd' [SNMP] +2024-01-17T16:31:02.986817+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.6) terminated (Timeout) +2024-01-18T15:06:40.390063+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.8) logged in +2024-01-18T15:14:04.541296+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-18T15:17:24.638372+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-18T15:17:44.538365+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-18T15:17:44.738399+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-18T15:37:47.620185+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.8) terminated (Timeout) +2024-01-18T23:21:41.297217+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-18T23:21:41.854349+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T09:03:22.911941+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-19T09:03:23.602120+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T09:27:28.169130+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:27:28.369915+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:27:48.167324+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:27:48.367168+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:28:08.167206+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:28:08.478386+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:28:28.133460+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:28:28.231983+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:28:48.136340+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:28:48.331962+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:29:08.133988+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:29:08.231963+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:29:28.133484+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:29:28.335511+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:29:48.135099+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:29:48.334983+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:30:08.131967+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:30:08.332099+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:30:28.134773+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:30:28.344520+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:30:48.131975+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:30:48.232141+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:31:08.134468+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:31:08.431996+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:31:28.131970+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:31:28.333634+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:31:48.132231+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:31:48.236196+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:32:08.131953+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:32:08.331967+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:32:28.131958+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:32:28.335647+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:32:48.134166+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:32:48.331945+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:33:08.234175+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:33:08.333893+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:33:28.132573+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:33:28.334046+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:33:48.134154+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:33:48.333918+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:34:08.131966+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:34:27.533592+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:34:31.133713+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:34:36.233966+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:34:48.133900+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:34:51.135736+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:35:08.234089+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:35:13.633572+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:35:28.131951+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:35:28.332006+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:35:48.135660+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:35:48.333525+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:36:08.131947+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:36:08.332140+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:36:28.131982+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:36:28.335604+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:36:48.134300+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:36:48.231953+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:37:08.135143+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:37:08.233714+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:37:28.131967+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:37:28.231984+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:37:48.131987+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:37:48.235684+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:38:08.132081+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:38:08.231985+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:38:28.131993+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:38:28.234913+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:38:48.132035+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:38:48.231959+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:39:08.132015+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:39:08.335162+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:39:28.131945+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:39:28.233509+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:39:48.131960+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:39:48.333892+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:40:08.132058+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:40:08.233560+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:40:28.131962+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:40:28.232141+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:40:48.135408+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:40:48.336984+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:41:08.233558+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:41:08.434932+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:41:28.132016+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:41:28.231968+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:41:48.131987+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:41:48.231969+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:42:08.132065+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:42:08.234084+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:42:28.131965+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:42:28.332090+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:42:48.132127+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:42:48.332076+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:43:08.232852+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:43:08.335125+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:43:28.131985+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:43:28.333517+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:43:48.132102+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:43:48.231974+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:44:08.132074+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:44:08.232061+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:44:28.098564+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:44:28.200031+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:44:48.098994+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:44:48.299343+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:45:08.099392+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:45:08.298760+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:45:28.096972+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:45:28.196978+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:45:48.099187+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:45:48.298806+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:46:08.199125+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:46:28.197007+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:46:48.096998+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:46:48.196971+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:47:08.096969+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:47:08.199109+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:47:28.099039+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:47:28.197184+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:47:48.097002+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:47:48.198677+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:48:08.196968+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:48:08.297006+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:48:28.096990+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:48:28.197039+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:48:48.098884+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:48:48.196986+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:49:08.099055+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:49:08.199672+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:49:28.097091+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:49:28.297079+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:49:48.096972+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:49:48.296992+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:50:08.096981+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:50:08.197010+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:50:28.102994+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:50:28.198487+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:50:48.059083+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:50:48.198913+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:51:08.098839+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:51:08.199130+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:51:28.101095+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:51:28.299780+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:51:48.100210+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:51:48.205571+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:52:08.298923+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:52:08.396977+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:52:28.097008+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:52:28.298771+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:52:48.100889+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:52:48.200699+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:53:08.102263+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:53:08.203505+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:53:28.098710+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:53:28.199901+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:53:48.099841+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:53:48.202517+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:54:08.097000+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:54:08.198542+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:54:28.104056+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:54:28.301140+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:54:48.100146+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:54:48.196971+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:55:08.060486+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:55:08.197161+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:55:28.200867+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:55:28.296954+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:55:48.097039+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:55:48.202783+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:56:08.097020+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:56:08.197061+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:56:28.100187+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:56:28.199495+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:56:48.097061+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:56:48.199128+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:57:08.198942+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:57:08.298680+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:57:28.097015+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:57:28.198725+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:57:48.200952+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:57:48.305981+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:58:08.098715+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:58:08.199026+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:58:28.100527+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:58:28.298993+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:58:48.099972+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:58:48.297142+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:59:08.800693+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:59:08.812939+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:59:28.096962+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:59:28.197024+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:59:48.104703+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T09:59:48.197760+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:00:08.201237+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:00:08.210202+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:00:28.162702+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:00:28.261531+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:00:48.063069+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:00:48.263564+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:01:08.067971+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:01:08.263724+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:01:28.163703+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:01:28.261520+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:01:48.061672+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:01:48.163197+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:02:08.164572+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:02:08.263366+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:02:28.161531+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:02:28.263641+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:02:48.363421+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:02:48.563440+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:03:08.163711+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:03:08.263669+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:03:28.063258+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:03:28.264452+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:03:48.064349+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:03:48.163727+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:04:08.163590+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:04:08.261524+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:04:28.161563+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:04:28.264027+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:04:48.164208+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:04:48.261534+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:05:08.069506+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:05:08.173122+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:05:28.161618+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:05:28.263373+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:05:48.066498+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:05:48.161576+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:06:08.164211+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:06:08.262295+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:06:28.161528+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:06:28.263237+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:06:48.069624+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:06:48.161513+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:07:08.161836+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:07:08.261593+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:07:28.161546+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:07:28.261529+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:07:48.163559+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:07:48.263057+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:08:08.161520+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:08:08.361533+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:08:28.162743+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:08:28.461532+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:08:48.163575+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:08:48.461557+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:09:08.163069+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:09:08.261538+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:09:28.161533+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:09:28.461513+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:09:48.161638+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:09:48.463999+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:10:08.162984+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:10:08.461508+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:10:28.061504+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:10:28.261581+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:10:48.161518+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:10:48.261499+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:11:08.264395+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:11:08.563709+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:11:28.063691+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:11:28.261576+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:11:48.174073+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:11:48.263045+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:12:08.163472+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:12:08.261544+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:12:28.163467+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:12:28.263665+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:12:48.163346+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:12:48.263306+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:13:08.163128+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:13:08.261524+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:13:28.164292+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:13:28.264442+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:13:48.163711+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:13:48.261688+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:14:08.163640+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:14:08.262258+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:14:28.165190+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:14:28.261530+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:14:48.165467+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:14:48.264601+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:15:08.161568+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:15:08.263062+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:15:28.165286+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:15:28.261564+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:15:48.163272+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:15:48.263575+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:16:08.172937+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:16:08.363091+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:16:28.128568+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:16:28.227064+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:16:48.127018+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:16:48.229183+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:17:08.126987+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:17:08.228832+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:17:28.128793+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:17:28.227025+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:17:48.128617+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:17:48.328944+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:18:08.127295+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:18:08.328999+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:18:28.129088+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:18:28.327090+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:18:48.128733+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:18:48.227025+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:19:08.128788+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:19:08.330196+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:19:28.127262+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:19:28.227055+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:19:48.129069+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:19:48.229737+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:20:08.127143+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:20:08.226986+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:20:28.127054+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:20:28.326981+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:20:48.129118+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:20:48.328879+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:21:08.127046+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:21:08.327006+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:21:28.129729+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:21:28.229200+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:21:48.127321+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:21:48.231340+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:22:08.130016+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:22:08.230911+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:22:28.141637+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:22:28.328622+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:22:48.127156+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:22:48.226998+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:23:08.131767+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:23:08.228868+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:23:28.129796+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:23:28.227138+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:23:48.128901+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:23:48.227248+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:24:08.127012+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:24:08.226976+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:24:28.130529+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:24:28.231600+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:24:48.127097+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:24:48.227088+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:25:08.129699+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:25:08.230066+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:25:28.128994+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:25:28.226997+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:25:48.128751+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:25:48.229170+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:26:08.128279+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:26:08.228524+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:26:28.129002+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:26:28.227022+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:26:48.128550+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:26:48.227050+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:27:08.127038+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:27:08.229076+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:27:28.127035+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:27:28.228976+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:27:48.127007+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:27:48.227148+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:28:08.129046+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:28:08.230616+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:28:28.129166+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:28:28.228632+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:28:48.129419+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:28:48.229152+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:29:08.129900+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:29:08.230629+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:29:28.129982+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:29:28.229021+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:29:48.127066+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:29:48.228758+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:30:08.127157+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:30:08.229075+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:30:28.127003+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:30:28.228608+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:30:48.128588+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:30:48.218367+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:31:08.129705+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:31:08.227012+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:31:28.128886+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:31:28.231853+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:31:48.128954+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:31:48.227013+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:32:08.126994+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:32:08.227014+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:32:28.091245+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:32:28.191242+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:32:48.092791+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:32:48.193696+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:33:08.092065+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:33:08.191321+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:33:28.091228+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:33:28.191233+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:33:48.091225+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:33:48.195603+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:34:08.193059+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:34:08.294136+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:34:28.192074+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:34:28.295047+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:34:48.091242+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:34:48.191456+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:35:08.193949+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:35:08.294343+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:35:28.093317+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:35:28.195049+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:35:48.091262+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:35:48.191253+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:36:08.091254+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:36:08.193210+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:36:28.094088+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:36:28.193218+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:36:48.094309+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:36:48.293252+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:37:08.091267+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:37:08.291229+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:37:28.094194+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:37:28.291251+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:37:48.193370+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:37:48.291216+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:38:08.094378+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:38:08.291226+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:38:28.091267+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:38:28.191222+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:38:48.491329+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:39:08.291262+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:39:28.091314+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:39:28.294024+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:39:48.094490+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:39:48.193215+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:40:08.094458+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:40:08.191250+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:40:28.093636+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:40:28.191251+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:40:48.093085+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:40:48.194398+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:41:08.092723+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:41:08.291282+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:41:28.091272+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:41:28.191892+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:41:48.093013+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:41:48.192466+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:42:08.093030+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:42:08.291244+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:42:28.094061+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:42:28.191318+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:42:48.091235+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:42:48.291276+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:43:08.092815+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:43:08.294405+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:43:28.091231+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:43:28.191255+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:43:48.093265+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:43:48.193409+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:44:08.194055+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:44:08.296211+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:44:28.192843+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:44:28.291242+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:44:48.093923+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:44:48.193280+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:45:08.091275+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:45:08.193019+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:45:28.091310+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:45:28.191297+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:45:48.091244+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:45:48.193210+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:46:08.091290+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:46:08.296128+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:46:28.091231+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:46:28.193381+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:46:48.093310+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:46:48.191398+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:47:08.094096+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:47:08.293413+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:47:28.092912+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:47:28.191244+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:47:48.093080+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:47:48.191209+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:48:08.193176+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:48:08.291231+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:48:28.056445+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:48:28.129409+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:48:48.058460+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:48:48.157109+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:49:08.158419+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:49:08.258385+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:49:28.058513+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:49:28.158273+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:49:48.065533+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:49:48.160078+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:50:08.056459+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:50:08.158431+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:50:28.058447+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:50:28.159464+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:50:48.056550+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:50:48.160744+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:51:08.058289+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:51:08.256562+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:51:28.058248+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:51:28.256535+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:51:48.058645+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:51:48.156443+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:52:08.061900+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:52:08.156485+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:52:28.059265+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:52:28.256539+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:52:48.058370+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:52:48.258497+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:53:08.159588+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:53:08.259421+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:53:28.060984+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:53:28.164711+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:53:48.057996+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:53:48.156648+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:54:08.056438+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:54:08.256501+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:54:28.056533+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:54:28.156430+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:54:48.156550+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:54:48.256421+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:55:08.156438+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:55:08.162541+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:55:28.158193+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:55:28.259284+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:55:48.156477+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:55:48.359404+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:56:08.167861+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:56:08.256496+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:56:28.058587+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:56:28.256458+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:56:48.058538+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:56:48.158059+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:57:08.158638+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:57:08.256482+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:57:28.157508+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:57:28.258639+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:57:48.158392+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:57:48.258328+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:58:08.156470+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:58:08.258175+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:58:28.058945+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:58:28.158377+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:58:48.158176+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:58:48.258066+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:59:08.058078+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:59:08.256499+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:59:28.157041+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:59:28.256538+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:59:48.156515+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T10:59:48.160860+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:00:08.158027+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:00:08.358179+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:00:28.156444+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:00:28.256496+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:00:48.156488+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:00:48.258915+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:01:08.158584+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:01:08.359218+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:01:28.156425+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:01:28.268508+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:01:48.159133+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:01:48.256619+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:02:08.156573+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:02:08.258170+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:02:28.158082+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:02:28.268463+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:02:48.158632+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:02:48.256461+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:03:08.159135+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:03:08.258088+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:03:28.156511+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:03:28.258007+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:03:48.156463+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:03:48.359400+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:04:08.156499+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:04:08.259573+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:04:28.120525+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:04:28.323750+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:04:48.120534+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:04:48.322522+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:05:08.120615+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:05:08.620811+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:05:28.122366+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:05:28.322592+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:05:48.122555+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:06:08.220531+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:06:28.122508+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:06:28.222088+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:06:48.123333+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:06:48.222250+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:07:08.122502+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:07:08.220542+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:07:28.120505+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:07:28.224557+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:07:48.122936+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:07:48.220524+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:08:08.120834+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:08:08.220564+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:08:28.122679+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:08:28.322067+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:08:48.125256+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:08:48.223716+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:09:08.122282+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:09:08.223727+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:09:28.122031+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:09:28.222650+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:09:48.133753+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:09:48.224998+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:10:08.123353+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:10:08.322648+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:10:28.123426+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:10:28.223763+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:10:48.123822+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:10:48.222356+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:11:08.124715+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:11:08.220541+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:11:28.120545+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:11:28.220502+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:11:48.123498+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:11:48.223482+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:12:08.126384+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:12:08.220597+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:12:28.120524+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:12:28.324140+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:12:48.123239+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:12:48.223641+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:13:08.124120+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:13:08.223797+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:13:28.122617+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:13:28.222651+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:13:48.122069+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:13:48.220518+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:14:08.122252+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:14:08.220542+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:14:28.124179+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:14:28.220753+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:14:48.123559+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:14:48.220508+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:15:08.124033+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:15:08.289224+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:15:28.120620+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:15:28.326014+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:15:48.120580+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:15:48.221402+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:16:08.120597+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:16:08.220539+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:16:28.122988+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:16:28.220564+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:16:48.120526+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:16:48.223454+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:17:08.120551+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:17:08.224979+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:17:28.122550+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:17:28.322414+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:17:48.123454+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:17:48.222310+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:18:08.122771+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:18:08.326505+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:18:28.722209+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:18:28.732656+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:18:48.127491+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:18:48.220509+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:19:08.120526+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:19:08.322275+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:19:28.132898+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:19:28.323499+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:19:48.120510+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:19:48.225526+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:20:08.120607+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:20:08.322065+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:20:28.086923+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:20:28.185296+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:20:48.090126+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:20:48.185308+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:21:08.085305+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:21:08.285233+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:21:28.087009+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:21:28.185353+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:21:48.087594+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:21:48.187317+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:22:08.187419+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:22:08.285263+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:22:28.086612+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:22:28.185374+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:22:48.085261+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:22:48.188061+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:23:08.090119+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:23:08.188392+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:23:28.085233+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:23:28.185340+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:23:48.087665+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:23:48.185372+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:24:08.091508+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:24:08.188848+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:24:28.087967+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:24:28.287972+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:24:48.085263+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:24:48.187445+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:25:08.087279+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:25:08.285264+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:25:28.087332+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:25:28.185236+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:25:48.085291+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:25:48.188145+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:26:08.085263+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:26:08.252774+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:26:28.086974+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:26:28.185248+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:26:48.089874+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:26:48.185255+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:27:08.086086+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:27:08.287132+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:27:28.086380+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:27:28.188046+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:27:48.085261+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:27:48.193777+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:28:08.085278+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:28:08.186802+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:28:28.086352+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:28:28.187028+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:28:48.085242+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:28:48.185230+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:29:08.185252+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:29:08.285264+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:29:28.088116+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:29:28.188224+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:29:48.087420+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:29:48.288339+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:30:08.087413+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:30:08.286897+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:30:28.085238+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:30:28.386810+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:30:48.087435+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:30:48.285580+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:31:08.188253+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:31:08.287404+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:31:28.085293+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:31:28.187191+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:31:48.085255+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:31:48.185344+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:32:08.088222+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:32:08.287458+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:32:28.060064+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:32:28.185211+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:32:48.085247+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:32:48.185325+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:33:08.087029+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:33:08.185208+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:33:28.085308+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:33:28.185230+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:33:48.087167+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:33:48.185249+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:34:08.087065+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:34:08.185242+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:34:28.085246+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:34:28.189007+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:34:48.095635+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:34:48.185533+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:35:08.085244+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:35:08.160876+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:35:28.087653+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:35:28.190885+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:35:48.085238+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:35:48.187717+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:36:08.185227+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:36:08.286784+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:36:28.153806+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:36:28.252021+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:36:48.050145+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:36:48.150155+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:37:08.052267+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:37:08.150185+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:37:28.050426+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:37:28.150220+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:37:48.052265+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:37:48.150196+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:38:08.063157+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:38:08.257088+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:38:28.052313+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:38:28.152199+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:38:48.153799+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:38:48.255018+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:39:08.050205+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:39:08.150155+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:39:28.150203+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:39:28.251752+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:39:48.050263+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:39:48.152058+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:40:08.154090+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:40:08.250140+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:40:28.052157+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:40:28.151722+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:40:48.051740+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:40:48.150174+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:41:09.162459+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:41:09.251766+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:41:29.050217+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:41:29.152290+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:41:49.050194+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:41:49.152275+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:42:09.053871+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:42:09.152362+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:42:29.248906+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:42:29.351706+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:42:49.050364+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:42:49.150203+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:43:09.150280+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:43:09.250330+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:43:29.050195+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:43:29.152673+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:43:49.050194+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:43:49.150144+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:44:09.050182+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:44:09.252861+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:44:29.050331+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:44:29.151887+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:44:49.050184+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:44:49.153960+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:45:09.152575+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:45:09.251699+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:45:29.059501+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:45:29.150220+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:45:49.050251+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:45:49.152143+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:46:09.152195+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:46:09.212668+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:46:29.055419+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:46:29.150269+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:46:49.050284+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:46:49.154409+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:47:09.050187+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:47:09.250267+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:47:29.052925+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:47:29.153846+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:47:49.050173+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:47:49.150251+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:48:09.153419+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:48:09.254431+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:48:29.052106+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:48:29.150224+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:48:49.153865+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:48:49.250219+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:49:09.150174+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:49:09.252992+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:49:29.150448+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:49:29.153108+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:49:49.050275+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:49:49.150182+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:50:09.153749+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:50:09.250346+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:50:29.052234+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:50:29.151849+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:50:49.152242+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:50:49.250183+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:51:09.152260+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:51:09.250201+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:51:29.050305+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:51:29.150317+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:51:49.150181+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:51:49.252225+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:52:09.153667+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:52:09.352924+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:52:29.115339+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:52:29.219634+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:52:49.015640+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:52:49.115333+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:53:09.117125+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:53:09.215359+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:53:29.117204+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:53:29.315349+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:53:49.116983+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:53:49.317812+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:54:09.115407+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:54:09.477581+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:54:29.115342+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:54:29.217484+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:54:49.115394+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:54:49.215315+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:55:09.115341+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:55:09.215373+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:55:29.017096+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:55:29.119193+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:55:49.115321+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:55:49.215340+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:56:09.115337+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:56:09.315339+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:56:29.016875+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:56:29.117311+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:56:49.115335+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:56:49.215480+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:57:09.115346+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:57:09.217107+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:57:29.115355+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:57:29.215409+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:57:49.116888+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:57:49.215374+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:58:09.080004+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:58:09.215440+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:58:29.117409+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:58:29.216883+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:58:49.117334+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:58:49.215298+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:59:09.115356+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:59:09.216706+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:59:29.115419+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:59:29.215339+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:59:49.115355+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T11:59:49.217458+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:00:09.116875+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:00:09.219086+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:00:29.118282+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:00:29.217398+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:00:49.115385+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:00:49.215485+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:01:09.115430+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:01:09.217769+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:01:29.118982+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:01:29.215335+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:01:49.115338+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:01:49.215343+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:02:09.128503+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:02:09.219573+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:02:29.116988+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:02:29.216844+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:02:49.115347+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:02:49.217328+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:03:09.126858+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:03:09.219255+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:03:29.115338+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:03:29.215338+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:03:49.115325+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:03:49.218912+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:04:09.117764+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:04:09.319069+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:04:29.117410+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:04:29.218494+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:04:49.115352+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:04:49.215425+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:05:09.115526+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:05:09.217515+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:05:29.118129+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:05:29.215361+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:05:49.127390+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:05:49.317525+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:06:09.115348+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:06:09.315347+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:06:29.115309+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:06:29.217423+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:06:49.115377+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:06:49.218049+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:07:09.216890+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:07:09.228669+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:07:29.115334+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:07:29.215349+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:07:49.115411+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:07:49.217432+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:08:09.218340+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:08:09.315338+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:08:29.080024+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:08:29.180156+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:08:49.084785+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:08:49.185171+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:09:09.081643+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:09:09.181972+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:09:29.086346+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:09:29.181718+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:09:49.082087+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:09:49.183181+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:10:09.079996+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:10:09.282787+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:10:29.080092+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:10:29.282933+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:10:49.083702+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:10:49.281989+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:11:09.080164+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:11:09.281874+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:11:29.079992+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:11:29.282045+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:11:49.084837+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:11:49.182136+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:12:09.080020+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:12:09.182125+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:12:29.087006+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:12:29.182935+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:12:49.080004+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:12:49.180009+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:13:09.087973+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:13:09.180095+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:13:29.081723+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:13:29.183657+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:13:49.080015+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:13:49.182505+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:14:09.082777+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:14:09.194944+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:14:29.080054+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:14:29.283832+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:14:49.083532+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:14:49.179972+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:15:09.091729+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:15:09.183192+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:15:29.081726+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:15:29.183606+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:15:49.081786+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:15:49.187899+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:16:09.782113+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:16:09.792671+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:16:29.082501+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:16:29.182706+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:16:49.050095+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:16:49.181974+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:17:09.080064+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:17:09.181559+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:17:29.082487+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:17:29.182885+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:17:49.080056+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:17:49.283214+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:18:09.080014+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:18:09.181732+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:18:29.084010+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:18:29.181996+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:18:49.079996+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:18:49.180068+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:19:09.080010+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:19:09.280011+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:19:29.088611+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:19:29.181966+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:19:49.081584+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '33.00 °C' by user 'snmpd' [SNMP] +2024-01-19T12:19:49.180263+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-19T23:12:47.797460+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:12:48.348640+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:12:49.958249+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:12:50.648558+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:13:02.401131+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:13:02.948955+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:13:05.960308+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:13:06.647897+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:13:21.387394+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:13:21.948541+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:14:22.760051+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:14:23.447888+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:14:33.786459+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-19T23:14:34.348601+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:14:43.159837+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:14:43.847860+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:15:03.687823+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:15:04.248519+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:15:10.759863+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:15:11.447899+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:15:26.188238+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:15:26.747948+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:15:33.250239+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:15:34.148546+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:16:29.503500+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:16:30.048554+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:16:46.054722+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:16:46.949073+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:17:01.487114+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:17:02.247931+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:17:12.456038+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:17:13.148560+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:17:28.593016+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:17:29.148576+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:17:29.162718+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:17:29.848562+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:22:14.851364+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:22:15.413453+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:22:21.421118+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:22:22.112784+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:23:18.762069+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:23:19.314324+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:23:22.126023+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-19T23:23:22.813480+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:23:34.776418+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:23:35.312782+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:23:37.425074+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:23:38.113931+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:23:43.416497+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:23:44.114081+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:28:12.822447+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-19T23:28:13.512853+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-19T23:28:21.762621+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-19T23:28:22.313419+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-19T23:31:46.154909+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-20T10:09:33.040227+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T10:09:35.975493+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T10:09:43.940948+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T10:10:01.510139+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T10:10:46.139865+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T10:11:12.463937+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T10:11:13.042372+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T10:11:53.438833+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T10:11:55.236547+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T10:12:18.361801+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T10:12:20.238365+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:34:05.801504+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:34:07.265476+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20T11:34:08.853901+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:34:27.664940+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:34:40.802466+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:34:43.667041+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:34:44.653752+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:34:58.968175+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:35:56.906400+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:36:00.467770+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:36:12.198097+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:36:12.770922+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:36:20.999896+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:36:28.061090+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:36:39.101799+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:38:11.735434+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:38:16.263579+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:38:19.135700+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:38:22.063821+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:38:22.637998+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:38:29.470874+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:38:30.735573+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:38:46.172297+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:39:49.635764+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:40:02.285456+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:40:20.925470+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:40:24.052388+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:41:50.333755+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:42:04.873441+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:44:00.229954+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:44:06.161450+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:44:26.832837+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20T11:44:31.538974+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:44:31.928191+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:44:42.338773+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:44:47.927871+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:44:49.463796+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:44:50.932303+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:45:03.360760+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:45:17.132540+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:47:28.802306+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:47:32.335118+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:48:21.565214+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:48:39.731556+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:51:05.780554+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:51:08.629881+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:51:20.377112+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:52:00.335399+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:52:22.965451+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:52:23.532255+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:52:39.861397+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:52:43.930006+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:52:45.677502+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:52:48.330658+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:55:22.729267+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:57:04.993840+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:57:13.231603+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:57:35.601059+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:58:17.922371+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:58:25.196496+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:58:51.226640+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:59:20.799134+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T11:59:52.440362+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T11:59:53.001670+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:01:46.329768+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:01:46.893383+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:02:52.136433+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:02:57.097043+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:03:17.722970+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:05:48.990466+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:05:51.413200+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:06:01.000603+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:06:11.343034+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:07:56.394739+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:08:02.537161+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:08:03.097487+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20T12:08:05.334186+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:09:12.191352+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:09:15.322875+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:14:47.762452+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:15:01.593191+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-20T12:15:03.563590+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T12:15:13.902524+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T12:15:17.465564+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20T14:03:19.858260+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:03:22.511912+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:03:24.088487+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:03:30.622045+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:03:32.850276+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:04:40.421350+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:04:50.745679+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:04:57.621904+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:05:13.051528+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:05:18.020603+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:05:23.974941+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:05:26.617252+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:05:28.365007+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:05:28.912166+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:05:45.049325+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:05:45.617330+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:06:23.554390+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-20T14:06:26.417460+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-20T14:06:51.644014+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:07:30.720241+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:07:38.945994+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:07:39.522188+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:07:41.089176+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:07:41.820112+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:07:50.040326+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:08:38.014741+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:08:44.150488+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:09:34.122025+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:09:51.849207+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:11:15.713766+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:11:20.256698+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:15:32.326561+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:15:34.549522+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-20T14:15:37.423128+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-20T14:15:47.351344+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T11:33:36.965126+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T11:33:48.246824+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T11:33:51.568018+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T11:34:16.230725+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T11:34:22.566933+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T11:34:24.992616+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T11:34:26.962757+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T11:34:48.365263+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T11:34:49.457236+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T11:35:26.204851+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T11:35:39.072617+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T11:37:51.394543+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T11:37:54.756683+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T11:42:27.158990+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T11:42:28.631730+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T12:24:41.262447+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-21T12:24:41.950922+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:42:59.553105+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:43:00.076187+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:43:00.788374+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:43:01.676765+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:44:21.021021+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:44:21.576860+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:44:28.787893+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:44:29.677581+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:44:34.925630+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:44:35.476770+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:44:37.588307+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:44:38.276763+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:44:39.116218+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:44:39.876089+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:44:41.986584+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:44:42.676827+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:48:43.879870+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:48:44.441813+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:48:53.958161+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:48:54.641121+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:49:22.987073+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:49:23.541815+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:49:30.253796+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:49:30.941830+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:49:41.284857+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:49:41.841905+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:50:00.853680+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:50:01.541748+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:50:05.420202+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:50:05.942502+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:50:37.954815+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:50:38.641171+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:50:53.380708+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:50:53.942350+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:51:03.851953+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:51:04.541150+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:51:06.088288+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:51:06.641762+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:51:08.254444+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:51:08.941762+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:52:51.536324+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:52:52.041239+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:52:52.050969+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:52:52.741813+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:54:08.690463+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:54:09.241103+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:54:30.350828+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:54:31.041762+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:54:34.782687+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:54:35.341782+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:54:59.245667+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:55:00.141771+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:55:03.077908+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:55:03.641776+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:55:05.254946+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:55:05.941144+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:55:27.431699+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:55:27.741178+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:55:28.445925+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:55:29.141166+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:55:57.786266+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:55:58.341760+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:56:19.453429+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:56:20.141767+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:56:23.678838+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:56:24.141762+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:57:06.347891+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:57:07.041119+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:57:19.675769+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:57:20.241123+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:57:22.354808+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:57:23.041086+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:57:33.381112+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:57:33.941782+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:57:53.653009+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:57:54.341812+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:58:23.286520+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:58:23.842306+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:58:28.249873+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:58:28.941799+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:58:44.419061+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:58:44.941817+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:59:03.247883+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:59:03.941834+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:59:04.779819+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:59:05.341780+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T13:59:06.744372+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T13:59:07.641781+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T13:59:13.581238+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T13:59:14.141806+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:00:56.557527+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:00:57.241086+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:01:08.990350+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:01:09.541908+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:01:09.555155+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:01:10.241099+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:04:17.754970+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:04:18.307141+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:04:19.014261+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:04:19.706543+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:05:18.252487+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:05:18.806508+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:05:21.617417+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:05:22.306603+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:06:55.348038+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:06:56.105874+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:06:56.122604+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:06:56.806547+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:07:02.042826+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:07:02.606587+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:07:07.715615+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:07:08.406937+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:07:22.241787+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:07:23.006583+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:07:25.815475+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:07:26.506514+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:07:39.151858+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:07:39.707170+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:08:08.017919+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:08:08.906583+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:08:29.450273+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:08:30.006510+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:08:30.019478+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:08:30.706591+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:08:42.450237+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:08:43.005873+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:08:43.021111+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:08:43.706510+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:08:59.150845+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:09:01.005975+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:09:01.716607+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:09:02.408383+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:09:12.053445+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:09:12.606579+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:11:40.208279+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:11:40.906582+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:11:46.152817+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:11:46.706597+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:12:04.115796+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:12:04.805860+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:23:55.808919+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:23:56.570314+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:23:57.975296+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:23:58.671019+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:23:58.821145+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:23:59.371016+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:24:00.774678+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:24:01.670977+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:27:38.023531+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:27:38.570981+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:27:42.082887+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:27:42.970299+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:28:51.262960+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:28:51.670966+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:28:53.083295+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:28:53.770363+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:28:53.918784+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:28:54.471100+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:28:55.375007+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:28:56.070310+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:29:20.117317+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:29:20.871548+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:29:20.887110+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:29:21.570994+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:29:30.386187+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:29:31.070313+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:30:00.079381+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:30:00.770417+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:30:04.605311+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:30:05.171856+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:30:13.285163+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:30:13.970315+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:30:32.453424+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:30:32.971002+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:30:39.080721+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:30:39.770974+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:30:48.744290+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:30:49.271065+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:31:55.581080+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:31:56.270329+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:32:04.317397+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:32:05.071018+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:32:12.284522+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:32:12.971047+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:32:16.133801+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:32:16.670969+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:32:27.981570+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:32:28.670986+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:32:34.603168+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:32:35.170333+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:33:50.276370+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:33:50.971022+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:34:37.316161+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:34:37.871027+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:34:39.282703+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:34:40.170971+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:34:40.368249+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:34:40.870316+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:34:42.285291+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:34:42.970985+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:35:10.903701+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:35:11.435771+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:35:11.459760+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:35:12.135776+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:37:39.815115+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:37:40.335247+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:37:42.445345+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:37:43.135809+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:38:53.726405+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:38:54.236525+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:38:55.638565+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:38:56.336716+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:39:07.575844+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:39:08.135792+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:39:17.651789+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:39:18.337001+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:45:26.178914+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:45:26.735764+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:46:11.939494+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:46:12.635801+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:46:20.877639+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:46:21.435875+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:46:32.345386+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:46:33.035373+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:51:06.641292+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:51:07.199874+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:51:13.008011+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:51:13.900553+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:51:47.477120+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:51:47.999761+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:51:58.206664+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:51:58.899783+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:52:06.442382+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:52:07.000958+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:52:33.610119+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:52:34.300510+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:52:56.254600+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:52:56.999763+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:53:09.307424+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:53:10.001232+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:53:15.245073+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:53:15.800457+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:53:16.507491+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:53:17.400539+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:53:43.751338+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:53:44.299842+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:53:47.111283+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:53:48.000882+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T14:54:18.851157+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T14:54:19.600427+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T14:54:19.614620+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T14:54:20.300458+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T15:56:52.102371+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T15:56:52.661850+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T15:57:09.964903+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T15:57:10.661870+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T15:57:12.211609+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T15:57:12.761840+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T15:57:12.776133+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T15:57:13.461256+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T15:57:26.096514+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T15:57:26.661864+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T15:57:28.071357+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T15:57:28.761906+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T15:57:34.042429+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T15:57:34.562303+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T15:57:52.170152+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T15:57:52.861892+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T15:57:53.708538+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T15:57:54.261864+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T15:58:00.070909+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T15:58:00.961152+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T15:58:27.301306+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T15:58:27.863345+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T15:58:52.673718+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T15:58:53.361830+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T15:59:01.704950+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T15:59:02.261198+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:09:47.178971+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T16:09:47.861934+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:09:48.711606+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:09:49.261836+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:10:50.439506+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T16:10:51.126834+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:10:52.669941+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:10:53.426518+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:10:58.528880+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T16:10:59.227169+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:11:00.916562+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:11:01.327185+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:11:02.733954+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T16:11:03.626518+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:11:35.362769+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:11:35.927625+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:11:49.639184+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T16:11:50.526529+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:11:53.467108+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:11:54.026516+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:11:55.637123+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T16:11:56.327208+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:12:14.569629+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:12:15.127757+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:12:16.028824+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T16:12:16.727212+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:12:17.559983+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:12:18.127197+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:12:19.536126+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T16:12:20.227745+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:13:28.566189+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:13:29.127218+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:14:11.339061+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-21T16:14:12.027743+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-21T16:14:15.870005+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T16:14:16.427262+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-21T16:29:49.543886+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-21T19:29:56.119221+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:30:07.154447+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:30:47.119828+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:30:57.447284+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:31:40.217957+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:31:48.760016+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:34:00.618693+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:34:10.250098+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:34:14.520678+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:34:25.547155+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:34:32.113241+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:34:57.746425+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:36:02.719336+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:36:11.661914+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:36:12.220781+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:36:24.652508+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:38:06.824439+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:38:21.564194+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:38:46.921622+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:38:57.548252+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:38:58.819725+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:45:16.119986+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:45:25.282457+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:46:54.454119+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:46:57.088693+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:47:10.420924+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:47:29.989266+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:47:45.459833+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:47:48.089301+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:49:59.320264+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:50:01.490015+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:50:14.623668+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:50:15.385943+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:50:27.108737+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:50:47.382186+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:50:56.329094+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:51:36.585878+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:51:42.519661+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:51:44.688380+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:51:46.217029+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:51:52.589319+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:52:20.693234+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:54:17.378493+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:54:28.425522+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:54:36.188556+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-21T19:54:48.824202+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:54:51.486978+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:55:09.510500+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:55:11.451378+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:55:45.880182+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:55:46.455508+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:55:57.477300+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:56:13.347133+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:56:15.787921+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:56:22.848410+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:56:23.705010+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:56:33.752556+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:58:41.673175+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:58:53.576331+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:58:56.688979+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:58:58.645368+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:59:12.686323+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:59:25.552428+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:59:38.882418+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:59:40.852112+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:59:42.783989+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T19:59:44.550506+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T19:59:51.177156+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:01:32.057509+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:01:35.188367+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:01:45.248021+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:01:51.195360+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:01:53.149148+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:02:05.783912+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:02:09.152253+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:02:37.374573+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:02:47.447076+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:02:54.110547+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:02:57.647737+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:03:01.274878+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:03:10.652405+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:04:32.279689+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:04:45.142725+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:04:48.283748+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:04:48.845431+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:05:02.189179+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:05:12.252727+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:05:18.877633+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-21T20:05:28.246130+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:05:42.980216+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:11:42.710759+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:11:49.549831+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:26:41.908781+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-21T20:26:50.153064+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:32:35.681361+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:32:43.754586+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:33:01.183988+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:33:27.527078+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:33:28.777585+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:33:35.440578+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:33:50.579882+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:33:59.078869+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T20:34:17.681675+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T20:34:25.109375+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:19:45.973021+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:19:55.207852+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:20:26.378914+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:20:41.107533+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:21:10.178853+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:21:12.414543+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:21:32.076381+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:21:58.014553+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:25:03.177702+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:25:15.610523+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:25:22.575113+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:25:33.620574+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:25:35.576129+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:25:50.381234+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:25:57.377177+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:25:59.807351+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:26:02.479107+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:26:23.906669+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:26:26.577331+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:26:38.431994+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:26:39.176485+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:26:49.549335+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:26:55.176405+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:28:38.414539+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:28:39.676401+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:29:07.016132+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:34:13.739784+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:34:20.678285+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:34:22.640325+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:34:23.660675+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:34:24.933213+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:35:24.874639+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:35:28.935593+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:35:48.883877+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:36:07.243641+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:36:15.370547+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:37:02.646226+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-21T21:37:09.978605+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:37:11.237291+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:37:14.430568+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-21T21:37:17.038488+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-21T21:38:01.972721+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22T05:29:01.932908+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (19.90 °C) +2024-01-22T05:29:04.380734+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22T05:29:06.343041+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22T05:29:25.479883+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22T05:29:49.442671+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22T08:56:17.290731+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-22T08:56:17.978084+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22T12:03:56.514430+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.3) logged in +2024-01-22T12:13:15.877938+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.3) terminated (Timeout) +2024-01-22T12:57:45.806942+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-22T13:03:24.374287+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.12) logged in +2024-01-22T13:53:23.267763+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.12) terminated (Timeout) +2024-01-22T14:16:54.632056+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.3) logged in +2024-01-22T14:17:11.283881+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Variable 'Temperature.SetPtHighAlarm' changed to '67.00 °C' by user 'snmpd' [SNMP] +2024-01-22T14:18:03.581758+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom-Update), Description changed to 'CMCIII-TMP-2-front-botom' by user 'snmpd' [SNMP] +2024-01-22T14:19:03.581571+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-botom), Description changed to 'CMCIII-TMP-2-front' by user 'snmpd' [SNMP] +2024-01-22T14:20:03.580159+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Description changed to 'CMCIII-TMP-2-front-status' by user 'snmpd' [SNMP] +2024-01-22T14:24:23.644725+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-status), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-22T14:26:23.746263+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-status), Description changed to 'CMCIII-TMP-2-front' by user 'snmpd' [SNMP] +2024-01-22T14:29:43.946412+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '67.00 °C' by user 'snmpd' [SNMP] +2024-01-22T14:31:13.646437+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-22T14:38:43.511422+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '67.00 °C' by user 'snmpd' [SNMP] +2024-01-22T14:40:01.609652+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-22T14:40:21.518400+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Description changed to 'CMCIII-TMP-2-front-test' by user 'snmpd' [SNMP] +2024-01-22T14:41:41.611210+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front-test), Description changed to 'CMCIII-TMP-2-front' by user 'snmpd' [SNMP] +2024-01-22T17:02:37.645267+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.3) terminated (Timeout) +2024-01-22T22:45:04.794966+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-22T22:45:05.361659+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22T22:45:09.076905+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22T22:45:09.761695+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22T22:48:58.118222+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22T22:48:58.661644+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22T22:48:59.367925+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22T22:49:00.261636+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22T22:49:17.137820+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22T22:49:17.661636+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22T22:49:23.466039+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22T22:49:24.162299+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22T22:50:10.256194+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22T22:50:10.760981+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22T22:50:38.164280+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22T22:50:38.861710+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22T22:51:24.201320+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22T22:51:24.761051+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22T22:51:28.273105+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-22T22:51:29.161666+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-22T22:51:43.700914+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-22T22:51:44.461707+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-22T23:10:55.230871+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-23T07:11:03.876261+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:11:13.501868+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:13:18.878599+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (19.90 °C) +2024-01-23T07:13:26.213193+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:14:41.474079+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:15:22.409459+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:15:32.081637+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:15:36.613219+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:15:44.376291+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:15:50.303865+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:15:53.172084+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:15:54.705816+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:16:31.678201+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:16:56.606396+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:16:58.075054+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (19.90 °C) +2024-01-23T07:22:43.213204+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:22:48.878622+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:23:08.738356+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:23:10.174276+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:49:34.536192+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:49:41.499685+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:50:05.535140+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:50:06.107511+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:51:29.840545+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:51:35.508323+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:52:01.197260+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:52:37.406327+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T07:53:02.349323+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T07:53:04.298873+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T08:37:21.798385+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-23T08:37:22.490817+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:34:38.191087+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:34:38.714187+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:34:38.737471+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:34:39.414898+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:36:56.850119+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:36:57.414933+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:37:03.923931+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:37:04.614874+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:37:18.652337+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (20.00 °C) +2024-01-23T23:37:19.214261+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:42:02.316402+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:42:03.014290+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:42:03.165330+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:42:03.680490+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:42:27.783135+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:42:28.479839+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:42:38.127609+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:42:38.680538+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:43:02.783384+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (19.90 °C) +2024-01-23T23:43:03.479976+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:43:13.116729+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:43:13.679783+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:43:17.389205+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:43:18.079910+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:44:08.138251+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:44:08.881027+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:44:08.894975+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:44:09.581280+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:44:10.417271+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:44:10.980558+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:45:24.388156+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:45:25.080471+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:45:27.538742+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:45:28.080947+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:46:21.188986+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:46:21.879795+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:46:24.321340+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:46:24.879965+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-23T23:47:20.592809+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-23T23:47:21.280521+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-23T23:47:32.330007+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-23T23:47:32.879821+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-24T00:19:06.952949+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-24T05:54:41.187218+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-24T06:22:25.653113+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-24T06:22:26.315756+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-24T18:48:37.384145+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-24T18:49:05.183343+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:15:42.835667+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:15:43.398939+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:15:43.416433+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T02:15:44.098218+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:15:44.260512+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:15:44.999244+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:15:52.210686+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T02:15:52.898205+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:15:53.739476+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:15:54.298189+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:15:55.200570+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T02:15:55.898843+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:16:24.339364+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:16:24.898837+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:16:26.507485+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T02:16:27.198265+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:16:27.478187+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:16:27.898855+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:16:29.303175+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T02:16:29.998927+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:16:43.537944+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:16:43.898194+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:17:37.305747+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T02:17:38.198287+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:17:54.331921+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:17:54.898900+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:17:57.709918+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T02:17:58.598908+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:17:59.489993+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:17:59.998176+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:19:46.711185+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T02:19:47.398901+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T02:19:47.538985+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T02:19:48.098882+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-25T02:32:24.151779+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-25T05:35:51.755688+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T05:35:59.380973+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-25T05:36:07.056044+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front) @2.05, Temperature12345: OK (20.00 °C) +2024-01-25T05:49:22.052117+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-25T05:49:22.747521+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-25T16:01:42.550163+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '45.00 °C' by user 'snmpd' [SNMP] +2024-01-25T16:02:18.701813+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.10) logged in +2024-01-25T16:03:21.453184+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '46.00 °C' by user 'snmpd' [SNMP] +2024-01-25T16:04:41.551802+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '47.00 °C' by user 'snmpd' [SNMP] +2024-01-25T16:13:05.451972+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Variable 'Temperature.SetPtHighAlarm' changed to '46.00 °C' by user 'snmpd' [SNMP] +2024-01-25T16:17:26.415015+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2-front), Description changed to 'CMCIII-TMP-2' by user 'snmpd' [SNMP] +2024-01-25T17:08:51.957771+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.10) terminated (Timeout) +2024-01-26T04:00:31.442441+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-26T04:00:31.987545+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26T05:46:36.451900+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26T05:46:37.142983+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26T08:19:15.489870+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26T08:19:16.446028+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.70 °C) +2024-01-26T08:19:16.987719+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26T08:20:35.589350+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26T08:20:36.201109+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26T08:20:36.888366+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26T08:22:15.589773+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26T08:22:16.458270+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.80 °C) +2024-01-26T08:22:17.187702+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26T08:22:55.589601+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26T08:22:57.099636+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26T08:22:57.987769+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26T09:11:35.481745+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26T09:11:37.626517+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.80 °C) +2024-01-26T09:11:38.183565+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26T09:12:15.444265+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26T09:12:18.288905+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26T09:12:18.982888+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26T09:22:55.481645+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26T09:22:57.733587+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.70 °C) +2024-01-26T09:22:58.282080+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26T09:25:35.408403+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26T09:25:36.953602+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26T09:25:37.645938+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26T09:39:35.512825+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26T09:39:37.049810+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.70 °C) +2024-01-26T09:39:37.610946+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26T09:40:15.510502+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-26T09:40:17.428754+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-26T09:40:18.111041+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-26T10:07:55.578778+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '21.00 °C' by user 'snmpd' [SNMP] +2024-01-26T10:07:56.728932+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.70 °C) +2024-01-26T10:07:57.276200+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-26T11:15:50.849366+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.184) logged in +2024-01-26T13:24:24.667508+01:00 pdu-256111c9 CMC_Log: Configuration 'SNMP-Setup' changed by user 'admin' [Web] +2024-01-26T13:25:30.613111+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtLowAlarm' changed to '5.00 °C' by user 'admin' [Web] +2024-01-26T13:26:15.667065+01:00 pdu-256111c9 CMC_Log: Configuration 'SNMP-Setup' changed by user 'admin' [Web] +2024-01-26T13:26:29.814516+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtLowAlarm' changed to '5.20 °C' by user 'admin' [Web] +2024-01-26T13:30:12.814810+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtLowAlarm' changed to '5.00 °C' by user 'admin' [Web] +2024-01-26T15:19:45.014753+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-26T19:30:47.979039+01:00 pdu-256111c9 CMC_Log: User 'admin' (IP 10.242.2.6) logged out +2024-01-27T01:10:10.085119+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtHighAlarm' changed to '66.00 °C' by user 'snmpd' [SNMP] +2024-01-27T01:10:30.083613+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2), Variable 'Temperature.SetPtHighAlarm' changed to '65.00 °C' by user 'snmpd' [SNMP] +2024-01-27T01:11:10.047350+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2), Description changed to 'CMCIII-TMP-2 update' by user 'snmpd' [SNMP] +2024-01-27T01:11:10.147367+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update), Description changed to 'CMCIII-TMP-2 update' by user 'snmpd' [SNMP] +2024-01-27T01:11:24.413822+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-01-27T01:33:49.564924+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.6) terminated (Timeout) +2024-01-27T03:04:43.045945+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27T03:05:03.316425+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27T03:08:04.796350+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27T03:08:05.315867+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27T03:09:08.946598+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27T03:09:10.209578+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27T03:09:21.952749+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27T03:09:36.207203+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27T03:09:46.548025+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27T03:09:53.612170+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27T03:10:10.653266+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-27T06:55:24.926674+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-27T09:04:13.747946+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.90 °C) +2024-01-27T09:04:14.436417+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-27T10:49:45.030585+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.90 °C) +2024-01-27T10:49:45.582245+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-27T11:40:18.885364+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.90 °C) +2024-01-27T11:40:19.577078+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-27T15:59:36.330987+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.90 °C) +2024-01-27T15:59:36.891015+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-28T01:05:54.349713+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T01:06:05.994051+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T01:06:06.825927+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T01:06:13.199412+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T01:06:48.331375+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T01:06:54.702715+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T01:06:57.203904+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T01:07:13.002240+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T01:07:15.931078+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T01:07:17.396596+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T01:07:33.926493+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T08:00:08.314170+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T08:00:23.847911+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T08:00:34.311593+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T09:11:05.071958+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.90 °C) +2024-01-28T09:11:05.759910+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-28T10:34:24.533188+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.90 °C) +2024-01-28T10:34:25.080714+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-28T11:43:01.513893+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.90 °C) +2024-01-28T11:43:02.202789+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-28T15:04:03.112965+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (20.90 °C) +2024-01-28T15:04:03.665914+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-28T23:10:13.817375+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T23:10:28.986842+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T23:12:10.122535+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T23:12:12.987045+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T23:12:15.273176+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T23:12:15.782975+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T23:12:23.325023+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T23:12:28.982329+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T23:12:43.725215+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-28T23:12:50.787238+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-28T23:13:07.418818+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T06:48:50.121927+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T06:48:53.260318+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T06:49:04.023514+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T06:49:19.455811+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T06:49:49.226522+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T06:50:01.671957+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T06:50:12.423323+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T06:50:21.362687+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T06:50:25.621219+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T06:51:42.121583+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T06:51:42.525177+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T06:52:53.457518+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T06:52:54.229177+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T07:37:34.751048+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T07:37:36.020144+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T07:39:00.465955+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T07:39:25.815501+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T07:40:15.176749+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T07:40:17.124772+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T07:40:23.092704+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T07:40:38.222330+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T07:40:44.358971+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T07:43:19.387115+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T07:43:33.231435+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T08:10:40.652832+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T08:10:56.080084+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T08:11:26.555083+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T08:11:41.996986+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T08:11:44.153384+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T08:12:51.714374+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T08:12:53.655904+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T08:13:22.454241+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T08:13:24.943774+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T08:14:03.211036+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T08:14:03.943687+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T08:14:06.189301+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T08:14:09.057631+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T10:13:07.560309+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Temperature.SetPtLowWarning' changed to '20.00 °C' by user 'snmpd' [SNMP] +2024-01-29T10:13:10.072117+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (21.40 °C) +2024-01-29T10:13:10.759800+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-29T13:23:28.784589+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.9) logged in +2024-01-29T13:56:06.558989+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update), Variable 'Temperature.SetPtHighAlarm' changed to '63.00 °C' by user 'snmpd' [SNMP] +2024-01-29T13:56:46.460726+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update), Variable 'Temperature.SetPtHighAlarm' changed to '60.00 °C' by user 'snmpd' [SNMP] +2024-01-29T13:58:38.460736+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Humidity.SetPtHighAlarm' changed to '45.00 %' by user 'admin' [Web] +2024-01-29T14:17:46.424971+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update), Variable 'Temperature.SetPtHighAlarm' changed to '64.00 °C' by user 'snmpd' [SNMP] +2024-01-29T17:29:31.399157+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Humidity.SetPtHighAlarm' changed to '43.00 %' by user 'snmpd' [SNMP] +2024-01-29T17:32:31.407266+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Humidity.SetPtHighAlarm' changed to '41.00 %' by user 'snmpd' [SNMP] +2024-01-29T17:34:31.397101+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Description changed to 'CMCIII-HUM-update' by user 'snmpd' [SNMP] +2024-01-29T17:49:33.013342+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.9) terminated (Timeout) +2024-01-29T22:53:32.734932+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM-update) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-29T22:53:33.292479+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-29T23:12:58.525920+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T23:13:52.228121+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T23:14:50.981671+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-29T23:15:17.937060+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-29T23:15:33.370037+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-30T07:15:21.604734+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-30T07:15:30.464382+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: Low Warn (19.90 °C) +2024-01-30T07:15:59.801904+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature12345: OK (20.00 °C) +2024-01-30T08:20:59.476678+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM-update) @2.04, Temperatur: OK (20.80 °C) +2024-01-30T08:21:00.158929+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-30T09:24:56.018334+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-30T09:24:56.120431+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30T09:24:56.134181+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30T09:24:56.628588+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-30T09:24:56.632105+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-30T09:25:01.726311+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30T09:25:17.030069+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-30T09:51:43.735708+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-01-30T09:51:58.583486+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-30T09:51:58.683607+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30T09:51:58.687823+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30T09:51:59.685630+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-30T09:51:59.688270+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-30T09:52:09.190649+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30T09:52:24.886852+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-30T10:55:27.094727+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-01-30T11:10:04.760027+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.10) logged in +2024-01-30T11:10:22.806831+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM-update), Variable 'Humidity.SetPtHighAlarm' changed to '45.00 %' by user 'snmpd' [SNMP] +2024-01-30T11:13:43.671232+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM-update), Variable 'Humidity.SetPtHighAlarm' changed to '43.00 %' by user 'snmpd' [SNMP] +2024-01-30T11:15:04.708139+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM-update), Description changed to 'CMCIII-HUM' by user 'snmpd' [SNMP] +2024-01-30T11:52:39.705360+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM), Variable 'Humidity.SetPtHighAlarm' changed to '45.00 %' by user 'snmpd' [SNMP] +2024-01-30T13:26:29.386417+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-30T13:26:29.486959+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30T13:26:29.503060+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30T13:26:30.591077+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-30T13:26:30.597563+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-30T13:26:35.696271+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30T13:26:36.536683+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Alarm (1 ) +2024-01-30T13:26:37.085429+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-30T13:26:37.786638+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30T13:26:38.484792+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-30T13:26:55.192240+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-30T13:31:39.735081+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4): RFID-Card '0000000056D71A54' valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-01-30T13:31:39.790611+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30T13:31:39.797245+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-01-30T13:31:40.586544+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Unlocked (0 ) +2024-01-30T13:31:41.292971+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Unlocked (1 ) +2024-01-30T13:31:48.497911+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4) @2.01, Handle2: Locked (0 ) +2024-01-30T13:32:06.093967+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle: Locked (1 ) +2024-01-30T13:41:45.100080+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-01-30T16:06:31.625918+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update), Variable 'Temperature.DescName' changed to 'Temperature-Update' by user 'snmpd' [SNMP] +2024-01-30T17:03:40.666839+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-01-31T01:17:09.460017+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-01-31T01:17:10.007154+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-01-31T02:22:52.806237+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-01-31T02:23:01.274507+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-01-31T02:23:52.407990+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-01-31T02:24:50.081266+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-01-31T02:24:59.710614+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-01-31T05:56:31.831281+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-01-31T06:50:00.988332+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-01-31T06:50:01.880298+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-01-31T11:08:45.462260+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-01-31T11:14:21.709547+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4), Description changed to 'CMCIII-GRF2-4 front' by user 'admin' [Web] +2024-01-31T11:14:33.811284+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Description changed to 'CMCIII-GRF2-2 rear' by user 'admin' [Web] +2024-01-31T11:58:48.254979+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-02-01T01:40:52.719251+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-02-01T01:40:53.264907+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-02-01T03:02:23.422145+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-02-01T03:02:46.495241+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-02-01T03:02:54.740665+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-02-01T05:44:18.862579+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-02-01T05:44:50.296378+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-02-01T05:44:51.054903+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-02-01T06:22:47.943191+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-02-01T06:22:48.640740+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-02-01T07:55:00.555370+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: Low Warn (19.90 °C) +2024-02-01T07:55:01.129236+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: Off (Off) +2024-02-01T08:02:21.883468+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: Low Warn (19.90 °C) +2024-02-01T09:11:52.997535+01:00 pdu-256111c9 CMC_Log: Device 7 (CMCIII-HUM) @2.04, Temperatur: OK (20.80 °C) +2024-02-01T09:45:51.831608+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-2 update) @2.05, Temperature-Update: OK (20.00 °C) +2024-02-01T09:45:52.513902+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller) @1.01, Alarm Relay: On (On) +2024-02-01T11:25:43.117899+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.194) logged in +2024-02-01T11:27:35.814393+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 192.168.10.194) terminated (Timeout) +2024-02-26T04:18:11.066429+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-1) @2.05, Temperature-Update12: OK (20.00 °C) +2024-02-26T04:18:12.649931+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-1) @2.05, Temperature-Update12: Low Warn (19.90 °C) +2024-02-26T04:18:13.161506+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-1) @2.05, Temperature-Update12: OK (20.00 °C) +2024-02-26T04:18:30.294317+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-1) @2.05, Temperature-Update12: Low Warn (19.90 °C) +2024-02-26T05:26:28.129977+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-1) @2.05, Temperature-Update12: OK (20.00 °C) +2024-02-26T05:26:30.561302+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-1) @2.05, Temperature-Update12: Low Warn (19.90 °C) +2024-02-26T05:26:42.030147+01:00 pdu-256111c9 CMC_Log: Device 6 (CMCIII-TMP-1) @2.05, Temperature-Update12: OK (20.00 °C) +2024-02-26T10:52:44.435086+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-02-26T13:51:03.135315+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.10) logged in +2024-02-26T14:47:12.383676+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.10) terminated (Timeout) +2024-02-26T16:26:34.246761+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 10.242.2.6) logged in +2024-02-26T16:27:12.494648+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.DescName' changed to 'Handle x' by user 'snmpd' [SNMP] +2024-02-26T16:39:51.455493+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.DescName' changed to 'Handle x1' by user 'snmpd' [SNMP] +2024-02-26T17:51:11.704440+01:00 pdu-256111c9 CMC_Log: Device 1 (PDU-Controller1), Variable 'Login.DescName' changed to 'Login1' by user 'snmpd' [SNMP] +2024-02-26T20:01:57.364434+01:00 pdu-256111c9 CMC_Log: User 'admin' session (IP 10.242.2.6) terminated (Timeout) +2024-02-27T09:53:39.116916+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1): RFID-Card '0002B7D4D1F0DE20' not valid +2024-02-27T09:54:16.021841+01:00 pdu-256111c9 CMC_Log: User 'admin' (local / Group 'admins' / IP 192.168.10.162) logged in +2024-02-27T09:56:01.281354+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2): Keycode not valid +2024-02-27T09:57:22.333245+01:00 pdu-256111c9 CMC_Log: Access Configuration changed by user 'admin' [Web] +2024-02-27T09:58:01.534351+01:00 pdu-256111c9 CMC_Log: Access Configuration changed by user 'admin' [Web] +2024-02-27T09:58:18.583863+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1): RFID-Card '0002B7D4D1F0DE20' valid --> User 'AccessUser' valid --> Wait for second user +2024-02-27T09:58:47.084080+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1): RFID-Card '0002B7D4D1F0DE20' valid --> User 'AccessUser' valid --> Same code again +2024-02-27T09:58:52.733785+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1): RFID-Card '0002B7D4D1F0DE20' valid --> User 'AccessUser' valid --> Wait for second user +2024-02-27T09:59:00.582338+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2): Keycode valid --> User 'AccessUser' valid --> Open handle(s) '3, 4' +2024-02-27T09:59:00.631527+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-02-27T09:59:00.634167+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2), Variable 'Handle.Command' changed to 'Delay' by user 'AccessUser' [Access] +2024-02-27T09:59:01.439130+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1) @2.01, Handle2: Unlocked (0 ) +2024-02-27T09:59:01.444169+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle x1: Unlocked (1 ) +2024-02-27T09:59:07.241491+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1) @2.01, Handle2: Locked (0 ) +2024-02-27T09:59:08.071427+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1) @2.01, Handle2: Alarm (1 ) +2024-02-27T09:59:10.040310+01:00 pdu-256111c9 CMC_Log: Device 3 (CMCIII-GRF2-4 front1) @2.01, Handle2: Locked (0 ) +2024-02-27T09:59:26.942434+01:00 pdu-256111c9 CMC_Log: Device 4 (CMCIII-GRF2-2) @2.02, Handle x1: Locked (1 ) diff --git a/version.txt b/version.txt new file mode 100755 index 0000000..7c1886b --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +0.0.10