1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#-------------------------------------------------------------------------------
# Name: tridupdate.py
# Purpose: TrID's definitions package updater
#
# Author: Marco Pontello
#
# Created: 20/05/2012
# Copyright: (c) Mark 2012
# Licence: public domain
#-------------------------------------------------------------------------------
#!/usr/bin/env python
import os
import sys
import hashlib
import argparse
import urllib
import zipfile
import tempfile
PROGRAM_VER = "1.00"
def errexit(mess, errlev=1):
"""Display an error and exit."""
print "%s: error: %s" % (os.path.split(sys.argv[0])[1], mess)
sys.exit(errlev)
def chunked(file, chunk_size):
"""Helper function to read files in chunks."""
return iter(lambda: file.read(chunk_size), '')
def MD5digest(filename=None, data=None):
"""Return an MD5 digest for a file or a string."""
h = hashlib.md5()
if filename:
f = open(filename, "rb")
for data in chunked(f, 1024*1024):
h.update(data)
f.close()
elif data:
h.update(data)
return h.hexdigest()
def trdget(url_defs):
"""Download & unzip a new TrID defs package"""
f = tempfile.TemporaryFile()
u = urllib.urlopen(url_defs)
for data in chunked(u, 1024*8):
f.write(data)
print "\r%dKB" % (f.tell() / 1024),
print "\r",
z = zipfile.ZipFile(f)
trd = z.read("triddefs.trd")
z.close()
f.close()
return trd
def get_cmdline():
"""Evaluate command line parameters, usage & help."""
parser = argparse.ArgumentParser(
description="TrID's definitions updater",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
prefix_chars='-/+',
version = "TrIDUpdate v%s - (C) 2012 M.Pontello" % PROGRAM_VER)
parser.add_argument("filename", action="store", nargs='?',
help = "TRD package filename.", default="triddefs.trd")
res = parser.parse_args()
return res
def main():
res = get_cmdline()
trdfilename = res.filename
url_MD5 = "http://mark0.net/download/triddefs.trd.md5"
url_defs = "http://mark0.net/download/triddefs.zip"
if os.path.exists(trdfilename):
curdigest = MD5digest(filename=trdfilename)
print "MD5: %s" % (curdigest)
else:
curdigest = 0
print "File %s not found" % (trdfilename)
print "Checking last version online..."
f = urllib.urlopen(url_MD5)
newdigest = f.read()
f.close()
print "MD5: %s" % (newdigest)
if curdigest == newdigest:
print "Current defs are up-to-date."
sys.exit(0)
print "Downloading new defs..."
trdpack = trdget(url_defs)
print "Checking defs integrity..."
if MD5digest(data=trdpack) == newdigest:
f = open(trdfilename, "wb")
f.write(trdpack)
f.close()
print "OK."
else:
errexit("Digest don't match. Retry!")
if __name__ == '__main__':
main()
|