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