diff options
author | Nils Schwabe | 2014-07-04 13:02:57 +0200 |
---|---|---|
committer | Nils Schwabe | 2014-07-04 13:02:57 +0200 |
commit | 2037cb1a089787adeb3b3c7d83d5d0f1e1502aa0 (patch) | |
tree | f36e69141188bbcb365b038b3faa2d50441b3427 /src/main/java/org/openslx/imagemaster/crcchecker/CRCChecker.java | |
parent | Added TODOs (diff) | |
download | master-sync-shared-2037cb1a089787adeb3b3c7d83d5d0f1e1502aa0.tar.gz master-sync-shared-2037cb1a089787adeb3b3c7d83d5d0f1e1502aa0.tar.xz master-sync-shared-2037cb1a089787adeb3b3c7d83d5d0f1e1502aa0.zip |
Move crc checler from masterserver to master-sync-shared
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/crcchecker/CRCChecker.java')
-rw-r--r-- | src/main/java/org/openslx/imagemaster/crcchecker/CRCChecker.java | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/imagemaster/crcchecker/CRCChecker.java b/src/main/java/org/openslx/imagemaster/crcchecker/CRCChecker.java new file mode 100644 index 0000000..9ca3d55 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/crcchecker/CRCChecker.java @@ -0,0 +1,76 @@ +package org.openslx.imagemaster.crcchecker; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.zip.CRC32; + +import org.apache.log4j.Logger; + +// TODO: Move to master-sync-shared, sattelite daemon might want to check images too + +public class CRCChecker +{ + + private static Logger log = Logger.getLogger( CRCChecker.class ); + private static final int blockSize = 16 * 1024 * 1024; + + /** + * Checks the CRC sum of given blocks of a given imageFile against a given crcFile. + * The caller needs to make sure that block that are going to be checked are complete! + * + * @param imageFile The imageFile to check + * @param crcFile The crcFile to check against + * @param blocks The blocks to check + * @return List of blocks where the crc matches, or null if the crc file is corrupted + */ + public static List<Integer> checkCRC( String imageFile, String crcFile, List<Integer> blocks ) throws IOException + { + List<Integer> result = new LinkedList<>(); + + ImageFile image = new ImageFile( imageFile, blockSize ); + CRCFile crc = new CRCFile( crcFile ); + + log.debug( "Checking image file: '" + imageFile + "' with crc file: '" + crcFile + "'" ); + try { + if ( !crc.isValid() ) + return null; + // TODO: also return null if the crc file contains the wrong number of checksums (only makes sense if the upload is complete) + } catch ( IOException e ) { + throw new IOException( "Could not read CRC file", e ); + } + + // check all blocks + byte[] block = new byte[blockSize]; + for ( Integer blockN : blocks ) { + try { + image.getBlock( blockN, block ); + } catch ( IOException e ) { + throw new IOException( "Could not read image file", e ); + } + + if ( block == null ) + continue; // some error occured (for example: someone tried to check a block that is not in the file) + + // check this block with CRC32 + // add this block to result, if check was ok with CRC file + + CRC32 crcCalc = new CRC32(); + crcCalc.update( block ); + int crcSum = Integer.reverseBytes( (int)crcCalc.getValue() ); + int crcSumFromFile; + try { + crcSumFromFile = crc.getCRCSum( blockN ); + } catch ( IOException e ) { + throw new IOException( "Could not read CRC file", e ); + } + + if ( crcSum == crcSumFromFile ) + result.add( blockN ); + else + log.debug( blockN + " was invalid" ); + } + + return result; + } +} |