added counter
[stack/code/idfimage.git] / idfimage.py
1 #!/usr/bin/env python
2
3 #Identify false image files, for example a file that has a gif header and a php body
4 #author: stack@inventati.org
5 #copyleft: 2013-01-29
6
7 import os
8 import sys
9 from PIL import Image
10 import imghdr
11
12 #Log wrong image files found
13 def log(path, fd):
14     fd.write(path+"\n") 
15
16 #Echo a message if verbose is enabled
17 def verbose(message):
18     if debug is not None:
19         print(message)
20
21 #Check if a given file is an image, trying not to be fooled
22 def checkfimage(fpath):
23     #imghdr is fooled with false images, so use it to check if file would be a valid image file
24     if imghdr.what(fpath):        
25         try: 
26             #PIL Image is not fooled
27             Image.open(fpath)
28         except:
29             return False
30     return True
31
32 #Generate the file paths to traverse, or a single path if a file name was given
33 def getfiles(path):
34     if os.path.isdir(sys.argv[1]):
35         for root, dirs, files in os.walk(sys.argv[1]):
36             for name in files:
37                 yield os.path.join(root, name)
38     else:
39         yield path
40
41 if __name__ == "__main__":
42     if len(sys.argv) < 3:
43         sys.exit('Usage: %s path logfile [-v]' % sys.argv[0])
44
45     if not os.path.exists(sys.argv[1]):
46         sys.exit('ERROR: path %s was not found!' % sys.argv[1])
47
48     try:
49         fdlog = open(sys.argv[2],"w")
50     except:
51         sys.exit('ERROR: unable to open logfile' % sys.argv[2])
52
53     debug = 1 if len(sys.argv) == 4 and sys.argv[3] == "-v" else None
54
55     nfiles = 0 
56     for fpath in getfiles(sys.argv[1]):
57         verbose("Checking: " + fpath)
58         nfiles += 1 
59         if not checkfimage(fpath):
60             log(fpath, fdlog)
61             verbose("ERR not an image: " + fpath)
62     fdlog.close()
63     print ("Checked %d files."% nfiles)