]> arthur.barton.de Git - bup.git/blob - cmd/damage-cmd.py
Move cmd-*.py to cmd/*-cmd.py.
[bup.git] / cmd / damage-cmd.py
1 #!/usr/bin/env python
2 import sys, os, random
3 from bup import options
4 from bup.helpers import *
5
6
7 def randblock(n):
8     l = []
9     for i in xrange(n):
10         l.append(chr(random.randrange(0,256)))
11     return ''.join(l)
12
13
14 optspec = """
15 bup damage [-n count] [-s maxsize] [-S seed] <filenames...>
16 --
17    WARNING: THIS COMMAND IS EXTREMELY DANGEROUS
18 n,num=   number of blocks to damage
19 s,size=  maximum size of each damaged block
20 percent= maximum size of each damaged block (as a percent of entire file)
21 equal    spread damage evenly throughout the file
22 S,seed=  random number seed (for repeatable tests)
23 """
24 o = options.Options('bup damage', optspec)
25 (opt, flags, extra) = o.parse(sys.argv[1:])
26
27 if not extra:
28     o.fatal('filenames expected')
29
30 if opt.seed != None:
31     random.seed(opt.seed)
32
33 for name in extra:
34     log('Damaging "%s"...\n' % name)
35     f = open(name, 'r+b')
36     st = os.fstat(f.fileno())
37     size = st.st_size
38     if opt.percent or opt.size:
39         ms1 = int(float(opt.percent or 0)/100.0*size) or size
40         ms2 = opt.size or size
41         maxsize = min(ms1, ms2)
42     else:
43         maxsize = 1
44     chunks = opt.num or 10
45     chunksize = size/chunks
46     for r in range(chunks):
47         sz = random.randrange(1, maxsize+1)
48         if sz > size:
49             sz = size
50         if opt.equal:
51             ofs = r*chunksize
52         else:
53             ofs = random.randrange(0, size - sz + 1)
54         log('  %6d bytes at %d\n' % (sz, ofs))
55         f.seek(ofs)
56         f.write(randblock(sz))
57     f.close()