17eaccca01052fe53521f6ef3c44a3bf60676f2f
[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
21 @Service
22 @Log4j2
23 public class TSMService {
24     @Autowired
25     private SafeDeleteProperties safeDeleteProperties;
26
27     private static final String TMP_PREFIX = "TSM-RESTORED-";
28
29     private Path restore(String fileName) throws Exception {
30         Path result = null;
31         TSMClient server = null;
32         try {
33             server = new TSMClient(safeDeleteProperties.getNodeName());
34             server.connect(safeDeleteProperties.getUser(), safeDeleteProperties.getPassword());
35             server.setBufferSize(safeDeleteProperties.getPort());
36
37             TSMBackupFileObject backupFileObject = server.getActiveBackupFileObject(safeDeleteProperties.getFsName(),
38                     safeDeleteProperties.getHlName(), safeDeleteProperties.getDelimiter() + fileName);
39             if (backupFileObject != null) {
40                 Path tempDirectory = Files.createTempDirectory(String.format("%s-%s", TMP_PREFIX, fileName));
41                 backupFileObject.setLocalFilePath(tempDirectory.toAbsolutePath().toString());
42                 server.recieve(backupFileObject);
43                 result = Paths.get(tempDirectory.toAbsolutePath().toString(), fileName);
44                 if (!result.toFile().exists()) {
45                     throw new Exception(String.format("Restored file not exists: %s ", result));
46                 }
47             }
48
49         } catch (Exception e) {
50             throw e;
51         } finally {
52             if (Objects.nonNull(server)) {
53                 server.disconnect();
54             }
55         }
56         return result;
57     }
58
59     public void verify(Path source, ArchiveFileStatus status) throws Exception {
60         Path restored = null;
61         try {
62             restored = restore(source.getFileName().toString());
63             long restoredLength = restored.toFile().length();
64             long originalLength = source.toFile().length();
65             if (originalLength != restoredLength) {
66                 throw new Exception(String.format("File size mismatch. Expected %d, found %d", originalLength, restoredLength));
67             }
68             status.setFileSizeEquals(true);
69
70             String originalMD5 = createMD5Hash(source);
71             String restoredMD5 = createMD5Hash(restored);
72             if (!StringUtils.equals(originalMD5, restoredMD5)) {
73                 throw new Exception(String.format("File MD5 hash mismatch. Expected %d, found %d", originalMD5, restoredMD5));
74             }
75             status.setHashEquals(true);
76         } catch (Exception e) {
77             throw e;
78         } finally {
79             if (Objects.nonNull(restored)) {
80                 FileOperations.silentDelete(restored);
81                 FileOperations.silentDelete(restored.getParent());
82             }
83         }
84     }
85
86     private String createMD5Hash(Path filePath) throws IOException {
87         String result;
88         try (InputStream is = Files.newInputStream(filePath)) {
89             result = DigestUtils.md5Hex(is);
90         } catch (Exception e) {
91             throw e;
92         }
93         return result;
94     }
95
96 }
97