| 230 | break |
| 231 | |
| 232 | def hashBigfile(self, file_in, size, piece_size=1024 * 1024, file_out=None): |
| 233 | self.site.settings["has_bigfile"] = True |
| 234 | |
| 235 | recv = 0 |
| 236 | try: |
| 237 | piece_hash = CryptHash.sha512t() |
| 238 | piece_hashes = [] |
| 239 | piece_recv = 0 |
| 240 | |
| 241 | mt = merkletools.MerkleTools() |
| 242 | mt.hash_function = CryptHash.sha512t |
| 243 | |
| 244 | part = "" |
| 245 | for part in self.readFile(file_in, size): |
| 246 | if file_out: |
| 247 | file_out.write(part) |
| 248 | |
| 249 | recv += len(part) |
| 250 | piece_recv += len(part) |
| 251 | piece_hash.update(part) |
| 252 | if piece_recv >= piece_size: |
| 253 | piece_digest = piece_hash.digest() |
| 254 | piece_hashes.append(piece_digest) |
| 255 | mt.leaves.append(piece_digest) |
| 256 | piece_hash = CryptHash.sha512t() |
| 257 | piece_recv = 0 |
| 258 | |
| 259 | if len(piece_hashes) % 100 == 0 or recv == size: |
| 260 | self.log.info("- [HASHING:%.0f%%] Pieces: %s, %.1fMB/%.1fMB" % ( |
| 261 | float(recv) / size * 100, len(piece_hashes), recv / 1024 / 1024, size / 1024 / 1024 |
| 262 | )) |
| 263 | part = "" |
| 264 | if len(part) > 0: |
| 265 | piece_digest = piece_hash.digest() |
| 266 | piece_hashes.append(piece_digest) |
| 267 | mt.leaves.append(piece_digest) |
| 268 | except Exception as err: |
| 269 | raise err |
| 270 | finally: |
| 271 | if file_out: |
| 272 | file_out.close() |
| 273 | |
| 274 | mt.make_tree() |
| 275 | merkle_root = mt.get_merkle_root() |
| 276 | if type(merkle_root) is bytes: # Python <3.5 |
| 277 | merkle_root = merkle_root.decode() |
| 278 | return merkle_root, piece_size, { |
| 279 | "sha512_pieces": piece_hashes |
| 280 | } |
| 281 | |
| 282 | def hashFile(self, dir_inner_path, file_relative_path, optional=False): |
| 283 | inner_path = dir_inner_path + file_relative_path |