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