eed9471cd9126b217b72d44d5634d75dac7ca756
[mediacube.git] /
1 package hu.user.mediacube.integration.safedelete.verifier;
2
3 import hu.user.mediacube.integration.safedelete.ArchiveFileStatus;
4 import hu.user.mediacube.integration.safedelete.FileOperations;
5 import hu.user.mediacube.integration.safedelete.SafeDeleteProperties;
6 import lombok.extern.log4j.Log4j2;
7 import org.apache.commons.codec.digest.DigestUtils;
8 import org.apache.commons.lang3.StringUtils;
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.stereotype.Service;
11 import user.tsm.client.TSMBackupFileObject;
12 import user.tsm.client.TSMClient;
13
14 import java.io.IOException;
15 import java.io.InputStream;
16 import java.nio.file.Files;
17 import java.nio.file.Path;
18 import java.nio.file.Paths;
19 import java.util.Objects;
20 import java.util.UUID;
21
22 @Service
23 @Log4j2
24 public class TSMService {
25     @Autowired
26     private SafeDeleteProperties safeDeleteProperties;
27
28     private static final String TMP_PREFIX = "TSM-RESTORED-";
29
30     private Path restore(Path source) throws Exception {
31         Path result = null;
32         TSMClient server = null;
33         try {
34             server = new TSMClient(safeDeleteProperties.getNodeName());
35             server.connect(safeDeleteProperties.getUser(), safeDeleteProperties.getPassword());
36             server.setBufferSize(safeDeleteProperties.getBufferSize());
37
38             TSMBackupFileObject backupFileObject = server.getActiveBackupFileObject(safeDeleteProperties.getFsName(),
39                     safeDeleteProperties.getHlName(), safeDeleteProperties.getDelimiter() + source.getFileName().toString());
40             if (backupFileObject != null) {
41                 result = Paths.get(source.getParent().toAbsolutePath().toString(),
42                         source.getFileName().toString() + UUID.randomUUID());
43                 backupFileObject.setLocalFilePath(result.toAbsolutePath().toString());
44                 server.recieve(backupFileObject);
45                 if (!result.toFile().exists()) {
46                     throw new Exception(String.format("Restored file not exists: %s ", result));
47                 }
48                 log.info("TSM file successfully restored to: {}", result);
49             }
50
51         } catch (Exception e) {
52             throw e;
53         } finally {
54             if (Objects.nonNull(server)) {
55                 server.disconnect();
56             }
57         }
58         return result;
59     }
60
61     public void verify(Path source, ArchiveFileStatus status) throws Exception {
62         Path restored = null;
63         try {
64             restored = restore(source);
65             long restoredLength = restored.toFile().length();
66             long originalLength = source.toFile().length();
67             if (originalLength != restoredLength) {
68                 throw new Exception(String.format("File size mismatch. Expected %d, found %d", originalLength, restoredLength));
69             }
70             log.info("File size check passed: {}", originalLength);
71             status.setFileSizeEquals(true);
72
73             String originalMD5 = createMD5Hash(source);
74             String restoredMD5 = createMD5Hash(restored);
75             if (!StringUtils.equals(originalMD5, restoredMD5)) {
76                 throw new Exception(String.format("File MD5 hash mismatch. Expected %d, found %d", originalMD5, restoredMD5));
77             }
78             log.info("MD5 hash check passed: {}", originalMD5);
79             status.setHashEquals(true);
80         } catch (Exception e) {
81             throw e;
82         } finally {
83             if (Objects.nonNull(restored)) {
84                 FileOperations.silentDelete(restored);
85             }
86         }
87     }
88
89     private String createMD5Hash(Path filePath) throws IOException {
90         String result;
91         try (InputStream is = Files.newInputStream(filePath)) {
92             result = DigestUtils.md5Hex(is);
93         } catch (Exception e) {
94             throw e;
95         }
96         return result;
97     }
98
99 }
100