diff options
Diffstat (limited to 'scripts/lib/wic/plugins/source/empty.py')
-rw-r--r-- | scripts/lib/wic/plugins/source/empty.py | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/scripts/lib/wic/plugins/source/empty.py b/scripts/lib/wic/plugins/source/empty.py index 9c492ca206..0a9f5fa27c 100644 --- a/scripts/lib/wic/plugins/source/empty.py +++ b/scripts/lib/wic/plugins/source/empty.py | |||
@@ -9,9 +9,19 @@ | |||
9 | # To use it you must pass "empty" as argument for the "--source" parameter in | 9 | # To use it you must pass "empty" as argument for the "--source" parameter in |
10 | # the wks file. For example: | 10 | # the wks file. For example: |
11 | # part foo --source empty --ondisk sda --size="1024" --align 1024 | 11 | # part foo --source empty --ondisk sda --size="1024" --align 1024 |
12 | # | ||
13 | # The plugin supports writing zeros to the start of the | ||
14 | # partition. This is useful to overwrite old content like | ||
15 | # filesystem signatures which may be re-recognized otherwise. | ||
16 | # This feature can be enabled with | ||
17 | # '--soucreparams="[fill|size=<N>[S|s|K|k|M|G]][,][bs=<N>[S|s|K|k|M|G]]"' | ||
18 | # Conflicting or missing options throw errors. | ||
12 | 19 | ||
13 | import logging | 20 | import logging |
21 | import os | ||
14 | 22 | ||
23 | from wic import WicError | ||
24 | from wic.ksparser import sizetype | ||
15 | from wic.pluginbase import SourcePlugin | 25 | from wic.pluginbase import SourcePlugin |
16 | 26 | ||
17 | logger = logging.getLogger('wic') | 27 | logger = logging.getLogger('wic') |
@@ -19,6 +29,16 @@ logger = logging.getLogger('wic') | |||
19 | class EmptyPartitionPlugin(SourcePlugin): | 29 | class EmptyPartitionPlugin(SourcePlugin): |
20 | """ | 30 | """ |
21 | Populate unformatted empty partition. | 31 | Populate unformatted empty partition. |
32 | |||
33 | The following sourceparams are supported: | ||
34 | - fill | ||
35 | Fill the entire partition with zeros. Requires '--fixed-size' option | ||
36 | to be set. | ||
37 | - size=<N>[S|s|K|k|M|G] | ||
38 | Set the first N bytes of the partition to zero. Default unit is 'K'. | ||
39 | - bs=<N>[S|s|K|k|M|G] | ||
40 | Write at most N bytes at a time during source file creation. | ||
41 | Defaults to '1M'. Default unit is 'K'. | ||
22 | """ | 42 | """ |
23 | 43 | ||
24 | name = 'empty' | 44 | name = 'empty' |
@@ -31,4 +51,39 @@ class EmptyPartitionPlugin(SourcePlugin): | |||
31 | Called to do the actual content population for a partition i.e. it | 51 | Called to do the actual content population for a partition i.e. it |
32 | 'prepares' the partition to be incorporated into the image. | 52 | 'prepares' the partition to be incorporated into the image. |
33 | """ | 53 | """ |
34 | return | 54 | get_byte_count = sizetype('K', True) |
55 | size = 0 | ||
56 | |||
57 | if 'fill' in source_params and 'size' in source_params: | ||
58 | raise WicError("Conflicting source parameters 'fill' and 'size' specified, exiting.") | ||
59 | |||
60 | # Set the size of the zeros to be written to the partition | ||
61 | if 'fill' in source_params: | ||
62 | if part.fixed_size == 0: | ||
63 | raise WicError("Source parameter 'fill' only works with the '--fixed-size' option, exiting.") | ||
64 | size = get_byte_count(part.fixed_size) | ||
65 | elif 'size' in source_params: | ||
66 | size = get_byte_count(source_params['size']) | ||
67 | |||
68 | if size == 0: | ||
69 | # Nothing to do, create empty partition | ||
70 | return | ||
71 | |||
72 | if 'bs' in source_params: | ||
73 | bs = get_byte_count(source_params['bs']) | ||
74 | else: | ||
75 | bs = get_byte_count('1M') | ||
76 | |||
77 | # Create a binary file of the requested size filled with zeros | ||
78 | source_file = os.path.join(cr_workdir, 'empty-plugin-zeros%s.bin' % part.lineno) | ||
79 | if not os.path.exists(os.path.dirname(source_file)): | ||
80 | os.makedirs(os.path.dirname(source_file)) | ||
81 | |||
82 | quotient, remainder = divmod(size, bs) | ||
83 | with open(source_file, 'wb') as file: | ||
84 | for _ in range(quotient): | ||
85 | file.write(bytearray(bs)) | ||
86 | file.write(bytearray(remainder)) | ||
87 | |||
88 | part.size = (size + 1024 - 1) // 1024 # size in KB rounded up | ||
89 | part.source_file = source_file | ||