Add audit log details for telemetry deleted and telemetry updated types
This commit is contained in:
		
							parent
							
								
									9c44920fe7
								
							
						
					
					
						commit
						f1fb0cedae
					
				@ -716,6 +716,9 @@ public abstract class BaseController {
 | 
			
		||||
            case TIMESERIES_UPDATED:
 | 
			
		||||
                msgType = DataConstants.TIMESERIES_UPDATED;
 | 
			
		||||
                break;
 | 
			
		||||
            case TIMESERIES_DELETED:
 | 
			
		||||
                msgType = DataConstants.TIMESERIES_DELETED;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        if (!StringUtils.isEmpty(msgType)) {
 | 
			
		||||
            try {
 | 
			
		||||
@ -774,6 +777,14 @@ public abstract class BaseController {
 | 
			
		||||
                    } else if (actionType == ActionType.TIMESERIES_UPDATED) {
 | 
			
		||||
                        List<TsKvEntry> timeseries = extractParameter(List.class, 0, additionalInfo);
 | 
			
		||||
                        addTimeseries(entityNode, timeseries);
 | 
			
		||||
                    } else if (actionType == ActionType.TIMESERIES_DELETED) {
 | 
			
		||||
                        List<String> keys = extractParameter(List.class, 0, additionalInfo);
 | 
			
		||||
                        if (keys != null) {
 | 
			
		||||
                            ArrayNode timeseriesArrayNode = entityNode.putArray("timeseries");
 | 
			
		||||
                            keys.forEach(timeseriesArrayNode::add);
 | 
			
		||||
                        }
 | 
			
		||||
                        entityNode.put("startTs", extractParameter(Long.class, 1, additionalInfo));
 | 
			
		||||
                        entityNode.put("endTs", extractParameter(Long.class, 2, additionalInfo));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                TbMsg tbMsg = TbMsg.newMsg(msgType, entityId, metaData, TbMsgDataType.JSON, json.writeValueAsString(entityNode));
 | 
			
		||||
 | 
			
		||||
@ -298,7 +298,6 @@ public class TelemetryController extends BaseController {
 | 
			
		||||
            deleteToTs = System.currentTimeMillis();
 | 
			
		||||
        } else {
 | 
			
		||||
            if (startTs == null || endTs == null) {
 | 
			
		||||
                deleteToTs = endTs;
 | 
			
		||||
                return getImmediateDeferredResult("When deleteAllDataForKeys is false, start and end timestamp values shouldn't be empty", HttpStatus.BAD_REQUEST);
 | 
			
		||||
            } else {
 | 
			
		||||
                deleteFromTs = startTs;
 | 
			
		||||
@ -316,13 +315,13 @@ public class TelemetryController extends BaseController {
 | 
			
		||||
            Futures.addCallback(future, new FutureCallback<List<Void>>() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onSuccess(@Nullable List<Void> tmp) {
 | 
			
		||||
                    logTimeseriesDeleted(user, entityId, keys, null);
 | 
			
		||||
                    logTimeseriesDeleted(user, entityId, keys, deleteFromTs, deleteToTs, null);
 | 
			
		||||
                    result.setResult(new ResponseEntity<>(HttpStatus.OK));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onFailure(Throwable t) {
 | 
			
		||||
                    logTimeseriesDeleted(user, entityId, keys, t);
 | 
			
		||||
                    logTimeseriesDeleted(user, entityId, keys, deleteFromTs, deleteToTs, t);
 | 
			
		||||
                    result.setResult(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
 | 
			
		||||
                }
 | 
			
		||||
            }, executor);
 | 
			
		||||
@ -443,6 +442,7 @@ public class TelemetryController extends BaseController {
 | 
			
		||||
        if (entries.isEmpty()) {
 | 
			
		||||
            return getImmediateDeferredResult("No timeseries data found in request body!", HttpStatus.BAD_REQUEST);
 | 
			
		||||
        }
 | 
			
		||||
        SecurityUser user = getCurrentUser();
 | 
			
		||||
        return accessValidator.validateEntityAndCallback(getCurrentUser(), Operation.WRITE_TELEMETRY, entityIdSrc, (result, tenantId, entityId) -> {
 | 
			
		||||
            long tenantTtl = ttl;
 | 
			
		||||
            if (!TenantId.SYS_TENANT_ID.equals(tenantId) && tenantTtl == 0) {
 | 
			
		||||
@ -590,10 +590,10 @@ public class TelemetryController extends BaseController {
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void logTimeseriesDeleted(SecurityUser user, EntityId entityId, List<String> keys, Throwable e) {
 | 
			
		||||
    private void logTimeseriesDeleted(SecurityUser user, EntityId entityId, List<String> keys, long startTs, long endTs, Throwable e) {
 | 
			
		||||
        try {
 | 
			
		||||
            logEntityAction(user, (UUIDBased & EntityId) entityId, null, null, ActionType.TIMESERIES_DELETED, toException(e),
 | 
			
		||||
                    keys);
 | 
			
		||||
                    keys, startTs, endTs);
 | 
			
		||||
        } catch (ThingsboardException te) {
 | 
			
		||||
            log.warn("Failed to log timeseries delete", te);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -60,6 +60,7 @@ public class DataConstants {
 | 
			
		||||
    public static final String ATTRIBUTES_UPDATED = "ATTRIBUTES_UPDATED";
 | 
			
		||||
    public static final String ATTRIBUTES_DELETED = "ATTRIBUTES_DELETED";
 | 
			
		||||
    public static final String TIMESERIES_UPDATED = "TIMESERIES_UPDATED";
 | 
			
		||||
    public static final String TIMESERIES_DELETED = "TIMESERIES_DELETED";
 | 
			
		||||
    public static final String ALARM_ACK = "ALARM_ACK";
 | 
			
		||||
    public static final String ALARM_CLEAR = "ALARM_CLEAR";
 | 
			
		||||
    public static final String ENTITY_ASSIGNED_FROM_TENANT = "ENTITY_ASSIGNED_FROM_TENANT";
 | 
			
		||||
 | 
			
		||||
@ -24,8 +24,8 @@ public enum ActionType {
 | 
			
		||||
    UPDATED(false), // log entity
 | 
			
		||||
    ATTRIBUTES_UPDATED(false), // log attributes/values
 | 
			
		||||
    ATTRIBUTES_DELETED(false), // log attributes
 | 
			
		||||
    TIMESERIES_DELETED(false), // log timeseries
 | 
			
		||||
    TIMESERIES_UPDATED(false), // log timeseries update
 | 
			
		||||
    TIMESERIES_DELETED(false), // log timeseries
 | 
			
		||||
    RPC_CALL(false), // log method and params
 | 
			
		||||
    CREDENTIALS_UPDATED(false), // log new credentials
 | 
			
		||||
    ASSIGNED_TO_CUSTOMER(false), // log customer name
 | 
			
		||||
 | 
			
		||||
@ -39,21 +39,23 @@ import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
 | 
			
		||||
import org.thingsboard.server.common.data.kv.TsKvEntry;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.TimePageLink;
 | 
			
		||||
import org.thingsboard.server.common.data.relation.EntityRelation;
 | 
			
		||||
import org.thingsboard.server.common.data.rule.RuleChainMetaData;
 | 
			
		||||
import org.thingsboard.server.common.data.security.DeviceCredentials;
 | 
			
		||||
import org.thingsboard.server.dao.audit.sink.AuditLogSink;
 | 
			
		||||
import org.thingsboard.server.dao.device.provision.ProvisionRequest;
 | 
			
		||||
import org.thingsboard.server.dao.entity.EntityService;
 | 
			
		||||
import org.thingsboard.server.dao.exception.DataValidationException;
 | 
			
		||||
import org.thingsboard.server.dao.device.provision.ProvisionRequest;
 | 
			
		||||
import org.thingsboard.server.dao.service.DataValidator;
 | 
			
		||||
 | 
			
		||||
import java.io.PrintWriter;
 | 
			
		||||
import java.io.StringWriter;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import static org.thingsboard.server.dao.service.Validator.validateEntityId;
 | 
			
		||||
import static org.thingsboard.server.dao.service.Validator.validateId;
 | 
			
		||||
@ -265,6 +267,32 @@ public class AuditLogServiceImpl implements AuditLogService {
 | 
			
		||||
                    actionData.set("provisionRequest", objectMapper.valueToTree(request));
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case TIMESERIES_UPDATED:
 | 
			
		||||
                actionData.put("entityId", entityId.toString());
 | 
			
		||||
                List<TsKvEntry> updatedTimeseries = extractParameter(List.class, 0, additionalInfo);
 | 
			
		||||
                if (updatedTimeseries != null) {
 | 
			
		||||
                    ArrayNode result = actionData.putArray("timeseries");
 | 
			
		||||
                    updatedTimeseries.stream()
 | 
			
		||||
                            .collect(Collectors.groupingBy(TsKvEntry::getTs))
 | 
			
		||||
                            .forEach((k, v) -> {
 | 
			
		||||
                                ObjectNode element = objectMapper.createObjectNode();
 | 
			
		||||
                                element.put("ts", k);
 | 
			
		||||
                                ObjectNode values = element.putObject("values");
 | 
			
		||||
                                v.forEach(kvEntry -> values.put(kvEntry.getKey(), kvEntry.getValueAsString()));
 | 
			
		||||
                                result.add(element);
 | 
			
		||||
                            });
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case TIMESERIES_DELETED:
 | 
			
		||||
                actionData.put("entityId", entityId.toString());
 | 
			
		||||
                List<String> timeseriesKeys = extractParameter(List.class, 0, additionalInfo);
 | 
			
		||||
                if (timeseriesKeys != null) {
 | 
			
		||||
                    ArrayNode timeseriesArrayNode = actionData.putArray("timeseries");
 | 
			
		||||
                    timeseriesKeys.forEach(timeseriesArrayNode::add);
 | 
			
		||||
                }
 | 
			
		||||
                actionData.put("startTs", extractParameter(Long.class, 1, additionalInfo));
 | 
			
		||||
                actionData.put("endTs", extractParameter(Long.class, 2, additionalInfo));
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        return actionData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,8 @@ import org.thingsboard.server.common.msg.session.SessionMsgType;
 | 
			
		||||
        configClazz = EmptyNodeConfiguration.class,
 | 
			
		||||
        relationTypes = {"Post attributes", "Post telemetry", "RPC Request from Device", "RPC Request to Device", "Activity Event", "Inactivity Event",
 | 
			
		||||
                "Connect Event", "Disconnect Event", "Entity Created", "Entity Updated", "Entity Deleted", "Entity Assigned",
 | 
			
		||||
                "Entity Unassigned", "Attributes Updated", "Attributes Deleted", "Alarm Acknowledged", "Alarm Cleared", "Other", "Entity Assigned From Tenant", "Entity Assigned To Tenant", "Timeseries Updated"},
 | 
			
		||||
                "Entity Unassigned", "Attributes Updated", "Attributes Deleted", "Alarm Acknowledged", "Alarm Cleared", "Other", "Entity Assigned From Tenant", "Entity Assigned To Tenant",
 | 
			
		||||
                "Timeseries Updated", "Timeseries Deleted"},
 | 
			
		||||
        nodeDescription = "Route incoming messages by Message Type",
 | 
			
		||||
        nodeDetails = "Sends messages with message types <b>\"Post attributes\", \"Post telemetry\", \"RPC Request\"</b> etc. via corresponding chain, otherwise <b>Other</b> chain is used.",
 | 
			
		||||
        uiResources = {"static/rulenode/rulenode-core-config.js"},
 | 
			
		||||
@ -91,7 +92,9 @@ public class TbMsgTypeSwitchNode implements TbNode {
 | 
			
		||||
        } else if (msg.getType().equals(DataConstants.ENTITY_ASSIGNED_TO_TENANT)) {
 | 
			
		||||
            relationType = "Entity Assigned To Tenant";
 | 
			
		||||
        } else if (msg.getType().equals(DataConstants.TIMESERIES_UPDATED)) {
 | 
			
		||||
            relationType = "Timeseries updated";
 | 
			
		||||
            relationType = "Timeseries Updated";
 | 
			
		||||
        } else if (msg.getType().equals(DataConstants.TIMESERIES_DELETED)) {
 | 
			
		||||
            relationType = "Timeseries Deleted";
 | 
			
		||||
        } else {
 | 
			
		||||
            relationType = "Other";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -53,7 +53,9 @@ export enum ActionType {
 | 
			
		||||
  ASSIGNED_FROM_TENANT = 'ASSIGNED_FROM_TENANT',
 | 
			
		||||
  ASSIGNED_TO_TENANT = 'ASSIGNED_TO_TENANT',
 | 
			
		||||
  PROVISION_SUCCESS = 'PROVISION_SUCCESS',
 | 
			
		||||
  PROVISION_FAILURE = 'PROVISION_FAILURE'
 | 
			
		||||
  PROVISION_FAILURE = 'PROVISION_FAILURE',
 | 
			
		||||
  TIMESERIES_UPDATED = 'TIMESERIES_UPDATED',
 | 
			
		||||
  TIMESERIES_DELETED = 'TIMESERIES_DELETED'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export enum ActionStatus {
 | 
			
		||||
@ -87,7 +89,9 @@ export const actionTypeTranslations = new Map<ActionType, string>(
 | 
			
		||||
    [ActionType.ASSIGNED_FROM_TENANT, 'audit-log.type-assigned-from-tenant'],
 | 
			
		||||
    [ActionType.ASSIGNED_TO_TENANT, 'audit-log.type-assigned-to-tenant'],
 | 
			
		||||
    [ActionType.PROVISION_SUCCESS, 'audit-log.type-provision-success'],
 | 
			
		||||
    [ActionType.PROVISION_FAILURE, 'audit-log.type-provision-failure']
 | 
			
		||||
    [ActionType.PROVISION_FAILURE, 'audit-log.type-provision-failure'],
 | 
			
		||||
    [ActionType.TIMESERIES_UPDATED, 'audit-log.type-timeseries-updated'],
 | 
			
		||||
    [ActionType.TIMESERIES_DELETED, 'audit-log.type-timeseries-deleted']
 | 
			
		||||
  ]
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -527,7 +527,9 @@
 | 
			
		||||
        "type-assigned-from-tenant": "Assigned from Tenant",
 | 
			
		||||
        "type-assigned-to-tenant": "Assigned to Tenant",
 | 
			
		||||
        "type-provision-success": "Device provisioned",
 | 
			
		||||
        "type-provision-failure": "Device provisioning was failed"
 | 
			
		||||
        "type-provision-failure": "Device provisioning was failed",
 | 
			
		||||
        "type-timeseries-updated": "Telemetry updated",
 | 
			
		||||
        "type-timeseries-deleted": "Telemetry deleted"
 | 
			
		||||
    },
 | 
			
		||||
    "confirm-on-exit": {
 | 
			
		||||
        "message": "You have unsaved changes. Are you sure you want to leave this page?",
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user