import os
import sys

import fiemap

def main():
    
    if len(sys.argv) < 2:
        print 'ERROR: not enough arguments provided'
        return -1
        
    base_path = sys.argv[1]
    
    # Statistics variables
    smallest_extent = 2**20
    largest_extent = 0
    number_extents = 0
    number_chunks = 0
    total_extent_size = 0
    
    directory_count = 0
    
    # Iterate over all of the "file" directories
    directories = [d for d in os.listdir(base_path) 
                   if os.path.isdir(os.path.join(base_path, d))]
    dir_total = len(directories)
    
    for directory in directories:
        path = os.path.join(base_path, directory)
        directory_count += 1
        sys.stdout.write('(%d of %d) -- file: %s --- analyzing ... ' % 
                         (directory_count, dir_total, directory))
        sys.stdout.flush()
        
        # Iterate over all of the chunk files
        for file_ in os.listdir(path):
            file_path = os.path.join(path, file_)
            
            number_chunks += 1
            
            # Open a chunk file to perform the fiemap call
            with open(file_path, 'r') as fd:
                map_ = fiemap.get_all_mappings(fd)
                
                # Update statistics variables
                number_extents += len(map_.extents)
                for extent in map_.extents:
                    if extent.length < smallest_extent:
                        smallest_extent = extent.length
                    if extent.length > largest_extent:
                        largest_extent = extent.length
                    total_extent_size += extent.length
                
        sys.stdout.write('DONE\n')
        sys.stdout.flush()
    
    # Print out final statistics
    print '-' * 80
    print 'Smallest extent size:      %8d' % smallest_extent
    print 'Largest extent size:       %8d' % largest_extent
    print 'Average extents per chunk: %8d' % (number_extents / number_chunks)
    print 'Average extent size:       %8d' % (total_extent_size / number_extents)
        
if __name__ == '__main__':
    sys.exit(main())
