~smoser/ubuntu/xenial/cloud-utils/pkg

« back to all changes in this revision

Viewing changes to bin/cloud-localds

  • Committer: Scott Moser
  • Date: 2016-03-14 16:55:34 UTC
  • Revision ID: smoser@ubuntu.com-20160314165534-6gf0d2zdeoya6xwg
cloud-localds: support --vendor-data, network-config and 'tar'
output.  This is in support of the work going into cloud-init
under LP: #1549403.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
   Create a disk for cloud-init to utilize nocloud
18
18
 
19
19
   options:
20
 
     -h | --help            show usage
21
 
     -d | --disk-format D   disk format to output. default: raw
22
 
     -H | --hostname    H   set hostname in metadata to H
23
 
     -f | --filesystem  F   filesystem format (vfat or iso), default: iso9660
 
20
     -h | --help             show usage
 
21
     -d | --disk-format D    disk format to output. default: raw
 
22
                             can be anything supported by qemu-img or
 
23
                             tar, tar-seed-local, tar-seed-net
 
24
     -H | --hostname    H    set hostname in metadata to H
 
25
     -f | --filesystem  F    filesystem format (vfat or iso), default: iso9660
24
26
 
25
 
     -i | --interfaces  F   write network interfaces file into metadata
26
 
     -m | --dsmode      M   add 'dsmode' ('local' or 'net') to the metadata
27
 
                            default in cloud-init is 'net', meaning network is
28
 
                            required.
29
 
     -v | --verbose         increase verbosity
 
27
     -i | --interfaces  F    write network interfaces file into metadata
 
28
     -N | --network-config F write network config file to local datasource
 
29
     -m | --dsmode      M    add 'dsmode' ('local' or 'net') to the metadata
 
30
                             default in cloud-init is 'net', meaning network is
 
31
                             required.
 
32
     -V | --vendor-data F    vendor-data file
 
33
     -v | --verbose          increase verbosity
30
34
 
31
35
   Note, --dsmode, --hostname, and --interfaces are incompatible
32
36
   with metadata.
56
60
        error "${@}"
57
61
}
58
62
 
59
 
short_opts="hH:i:d:f:m:o:v"
60
 
long_opts="disk-format:,dsmode:,filesystem:,help,hostname:,interfaces:,output:,verbose"
 
63
short_opts="hH:i:d:f:m:N:o:V:v"
 
64
long_opts="disk-format:,dsmode:,filesystem:,help,hostname:,interfaces:,"
 
65
long_opts="${long_opts}network-config:,output:,vendor-data:,verbose"
61
66
getopt_out=$(getopt --name "${0##*/}" \
62
67
        --options "${short_opts}" --long "${long_opts}" -- "$@") &&
63
68
        eval set -- "${getopt_out}" ||
67
72
output=""
68
73
userdata=""
69
74
metadata=""
70
 
filesystem=$DEF_FILESYSTEM
 
75
vendordata=""
 
76
filesystem=""
71
77
diskformat=$DEF_DISK_FORMAT
72
78
interfaces=_unset
73
79
dsmode=""
74
80
hostname=""
 
81
ncname="network-config"
75
82
 
76
83
 
77
84
while [ $# -ne 0 ]; do
78
85
        cur=${1}; next=${2};
79
86
        case "$cur" in
80
87
                -h|--help) Usage ; exit 0;;
81
 
                -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
82
88
                -d|--disk-format) diskformat=$next; shift;;
83
89
                -f|--filesystem) filesystem=$next; shift;;
 
90
                -H|--hostname) hostname=$next; shift;;
 
91
                -i|--interfaces) interfaces=$next; shift;;
 
92
                -N|--network-config) netcfg=$next; shift;;
84
93
                -m|--dsmode) dsmode=$next; shift;;
85
 
                -i|--interfaces) interfaces=$next; shift;;
86
 
                -H|--hostname) hostname=$next; shift;;
 
94
                -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
 
95
                -V|--vendor-data) vendordata="$next";;
87
96
                --) shift; break;;
88
97
        esac
89
98
        shift;
104
113
                        "--interfaces, --hostname, --dsmode"
105
114
fi
106
115
 
 
116
case "$diskformat" in
 
117
        tar|tar-seed-local|tar-seed-net)
 
118
                if [ "${filesystem:-tar}" != "tar" ]; then
 
119
                        fail "diskformat=tar is incompatible with filesystem"
 
120
                fi
 
121
                filesystem="$diskformat"
 
122
                ;;
 
123
        tar*)
 
124
                fail "supported 'tar' formats are tar, tar-seed-local, tar-seed-net"
 
125
esac
 
126
 
 
127
if [ -z "$filesystem" ]; then
 
128
        filesystem="$DEF_FILESYSTEM"
 
129
fi
 
130
 
107
131
[ "$interfaces" = "_unset" -o -r "$interfaces" ] ||
108
132
        fail "$interfaces: not a readable file"
109
133
 
111
135
        fail "failed to make tempdir"
112
136
trap cleanup EXIT
113
137
 
 
138
files=( "${TEMP_D}/user-data" "${TEMP_D}/meta-data" )
114
139
if [ -n "$metadata" ]; then
115
140
        cp "$metadata" "$TEMP_D/meta-data" || fail "$metadata: failed to copy"
116
141
else
131
156
        printf "{\n%s\n}\n" "$mdata" > "${TEMP_D}/meta-data"
132
157
fi
133
158
 
 
159
if [ -n "$netcfg" ]; then
 
160
        cp "$netcfg" "${TEMP_D}/$ncname" ||
 
161
                fail "failed to copy network config"
 
162
        files[${#files[@]}]="$TEMP_D/$ncname"
 
163
fi
 
164
 
 
165
if [ -n "$vendordata" ]; then
 
166
        cp "$vendordata" "${TEMP_D}/vendor-data" ||
 
167
                fail "failed to copy vendor data"
 
168
        files[${#files[@]}]="$TEMP_D/vendor-data"
 
169
fi
 
170
 
 
171
files_rel=( )
 
172
for f in "${files[@]}"; do
 
173
        files_rel[${#files_rel[@]}]="${f#${TEMP_D}/}"
 
174
done
 
175
 
134
176
if [ "$userdata" = "-" ]; then
135
177
        cat > "$TEMP_D/user-data" || fail "failed to read from stdin"
136
178
else
138
180
fi
139
181
 
140
182
## alternatively, create a vfat filesystem with same files
141
 
img="$TEMP_D/seed.img"
142
 
truncate --size 100K "$img" || fail "failed truncate image"
 
183
img="$TEMP_D/seed-data"
 
184
tar_opts=( --owner=root --group=root )
 
185
 
 
186
case "$filesytem" in
 
187
        iso9660|iso|vfat)
 
188
                truncate --size 100K "$img" || fail "failed truncate image";;
 
189
esac
143
190
 
144
191
case "$filesystem" in
 
192
        tar)
 
193
                tar "${tar_opts[@]}" -C "${TEMP_D}" -cf "$img" "${files_rel[@]}" ||
 
194
                        fail "failed to create tarball of ${files_rel[*]}"
 
195
                ;;
 
196
        tar-seed-local|tar-seed-net)
 
197
                if [ "$filesystem" = "tar-seed-local" ]; then
 
198
                        path="var/lib/cloud/seed/nocloud"
 
199
                else
 
200
                        path="var/lib/cloud/seed/nocloud-net"
 
201
                fi
 
202
                mkdir -p "${TEMP_D}/${path}" ||
 
203
                        fail "failed making path for seed files"
 
204
                mv "${files[@]}" "${TEMP_D}/$path" ||
 
205
                        fail "failed moving files"
 
206
                tar "${tar_opts[@]}" -C "${TEMP_D}" -cf "$img" "${path}" ||
 
207
                        fail "failed to create tarball with $path"
 
208
                ;;
145
209
        iso9660|iso)
146
210
                genisoimage  -output "$img" -volid cidata \
147
 
                        -joliet -rock "$TEMP_D/user-data" "$TEMP_D/meta-data" \
148
 
                        > "$TEMP_D/err" 2>&1 ||
 
211
                        -joliet -rock "${files[@]}" > "$TEMP_D/err" 2>&1 ||
149
212
                        { cat "$TEMP_D/err" 1>&2; fail "failed to genisoimage"; }
150
213
                ;;
151
214
        vfat)
 
215
                truncate --size 100K "$img" || fail "failed truncate image"
152
216
                mkfs.vfat -n cidata "$img" || fail "failed mkfs.vfat"
153
 
                mcopy -oi "$img" "$TEMP_D/user-data" "$TEMP_D/meta-data" :: ||
 
217
                mcopy -oi "$img" "${files[@]}" :: ||
154
218
                        fail "failed to copy user-data, meta-data to img"
155
219
                ;;
156
220
        *) fail "unknown filesystem $filesystem";;
157
221
esac
158
222
 
159
223
[ "$output" = "-" ] && output="$TEMP_D/final"
160
 
if [ "$diskformat" != "raw" ]; then
 
224
if [ "${diskformat#tar}" != "$diskformat" -o "$diskformat" = "raw" ]; then
 
225
        cp "$img" "$output" ||
 
226
                fail "failed to copy image to $output"
 
227
else
161
228
        qemu-img convert -f raw -O "$diskformat" "$img" "$output" ||
162
229
                fail "failed to convert to disk format $diskformat"
163
 
else
164
 
        cp "$img" "$output" ||
165
 
                fail "failed to copy image to $output"
166
230
fi
167
231
 
168
232
[ "$output" != "$TEMP_D/final" ] || { cat "$output" && output="-"; } ||