2019-09-07 05:08:48 +08:00
|
|
|
#!/usr/bin/env python3
|
2017-07-06 18:53:39 +08:00
|
|
|
"""
|
|
|
|
This is a tool to decrypt file names in rclone logs.
|
|
|
|
|
|
|
|
Pass two files in, the first should be a crypt mapping generated by
|
|
|
|
|
|
|
|
rclone ls --crypt-show-mapping remote:path
|
|
|
|
|
|
|
|
The second should be a log file that you want the paths decrypted in.
|
|
|
|
|
|
|
|
Note that if the crypt mappings file is large it can take some time to
|
|
|
|
run.
|
|
|
|
"""
|
|
|
|
|
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
|
|
|
|
# Crypt line
|
|
|
|
match_crypt = re.compile(r'NOTICE: (.*?): Encrypts to "(.*?)"$')
|
|
|
|
|
|
|
|
def read_crypt_map(mapping_file):
|
|
|
|
"""
|
|
|
|
Read the crypt mapping file in, creating a dictionary of substitutions
|
|
|
|
"""
|
|
|
|
mapping = {}
|
|
|
|
with open(mapping_file) as fd:
|
|
|
|
for line in fd:
|
|
|
|
match = match_crypt.search(line)
|
|
|
|
if match:
|
|
|
|
plaintext, ciphertext = match.groups()
|
|
|
|
plaintexts = plaintext.split("/")
|
|
|
|
ciphertexts = ciphertext.split("/")
|
|
|
|
for plain, cipher in zip(plaintexts, ciphertexts):
|
|
|
|
mapping[cipher] = plain
|
|
|
|
return mapping
|
|
|
|
|
|
|
|
def map_log_file(crypt_map, log_file):
|
|
|
|
"""
|
|
|
|
Substitute the crypt_map in the log file.
|
|
|
|
|
|
|
|
This uses a straight forward O(N**2) algorithm. I tried using
|
|
|
|
regexps to speed it up but it made it slower!
|
|
|
|
"""
|
|
|
|
with open(log_file) as fd:
|
|
|
|
for line in fd:
|
2019-09-07 05:08:48 +08:00
|
|
|
for cipher, plain in crypt_map.items():
|
2017-07-06 18:53:39 +08:00
|
|
|
line = line.replace(cipher, plain)
|
|
|
|
sys.stdout.write(line)
|
|
|
|
|
|
|
|
def main():
|
|
|
|
if len(sys.argv) < 3:
|
2019-09-07 05:08:48 +08:00
|
|
|
print("Syntax: %s <crypt-mapping-file> <log-file>" % sys.argv[0])
|
2017-07-06 18:53:39 +08:00
|
|
|
raise SystemExit(1)
|
|
|
|
mapping_file, log_file = sys.argv[1:]
|
|
|
|
crypt_map = read_crypt_map(mapping_file)
|
|
|
|
map_log_file(crypt_map, log_file)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|