summarylogtreecommitdiffstats
path: root/tridupdate.py
blob: a90bf58dfe0ca094743f823e07ef6726a3804980 (plain)
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()