#!/usr/bin/python # Copyright 2011 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import cliapp import os import sys import ttystatus import genbackupdatalib class GenbackupdataApp(cliapp.Application): def add_settings(self): self.settings.bytesize( ['create', 'c'], 'how much data to create (default: %default)') self.settings.bytesize( ['file-size'], 'size of one file', default=16*1024) self.settings.bytesize( ['chunk-size'], 'generate data in chunks of this size', default=16*1024) self.settings.integer( ['depth'], 'depth of directory tree', default=3) self.settings.integer( ['max-files'], 'max files/dirs per dir', default=128) self.settings.integer( ['seed'], 'seed for random number generator', default=0) self.settings.boolean( ['quiet'], 'do not report progress') def process_args(self, args): outputdir = args[0] bytes = self.settings['create'] self.gen = genbackupdatalib.DataGenerator(self.settings['seed']) self.names = genbackupdatalib.NameGenerator( outputdir, self.settings['depth'], self.settings['max-files']) self.setup_ttystatus() self.status['total'] = bytes while bytes > 0: n = min(self.settings['file-size'], bytes) self.create_file(n) bytes -= n self.status.finish() def create_file(self, bytes): '''Generate one output file.''' file_size = self.settings['file-size'] chunk_size = self.settings['chunk-size'] pathname = self.names.new() dirname = os.path.dirname(pathname) if not os.path.exists(dirname): os.makedirs(dirname) with open(pathname, 'wb') as f: while bytes >= chunk_size: self.write_bytes(f, chunk_size) bytes -= chunk_size if bytes > 0: self.write_bytes(f, bytes) def write_bytes(self, f, bytes): chunk = self.gen.generate(bytes) f.write(chunk) self.status['written'] += bytes def setup_ttystatus(self): self.status = ttystatus.TerminalStatus(period=0.1) if self.settings['quiet']: self.status.disable() self.status['written'] = 0 self.status['total'] = 0 self.status.format( 'Generating %ByteSize(written) of %ByteSize(total) ' '%PercentDone(written,total) (%ByteSpeed(written))') if __name__ == '__main__': GenbackupdataApp().run()