Merge lp:~smoser/maas-images/trunk.moved2git into lp:maas-images

Proposed by Scott Moser
Status: Merged
Merged at revision: 413
Proposed branch: lp:~smoser/maas-images/trunk.moved2git
Merge into: lp:maas-images
Diff against target: 11524 lines (+21/-11177)
58 files modified
README (+11/-224)
README.di-scraping (+0/-56)
README.testing (+0/-32)
bin/fake-maas-cloudimg2eph2 (+0/-83)
bin/img2squashfs (+0/-289)
bin/kh-xgene (+0/-39)
bin/kpack-from-image (+0/-565)
bin/maas-cloudimg2eph2 (+0/-687)
bin/maas-cloudimg2ephemeral (+0/-725)
bin/maas-qcow2targz (+0/-235)
bin/meph2-build (+0/-28)
bin/meph2-cloudimg-sync (+0/-27)
bin/meph2-import (+0/-27)
bin/meph2-util (+0/-27)
bin/moved-to-git (+10/-0)
bin/netboot-mirror (+0/-27)
bin/unshare-pidns (+0/-24)
conf/bootloaders.yaml (+0/-67)
conf/centos.yaml (+0/-87)
conf/meph-v2.yaml (+0/-226)
conf/meph-v3.yaml (+0/-228)
curtin/centos6/curtin-hooks.py (+0/-393)
curtin/centos6/finalize.py (+0/-99)
curtin/centos6/python_wrapper (+0/-11)
curtin/centos7/curtin-hooks.py (+0/-396)
curtin/centos7/finalize.py (+0/-108)
curtin/centos7/python_wrapper (+0/-11)
exdata/README (+0/-19)
exdata/dates.txt (+0/-10)
exdata/hcc/info.txt (+0/-1)
exdata/muc/precise-armhf-p.yaml (+0/-55)
exdata/muc/precise-armhf-q.yaml (+0/-40)
exdata/muc/precise-armhf-r.yaml (+0/-40)
exdata/muc/precise-armhf-s.yaml (+0/-23)
exdata/muc/precise-armhf-t.yaml (+0/-15)
meph2/__init__.py (+0/-8)
meph2/commands/__init__.py (+0/-1)
meph2/commands/build_image.py (+0/-119)
meph2/commands/cloudimg_sync.py (+0/-304)
meph2/commands/dpkg.py (+0/-332)
meph2/commands/flags.py (+0/-111)
meph2/commands/meph2_util.py (+0/-451)
meph2/commands/mimport.py (+0/-339)
meph2/commands/netboot_mirror.py (+0/-158)
meph2/netinst.py (+0/-712)
meph2/stream.py (+0/-363)
meph2/ubuntu_info.py (+0/-114)
meph2/url_helper.py (+0/-74)
meph2/util.py (+0/-310)
notes/description.txt (+0/-225)
notes/example-1.txt (+0/-255)
notes/example-2.txt (+0/-280)
setup.py (+0/-24)
system-setup (+0/-143)
tests/unittests/file_item_data.json (+0/-1579)
tests/unittests/test_netboot.py (+0/-46)
tools/genstream-muc (+0/-272)
tox.ini (+0/-33)
To merge this branch: bzr merge lp:~smoser/maas-images/trunk.moved2git
Reviewer Review Type Date Requested Status
Robert C Jennings (community) Approve
Andres Rodriguez (community) Approve
maintainers of maas images Pending
Review via email: mp+355495@code.launchpad.net

Commit message

maas-images has moved its development from bzr to git.

Please update your workflow to use git. Instead of
   bzr branch lp:maas-images
use:
   git clone https://git.launchpad.net/maas-images

This bzr repository is no longer functional.

To post a comment you must log in.
Revision history for this message
Andres Rodriguez (andreserl) wrote :

+1 from my perspective. Our CI has now been updated to use git.

review: Approve
Revision history for this message
Robert C Jennings (rcj) wrote :

We'll want to do this next week on Tuesday so we're not travelling and we're awake. But this is great. I'll hold putting this in 'approved' until then though.

Revision history for this message
Robert C Jennings (rcj) wrote :

Scott, The 'git clone' cmd you include in this MP does not work today. On my system I need 'git clone lp:~maas-images-maintainers/maas-images'. Thoughts?

review: Needs Fixing
Revision history for this message
Scott Moser (smoser) wrote :

@Robert,

Fixed. I had to 'Configure Code' for the maas-images project and point it at lp:~maas-images-maintainers/maas-images/+git/maas-images

all set now.

Revision history for this message
Scott Moser (smoser) wrote :

Per Daniel on Friday 9-21:
  smoser: roaksoax: FYI, we won't want the bzr repo to go away for a week or two as we tie up loose ends.

I plan on merging this on Tuesday October 2.

Revision history for this message
Robert C Jennings (rcj) :
review: Approve
Revision history for this message
Scott Moser (smoser) wrote :

just a reminder, i'll push this tomorrow (tuesday october 2).
at some point in the US/Eastern day

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'README'
2--- README 2017-10-06 20:42:21 +0000
3+++ README 2018-09-21 12:24:04 +0000
4@@ -1,224 +1,11 @@
5-This builds maas ephemeral images from daily builds of cloud images.
6-Ie, it creates stuff that goes on
7- http://maas.ubuntu.com/images/ephemeral-v2/daily
8-from stuff on
9- http://cloud-images.ubuntu.com/daily
10-
11-== setup ==
12- Run './system-setup' to set up the system.
13- This will install necessary dependencies.
14-
15- the tools expect that the 'bin' dir is in $PATH.
16-
17- export PATH=$PWD/bin:$PATH
18-
19-== building images ==
20-You can build images and kernel in one of 2 ways
21-
22-=== build a single release/arch combination ===
23-This will build output for a single release and architecture.
24-You must provide a url or file to use as the source image.
25-
26- meph2-build arch release version source-image output.d
27-
28-example:
29- $ burl=http://cloud-images.ubuntu.com/daily/server/
30- $ meph2-build amd64 xenial 20160101 \
31- $burl/xenial/current/xenial-server-cloudimg-amd64-root.tar.xz \
32- xenial-output.d/
33-
34-This will build from source-image into output.d for 'arch' and 'release'.
35-The 'version' provided is a serial (YYYYMMDD such as 20160101).
36-source-image can be either a url or a local file of type
37- '.tar.gz', '-root.tar.gz', or '-root.tar.xz' or '.img'
38-
39-In order to collect debian installer data you will need '--enable-di'.
40-
41-=== syncing against cloud-images.ubuntu.com ===
42-This will pull the latest images down from cloud-images.ubuntu.com
43-and build maas images and kernel data all in one go. It only builds
44-if it notices that maas images are out of date with cloud-images.
45-To force a build, use '--target=force'
46-
47- To run:
48- meph2-cloudimg-sync out.d
49-
50- You can then add filters to the end, like 'release=trusty' or
51- 'arch=amd64'. The resultant out.d/streams/v1/ will have information
52- copied from maas.ubuntu.com for all other products, but will only
53- create new content for products that match the provided filters.
54-
55- If the maas ephemeral data is up to date with the latest cloud image daily
56- then meph2-cloudimg-sync will not do anything.
57-
58-In order to 'rebuild' something. To create a new '20160101.1' even when
59-there is an existing '20160101' maas image and the latest cloud image
60-is 20160101, then pass '--rebuild=20160101:20160101.1'.
61-
62-For faster debugging, you can disable the crawling of d-i kernel/initramfs
63-by passing '--disable-di'
64-
65-=== debugging ===
66-To debug and use the fake 'maas-cloudimg2eph2', run like:
67- env MAAS_CLOUDIMG2EPH2=fake-maas-cloudimg2eph2 meph2-cloudimg-sync out.d
68-
69- This will still download di-kernels and di-initramfs.
70-
71-It will produce output that looks much like the final output, but
72-runs in seconds rather than minutes.
73-
74-=== Enabling Proposed ===
75-For development and test purposes using Ubuntu proposed or PPA can
76-be very useful.
77-
78-You can enable the proposed archive by simply editing the config
79-file conf/meph-v3.yaml and specifying '--conf=conf/meph-v3.yaml'.
80-
81- enable_proposed: True
82-
83-Alternatively, you can simply pass '--proposed' to 'meph2-build' or
84-to 'meph2-cloudimg-sync'.
85-
86-=== Adding PPAs ===
87-You can build images with any number of PPAs added and additional
88-packages installed into the image through the environment variables
89-M2E_ADD_REPOS and M2E_ADD_PACKAGES which are read by
90-maas-cloudimg2ephemeral.
91-
92-M2E_ADD_REPOS is a space-delimited list of repositories to pass
93-to 'add-apt-repository'. M2E_ADD_PACKAGES is a space-delimited
94-list of packages that will be installed into the image, and will
95-thus affect both the image and the initramfs produced from it.
96-
97-For example:
98-
99- $ rel=xenial ; arch=amd64
100- $ burl=http://cloud-images.ubuntu.com/
101- $ file=$rel-server-cloudimg-amd64.squashfs
102- $ wget $burl/$rel/current/$rel-server-cloudimg-amd64.squashfs -O "$file"
103-
104- $ export M2E_ADD_REPOS=ppa:smoser/lp1711760
105- $ meph2-build --config=conf/meph-v3.yaml \
106- $arch $rel $(date +"%Y%m%d") $file $rel-output.d/
107-
108-== streams management ==
109-Building as above will create out.d that has *metadata* describing
110-everything that is in the source stream and also the things that were
111-just built. data (images) will only be present for the newly built things.
112-
113-So after building new data and metadata, you'll then insert the new data into
114-an existing stream. This option (meph2-util insert) is additive only.
115-
116-
117-=== insert data ===
118-Given output of a meph2-cloudimg-sync command above in build-output.d
119-and local daily stream directory daily-stream.d you can add the new data
120-with:
121-
122- meph2-util insert build-output.d daily-stream.d
123-
124-If you do not want to sign (create .gpg and .sjson files), then you will
125-have to use '--no-sign'.
126-
127-You can use '--dry-run' to only report what would be done.
128-
129-=== Promoting Builds ===
130-Promoting is done on a specific version of a product.
131-You promote a daily build to a released build with a given label.
132-Likely that label is 'release'.
133-
134- # list the product-ids and version are available for promotion
135- $ sstream-query --output-format="%(product_name)s %(version_name)s" --max=1 \
136- daily.d/streams/v1/index.json arch=i386 | sort -u
137- com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-p 20140414
138- com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-q 20140414
139- com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-r 20140414
140- com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-s 20140414
141- com.ubuntu.maas.daily:v2:boot:13.10:i386:hwe-s 20140416
142- com.ubuntu.maas.daily:v2:boot:14.04:i386:hwe-t 20140416.1
143-
144- # promote the listed version
145- $ meph2-util promote --label=release \
146- daily.d/streams/v1/index.json releases.d/ 20140414 \
147- product_name=com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-q
148-
149-
150-== cleaning old images ==
151-Cleaning is done in 2 parts:
152- * cleaning meta-data (removing entries from the products files)
153- * finding orphans: identify which files in the tree are no longer referenced.
154- * purging orphans: removing files that are known to have been orpaned for
155- a given amount of time (3 days).
156-
157-=== cleaning meta-data ===
158-
159-clean-md is the meph-util subcommand that allows you to keep only a given
160-number of builds. For example, to keep the latest 3 versions of every
161-product in the meta-data, you would run:
162-
163- meph2-util clean-md --max=3 daily-sream.d/
164-
165-This *only* modifies the meta-data, it does not delete files, use find-orphans
166-and reap-orphans for that.
167-
168-There is a --dry-run and --no-sign arguments also.
169-
170-=== finding orphans ===
171-
172-finding orphans creates a json formated file that contains a entry for each
173-file that is no longer referenced, and a timestamp of "now" (when it was first
174-found to be orphaned).
175-
176-Example usage:
177- The following will populate my-orphans.json. Subsequent runs will update
178- my-orphans.json with any new items, but will not update first-orphaned
179- timestamp.
180-
181- $ meph2-util find-orphans my-orphans.json ./daily/ ./daily/streams/v1/*.json
182-
183-More complex usage:
184- Its possible that 2 streams dirs could share a data directory, similar
185- to the 'pool' concept of apt for debian packages. For example, the following
186- directory tree layout (note, 'path' elements would have 'data' in them in
187- this example):
188-
189- daily/
190- data -> ../data/
191- streams/v1/index.json
192- streams/v1/daily.json
193- released/
194- data -> ../data
195- streams/v1/index.json
196- streams/v1/released.json
197- data/
198- trusty/...
199- utopic/...
200-
201- Then, we could run meph-util find-orphans with:
202-
203- $ meph2-util find-orphans my-orphans.json ./data/ \
204- ./daily/streams/v1/index.json released/streams/v1/index.json
205-
206- That will look through files in data/ that are not referenced by path
207- elements in either the daily/streams/v1/ or released/streams/v1/ files.
208-
209- There is no --dry-run for finding orphans as it is non-destructive.
210-
211-
212-=== cleaning / reaping orphans ===
213-Reaping orphans is what actually removes files. There is a '--dry-run' to
214-indicate what would be done.
215-
216-its usage is fairly simple.
217-
218- $ meph2-util reap-orphans --older 7d my-orphans.json ./data/
219-
220-'--older' takes input like:
221- Ni
222- Where N is a number and i can be one of:
223- d: days
224- h: hours
225- m: minutes
226- s: seconds
227-
228-The default is '3d'.
229+****************************************************************************
230+** maas-images has moved its development from bzr to git. **
231+** **
232+** If you are seeing this message, it means you have checked out via bzr. **
233+** Please update your workflow to use git. Instead of **
234+** bzr branch lp:maas-images **
235+** use: **
236+** git clone https://git.launchpad.net/maas-images **
237+** **
238+** This bzr repository is no longer functional. **
239+****************************************************************************
240
241=== removed file 'README.di-scraping'
242--- README.di-scraping 2015-06-01 18:43:11 +0000
243+++ README.di-scraping 1970-01-01 00:00:00 +0000
244@@ -1,56 +0,0 @@
245-Part of the processes of creating maas ephemeral images and streams data
246-is scraping the d-i installer data from an archive location. This is not
247-a very pretty process. Part of that blame resides in the very un-clean
248-data that has to be interpreted.
249-
250-The way this is currently handled is with an intermediate simplestreams
251-stream. The code in meph2/netinst.py. It can be excercise for test with
252-bin/netboot-mirror .
253-
254-For example:
255- ./bin/netboot-mirror --dry-run -vvv --arches=i386 --releases=trusty out.d
256-
257-That will create a NetbootMirrorReader that will scrape i386 data for trusty
258-mirror trusty from the mirrors specified in meph2/netinst.py HTTP_MIRRORS.
259-
260-The logging there is useful to see what is happening.
261-
262-
263-== Details ==
264-The d-i data lives at
265- <mirror>/dists/<release><pocket>/installer-<arch>/
266-Where <release> is like 'trusty' and <pocket> like '-updates', '' or
267-'-proposed'.
268-For example:
269- http://archive.ubuntu.com/ubuntu/dists/precise-updates/main/installer-i386/
270-
271-The NetbootReader scrapes apache html to get a list of d-i versions available
272-like '20101020ubuntu136.20'.
273-
274-So given "version_dir" as the above mirro/dists/..../<version>
275-Then SHA256SUM and MD5SUM files are pulled from
276- <mirror>/dists/trusty/main/installer-i386/<version>/images/
277-Example
278- http://archive.ubuntu.com/ubuntu/dists/precise-updates/main/installer-i386/20101020ubuntu136.20/images/
279-
280-Then, we try to extract clean data from each line in that sums file via
281-the get_file_item_data method.
282-
283-The end result is that NetbootMirrorReader is a simplestreams mirror
284-that can be read.
285-
286-It has products like:
287- com.ubuntu.installer:netboot:14.04:i386
288-
289-You can fully see this mirror by running:
290- netboot-mirror [--arches=i386] [--releases=trusty] out.d
291-and looking in
292- out.d/streams/v1/com.ubuntu.installer:released:netboot.json
293-
294-== d-i data to maas ephemeral ==
295-The 'bin/maas-cloudimg2ephemeral' program then uses this streams formated data
296-from the NetbootMirrorReader to as a clean set of data. And re-forms that
297-data to fit its purposes.
298-
299-The intermediate step of NetbootReader is not necessary, but the NetbootReader
300-code existed previously from an attempt to provide that data in a consistent format.
301
302=== removed file 'README.testing'
303--- README.testing 2014-05-30 18:27:15 +0000
304+++ README.testing 1970-01-01 00:00:00 +0000
305@@ -1,32 +0,0 @@
306-To get local copies of maas ephemerals, you can do:
307-
308- burl=http://maas.ubuntu.com/images/ephemeral-v2
309- for stream in releases daily; do
310- sstream-mirror --no-item-download \
311- $burl/$stream/streams/v1/index.json "$stream.d"; done
312-
313-
314-Then, to test promote you could do:
315- $ sstream-query --output-format="%(product_name)s %(version_name)s" --max=1 \
316- daily.d/streams/v1/index.json arch=i386 | sort -u
317- com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-p 20140414
318- com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-q 20140414
319- com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-r 20140414
320- com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-s 20140414
321- com.ubuntu.maas.daily:v2:boot:13.10:i386:hwe-s 20140416
322- com.ubuntu.maas.daily:v2:boot:14.04:i386:hwe-t 20140416.1
323-
324- $ sstream-query \
325- --output-format="%(product_name)s %(version_name)s/%(item_name)s" \
326- releases.d/streams/v1/index.json | sort -u > before
327-
328- $ meph2-util promote --no-sign --skip-file-copy --label=release \
329- daily.d/streams/v1/index.json releases.d/ 20140414 \
330- product_name=com.ubuntu.maas.daily:v2:boot:12.04:i386:hwe-q
331-
332- $ sstream-query \
333- --output-format="%(product_name)s %(version_name)s/%(item_name)s" \
334- releases.d/streams/v1/index.json | sort -u > after
335-
336- That will add the provided product to the releases.d/streams/ data.
337- It will not copy the files because of '--skip-file-copy'.
338
339=== removed file 'TODO'
340=== modified file 'bin/fake-maas-cloudimg2eph2'
341--- bin/fake-maas-cloudimg2eph2 2015-11-06 21:07:45 +0000
342+++ bin/fake-maas-cloudimg2eph2 1970-01-01 00:00:00 +0000
343@@ -1,83 +0,0 @@
344-#!/bin/bash
345-set -f
346-
347-error() { echo "$@" 1>&2; }
348-
349-short_opts="a:k:p:v"
350-long_opts="arch:,kernel:,krd-pack:,manifest:,verbose"
351-getopt_out=$(getopt --name "${0##*/}" \
352- --options "${short_opts}" --long "${long_opts}" -- "$@") &&
353- eval set -- "${getopt_out}" ||
354- { echo "bad arguments to $0"; exit 1; }
355-
356-gzip=true
357-arch=""
358-kernel=""
359-manif=""
360-kpacks=( )
361-while [ $# -ne 0 ]; do
362- cur=$1
363- next=$2
364- case "$cur" in
365- -a|--arch) arch="$next"; shift;;
366- -k|--kernel) kernel=$next; shift;;
367- -p|--krd-pack) kpacks[${#kpacks[@]}]=$next; shift;;
368- --manifest) manif="$next"; shift;;
369- --no-gzip) gzip=false;;
370- --) shift; break;;
371- esac
372- shift;
373-done
374-
375-src=$1
376-root_gz=$2
377-
378-ensure_d() { local d=""; d=$(dirname "$1"); mkdir -p "$d"; }
379-
380-ensure_d "$root_gz"
381-$gzip && gzip_prog="gzip -c" || gzip_prog="cat"
382-
383-error "src=$src arch=$arch kernel=$kernel output=$root_gz"
384-dd if=/dev/zero bs=1024 count=1024 2>/dev/null | $gzip_prog > "$root_gz"
385-if [ -n "$manif" ]; then
386- npkg=10
387- for((i=0;i<$npkg;i++)); do
388- printf "bogus-package-%02d\t0.$((($npkg-$i)%$npkg))\n" "$i"
389- done > "$manif"
390-fi
391-
392-OIFS="$IFS"
393-for kpack in "${kpacks[@]}"; do
394- flags=""
395- pkg=""; kout=""; iout=""; dtbs="";
396- IFS=","; set -- $kpack ; IFS="$OIFS"
397- error "kpack: $*"
398- while [ $# -ne 0 ]; do
399- case "$1" in
400- --dtb=*|--dtb)
401- [ "$1" = "--dtb" ] &&
402- { data="$2"; shift; } || data="${1#--dtb=}"
403- echo "dtb-${data%%=*}" > "${data#*=}";;
404- -*) flags="$flags $1";;
405- *)
406- if [ -z "$pkg" ]; then
407- pkg="$1"
408- elif [ -z "$kout" ]; then
409- kout="$1"
410- ensure_d "$kout"
411- echo "kernel: $pkg" > "$kout"
412- elif [ -z "$iout" ]; then
413- iout="$1"
414- ensure_d "$iout"
415- echo "kernel: $pkg" > "$iout"
416- else
417- error "confused by $*"
418- fi
419- esac
420- shift;
421- done
422- ensure_d "$kout"
423- ensure_d "$iout"
424- echo "kernel: $pkg" > "$kout"
425- echo "initrd: $pkg" > "$iout"
426-done
427
428=== target is u'moved-to-git'
429=== modified file 'bin/img2squashfs'
430--- bin/img2squashfs 2018-09-19 20:59:56 +0000
431+++ bin/img2squashfs 1970-01-01 00:00:00 +0000
432@@ -1,289 +0,0 @@
433-#!/bin/bash
434-
435-VERBOSITY=1
436-TEMP_D=""
437-VALID_FORMATS=( auto img-tar root-image root-image-gz root-tar squashfs-image
438- dir )
439-
440-error() { echo "$@" 1>&2; }
441-fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
442-
443-Usage() {
444- cat <<EOF
445-Usage: ${0##*/} [ options ] source-image output-squash-image
446-
447- convert 'source-image' into a squashfs filesystem image.
448-
449- source-image is a file in one of:
450- ${VALID_FORMATS[*]}
451-
452- output-squash-image will be a squashfs image.
453-
454- options:
455- -v | --verbose increase verbosity
456- -f | --format F source-image is of format F. default: auto.
457- must be one of:
458- auto: determine based on file and name heuristics
459- img-tar: tarball of root image (image file named .img)
460- root-image: filesytem (ext[234] in a file)
461- root-image-gz: root-image that is compressed with gzip
462- root-tar: tarball of / (supports .tar.xz .tar.gz)
463- squashfs-image: a squahsfs image (.squashfs)
464- -O | --owner O change ownership of output to O (user:group)
465-
466- Example:
467- ${0##*/} --format=my.tar.gz my.squashfs
468-EOF
469-}
470-
471-bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; return 1; }
472-cleanup() {
473- [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}"
474-}
475-
476-ddebug() {
477- local level="$1"; shift;
478- [ "${level}" -gt "${VERBOSITY}" ] && return
479- error "$(date -R):" "$@"
480-}
481-
482-debug() {
483- local level=${1}; shift;
484- [ "${level}" -gt "${VERBOSITY}" ] && return
485- error "${@}"
486-}
487-
488-inargs() {
489- #inargs(needle, [haystack])
490- # return true if needle is in haystack
491- local needle="$1" i=""
492- shift
493- for i in "$@"; do
494- [ "$i" = "$needle" ] && return 0
495- done
496- return 1
497-}
498-
499-get_img_from_tar() {
500- # given 'img' (image.tar.gz), extract it and put the .img file in 'out'
501- local img="$1" out="$2" tempd="$3"
502- local mtmp=$(mktemp -d "${tempd}/img_from_tar.XXXXXX")
503- tar -C "$mtmp" -Sxf "$img" ||
504- { error "failed to extract $img"; return 1; }
505- local f="" found=""
506- for f in "${mtmp}/"*; do
507- [ ! -f "$f" -o "${f%.img}" = "$f" ] && continue
508- [ -z "$found" ] ||
509- { error "multiple .img found in $img"; return 1; }
510- found="$f"
511- done
512- [ -n "$found" ] || { error "no .img in $img"; return 1; }
513- mv "$found" "$out" && rm -Rf "$mtmp"
514-}
515-
516-determine_format() {
517- local input="$1" fmt="$2" fout=""
518- inargs "$fmt" "${VALID_FORMATS[@]}" || {
519- error "provided '--format=$fmt' not a valid format:" \
520- "${VALID_FORMATS[*]}"
521- return 1;
522- }
523- [ "$fmt" != "auto" ] && _RET="$fmt" && return 0
524- if [ -d "$input" ]; then
525- debug 1 "${input} is a directory";
526- _RET="dir"
527- return
528- fi
529- fout=$(LANG=C file "$input") ||
530- { error "failed: file $input"; return 1; }
531- case "${fout#$input: }" in
532- "gzip compressed"*)
533- fout=$(zcat "$input" | file -)
534- case "${fout#*: }" in
535- POSIX\ tar*) fmt="img-tar";;
536- *) fmt="root-image-gz";;
537- esac
538- ;;
539- "POSIX tar"*) fmt="img-tar";;
540- *ext[234]\ filesystem*) fmt="root-image";;
541- *[Ss]quashfs*) fmt="squashfs-image";;
542- *)
543- # if the above failed (on trusty a .tar.gz file was reported
544- # as a Minux file system) then try filename based heuristics
545- case "$input" in
546- *-root.t??|*-root.tar|*-root.tar.??) fmt="root-tar";;
547- *.tar.gz|*.tgz|*.tar) fmt="img-tar";;
548- *.gz) fmt="root-image-gz";;
549- *.squashfs) fmt="squashfs-image";;
550- *)
551- error "WARN: file '$input' did not match name hueristics"
552- fmt="root-image";;
553- esac
554- debug 1 "guessing $input is $fmt based on name and 'file' [$fout]";;
555- esac
556- debug 1 "determined format is $fmt"
557- _RET="$fmt"
558-}
559-
560-get_usable_input() {
561- # given 'input' in format 'fmt' return:
562- # _RET_fmt: the format of _RET_path. either
563- # fs-image : a mountable filesystem image.
564- # dir : a directory
565- # _RET_path: full path to a file in tempd
566- local input="$1" fmt="$2" tempd="$3" cmd=""
567- case "$fmt" in
568- img-tar)
569- _RET_fmt="fs-image"
570- _RET_path="fs-image"
571- get_img_from_tar "$input" "${tempd}/fs-image" "${tempd}"
572- return;;
573- root-image-gz)
574- _RET_fmt="fs-image"
575- _RET_path="$tempd/fs-image"
576- zcat -c "$input" > "$tempd/fs-image.tmp" &&
577- mv "$tempd/fs-image.tmp" "$tempd/fs-image"
578- return;;
579- root-image)
580- _RET_fmt="fs-image"
581- _RET_path="$tempd/fs-image"
582- ln -s "$(readlink -f "$input")" "${tempd}/fs-image"
583- return;;
584- squashfs-image)
585- _RET_fmt="squashfs-image"
586- _RET_path="${tempd}/fs-image"
587- ln -s "$(readlink -f "$input")" "${tempd}/fs-image"
588- return;;
589- root-tar)
590- _RET_fmt="dir"
591- _RET_path="${tempd}/fs-dir"
592- mkdir "${_RET_path}"
593- cmd=( tar -C "${_RET_path}" -xpSf "$input" \
594- --numeric-owner --xattrs "--xattrs-include=*" )
595- debug 1 "extracting $fmt with ${cmd[*]}"
596- "${cmd[@]}" || {
597- error "failed: extracting $fmt with ${cmd[*]}"
598- return 1;
599- }
600- return
601- ;;
602- dir)
603- _RET_fmt="dir"
604- _RET_path="${tempd}/fs-dir"
605- ln -s "$(readlink -f "$input")" "${tempd}/fs-dir"
606- return;;
607- *)
608- error "Unknown format '$fmt'";
609- return 1;;
610- esac
611-}
612-
613-
614-dir2squashfs() {
615- local src_d="$1" out="$2" owner="${3:-$(id -u):$(id -g)}"
616- local tmpfile ret="" cmd=""
617- tmpfile="${out}.${0##*/}.$$" || return
618- cmd=( mksquashfs "$src_d" "$tmpfile" -xattrs -comp xz )
619- ddebug 1 "starting: ${cmd[*]}"
620- "${cmd[@]}"
621- ret=$?
622- ddebug 1 "finished: returned $ret"
623- if [ $ret -eq 0 ]; then
624- chown "$owner" "$tmpfile" ||
625- { error "failed chown $owner $tmpfile"; return 1; }
626- mv "$tmpfile" "$out" ||
627- { error "failed to move file to $out"; return 1; }
628- else
629- rm -f "$tmpfile"
630- error "mksquashfs failed [$ret]: ${cmd[*]}."
631- fi
632- return $ret
633-}
634-
635-fsimage2squashfs() {
636- local src="$1" out="$2" owner="$3"
637- local sudo="sudo"
638- [ "$(id -u )" = "0" ] && sudo=""
639- local cmd=""
640- cmd=( mount-image-callback "$src" --
641- "$0" dir2squashfs _MOUNTPOINT_ "$out" $owner )
642- debug 1 "calling ${cmd[*]}"
643- "${cmd[@]}"
644-}
645-
646-main() {
647- local short_opts="hf:O:v"
648- local long_opts="help,format:,owner:,verbose"
649- local getopt_out=""
650- getopt_out=$(getopt --name "${0##*/}" \
651- --options "${short_opts}" --long "${long_opts}" -- "$@") &&
652- eval set -- "${getopt_out}" ||
653- { bad_Usage; return; }
654-
655- local cur="" next="" input="" output="" owner="" fmt_in="auto" fmt=""
656- while [ $# -ne 0 ]; do
657- cur="$1"; next="$2";
658- case "$cur" in
659- -h|--help) Usage ; exit 0;;
660- -f|--format) fmt_in="$next"; shift;;
661- -O|--owner) owner="$next"; shift;;
662- -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
663- --) shift; break;;
664- esac
665- shift;
666- done
667-
668- [ $# -eq 2 ] || { bad_Usage "must provide input and output."; return; }
669- src_in="$1"
670- output="$2"
671-
672- TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") ||
673- { error "failed to make tempdir"; return 1; }
674- trap cleanup EXIT
675- local tempd="${TEMP_D}"
676-
677- determine_format "${src_in}" "${fmt_in}" || return
678- local fmt="${_RET}"
679- debug 1 "format of '${src_in}' is '$fmt'"
680-
681- case "$fmt" in
682- dir|squashfs-image|root-tar) :;;
683- *)
684- [ "$(id -u)" = "0" ] || {
685- error "Cannot convert $fmt to squashfs as non-root";
686- return 1;
687- }
688- esac
689- get_usable_input "${src_in}" "$fmt" "$tempd" || return
690- local cfmt="${_RET_fmt}" tpath="${_RET_path}"
691-
692- debug 1 "got format '$cfmt' at temp path '$tpath'"
693- if [ "$cfmt" = "squashfs-image" ]; then
694- local tmpf="$output.$$"
695- cp "$src_in" "$tmpf" &&
696- { [ -z "$owner" ] || chown "$owner" "$tmpf" ; } &&
697- mv "$tmpf" "$output" || {
698- rm -f "$tmpf"
699- error "failed copying $src_in to $output"
700- return 1
701- }
702- elif [ -f "$tpath" ]; then
703- fsimage2squashfs "$tpath" "$output" "$owner" || return
704- elif [ -d "$tpath" ]; then
705- dir2squashfs "$tpath/" "$output" || return
706- else
707- error "failed. path='$tpath' cfmt=${cfmt}"
708- return 1
709- fi
710- error "output in $output. took ${SECONDS}s."
711- return 0
712-}
713-
714-if [ "$1" = "dir2squashfs" ]; then
715- shift
716- dir2squashfs "$@"
717-else
718- main "$@"
719-fi
720-
721-# vi: ts=4 expandtab
722
723=== target is u'moved-to-git'
724=== modified file 'bin/kh-xgene'
725--- bin/kh-xgene 2016-10-13 21:52:32 +0000
726+++ bin/kh-xgene 1970-01-01 00:00:00 +0000
727@@ -1,39 +0,0 @@
728-#!/bin/bash
729-
730-cleanup() { [ -n "$TEMP_D" ] && rm -Rf "${TEMP_D}"; }
731-error() { echo "$@" 1>&2; }
732-fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
733-
734-compress_type() {
735- local file="$1"
736- magic="$(od -x -N2 $file | head -1 | cut -d' ' -f2)"
737- case $magic in
738- 8b1f)
739- echo "gzip"
740- ;;
741- *)
742- echo "none"
743- ;;
744- esac
745-}
746-
747-TEMP_D=$(mktemp -d "${0##*/}.XXXXXX") &&
748- trap cleanup EXIT || exit 1
749-
750-kernel="$1"
751-initrd="$2"
752-info=${VERSION_FLAVOR:-"unknown-ver unknown-flavor"}
753-
754-cp "$kernel" "${TEMP_D}/kernel" ||
755- fail "failed copy kernel '$kernel'"
756-cp "$initrd" "${TEMP_D}/initrd" ||
757- fail "failed copy initrd '$initrd'"
758-
759-comp="$(compress_type ${TEMP_D}/kernel)"
760-mkimage -A arm -O linux -T kernel -C $comp -a 0x80000 -e 0x80000 \
761- -n "kernel $info" -d "${TEMP_D}/kernel" "$kernel" ||
762- fail "failed mkimage for kernel";
763-comp="$(compress_type ${TEMP_D}/initrd)"
764-mkimage -A arm -O linux -T ramdisk -C $comp -a 0x0 -e 0x0 \
765- -n "ramdisk $info" -d "${TEMP_D}/initrd" "$initrd" ||
766- fail "failed mkimage for initrd";
767
768=== target is u'moved-to-git'
769=== modified file 'bin/kpack-from-image'
770--- bin/kpack-from-image 2018-07-09 18:28:07 +0000
771+++ bin/kpack-from-image 1970-01-01 00:00:00 +0000
772@@ -1,565 +0,0 @@
773-#!/bin/bash
774-
775-VERBOSITY=0
776-TEMP_D=""
777-COPY_TYPES="auto overlay qcow2 cp none"
778-UBUNTU_MIRROR=${UBUNTU_MIRROR:-"http://archive.ubuntu.com/ubuntu/"}
779-UBUNTU_MIRROR_PORTS=${UBUNTU_MIRROR_PORTS:-"http://ports.ubuntu.com/ubuntu-ports/"}
780-PROPOSED_ARCHIVE_FILE="/etc/apt/sources.list.d/proposed.list"
781-command -v unshare-pidns >/dev/null 2>&1 || PATH="${0%/*}:$PATH"
782-
783-error() { echo "$@" 1>&2; }
784-fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
785-
786-Usage() {
787- cat <<EOF
788-Usage: ${0##*/} [ options ] image kernel-package out-dir
789-
790- Install kernel-package into image and copy the generated kernel
791- and initrd out into out-dir
792- out-dir/
793- kernel
794- initrd
795- dtb-<filename>.dtb # for each file in lib/firmare/<ver>/device-tree
796-
797- Requires sudo to invoke mount-image-callback.
798-
799- options:
800- --kihelper PROG invoke PROG with kernel and initrd
801- This allows re-packing (ie, mkimage the files)
802- PROG is invoked with 2 arguments:
803- kernel-path initrd-path
804- it will have in its environment:
805- ROOT: path to the mounted 'image'
806- VERSION_FLAVOR: a string like 3.13.0-29-generic
807- --copy mode use 'mode' to copy. default: auto
808- one of: ${COPY_TYPES}
809- overlay can be used only with mount-image-callback support
810-EOF
811-}
812-
813-bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; return 1; }
814-cleanup() {
815- [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}"
816-}
817-
818-debug() {
819- local level=${1}; shift;
820- [ "${level}" -gt "${VERBOSITY}" ] && return
821- error "${@}"
822-}
823-
824-disable_services() {
825- local dir="$1"
826- cat > "$dir/usr/sbin/policy-rc.d" <<"EOF"
827-#!/bin/sh
828-while true; do
829- case "$1" in
830- -*) shift ;;
831- makedev) exit 0 ;;
832- x11-common) exit 0 ;;
833- *) exit 101 ;;
834- esac
835-done
836-EOF
837- [ $? -eq 0 ] && chmod 755 "$dir/usr/sbin/policy-rc.d" ||
838- { error "failed to write policy-rc.d"; return 1; }
839-}
840-
841-undisable_services() {
842- local dir="$1"
843- rm -f "$dir/usr/sbin/policy-rc.d"
844-}
845-
846-_chroot() {
847- local dir="$1"
848- shift
849- if [ "$dir" = "/" ]; then
850- "$@"
851- else
852- chroot "$dir" "$@"
853- fi
854-}
855-
856-replace_newaliases() {
857- local dir="$1"
858- debug 1 "hacking around newaliases in root (LP: #1531299)"
859- _chroot "$dir" dpkg-divert --local --rename --add /usr/bin/newaliases &&
860- ln -s /bin/true "$dir/usr/bin/newaliases"
861-}
862-
863-unreplace_newaliases() {
864- local dir="$1" chroot_dir=""
865- debug 1 "un-diverting newaliases in root"
866- [ "$dir/bin/true" -ef "$dir/usr/bin/newaliases" ] || return 0
867- rm -f "$dir/usr/bin/newaliases"
868- _chroot "$dir" dpkg-divert --local --rename --remove /usr/bin/newaliases
869-}
870-
871-kernel_from_mp() {
872- # this is the unwrapped function that actually does everything
873- # it essentially gets called by mount-image-callback.
874- local short_opts="hv"
875- local long_opts="chown-to:,help,kihelper:,proposed,verbose"
876- local getopt_out=""
877- getopt_out=$(getopt --name "${0##*/}" \
878- --options "${short_opts}" --long "${long_opts}" -- "$@") &&
879- eval set -- "${getopt_out}" ||
880- { bad_Usage; return; }
881-
882- local cur="" next=""
883- local output="" copy=true chown_to="" gid="" uid="" kihelper=""
884- local proposed="false"
885- local skip_update=${KPACK_SKIP_APT_UPDATE:-false}
886-
887- while [ $# -ne 0 ]; do
888- cur="$1"; next="$2";
889- case "$cur" in
890- --chown-to) chown_to=$next; shift;;
891- -h|--help) Usage ; exit 0;;
892- -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
893- --kihelper) kihelper="$next"; shift;;
894- --proposed) proposed=true;;
895- --skip-update) skip_update=true;;
896- --) shift; break;;
897- esac
898- shift;
899- done
900-
901- [ $# -eq 3 ] ||
902- { bad_Usage "expected 3 args, got $# [$*]"; return; }
903- local mp="$1" kpkg="$2" outd="$3"
904-
905- local me="" myd=""
906- me=$(readlink -f "$0") && myd="${me%/*}" ||
907- { error "couldn't figure out full path to $0"; return 1; }
908-
909- if [ -n "$kihelper" ]; then
910- if ! command -v "$kihelper" >/dev/null 2>&1 ; then
911- [ -x "$myd/$kihelper" ] ||
912- { error "failed to find kihelper"; return 1; }
913- kihelper="$myd/$kihelper"
914- fi
915- fi
916- if [ ! -d "$outd" ]; then
917- mkdir -p "$outd" ||
918- { error "failed mkdir $outd"; return 1; }
919- if [ -n "$chown_to" ]; then
920- chown "$chown_to" "$outd" || {
921- error "failed chown output dir '$outd' to '$chown_to'";
922- return 1;
923- }
924- fi
925- fi
926-
927- local ch_outd="/tmp/output"
928- KPACK_SKIP_APT_UPDATE=$skip_update CHROOTED_VERBOSITY=$VERBOSITY \
929- PROPOSED=$proposed \
930- unshare-pidns \
931- chroot "$mp" /bin/bash -s chrooted "$kpkg" "$ch_outd" < "$me" ||
932- { error "failed chroot and kernel install"; return 1; }
933-
934- if [ -n "$kihelper" ]; then
935- local verflav=""
936- read verflav < "$mp/$ch_outd/verflav"
937- debug 1 "using $kihelper verflav='$verflav'"
938- ROOT="$mp" VERSION_FLAVOR="$verflav" "$kihelper" \
939- "$mp/${ch_outd}/kernel" "$mp/${ch_outd}/initrd" ||
940- { error "$kihelper failed"; return 1; }
941- fi
942-
943- if [ -n "$chown_to" ]; then
944- ( cd "$mp/$ch_outd" && chown "$chown_to" * ) || {
945- error "failed chown $mp/$ch_outd/*";
946- return 1;
947- }
948- fi
949-
950- mv "$mp/$ch_outd/"* "$outd" ||
951- { error "failed move files from chrooted outdi '$ch_outd'"; return 1; }
952-
953-}
954-
955-config_addl_modules() {
956- local root="${1:-/}" rel="$2" fname=""
957- fname="${root%/}/etc/initramfs-tools/hooks/kpack_extra"
958- cat > "$fname" <<EOF
959-#!/bin/sh
960-. /usr/share/initramfs-tools/hook-functions
961-
962-copy_modules_dir kernel/drivers/char/ipmi # LP: #1333271
963-copy_modules_dir kernel/drivers/net/usb # LP: #1552378
964-manual_add_modules bcache # LP: #1513176
965-manual_add_modules hpilo # LP: #1761639
966-case $(dpkg --print-architecture) in
967- arm64)
968- manual_add_modules i2c-thunderx # LP: #1702976
969- ;;
970-esac
971-EOF
972- if [ "$rel" = "precise" ]; then
973- echo "manual_add_modules squashfs # (LP: #1501834)" >> "$fname"
974- fi
975- [ $? -eq 0 ] || { error "failed writing $fname"; return 1; }
976- chmod 755 "$fname" ||
977- { error "failed setting execute on $fname"; return 1; }
978-
979- return 0
980-}
981-
982-config_add_zfs() {
983- # In order for curtin to use zfs when booted in ephemeral we need the
984- # module included. This could also be achieved by zfs-initramfs package.
985- # However, that would bring in /sbin/zfs. We do not need use the 'zfs'
986- # command or the kernel module *in* the initramfs, we just need the module
987- # present so it can be used in install environment (LP: #1737592).
988- local root="${1:-/}" rel="$2" fname=""
989- fname="${root%/}/etc/initramfs-tools/hooks/kpack_zfs"
990- case "$rel" in
991- precise|trusty) return 0;;
992- esac
993- debug 1 "Will include zfs modules for release $rel."
994- cat > "$fname" <<"EOF"
995-. /usr/share/initramfs-tools/hook-functions
996-
997-manual_add_modules zfs # (LP: #1737592)
998-EOF
999- [ $? -eq 0 ] || { error "failed writing to $fname for zfs"; return 1; }
1000- chmod 755 "$fname" || {
1001- error "failed adding execute to $fname for zfs";
1002- return 1;
1003- }
1004-}
1005-
1006-ensure_iscsi_initramfs_support() {
1007- local root="${1:-/}"
1008- local mfile="${root%/}/etc/iscsi/iscsi.initramfs"
1009- if [ ! -f "$mfile" ]; then
1010- mkdir -p "${mfile%/*}" && touch "$mfile" ||
1011- { error "failed to create iscsi.initramfs"; return 1; }
1012- fi
1013-}
1014-
1015-clean_local_udev_rules() {
1016- # in wily and later, /etc/udev/rules.d/*.rules will be copied
1017- # into the initramfs. If there existed a '70-persistent-net.rules'
1018- # then those would be clearly wrong (mac addresses and naming for
1019- # the specific system that generated this). Clean those out.
1020- local root="${1:-/}"
1021- rm -f "${root%/}/etc/udev/rules.d/70-persistent-net.rules"
1022-}
1023-
1024-insist_running_in_container() {
1025- local root="${1:-/}"
1026- ln -sf /bin/true "${root%/}/bin/running-in-container"
1027-
1028- local sdv="/usr/bin/systemd-detect-virt"
1029- local fpsdv="${root%/}${sdv}"
1030- if [ -x "${fpsdv}" ]; then
1031- # make 'systemd-detect-virt X' exit true for any value of
1032- # X in -c/--container -r/--chroot
1033- mv "${fpsdv}" "$fpsdv.real" && cat > "$fpsdv" <<"EOF"
1034-#!/bin/sh
1035-args=" $* "
1036-hasarg() { [ "${args#* $1 }" != "$args" -o "${args#* $2 }" != "$args" ]; }
1037-hasarg -q --quiet && msg=: || msg=echo
1038-hasarg -c --container && { $msg "lxc"; exit 0; }
1039-hasarg -r --chroot && { $msg "chroot"; exit 0; }
1040-exec "$0.real" "$@"
1041-EOF
1042- [ $? -eq 0 ] || { error "failed writing $sdv"; return 1; }
1043- chmod 755 "$fpsdv" || { error "failed chmod $fpsdv"; return 1; }
1044- fi
1045-}
1046-
1047-vrun() {
1048- local vlvl="$1" msg="$2"
1049- shift 2
1050- debug $vlvl "$msg: $*"
1051- "$@"
1052-}
1053-
1054-chrooted() {
1055- # this is expected to run chrooted inside the root
1056- # installs all packages (arguments), writes kernel
1057- # and initramfs and 'verflav' to /tmp/
1058- VERBOSITY=${CHROOTED_VERBOSITY:-${VERBOSITY}}
1059- local pkgs="" kpkg="" copymods zzgrub emd="" out pkg rel arch
1060- local skip_update=${KPACK_SKIP_APT_UPDATE:-false}
1061- local proposed=${PROPOSED:-false} proposed_lfile="${PROPOSED_ARCHIVE_FILE}"
1062- local verflav initrd kernel
1063- export LANG=C
1064- kpkg="$1"
1065- outd="$2"
1066- shift 2;
1067- pkgs=( "$kpkg" "$@" )
1068-
1069- mkdir -p "$outd" || { error "failed mkdir $outd"; return 1; }
1070- local stamp="$outd/stamp"
1071- touch "$stamp"
1072-
1073- rel=$(lsb_release -sc) ||
1074- { error "failed to read release"; return 1; }
1075- arch=$(dpkg --print-architecture) ||
1076- { error "failed to get architecture from dpkg"; return 1; }
1077-
1078- # add proposed if necessary
1079- if $proposed; then
1080- local mirror=""
1081- case "$arch" in
1082- i?86|amd64) mirror="${UBUNTU_MIRROR}";;
1083- *) mirror="${UBUNTU_MIRROR_PORTS}";;
1084- esac
1085- debug 1 "adding proposed ($mirror) to $proposed_lfile"
1086- echo "deb $mirror ${rel}-proposed main universe multiverse" \
1087- > "$proposed_lfile"
1088- $skip_update &&
1089- { skip_update=false; debug 1 "enabling update due to proposed"; }
1090- fi
1091-
1092- # trusty and wily do not have mdadm or lvm2 installed in the image
1093- # but we want those modules included (LP: #1519470)
1094- # the packages are expected to be in xenial already
1095- case "$rel" in
1096- precise|trusty|wily) pkgs=( lvm2 mdadm "${pkgs[@]}" );;
1097- esac
1098-
1099- $skip_update || apt-get update -q ||
1100- { error "apt-get update failed"; return 1; }
1101-
1102- copymods="cloud-initramfs-copymods"
1103- if [ -f /usr/share/initramfs-tools/hooks/copymods ]; then
1104- debug 1 "package '$copymods' already installed."
1105- else
1106- apt-cache show $copymods >/dev/null 2>&1 ||
1107- { error "package '$copymods' not available."; return 1; }
1108- debug 1 "adding package '$copymods'."
1109- pkgs=( "$copymods" "${pkgs[@]}" )
1110- fi
1111-
1112- local rooturl="cloud-initramfs-rooturl"
1113- if [ -f /usr/share/initramfs-tools/hooks/rooturl ]; then
1114- debug 1 "package '$rooturl' already installed."
1115- else
1116- if ! apt-cache show $rooturl >/dev/null 2>&1; then
1117- case "$rel" in
1118- precise)
1119- debug 1 "package '$rooturl' not available on '$rel'";;
1120- *)
1121- error "package '$rooturl' not available.";
1122- return 1;;
1123- esac
1124- else
1125- debug 1 "adding package '$rooturl' (LP: #1688606)."
1126- pkgs=( "$rooturl" "${pkgs[@]}" )
1127- fi
1128- fi
1129-
1130- zzgrub=/etc/kernel/postinst.d/zz-update-grub
1131- [ ! -x "$zzgrub" ] || chmod ugo-x $zzgrub
1132-
1133- which eatmydata >/dev/null 2>&1 && emd=eatmydata
1134-
1135- config_addl_modules / "$rel" ||
1136- { error "failed configuring additional modules!"; return 1; }
1137-
1138- config_add_zfs / "$rel" ||
1139- { error "failed adding zfs"; return 1; }
1140-
1141- ensure_iscsi_initramfs_support / ||
1142- { error "failed to enable iscsi initramfs support"; return 1; }
1143-
1144- clean_local_udev_rules / ||
1145- { error "failed configuring additional modules!"; return 1; }
1146-
1147- insist_running_in_container / ||
1148- { error "failed to set running-in-container to true"; return 1; }
1149-
1150- disable_services / ||
1151- { error "failed to disable services before apt installs"; return 1; }
1152-
1153- replace_newaliases / ||
1154- { error "failed to replace newaliases"; return 1; }
1155-
1156- vrun 1 "installing packages" \
1157- env DEBIAN_FRONTEND=noninteractive FLASH_KERNEL_SKIP=1 \
1158- $emd apt-get install --assume-yes --quiet \
1159- "${pkgs[@]}" </dev/null
1160- [ $? -eq 0 ] ||
1161- { error "failed install of ${pkgs[*]}"; return 1; }
1162-
1163- undisable_services / ||
1164- { error "failed to re-enable services after apt installs"; return 1; }
1165-
1166- unreplace_newaliases / ||
1167- { error "failed to un-replace newaliases"; return 1; }
1168-
1169- $proposed && rm -f "$proposed_lfile"
1170-
1171- # here we look at all kernel files in /boot and get the package that
1172- # owns it. if the package is the kernel that was supplied, then we
1173- # found it. It supports 'kpkg' being a meta package by seeing
1174- # if kpkg would be removed if we uninstalled the kernel package.
1175- kernel=""
1176- for f in /boot/vmlin*; do
1177- [ -f "$f" ] || continue
1178- out=$(dpkg -S "$f")
1179- pkg=${out%%:*}
1180- [ "$pkg" = "$kpkg" ] && kernel="$f" && break
1181- if apt-get --dry-run remove $pkg | grep -q "Remv $kpkg "; then
1182- kernel="$f"
1183- break
1184- fi
1185- done
1186- [ -z "$kernel" ] && { error "no kernel found!" 1>&2; return 1; }
1187- verflav=${kernel#/boot/*-}
1188- initrd="/boot/initrd.img-$verflav"
1189- debug 2 "verflav is $verflav"
1190- # LP: #1711203 - Prefer a signed kernel over an unsigned kernel. The signed
1191- # kernel is created by combining the key in /usr/lib/linux and the kernel
1192- # in /boot. As the kernel will not be in the dpkg database assume if it
1193- # exists it's what we want.
1194- if [ -f "$(ls $kernel*signed)" ]; then
1195- kernel="$(ls $kernel*signed)"
1196- debug 1 "Found signed kernel $kernel"
1197- fi
1198- if [ "$initrd" -ot "$stamp" ]; then
1199- debug 1 "initramfs did not update by package install. regenerating."
1200- update-initramfs -c -k "$verflav"
1201- fi
1202-
1203- [ -f "$initrd" ] || { error "no initrd for $verflav" 1>&2; return 1; }
1204-
1205- local name="" t="" outf=""
1206- for f in /boot/*-${verflav}*; do
1207- # Skip unsigned kernel if a signed kernel is available.
1208- [ -f "$f"*.signed ] && continue
1209- t=$(basename "$f")
1210- case "$t" in
1211- vmlinu?*) name="kernel";;
1212- initrd.img*) name="initrd";;
1213- *)
1214- # name is the basename with -${verfla} removed
1215- name="${t%-${verflav}}"
1216- esac
1217- outf="$outd/$name"
1218- debug 2 "$f -> $outf"
1219- cp "$f" "$outf" && chmod ugo+r "$outf" ||
1220- { error "failed to copy '$name' from '$f'"; return 1; }
1221- done
1222-
1223- local path="/lib/firmware/$verflav/device-tree"
1224- if [ -d "$path" ]; then
1225- for f in $(find "$path" -type f -name "*.dtb"); do
1226- outf="$outd/dtb-${f##*/}"
1227- debug 2 "$f -> $outf"
1228- [ ! -f "$outf" ] || {
1229- error "basename collision over '${outf##*/}'"
1230- find "$path" -type f -name "${f##*/}" 1>&2
1231- return 1
1232- }
1233- cp "$f" "$outf" && chmod ugo+r "$outf" ||
1234- { error "failed to copy '$outf' from '$f'"; return 1; }
1235- done
1236- else
1237- debug 1 "dtb path '$path' did not exist. assume no dtb files"
1238- fi
1239-
1240- echo "$verflav" > "$outd/verflav" ||
1241- { error "failed to write verflavor"; return 1; }
1242-
1243- rm -f "$stamp"
1244-}
1245-
1246-main() {
1247- local short_opts="hv"
1248- local long_opts="help,kihelper:,copy:,proposed,verbose"
1249- local getopt_out=""
1250- getopt_out=$(getopt --name "${0##*/}" \
1251- --options "${short_opts}" --long "${long_opts}" -- "$@") &&
1252- eval set -- "${getopt_out}" ||
1253- { bad_Usage; return; }
1254-
1255- local cur="" next="" vflags=""
1256- local output="" copy=auto chown_to="" gid="" uid="" proposed_flag=""
1257-
1258- while [ $# -ne 0 ]; do
1259- cur="$1"; next="$2";
1260- case "$cur" in
1261- -h|--help) Usage ; exit 0;;
1262- -v|--verbose) VERBOSITY=$((${VERBOSITY}+1)); vflags="${vflags}v";;
1263- --kihelper) kihelper="$next"; shift;;
1264- --copy) copy=$next; shift;;
1265- --proposed) proposed_flag="--proposed";;
1266- --) shift; break;;
1267- esac
1268- shift;
1269- done
1270-
1271- [ $# -eq 3 ] ||
1272- { bad_Usage "expected 3 args, got $#"; return; }
1273- local img="$1" kpkg="$2" outd=${3}
1274-
1275- [ -z "$vflags" ] || vflags="-${vflags}"
1276-
1277- TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") ||
1278- fail "failed to make tempdir"
1279- trap cleanup EXIT
1280-
1281- if [ "$copy" = "auto" ]; then
1282- if mount-image-callback --help | grep -q -- --overlay; then
1283- copy="overlay"
1284- elif command -v qemu-img >/dev/null 2>&1; then
1285- copy="qcow"
1286- else
1287- copy="cp"
1288- fi
1289- fi
1290-
1291- local imgfp myimg="${TEMP_D}/my.img" overlay_flags=""
1292- imgfp=$(readlink -f "$img") ||
1293- { error "failed to get full path to $img"; return 1; }
1294- debug 1 "copy mode = $copy"
1295- case "$copy" in
1296- none) ln -s "$imgfp" "$myimg" ||
1297- { error "failed link $imgfp -> $myimg"; return 1; };;
1298- cp) cp --sparse=always "$img" "$myimg" ||
1299- { error "failed cp '$img' to tempdir"; return 1; };;
1300- qcow)
1301- qemu-img create -f qcow2 -b "$imgfp" "$myimg" ||
1302- { error "failed create qcow2 backed by $img"; return 1; };;
1303- overlay)
1304- overlay_flags="--overlay --read-only"
1305- ln -s "$imgfp" "$myimg" ||
1306- { error "failed link $imgfp -> $myimg"; return 1; };;
1307- *) error "bad copy type. one of: $COPY_TYPES"; return 1;;
1308- esac
1309-
1310- gid=$(id -g)
1311- uid=$(id -u)
1312- chown_to="$uid:$gid"
1313-
1314- local mic=""
1315- mic=$(which mount-image-callback) ||
1316- { error "mount-image-callback not in PATH"; return 1; }
1317- sudo \
1318- "KPACK_SKIP_APT_UPDATE=${KPACK_SKIP_APT_UPDATE:-false}" \
1319- "http_proxy=$http_proxy" PACKAGES="$kpkg" \
1320- UBUNTU_MIRROR=${UBUNTU_MIRROR} \
1321- UBUNTU_MIRROR_PORTS=${UBUNTU_MIRROR_PORTS} \
1322- "$mic" --sys --proc $overlay_flags \
1323- --system-resolvconf "$myimg" -- "$0" "kernel_from_mp" $vflags \
1324- _MOUNTPOINT_ "--chown-to=$chown_to" \
1325- ${kihelper:+"--kihelper=$kihelper"} ${proposed_flag} \
1326- "$kpkg" "$outd" ||
1327- { error "failed"; return 1; }
1328-
1329- error "wrote to $outd"
1330- error " " $(cd "$outd" && echo *)
1331- return
1332-}
1333-
1334-[ "$1" = "chrooted" ] && { shift; chrooted "$@"; exit; }
1335-[ "$1" = "kernel_from_mp" ] && { shift; kernel_from_mp "$@"; exit; }
1336-main "$@"
1337-# vi: ts=4 expandtab
1338
1339=== target is u'moved-to-git'
1340=== modified file 'bin/maas-cloudimg2eph2'
1341--- bin/maas-cloudimg2eph2 2018-01-06 02:14:53 +0000
1342+++ bin/maas-cloudimg2eph2 1970-01-01 00:00:00 +0000
1343@@ -1,687 +0,0 @@
1344-#!/bin/bash
1345-
1346-VERBOSITY=1
1347-TEMP_D=""
1348-VALID_FORMATS=( auto img-tar root-image root-image-gz root-tar squashfs-image )
1349-CLOUDIMG_LABEL="cloudimg-rootfs"
1350-
1351-error() { echo "$@" 1>&2; }
1352-fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
1353-
1354-Usage() {
1355- cat <<EOF
1356-Usage: ${0##*/} [ options ] source-image output-image.gz
1357-
1358- convert 'source-image' into a ephemeral image and put
1359- output into output-image.gz.
1360-
1361- source-image can be url or file path that is either .tar.gz or .img
1362- or -root.tar.gz. or -root.tar.xz
1363-
1364- options:
1365- --no-gzip do not gzip output image
1366- -k | --kernel K keep/install the kernel package 'k' inside image
1367- use 'none' to remove any existing kernels
1368- -p | --krd-pack P create a kernel / ramdisk pack
1369- P is ',' delimited: kernel-name,kernel,ramdisk[,flags]
1370- --manifest M write the dpkg manifest to M
1371- -v | --verbose increase verbosity
1372- -f | --format F source-image is of format F. default: auto.
1373- must be one of:
1374- auto: determine based on file and name heuristics
1375- img-tar: tarball of root image (image file named .img)
1376- root-image: filesytem (ext[234] in a file)
1377- root-image-gz: root-image that is compressed with gzip
1378- root-tar: tarball of / (supports .tar.xz .tar.gz)
1379- squashfs-image: a squahsfs image (.squashfs)
1380-
1381- Example:
1382- ${0##*/} --kernel=linux-generic \\
1383- --krd-pack=linux-generic,output/kernel,output/initrd \\
1384- trusty-server-cloudimg-armhf.tar.gz \\
1385- output/root-image.gz
1386-EOF
1387-}
1388-
1389-bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; return 1; }
1390-cleanup() {
1391- [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}"
1392-}
1393-
1394-ddebug() {
1395- local level="$1"; shift;
1396- [ "${level}" -gt "${VERBOSITY}" ] && return
1397- error "$(date -R):" "$@"
1398-}
1399-
1400-debug() {
1401- local level=${1}; shift;
1402- [ "${level}" -gt "${VERBOSITY}" ] && return
1403- error "${@}"
1404-}
1405-
1406-mkfs_ext4() {
1407- local out="" cmd="" feature_flags="" cfg="/etc/mke2fs.conf" fstype="ext4"
1408- case "$1" in
1409- --type=*) fstype=${1#--type=}; shift;;
1410- --type) fstype="$2"; shift 2;;
1411- esac
1412-
1413- local target="$1" label="$2" uuid="$3"
1414- if grep -q metadata_csum "$cfg"; then
1415- # disable metadata_csum as yakkety will create this by default
1416- # but kernels on some buildd cannot mount such a filesystem.
1417- feature_flags="^metadata_csum"
1418- fi
1419- cmd=( "mkfs.$fstype"
1420- ${label:+-L "$label"} ${uuid:+-U "$uuid"}
1421- ${feature_flags:+-O "$feature_flags"}
1422- -F "$target" )
1423- debug 1 "creating $fstype fs in '$target'. label=$label" \
1424- " feature_flags='${feature_flags}'"
1425- debug 2 "mkfs cmd: ${cmd[*]}"
1426-
1427- local ret=0
1428- out=$("${cmd[@]}" 2>&1)
1429- ret=$?
1430- if [ $ret -ne 0 ]; then
1431- error "failed [$ret]: ${cmd[*]}";
1432- error "$out";
1433- fi
1434- return $ret
1435-}
1436-
1437-get_img_from_tar() {
1438- local img="$1" out="$2" tempd="$3"
1439- local mtmp=$(mktemp -d "${tempd}/img_from_tar.XXXXXX")
1440- tar -C "$mtmp" -Sxf "$img" ||
1441- { error "failed to extract $img"; return 1; }
1442- local f="" found=""
1443- for f in "${mtmp}/"*; do
1444- [ ! -f "$f" -o "${f%.img}" = "$f" ] && continue
1445- [ -z "$found" ] ||
1446- { error "multiple .img found in $img"; return 1; }
1447- found="$f"
1448- done
1449- [ -n "$found" ] || { error "no .img in $img"; return 1; }
1450- mv "$found" "$out" && rm -Rf "$mtmp"
1451-}
1452-
1453-squashfs_to_image() {
1454- local squashimg="$1" output="$2" tempd="$3" size="4G"
1455- local mtmp=$(mktemp -d "${tempd}/root_tar_to_image.XXXXXX")
1456- local xout="" ret=""
1457- local srcmp="$mtmp/src" trgmp="$mtmp/target"
1458- command -v unsquashfs >/dev/null 2>&1 || {
1459- error "unsquashfs is not available. apt-get install squashfs-tools".
1460- return 1;
1461- }
1462- truncate "--size=$size" "$output" || {
1463- error "failed to create file of $size in $output"
1464- return 1
1465- }
1466- mkdir "$srcmp" "$trgmp" || {
1467- error "failed mkdir $srcmp $trgmp"
1468- return 1;
1469- }
1470-
1471- mkfs_ext4 "$output" "$CLOUDIMG_LABEL" || return
1472- debug 1 "turning squahsfs image in $squashimg to ext4 image in $output"
1473- sudo bash -ec 'src="$1"; img="$2"; trgmp="$3";
1474- mounts=""
1475- cleanup() { for m in $mounts; do umount "$m"; done; }
1476- trap cleanup EXIT
1477- mount -o loop "$img" "$trgmp"
1478- mounts="$trgmp"
1479- unsquashfs -force -xattrs -dest "$trgmp" "$src"' \
1480- "squashimg-to-image" "$squashimg" "$output" "$trgmp"
1481- ret=$?
1482- rm -Rf "$mtmp" || return
1483- return $ret
1484-}
1485-
1486-root_tar_to_image() {
1487- local tball="$1" output="$2" tempd="$3" size="4G"
1488- local mtmp=$(mktemp -d "${tempd}/root_tar_to_image.XXXXXX")
1489- local mp="$mtmp/mp" xout="" ret=""
1490- truncate "--size=$size" "$output" ||
1491- return "failed to create file of $size in $output"
1492- mkdir "$mp"
1493- mkfs_ext4 "$output" "$CLOUDIMG_LABEL" || return
1494- debug 1 "turning root tarball in $tball to image in $output"
1495- sudo bash -ec 'tball="$1"; img="$2"; mp="$3";
1496- mount -o loop "$img" "$mp"
1497- trap "umount $mp" EXIT
1498- tar -C "$mp" -xpSf "$tball" --numeric-owner \
1499- --xattrs "--xattrs-include=*"' \
1500- "root-tar-to-image" "$tball" "$output" "$mp"
1501- ret=$?
1502- rm -Rf "$mtmp" || return
1503- return $ret
1504-}
1505-
1506-get_img_file() {
1507- local fout="" fmt="$1" input="$2" output="$3" tempd="$4" ret=""
1508- if [ "$fmt" = "auto" ]; then
1509- fout=$(LANG=C file "$input") ||
1510- { error "failed: file $input"; return 1; }
1511- case "${fout#$input: }" in
1512- "gzip compressed"*)
1513- fout=$(zcat "$input" | file -)
1514- case "${fout#*: }" in
1515- POSIX\ tar*) fmt="img-tar";;
1516- *) fmt="root-image";;
1517- esac
1518- ;;
1519- "POSIX tar"*) fmt="img-tar";;
1520- *ext[234]\ filesystem*) fmt="root-image";;
1521- *[Ss]quashfs*) fmt="squashfs-image";;
1522- *)
1523- # if the above failed (on trusty a .tar.gz file was reported
1524- # as a Minux file system) then try filename based heuristics
1525- case "$input" in
1526- *-root.t??|*-root.tar|*-root.tar.??) fmt="root-tar";;
1527- *.tar.gz|*.tgz|*.tar) fmt="img-tar";;
1528- *.gz) fmt="root-image-gz";;
1529- *.squashfs) fmt="squashfs-image";;
1530- *)
1531- error "WARN: file '$input' did not match name hueristics"
1532- fmt="root-image";;
1533- esac
1534- debug 1 "guessing $input is $fmt based on name and 'file' [$fout]";;
1535- esac
1536- debug 1 "determined format is $fmt"
1537- fi
1538- case "$fmt" in
1539- img-tar)
1540- get_img_from_tar "$input" "$output" "$tempd";;
1541- root-image-gz)
1542- zcat -c "$input" > "$output";;
1543- root-image)
1544- ln -s "$(readlink -f "$input")" "$output";;
1545- root-tar)
1546- root_tar_to_image "$input" "$output" "$tempd";;
1547- squashfs-image)
1548- squashfs_to_image "$input" "$output" "$tempd";;
1549- *)
1550- error "Unknown format '$fmt'";
1551- return 1;;
1552- esac
1553- ret=$?
1554- [ $ret -eq 0 ] || {
1555- error "failed converting $fmt from $input to $output [$?]"
1556- return $ret
1557- }
1558- _RET="$fmt"
1559-}
1560-
1561-ensure_file_d() {
1562- local f="" d=""
1563- for f in "$@"; do
1564- d=$(dirname "$f")
1565- mkdir -p "$d" || return
1566- done
1567- return 0
1568-}
1569-
1570-human2bytes() {
1571- # converts size suitable for input to resize2fs to bytes
1572- # s:512 byte sectors, K:kilobytes, M:megabytes, G:gigabytes
1573- # none: block size of the image
1574- local input=${1} defunit=${2:-1024}
1575- local unit count;
1576- case "$input" in
1577- *s) count=${input%s}; unit=512;;
1578- *K) count=${input%K}; unit=1024;;
1579- *M) count=${input%M}; unit=$((1024*1024));;
1580- *G) count=${input%G}; unit=$((1024*1024*1024));;
1581- *) count=${input} ; unit=${defunit};;
1582- esac
1583- _RET=$((${count}*${unit}))
1584-}
1585-
1586-resize_image() {
1587- # set image size to 'size'
1588- # if size is '+<size>', it will be grown by that size
1589- # if '--allow-padding' provided, then size will be
1590- # the minimum of "minimum_size + padding" or size
1591- local padding=""
1592- case "$1" in
1593- --allow-padding=*) padding="${1#--allow-padding=}"; shift;;
1594- --allow-padding) padding="$2"; shift 2;;
1595- esac
1596- local img="$1" size="$2" ret="" tok=":"
1597- local oimgsize="" oblocks="" out="" blksize=""
1598- local tbytes="" minblocks=""
1599- out=$(ls -l "$img") && oimgsize=$(echo "$out" | awk '{print $5}') &&
1600- [ -n "$oimgsize" ] ||
1601- { error "failed to get size of $img"; return 1; }
1602-
1603- case "$size" in
1604- +*) human2bytes "${size#+}" ||
1605- { error "failed convert '${size#+}' to bytes"; return 1; }
1606- tbytes=$(($oimgsize+$_RET))
1607- ;;
1608- *) human2bytes "$size" ||
1609- { error "failed convert '$size' to bytes"; return 1; }
1610- tbytes=${_RET}
1611- ;;
1612- esac
1613-
1614- if [ -n "$padding" ]; then
1615- human2bytes "$padding" || {
1616- error "failed convert '$padding' to bytes";
1617- return 1;
1618- }
1619- padbytes=$_RET
1620- fi
1621-
1622- out=$(e2fsck -fy "$img" 2>&1) ||
1623- { error "failed to e2fsck -fy '$img'"; error "$out"; return 1; }
1624-
1625- out=$(LC_ALL=C dumpe2fs "$img" 2>/dev/null) ||
1626- { error "failed 'dumpe2fs $img'"; return 1; }
1627- oblocks=$(printf "%s\n" "$out" |
1628- awk '$0 ~ /^Block count:/ { print $3 }') &&
1629- [ -n "$oblocks" ] || {
1630- error "failed to record blocks in $img"
1631- return
1632- }
1633-
1634- blksize=$(printf "%s\n" "$out" |
1635- awk '$0 ~ /^Block size:/ { print $3 }')
1636-
1637- out=$(LC_ALL=C resize2fs -P "$img" 2>/dev/null) ||
1638- { error "failed to get min image size"; return 1; }
1639- minblocks=$(printf "%s\n" "$out" | awk '$0 ~ /minimum/ { print $NF }')
1640- [ -n "$minblocks" ] ||
1641- { error "failed to get min blocks in '$img'"; return 1; }
1642-
1643- local tblocks=$(($tbytes/$blksize))
1644- local des_blocks=$tblocks
1645- if [ -n "$padding" ]; then
1646- if [ $(($minblocks+($padbytes/$blksize))) -gt $tblocks ]; then
1647- des_blocks=$((minblocks+($padbytes/$blksize)))
1648- error "WARN: '--allow-padding=$padding'."
1649- error " minblocks=$minblocks target=$tblocks desired=$des_blocks"
1650- elif [ $((minblocks+$(($padbytes/$blksize)))) -lt $tblocks ]; then
1651- ddebug 1 "do not need pad, target=$tblocks > $minblocks+$padding"
1652- fi
1653- fi
1654-
1655- if [ $des_blocks -lt $minblocks ]; then
1656- error "target blocks '$tblocks' smaller than minblocks '$minblocks'"
1657- error "fail: Could not resize to $size. ($tblocks * $blksize)"
1658- error " minblocks=$minblocks target=$tblocks desired=$des_blocks"
1659- return 1
1660- fi
1661- tbytes=$(($des_blocks*$blksize))
1662-
1663- ddebug 1 "targetting $tbytes ($des_blocks*$blksize) bytes."
1664- ddebug 1 "fs is currently $oblocks * $blksize."
1665- ddebug 1 "resize to $des_blocks. minblocks=$minblocks. target=$tblocks"
1666-
1667- if [ "$oimgsize" -lt "$tbytes" ]; then
1668- truncate --size=$tbytes "$img" ||
1669- { error "failed to resize image to $tbytes"; return 1; }
1670- fi
1671-
1672- out=$(e2fsck -fy "$img" 2>&1) ||
1673- { error "failed to e2fsck -fy '$img'"; error "$out"; return 1; }
1674-
1675- out=$(resize2fs "$img" "$des_blocks" 2>&1) ||
1676- { error "failed resize '$img'"; error "$out"; return 1; }
1677-
1678- if [ "$oimgsize" -gt "$tbytes" ]; then
1679- truncate --size=$tbytes "$img"
1680- fi
1681-
1682- out=$(e2fsck -fy "$img" 2>&1) ||
1683- { error "failed to e2fsck -fy '$img'"; error "$out"; return 1; }
1684-
1685- _RET="$oimgsize:$oblocks"
1686-}
1687-
1688-copy_filesystem_image() {
1689- local src_img="$1" target_img="$2" size="${3:-1400M}"
1690- local fstype="" label="" uuid="" tmpf="" out=""
1691- tmpf=$(mktemp "${TMPDIR:-/tmp}/${0##*/}-copyfs.XXXXXX") ||
1692- { error "mktemp failed"; return 1; }
1693- blkid -o export "${src_img}" > "$tmpf" ||
1694- { rm -f "$tmpf"; error "blkid ${src_img} failed"; return 1; }
1695- out=$(UUID=""; TYPE=""; LABEL=""; . "$tmpf" && echo "$TYPE $UUID $LABEL")
1696- [ $? -eq 0 ] || fail "failed reading blkid information for $src_img"
1697- set -- ${out}
1698- fstype="$1"
1699- uuid="$2"
1700- label="$3"
1701- rm -f "$tmpf"
1702-
1703- debug 1 "src image uuid=$uuid label=$label fstype=$fstype"
1704- truncate "--size=$size" "$target_img" ||
1705- { error "truncate $target_img $size failed"; return 1; }
1706- case "$fstype" in
1707- ext*) mkfs_ext4 "--type=$fstype" "$target_img" "$label" "$uuid";;
1708- *) error "unknown filesystem type '$fstype'";;
1709- esac
1710-
1711- sudo bash -ec '
1712- s_img=$1
1713- t_img=$2
1714- s_mp=""
1715- t_mp=""
1716- fail() { echo "$@" 1>&2; exit 1; }
1717- cleanup() {
1718- for t in "$t_mp" "$s_mp"; do [ -z "$t" ] || umount "$t"; done;
1719- rm -Rf "$tmpd";
1720- }
1721-
1722- tmpd=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") &&
1723- mkdir "$tmpd/src" "$tmpd/tgt" ||
1724- fail "failed making tmpdir"
1725- trap cleanup EXIT
1726- mount -o loop,ro "$s_img" "$tmpd/src" && s_mp="$tmpd/src" ||
1727- fail "failed mount $s_img";
1728- mount -o loop "$t_img" "$tmpd/tgt" && t_mp="$tmpd/tgt" ||
1729- fail "failed mount $t_img";
1730- rsync -aXHAS "${s_mp}/" "${t_mp}/" ||
1731- fail "failed copy data ${s_img} -> ${t_img}"' \
1732- copy-source-to-target "$src_img" "$target_img" || {
1733- error "copy data from $src_img -> $target_img failed"
1734- return 1;
1735- }
1736-}
1737-
1738-allow_resize_failure() {
1739- local arch="$1" bdist="" barch=""
1740- barch=${2:-$(uname -m)}
1741- bdist=${3:-$(lsb_release -sc)}
1742-
1743- local info="arch=$arch build-system=$bdist/$barch"
1744- if [ "$arch" = "arm64" ] &&
1745- [ "$barch" = "x86_64" -o -z "${barch#i?86}" ] &&
1746- [ "$bdist" != "trusty" ]; then
1747- error "***************************"
1748- error "WARN: resize2fs fail allowed for $info"
1749- error ""
1750- error "resize2fs is less aggresive in versions"
1751- error "newer than trusty: http://pad.lv/1415077"
1752- error "***************************"
1753- return 0
1754- else
1755- error "resize image failure not allowed for $info"
1756- return 1
1757- fi
1758-}
1759-
1760-handle_kpack() {
1761- local short_opts="v"
1762- local long_opts="dtb:,kihelper:,proposed"
1763- local getopt_out=""
1764- getopt_out=$(getopt --name "handle_kpack" \
1765- --options "${short_opts}" --long "${long_opts}" -- "$@") &&
1766- eval set -- "${getopt_out}" ||
1767- { bad_Usage; return; }
1768-
1769- local dtbs pt img outd ckpkg tkout tiout
1770- dtbs=( )
1771- pt=( )
1772- while [ $# -ne 0 ]; do
1773- cur="$1"; next="$2";
1774- case "$cur" in
1775- --proposed) pt[${#pt[@]}]="--proposed";;
1776- --dtb) dtbs[${#dtbs[@]}]="$next"; shift;;
1777- --kihelper) pt[${#pt[@]}]="$cur=$next"; shift;;
1778- --) shift; break;;
1779- esac
1780- shift;
1781- done
1782- # tkout, tiout = target kernel out, target initrd out
1783- img="$1"; ckpkg="$2"; tkout="$3"; tiout="$4"
1784- shift 4
1785- outd="${TEMP_D}/$ckpkg"
1786- mkdir -p "$outd" ||
1787- { error "failed tempdir for '$ckpkg'"; return 1; }
1788-
1789- local cmd=""
1790- cmd=( env kpack-from-image \
1791- $vflags "${pt[@]}" "$imgfile" "$ckpkg" "$outd" )
1792- ddebug 1 "$(date -R): starting ${cmd[*]}"
1793- "${cmd[@]}" ||
1794- { error "failed to get $ckpkg output"; return 1; }
1795- ensure_file_d "$tkout" "$tiout" ||
1796- { error "failed to make dirs for $tkout or $tiout"; return 1; }
1797- mv "$outd/kernel" "$tkout" &&
1798- mv "$outd/initrd" "$tiout" ||
1799- { error "failed copying files"; return 1; }
1800-
1801- local darg="" bname="" outf=""
1802- for darg in "${dtbs[@]}"; do
1803- # format is name=output. and kpack-from-image names
1804- # files dtb-<name>
1805- bname=${darg%%=*}
1806- outf=${darg#*=}
1807- ensure_file_d "$outf" || { error "failed mkdir for $outf"; return 1; }
1808- if [ -f "$outd/dtb-$bname" ]; then
1809- mv "$outd/dtb-$bname" "$outf" ||
1810- { error "failed moving dtb-$bname to $outf"; return 1; }
1811- elif [ -f "$outd/dtb-$bname.dtb" ]; then
1812- mv "$outd/dtb-$bname.dtb" "$outf" ||
1813- { error "failed moving dtb-$bname.dtb to $outf"; return 1; }
1814- else
1815- error "did not find dtb file $bname"
1816- return 1;
1817- fi
1818- done
1819-}
1820-
1821-inargs() {
1822- #inargs(needle, [haystack])
1823- # return true if needle is in haystack
1824- local needle="$1" i=""
1825- shift
1826- for i in "$@"; do
1827- [ "$i" = "$needle" ] && return 0
1828- done
1829- return 1
1830-}
1831-
1832-main() {
1833- local short_opts="a:fhk:p:v"
1834- local long_opts="arch:,help,format:,kernel:,krd-pack:,manifest:,no-gzip,proposed,verbose"
1835- local getopt_out=""
1836- getopt_out=$(getopt --name "${0##*/}" \
1837- --options "${short_opts}" --long "${long_opts}" -- "$@") &&
1838- eval set -- "${getopt_out}" ||
1839- { bad_Usage; return; }
1840-
1841- local cur="" next="" output="" gzip=true kpkg=""
1842- local kpacks="" src_in="" src="" arch="" vflags="" fmt="auto"
1843- local working_space="1024M" zero_img="true" fs_img_size="1400M"
1844- local manifest_out="" proposed_flag=""
1845- kpacks=( )
1846-
1847- while [ $# -ne 0 ]; do
1848- cur="$1"; next="$2";
1849- case "$cur" in
1850- -h|--help) Usage ; exit 0;;
1851- -a|--arch) arch="$next"; shift;;
1852- -f|--format) fmt="$next"; shift;;
1853- -k|--kernel) kpkg=$next; shift;;
1854- --manifest) manifest_out="$next";;
1855- -p|--krd-pack) kpacks[${#kpacks[@]}]="$next"; shift;;
1856- --no-gzip) gzip=false;;
1857- --proposed) proposed_flag="--proposed";;
1858- -v|--verbose) VERBOSITY=$((${VERBOSITY}+1)); vflags="${vflags}v";;
1859- --) shift; break;;
1860- esac
1861- shift;
1862- done
1863-
1864- [ $# -eq 2 ] || { bad_Usage "must provide source and target"; return; }
1865- src_in="$1"
1866- output="$2"
1867- [ -z "$vflags" ] || vflags="-$vflags"
1868-
1869- PATH="$(dirname "$0"):$PATH"
1870- command -v "maas-cloudimg2ephemeral" >/dev/null 2>&1 ||
1871- { error "do not have maas-cloudimg2ephemeral in path"; return 1; }
1872-
1873- inargs "$fmt" "${VALID_FORMATS[@]}" || {
1874- error "provided '--format=$fmt' not a valid format:" \
1875- "${VALID_FORMATS[*]}"
1876- return 1;
1877- }
1878-
1879- [ -z "$kpkg" ] && {
1880- error "no '--kernel' provided, choosing 'linux-generic'"
1881- kpkg="linux-generic"
1882- }
1883-
1884- TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") ||
1885- { error "failed to make tempdir"; return 1; }
1886- trap cleanup EXIT
1887-
1888- if [ -f "$src_in" ]; then
1889- src="$src_in"
1890- else
1891- case "$src_in" in
1892- http://*|https://*|ftp://*)
1893- ddebug 1 "getting source $src_in"
1894- src="${TEMP_D}/${src_in##*/}"
1895- wget "$src_in" --dot-style=mega -O "$src" ||
1896- { error "failed download $src_in"; return 1; }
1897- ;;
1898- file://*)
1899- [ -f "${src_in#file://}" ] ||
1900- { error "$src_in: not a file"; return 1; }
1901- src="${src_in#file://}"
1902- ;;
1903- *) error "Unable to handle src: $src_in"; return 1;;
1904- esac
1905- fi
1906-
1907- # now src is either a .tar.gz file, a -root.tar.gz, or a .img file
1908- local imgfile="${TEMP_D}/root.img"
1909- ddebug 1 "getting .img from $src fmt=$fmt"
1910- get_img_file "$fmt" "$src" "$imgfile" "${TEMP_D}" ||
1911- { error "failed to get image file from $src"; return 1; }
1912- fmt=${_RET}
1913-
1914- if [ "$fmt" = "root-tar" ]; then
1915- working_space=""
1916- fi
1917-
1918- if [ "$src" -ef "$imgfile" ]; then
1919- rm -f "$imgfile"
1920- ddebug 1 "copying $src_in to $imgfile"
1921- cp --sparse=always "$src" "$imgfile" ||
1922- { error "failed to copy $src_in to temp"; return 1; }
1923- chmod u+w "$imgfile" ||
1924- { error "failed to give write perms to $imgfile"; return 1; }
1925- fi
1926-
1927- ensure_file_d "$output" ||
1928- { error "failed to create dir for $output"; return 1; }
1929-
1930- local restore_img_info=""
1931- if [ -n "$working_space" ]; then
1932- ddebug 1 "getting '$working_space' in $imgfile"
1933- resize_image "$imgfile" "+$working_space" ||
1934- { error "failed to grow $imgfile by $working_space"; return 1; }
1935- restore_img_info="$_RET"
1936- fi
1937-
1938- # now imgfile has the root filesystem image to adjust
1939- local pkout="${TEMP_D}/$kpkg-kernel" piout="${TEMP_D}/$kpkg-initrd"
1940- local manif="${TEMP_D}/manifest"
1941- local mc2ephem=""
1942- mc2ephem=( maas-cloudimg2ephemeral $vflags ${arch:+"--arch=$arch"}
1943- $proposed_flag "$imgfile" "$kpkg" "$pkout" "$piout" "$manif" )
1944- ddebug 1 "starting ${mc2ephem[*]}"
1945- "${mc2ephem[@]}" ||
1946- { error "failed to turn $imgfile to ephemeral"; return 1; }
1947- [ -z "$manifest_out" ] || cp "$manif" "$manifest_out" ||
1948- { error "failed copying manifest to $manifest_out"; return 1; }
1949-
1950- local i="" oifs="$IFS"
1951- ddebug 1 "starting kpacks: ${kpacks[*]}"
1952- for i in "${kpacks[@]}"; do
1953- IFS=","; set -- $i; IFS="$oifs"
1954- # handle_kpack doesn't actually need $proposed_flag, because $imgfile
1955- # will have it already enabled, but passing it is more obvious.
1956- handle_kpack $proposed_flag "$imgfile" "$@" ||
1957- { error "handle_kpack '$imgfile' $* failed"; return 1; }
1958- done
1959- ddebug 1 "kpacks done"
1960-
1961- local pad="" tmp_img_size="$fs_img_size"
1962- if [ "$arch" = "ppc64el" ]; then
1963- ## ppc64el wily do not fit in 1400M. Instead of allowing this across
1964- ## the board, we're going to keep the 1400M standard other places.
1965- ## the 'pad' of 100M gives ~ 100M wiggle room in image.
1966- tmp_img_size="1600M"
1967- pad="100M"
1968- fi
1969- ddebug 1 "copying working img into new fs of $tmp_img_size (pad=$pad)"
1970- local timg="$imgfile.fs_img_size"
1971- copy_filesystem_image "$imgfile" "$timg" "$tmp_img_size" ||
1972- error "failed copying $imgfile to $timg"
1973-
1974- if [ -n "$pad" ]; then
1975- ddebug 1 "adjusting image to fit $fs_img_size with pad=$pad"
1976- resize_image "--allow-padding=$pad" "$timg" "$fs_img_size"
1977- fi
1978-
1979- if $zero_img; then
1980- ddebug 1 "zeroing img"
1981- e2fsck -fy "$imgfile" || { error "failed to e2fsck $imgfile"; return 1; }
1982- zerofree "$imgfile" || { error "failed zerofree $imgfile"; return 1; }
1983- fi
1984-
1985- if [ "$fmt" = "squashfs-image" ]; then
1986- local squash_out=""
1987- squash_out=$(dirname "$output")/$(basename "$src")
1988-
1989- # This is not perfect, but if these things imply a change
1990- # to the image rather than re-using the input.
1991- if [ -n "${proposed_flag}" ] ||
1992- [ -n "${M2E_ADD_REPOS}" -o -n "${M2E_ADD_PACKAGES}" ]; then
1993- debug 1 "creating a new squashfs in $squash_out from $imgfile"
1994- sudo mount-image-callback "$imgfile" --read-only -- sh -ec '
1995- src="$1"; out="$2"; owner="$3"; tmp="$out.$$"
1996- trap "rm -f \"$tmp\"" EXIT
1997- mksquashfs "$src" "$tmp" -xattrs -comp xz
1998- chown "$owner" "$tmp"
1999- mv "$tmp" "$out"
2000- ' newsquash-img _MOUNTPOINT_ \
2001- "${squash_out}" "$(id -u):$(id -g)" || {
2002- error "Failed mksquashfs from $imgfile"
2003- return 1
2004- }
2005- else
2006- cp "$src" "${squash_out}" || {
2007- error "copy SquashFS image from $src -> $squash_out failed"
2008- return 1;
2009- }
2010- fi
2011- fi
2012-
2013- if $gzip; then
2014- ddebug 1 "gzipping image file"
2015- local stime=$SECONDS
2016- gzip -9 --rsyncable "$timg" &&
2017- mv --force "$timg.gz" "$output" ||
2018- { error "failed gzip"; return 1; }
2019- ddebug 1 "gzip took $(($SECONDS-$stime))s"
2020- else
2021- mv --force "$timg" "$output" ||
2022- { error "failed move to $output"; return 1; }
2023- fi
2024-
2025- ddebug 1 "finished"
2026- return 0
2027-}
2028-
2029-main "$@"
2030-# vi: ts=4 expandtab
2031
2032=== target is u'moved-to-git'
2033=== modified file 'bin/maas-cloudimg2ephemeral'
2034--- bin/maas-cloudimg2ephemeral 2018-07-09 18:28:07 +0000
2035+++ bin/maas-cloudimg2ephemeral 1970-01-01 00:00:00 +0000
2036@@ -1,725 +0,0 @@
2037-#!/bin/bash
2038-#
2039-# maas-cloudimg2ephemeral - update a cloud image to make it sufficient
2040-# for use as a maas ephemeral image
2041-#
2042-# Copyright (C) 2011-2012 Canonical
2043-#
2044-# Authors:
2045-# Scott Moser <scott.moser@canonical.com>
2046-#
2047-# This program is free software: you can redistribute it and/or modify
2048-# it under the terms of the GNU Affero General Public License as
2049-# published by the Free Software Foundation, version 3 of the License.
2050-#
2051-# This program is distributed in the hope that it will be useful,
2052-# but WITHOUT ANY WARRANTY; without even the implied warranty of
2053-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2054-# GNU Affero General Public License for more details.
2055-#
2056-# You should have received a copy of the GNU Affero General Public License
2057-# along with this program. If not, see <http://www.gnu.org/licenses/>.
2058-
2059-_APT_UPDATED=false
2060-IMAGES_PPA_APT_KEY="-----BEGIN PGP PUBLIC KEY BLOCK-----
2061-Version: SKS 1.0.10
2062-
2063-mI0ETxf8lwEEAMAqtJVUnlCVzjTOsohaE/M4mGHFl4Py1cuE9ryOgmTWje+6BrNjtWLSfTQJ
2064-Kp1V6hViUoxPBck1qkZoAz7VU5nDuBWDybCsolliUX4zzTYNiDnPS74fs4CDUWx9qpl5Sdb6
2065-7aygIid/mFXubhJnTPR6Bq9ptGmc0Ks6ttNs3WJ/ABEBAAG0IkxhdW5jaHBhZCBQUEEgZm9y
2066-IE1hYVMgTWFpbnRhaW5lcnOIuAQTAQIAIgUCTxf8lwIbAwYLCQgHAwIGFQgCCQoLBBYCAwEC
2067-HgECF4AACgkQXP8eqZPujMU2zQP/W9OCzaU7HvFrqEt6nHGej2PEanIunxo7J8D5OR+Yl578
2068-FpRkHRgvcdQnGuZUpdBnOFatDDFME7ClN9qUrD1wDN1r9ip2luaKiO2cZOW4Uu5Z0n/3Qc6J
2069-eh9TNspyDMuHVVZ5GiAk+GXgF1m7ps5lCnOCZK/pXUEEUOS8AWnt3sM=
2070-=1RpZ
2071------END PGP PUBLIC KEY BLOCK-----"
2072-IMAGES_PPA_FILE="/etc/apt/sources.list.d/maas-ephemeral-images.list"
2073-IMAGES_PPA_URL="http://ppa.launchpad.net/maas-maintainers/maas-ephemeral-images/ubuntu"
2074-
2075-UBUNTU_MIRROR=${UBUNTU_MIRROR:-"http://archive.ubuntu.com/ubuntu/"}
2076-UBUNTU_MIRROR_PORTS=${UBUNTU_MIRROR_PORTS:-"http://ports.ubuntu.com/ubuntu-ports/"}
2077-PROPOSED_ARCHIVE_FILE="/etc/apt/sources.list.d/proposed.list"
2078-
2079-VERBOSITY=0
2080-TOP_D="${0%/*}"
2081-DISABLE_SUFFIX=".eph-temp-disabled"
2082-command -v unshare-pidns >/dev/null 2>&1 || PATH="${0%/*}:$PATH"
2083-
2084-error() { echo "$@" 1>&2; }
2085-errorp() { printf "$@" 1>&2; }
2086-fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
2087-failp() { [ $# -eq 0 ] || errorp "$@"; exit 1; }
2088-
2089-Usage() {
2090- cat <<EOF
2091-Usage: ${0##*/} [ options ] disk kpkg kernel initrd [manifest]
2092-
2093- Update the image 'disk', installing 'kpkg'
2094- copy out kernel and initramfs tothe kernel 'kernel' and initrd 'initrd'
2095- If manifest is given, a (dpkg --show) manifest will be written.
2096-
2097- Expects to receive in a cloudimg disk image with no partition
2098- table, and will update it for maas ephemeral use.
2099-
2100- options:
2101- -v | --verbose increase verbosity
2102-EOF
2103-}
2104-
2105-bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; return; }
2106-
2107-debug() {
2108- local level=${1}; shift;
2109- [ "${level}" -gt "${VERBOSITY}" ] && return
2110- error "$(date -R):" "${@}"
2111-}
2112-
2113-disable_services() {
2114- local dir="$1"
2115- cat > "$dir/usr/sbin/policy-rc.d" <<"EOF"
2116-#!/bin/sh
2117-while true; do
2118- case "$1" in
2119- -*) shift ;;
2120- makedev) exit 0 ;;
2121- x11-common) exit 0 ;;
2122- *) exit 101 ;;
2123- esac
2124-done
2125-EOF
2126- [ $? -eq 0 ] && chmod 755 "$dir/usr/sbin/policy-rc.d" ||
2127- { error "failed to write policy-rc.d"; return 1; }
2128-
2129- ( set -e;
2130- cd "$dir"
2131- for f in ./etc/kernel/*.d/*-grub; do
2132- [ -x "$f" ] || continue
2133- abs=${f#.}
2134- debug 2 "Disabling $abs via dpkg-divert rename"
2135- chroot "$dir" dpkg-divert --local --rename --divert \
2136- "${abs}${DISABLE_SUFFIX}" "${abs}"
2137- done
2138- )
2139-}
2140-
2141-undisable_services() {
2142- local dir="$1"
2143- rm -f "$dir/usr/sbin/policy-rc.d"
2144-
2145- ( set -e;
2146- cd "$dir"
2147- for f in ./etc/kernel/*.d/*${DISABLE_SUFFIX}; do
2148- [ -e "$f" ] || continue
2149- abs=${f#.}
2150- orig=${abs%${DISABLE_SUFFIX}}
2151- debug 2 "Re-enabling $orig via dpkg-divert removal."
2152- chroot "$dir" dpkg-divert --local --remove --rename --divert \
2153- "${abs}" "${orig}"
2154- done
2155- )
2156-}
2157-
2158-check_required_vars() {
2159- local req="" missing=""
2160- for req in "$@"; do
2161- [ -n "${!req}" ] || missing="${missing} ${req}"
2162- done
2163- missing=${missing# }
2164- _RET="$missing"
2165- [ -z "$_RET" ]
2166-}
2167-
2168-show_vars() {
2169- local var
2170- for var in "$@"; do
2171- printf "%s=%s\n" "$var" "${!var}"
2172- done
2173-}
2174-
2175-_apt_update() {
2176- if [ "${_APT_UPDATED}" != "true" ]; then
2177- log_change true "run apt-update${1:+ [$1]}."
2178- _apt update
2179- _APT_UPDATED=true
2180- fi
2181-}
2182-
2183-_apt() {
2184- local emd=$(which eatmydata 2>/dev/null || :)
2185- case "$1" in
2186- upgrade|dist-upgrade|install) _apt_update "$1";;
2187- esac
2188- debug 1 "$emd apt-get ${apt_opts} --quiet --assume-yes $*"
2189- $emd apt-get ${apt_opts} -q --assume-yes "$@" </dev/null;
2190-}
2191-
2192-log_change() {
2193- local change="$1"
2194- shift
2195- if $change; then
2196- echo "CHANGE:" "$@"
2197- else
2198- echo "NO_CHANGE:" "$@"
2199- fi
2200-}
2201-
2202-filter_installed_packages() {
2203- # write to stdout, a list of packages not installed locally
2204- local fmt='${Package} ${Version}\n'
2205- LC_ALL=C dpkg-query --show "--showformat=${fmt}" "$@" 2>&1 | awk '
2206- $0 ~ /[Nn]o packages/ {
2207- sub("[.]$","",$NF);
2208- pkgs[n]=$NF;
2209- n=n+1;
2210- }
2211- $2 == "" {
2212- pkgs[n]=$1;
2213- n=n+1;
2214- };
2215- END { for(p in pkgs) {printf("%s ",pkgs[p])}; printf("\n"); }' n=0
2216-}
2217-
2218-get_new_pkgs() {
2219- # get_new_pkgs(manifest_in, manifest_out)
2220- # return a list of packages in manifest_out that are not in manifest_in
2221- _RET=$(set -o pipefail
2222- cat "$1" "$1" "$2" | awk '-F\t' '{print $1}' | sort | uniq -u) &&
2223- (set -f; echo $_RET)
2224-}
2225-get_removed_pkgs() {
2226- # get_removed_pkgs(manifest_in, manifest_out)
2227- # return a list of packages manifest_in not in manifest_out
2228- _RET=$(set -o pipefail
2229- cat "$1" "$2" "$2" | awk '-F\t' '{print $1}' | sort | uniq -u) &&
2230- (set -f; echo $_RET)
2231-}
2232-
2233-ensure_iscsi_initramfs_support() {
2234- local root="${1:-/}" release="$2"
2235- local fname="/etc/iscsi/iscsi.initramfs"
2236- local mfile="${root%/}$fname"
2237- local change="touch $fname for iscsi root shutdown (LP: #1536707)"
2238- if [ -f "$mfile" ]; then
2239- log_change false "$change" "[file existed]"
2240- return 0
2241- fi
2242- case "$release" in
2243- precise|quantal|raring|saucy|trusty|utopic) :;;
2244- *)
2245- log_change false "$change" "[systemd]"
2246- return 0
2247- ;;
2248- esac
2249- mkdir -p "${mfile%/*}" && touch "$mfile" ||
2250- { error "failed to create iscsi.initramfs"; return 1; }
2251- log_change true "$change"
2252-}
2253-
2254-add_repos() {
2255- local repos="$1"
2256- (
2257- # repos can be space or , delimited
2258- oifs="$IFS"
2259- set -f
2260- set -e
2261- case "$repos" in
2262- *,*) IFS=","; set -- $repos; IFS="$oifs";;
2263- *) set -- $repos; IFS="$oifs";
2264- esac
2265- log_change true "$change: $repos"
2266- for i in "$@"; do
2267- debug 1 " $i"
2268- add-apt-repository -y "$i" </dev/null
2269- done
2270- )
2271-}
2272-
2273-apply_updates_chrooted() {
2274- # FIXME: remove this after no longer necessary
2275- local required="" known=""
2276- local release="" arch="" VERBOSITY=${_VERBOSITY:-1}
2277- local ppa_clear=${PPA_CLEAR:-true} change="" dist_upgrade=${DIST_UPGRADE:-false}
2278- local proposed=${proposed:-false}
2279- local repos="${m2e_repos}" add_packages="${m2e_add_packages}"
2280- required="kpkg pubd"
2281- known="apt_opts PPA_CLEAR VERBOSITY DIST_UPGRADE"
2282-
2283- export LC_ALL=C FLASH_KERNEL_SKIP=1
2284- export DEBIAN_FRONTEND=noninteractive
2285-
2286- check_required_vars ${required} ||
2287- { error "$FUNCNAME: missing required vars: $_RET"; return 1; }
2288-
2289- if [ "$VERBOSITY" -ge 1 ]; then
2290- show_vars $required $known 1>&2
2291- fi
2292-
2293- release=$(lsb_release -sc) ||
2294- { error "failed to get release"; return 1; }
2295-
2296- arch="$(dpkg --print-architecture)" ||
2297- { error "failed to get dpkg arch"; return 1; }
2298-
2299-
2300- mkdir -p "$pubd" || { error "failed to create pubdir '$pubd'"; return 1; }
2301-
2302- dpkg-query --show > "$pubd/manifest.in"
2303-
2304- change="add additional repos."
2305- if [ -n "$repos" ]; then
2306- add_repos "$repos" || {
2307- error "Failed to add repos: $repos"
2308- return 1;
2309- }
2310- log_change true "$change [$repos]"
2311- debug 1 "due to 'M2E_ADD_REPOS', setting dist-upgrade=true"
2312- dist_upgrade=true
2313- else
2314- log_change false "$change"
2315- fi
2316-
2317- change="images ppa for cloud-init and maas-enlist (LP: #1511482, 1515733)"
2318- if [ "$release" = "precise" ]; then
2319- # apt-add-repository failed when trying quantal amd64 with qemu-static.
2320- # so instead do this manually.
2321- log_change true "$change"
2322- debug 1 "configuring PPA at $IMAGES_PPA_URL"
2323- echo "deb $IMAGES_PPA_URL $release main" > "$IMAGES_PPA_FILE" ||
2324- { error "failed writing to $IMAGES_PPA_FILE"; return 1; }
2325- printf "%s\n" "$IMAGES_PPA_APT_KEY" | apt-key add - ||
2326- { error "apt-key add failed!"; return 1; }
2327- debug 1 "addition of PPA turns dist-upgrade on"
2328- dist_upgrade=true
2329- else
2330- log_change false "$change"
2331- debug 1 "not adding images ppa to release=$release"
2332- fi
2333-
2334- change="enable proposed"
2335- if $proposed; then
2336- local mirror=""
2337- case "$arch" in
2338- i?86|amd64) mirror="${UBUNTU_MIRROR}";;
2339- *) mirror="${UBUNTU_MIRROR_PORTS}";;
2340- esac
2341- log_change true "$change [$arch $mirror]"
2342- debug 1 "enabling proposed for $release [$arch $mirror]"
2343- echo "deb $mirror ${release}-proposed main universe multiverse" > "$PROPOSED_ARCHIVE_FILE" ||
2344- { error "failed writing to $PROPOSED_ARCHIVE_FILE"; return 1; }
2345- debug 1 "addition of proposed turns dist-upgrade on"
2346- dist_upgrade=true
2347- else
2348- log_change false "$change"
2349- debug 1 "not enabling proposed for $release (proposed=$proposed)."
2350- fi
2351-
2352- change="ensure mellanox mlx4_en gets loaded (LP: #1115710)"
2353- if [ "$release" = "precise" -a ! -f "/etc/modprobe.d/mlx4.conf" ]; then
2354- # packaged version would be mlx4.conf, to avoid conflict
2355- # we install a different file here.
2356- printf "%s\n%s; %s\n" \
2357- "# mlx4_core should load mlx4_en (LP: #1115710)." \
2358- "install mlx4_core /sbin/modprobe --ignore-install mlx4_core" \
2359- "/sbin/modprobe mlx4_en" \
2360- > "/etc/modprobe.d/mlx4.ephemeral.conf"
2361- log_change true "$change"
2362- else
2363- log_change false "$change"
2364- fi
2365-
2366- change="build-only: divert newaliases (LP: #1531299)"
2367- local newaliases_hack=false
2368- if [ "$cross" = "true" ] && [ -f /usr/bin/newaliases ]; then
2369- log_change true "$change"
2370- # work around LP: #1531299
2371- debug 1 "hacking around newaliases in cross root (LP: #1531299)"
2372- dpkg-divert --local --rename --add /usr/bin/newaliases
2373- ln -s /bin/true /usr/bin/newaliases
2374- newaliases_hack=true
2375- else
2376- log_change false "$change"
2377- fi
2378-
2379- local arch_pkgs="" toremove="" removed="" installed=""
2380- local add_pkgs="" rel_pkgs="" kernel_pkg=""
2381- if [ "$kpkg" != "none" ]; then
2382- kernel_pkg="$kpkg"
2383- fi
2384-
2385- # additional packages that we have to add
2386- add_pkgs="cloud-initramfs-dyn-netconf" # LP: #1749019
2387- add_pkgs="${add_pkgs} open-iscsi overlayroot"
2388- if [ -n "${add_packages}" ]; then
2389- debug 1 "add_packages=$add_packages (from M2E_ADD_PACKAGES)"
2390- add_pkgs="${add_pkgs} ${add_packages}"
2391- fi
2392-
2393- # rel_pkgs: packages added only in some releases
2394- case "$release" in
2395- precise|quantal|raring|saucy|trusty|utopic|vivid)
2396- rel_pkgs="${rel_pkgs} maas-enlist";;
2397- esac
2398-
2399- change="add u-boot-tools to arch_pkgs for arch '$arch' (LP: #1640519)"
2400- if [ "$arch" = "arm64" -o "$arch" = "armhf" ]; then
2401- case "$release" in
2402- precise|quantal|raring|saucy|trusty|utopic|vivid|wily|\
2403- xenial|yakkety)
2404- arch_pkgs="${arch_pkgs} u-boot-tools"
2405- debug 1 "release '$release' <= yakkety: $change"
2406- ;;
2407- *) debug 1 "release '$release' > yakkety: do not $change";;
2408- esac
2409- fi
2410-
2411- local removes="^linux-.*" keeps="^linux-base$" pkglist=""
2412- pkglist=$(dpkg-query --show) || { error "failed dpkg-query"; return 1; }
2413- toremove=$(echo "$pkglist" |
2414- awk '$1 ~ rm && $1 !~ keeps { printf("%s ",$1); }' \
2415- "rm=$removes" "keeps=$keeps") &&
2416- toremove="${toremove% }"
2417- [ $? -eq 0 ] || { error "failed getting list to remove"; return 1; }
2418-
2419- change="removing linux kernel packages."
2420- if [ -z "$toremove" ]; then
2421- error "nothing to remove: nothing match '$removes' and not '$keeps'."
2422- log_change false "$change"
2423- else
2424- debug 1 "removing: $toremove"
2425- ( set -f; _apt remove --purge $toremove ) ||
2426- { error "failed to remove $toremove"; return 1; }
2427- log_change true "$change [$toremove]"
2428- fi
2429- removed="$toremove"
2430-
2431- change="apt-get dist-upgrade"
2432- if [ "${dist_upgrade}" != "false" ]; then
2433- log_change true "$change"
2434- _apt dist-upgrade ||
2435- { error "failed apt-get dist-upgrade"; return 1; }
2436- else
2437- log_change false "$change"
2438- fi
2439-
2440- local missing="" pkgs="$arch_pkgs $kernel_pkg $add_pkgs $rel_pkgs"
2441- missing=$(filter_installed_packages $pkgs)
2442- change="install missing packages"
2443- if [ -n "$missing" ]; then
2444- log_change true "$change [$missing]"
2445- _apt install $missing || {
2446- error "failed installing $missing";
2447- return 1;
2448- }
2449- else
2450- log_change false "$change"
2451- fi
2452- installed="$missing"
2453-
2454- if ${ppa_clear} && [ -f "$IMAGES_PPA_FILE" ]; then
2455- debug 1 "disabling ppa in $IMAGES_PPA_FILE."
2456- sed -i "s,^,#," "$IMAGES_PPA_FILE" ||
2457- { error "failed to clear $IMAGES_PPA_FILE"; return 1; }
2458- fi
2459-
2460- change="remove dpkg foreign architectures"
2461- if dpkg --print-foreign-architectures | grep -q i386; then
2462- log_change true "$change"
2463- # precise used multiarch file
2464- dpkg --remove-architecture i386 >/dev/null 2>&1 ||
2465- rm /etc/dpkg/dpkg.cfg.d/multiarch
2466- dpkg --print-foreign-architectures | grep i386 &&
2467- { error "failed to remove i386 foreign arch"; return 1; }
2468- debug 1 "removed foreign arch i386"
2469- else
2470- log_change false "$change"
2471- fi
2472-
2473- change="run autoremove"
2474- if [ -n "$removed" ]; then
2475- log_change true "$change"
2476- _apt autoremove ||
2477- { error "failed apt-get autoremove"; return 1; }
2478- else
2479- log_change false "$change"
2480- fi
2481-
2482- log_change true "apt-get clean"
2483- _apt clean ||
2484- { error "failed apt-get clean"; return 1; }
2485-
2486- if [ "$newaliases_hack" = "true" ]; then
2487- debug 1 "restoring newaliases"
2488- rm -f /usr/bin/newaliases
2489- dpkg-divert --local --rename --remove /usr/bin/newaliases
2490- ls -l /usr/bin/newaliases
2491- fi
2492-
2493- # xenial should not need the symlink, but shipped GA with it
2494- # so it is there for now. Releases pre-xenial do need it.
2495- change="symlink ENI for cloud-initramfs-dyn-netconf (LP: #1534205)"
2496- local f=/etc/network/interfaces
2497- case "$release" in
2498- precise|quantal|raring|saucy|trusty|utopic|vivid|wily|xenial)
2499- log_change true "$change"
2500- mv "$f" "$f.dist" && ln -sf ../../run/network/dynamic-interfaces "$f" ||
2501- { error "failed to link dynamic interfaces"; return 1; }
2502- ;;
2503- *) log_change false "$change";;
2504- esac
2505-
2506- ensure_iscsi_initramfs_support "/" "$release" ||
2507- { "ensure_iscsi_initramfs_support / $release failed"; return 1; }
2508-
2509- change="create /lib/modules (LP: #1543204)"
2510- if [ ! -d "/lib/modules" ]; then
2511- log_change true "$change"
2512- mkdir /lib/modules ||
2513- { error "failed to create /lib/modules"; return 1; }
2514- else
2515- log_change false "$change"
2516- fi
2517-
2518- change="update-initramfs"
2519- if [ "$kpkg" != "none" ]; then
2520- local k="" i=""
2521- for i in /boot/vmlinu?-*; do
2522- [ "${i%-virtual}" = "${i}" ] && k=${i};
2523- done
2524- ver=${k##*/vmlinu?-}
2525- log_change true "$change [$ver]"
2526- debug 1 "updating kernel version '$ver'"
2527- update-initramfs -u -k "$ver" ||
2528- { error "update-initramfs failed"; return 1; }
2529-
2530- cp /boot/initrd.img-$ver "$pubd/initrd.img" &&
2531- cp /boot/vmlinu?-$ver "$pubd/kernel.img" &&
2532- chmod ugo+r "$pubd/kernel.img" ||
2533- { error "failed to publish kernel files to $pubd"; return 1; }
2534- else
2535- log_change false "$change"
2536- debug 1 "kernel package = 'none'. No kernels published."
2537- fi
2538- dpkg-query --show > "$pubd/manifest" ||
2539- { error "failed to publish manifest to $pubd"; return 1; }
2540-
2541- return 0
2542-}
2543-
2544-apply_updates() {
2545- # apply_updates(dir, kernel_out, initramfs_out)
2546- # update directory given, and pull out kernel and initramfs
2547- # to given locations
2548- short_opts="a:hv"
2549- long_opts="arch:,fix-perms-ref:,help,proposed,verbose"
2550- getopt_out=$(getopt --name "${0##*/}" \
2551- --options "${short_opts}" --long "${long_opts}" -- "$@") &&
2552- eval set -- "${getopt_out}" ||
2553- { bad_Usage; return 1; }
2554- local debian_arch="" perms_ref="" qemu_arch="" proposed=false
2555-
2556- while [ $# -ne 0 ]; do
2557- cur=${1}; next=${2};
2558- case "$cur" in
2559- -a|--arch) debian_arch="$next"; shift;;
2560- --fix-perms-ref) perms_ref="$next"; shift;;
2561- -h|--help) Usage ; exit 0;;
2562- --proposed) proposed=true;;
2563- -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
2564- --) shift; break;;
2565- esac
2566- shift;
2567- done
2568-
2569- [ $# -eq 4 -o $# -eq 5 ] ||
2570- { bad_Usage "expected image, kernel, ramdisk [,manifest]"; return 1; }
2571- local dir=$1 kpkg=$2 kernel_out=$3 initrd_out=$4 manifest=$5
2572- local tab=" "
2573-
2574- disable_services "$dir" || return
2575-
2576- # we expect /etc/lsb-release to be shell syntax with DISTRIB_CODENAME
2577- local rel="" fout host_arch
2578- host_arch=$(uname -m)
2579- rel=$(. "$dir/etc/lsb-release" && echo "${DISTRIB_CODENAME}") &&
2580- [ -n "$rel" ] ||
2581- fail "failed to read DISTRIB_CODENAME from $dir/etc/lsb-release"
2582-
2583- if [ -z "$debian_arch" ]; then
2584- # not pretty, use 'file' to determine arch
2585- fout=$(file -L "$dir/bin/sh") ||
2586- { error "'file' on $dir/bin/sh failed"; return 1; }
2587- case "$fout" in
2588- *\ x86-64,*) debian_arch="amd64";;
2589- *\ 80386,*) debian_arch="i386";;
2590- *\ ARM\ aarch64,*) debian_arch="arm64";;
2591- *\ ARM,*) debian_arch="armhf";;
2592- *\ 64-bit\ PowerPC*) debian_arch="ppc64el";;
2593- *) fail "unknown arch for fileoutput: $fout"; return 1;;
2594- esac
2595- fi
2596-
2597- case "$debian_arch" in
2598- x86_64|amd64) qemu_arch="x86_64";;
2599- arm64) qemu_arch="aarch64";;
2600- arm*) qemu_arch="arm";;
2601- ppc64el) qemu_arch="ppc64le";;
2602- powerpc) qemu_arch="ppc";;
2603- *) qemu_arch="$debian_arch";;
2604- esac
2605-
2606- local cross=true
2607- case "$host_arch:$qemu_arch" in
2608- $host_arch:$host_arch) cross=false;;
2609- ppc64:ppc) cross=false;;
2610- i?86:i386) cross=false;;
2611- x86_64:i386) cross=false;;
2612- aarm64:arm64) cross=false;;
2613- arm*:arm*) cross=false;;
2614- esac
2615-
2616- debug 1 "arch: $debian_arch rel: $rel host_arch: $host_arch"
2617- debug 1 "qemu_arch=$qemu_arch cross=$cross"
2618- if $cross; then
2619- local fmt="${QEMU_STATIC_FMT:-/usr/bin/qemu-%a-static}" exe=""
2620- exe=${fmt//%a/$qemu_arch}
2621- cp "$exe" "$dir/usr/bin/qemu-${qemu_arch}-static" || {
2622- error "failed to copy qemu-static [$exe] for ${qemu_arch}";
2623- error "install qemu-user-static or set QEMU_STATIC_FMT";
2624- return 1;
2625- }
2626- debug 1 "copied $exe into filesystem /usr/bin/qemu-${qemu_arch}-static"
2627- else
2628- debug 1 "no qemu-static needed to execute $debian_arch on ${host_arch}"
2629- fi
2630-
2631- local prox="" apt_opts=""
2632- out=$(apt-config shell prox Acquire::HTTP::Proxy) &&
2633- eval $out && [ -n "$prox" ] &&
2634- apt_opts="--option=Acquire::HTTP::Proxy=${prox}"
2635-
2636- apt_opts="${apt_opts} --option=Dpkg::Options::=--force-confold"
2637- [ -n "${apt_opts}" ] &&
2638- debug 1 "using apt options ${apt_opts} for install"
2639-
2640- local me=$(readlink -f "$0")
2641- local pubd="/tmp/results" fpubd="$dir/tmp/results"
2642-
2643- cross=$cross apt_opts="$apt_opts" kpkg="$kpkg" _VERBOSITY="$VERBOSITY" \
2644- proposed=$proposed \
2645- pubd="$pubd" \
2646- unshare-pidns \
2647- chroot "$dir" /bin/bash -s apply_updates_chrooted < "$me" ||
2648- { error "failed chroot and kernel install"; return 1; }
2649- [ $? -eq 0 ] || {
2650- error "failed to install packages or mkinitramfs in chroot";
2651- return 1;
2652- }
2653-
2654- [ -n "$perms_ref" ] &&
2655- chown -R "--reference=$perms_ref" "${fpubd}"
2656-
2657- if [ "$kpkg" != "none" ]; then
2658- mv "$fpubd/kernel.img" "$kernel_out" &&
2659- mv "$fpubd/initrd.img" "$initrd_out" ||
2660- { error "failed to copy kernels out"; return 1; }
2661- fi
2662-
2663- # LP: #1034116: disable rescuevol and overlayroot's diskcfg
2664- change="disable rescuevol (LP: #1034116)"
2665- if grep -q "^cloud-initramfs-rescuevol${tab}" "$fpubd/manifest"; then
2666- log_change true "$change"
2667- # if cloud-initramfs-resuevol is installed, disable it
2668- echo "# cloud-initramfs-rescuevol is disabled by ${0##*/}" \
2669- > "$dir/etc/rescuevol-ignore" ||
2670- { error "failed to disable rescuevol"; return 1; }
2671- else
2672- log_change false "$change"
2673- fi
2674-
2675- change="disable overlayroot via /etc/overlayroot.local.conf (LP: #1533822)"
2676- if grep -q "^overlayroot${tab}" "$fpubd/manifest"; then
2677- printf "%s\n%s\n%s\n" "# overlayroot_cfgdisk disabled by ${0##*/}" \
2678- "overlayroot_cfgdisk=disabled" "overlayroot=tmpfs" \
2679- > "$dir/etc/overlayroot.local.conf"
2680- fi
2681-
2682- local pkg_add="" pkg_remove=""
2683- pkg_add=$(get_new_pkgs "$fpubd/manifest.in" "$fpubd/manifest") ||
2684- fail "failed to get new packages"
2685- pkg_remove=$(get_removed_pkgs "$fpubd/manifest.in" "$fpubd/manifest") ||
2686- fail "failed to get removed packages"
2687- if [ -z "$pkg_add" -a -z "$pkg_remove" ]; then
2688- log_change false "package changes: add='' remove=''"
2689- else
2690- log_change true "package changes: add=$pkg_add remove=$pkg_remove"
2691- fi
2692-
2693- if [ -n "$manifest" ]; then
2694- mv "$fpubd/manifest" "$manifest" || fail "failed to move manifest"
2695- fi
2696- rm -Rf "$fpubd" || fail "failed to remove pubd"
2697-
2698- undisable_services "$dir"
2699-
2700- return 0
2701-}
2702-
2703-if [ "$1" = "apply_updates" ]; then
2704- "$@"
2705-elif [ "$1" = "apply_updates_chrooted" ]; then
2706- "$@"
2707-else
2708- short_opts="a:hv"
2709- long_opts="arch:,help,proposed,verbose,zero"
2710- getopt_out=$(getopt --name "${0##*/}" \
2711- --options "${short_opts}" --long "${long_opts}" -- "$@") &&
2712- eval set -- "${getopt_out}" ||
2713- { bad_Usage; exit 1; }
2714- arch=""
2715- vargs=""
2716- zero=false
2717- proposed=""
2718-
2719- while [ $# -ne 0 ]; do
2720- cur=${1}; next=${2};
2721- case "$cur" in
2722- -a|--arch) arch="$next"; shift;;
2723- -h|--help) Usage ; exit 0;;
2724- --proposed) proposed="--proposed";;
2725- -v|--verbose) vargs="${vargs}v";;
2726- --zero) zero=true;;
2727- --) shift; break;;
2728- esac
2729- shift;
2730- done
2731-
2732- [ $# -eq 4 -o $# -eq 5 ] ||
2733- { bad_Usage "expected image, kernel, ramdisk [,manifest]"; exit 1; }
2734-
2735- img="$1"
2736- kpkg="$2"
2737- kernel="$3"
2738- initrd="$4"
2739- manifest="$5"
2740-
2741- sudo \
2742- m2e_repos="${M2E_ADD_REPOS}" \
2743- m2e_add_packages="${M2E_ADD_PACKAGES}" \
2744- mount-image-callback --sys --proc --system-resolvconf "$img" -- \
2745- "$0" apply_updates ${vargs:+-$vargs} \
2746- ${proposed} \
2747- "--fix-perms-ref=$img" \
2748- ${arch:+"--arch=$arch"} _MOUNTPOINT_ \
2749- "$kpkg" "$kernel" "$initrd" ${manifest:+"${manifest}"} ||
2750- fail "failed to apply updates to $img"
2751-
2752- if $zero; then
2753- # this is optional as it will only work on a raw image
2754- e2fsck -fy "$img" || { error "failed to e2fsck $img"; exit 1; }
2755- zerofree "$img" || { error "failed zerofree $img"; exit 1; }
2756- fi
2757-
2758- exit 0
2759-
2760-fi
2761-# vi: ts=4 expandtab
2762
2763=== target is u'moved-to-git'
2764=== modified file 'bin/maas-qcow2targz'
2765--- bin/maas-qcow2targz 2018-09-18 10:26:54 +0000
2766+++ bin/maas-qcow2targz 1970-01-01 00:00:00 +0000
2767@@ -1,235 +0,0 @@
2768-#!/bin/bash
2769-#
2770-# maas-qcowtargz - Take a qcow2 or qcow2.xz file from a given URL or
2771-# file path and make it sufficient for use as a
2772-# MAAS installable image
2773-#
2774-# Copyright (C) 2015-2018 Canonical
2775-#
2776-# Authors:
2777-# Lee Trager <lee.trager@canonical.com>
2778-#
2779-# This program is free software: you can redistribute it and/or modify
2780-# it under the terms of the GNU Affero General Public License as
2781-# published by the Free Software Foundation, version 3 of the License.
2782-#
2783-# This program is distributed in the hope that it will be useful,
2784-# but WITHOUT ANY WARRANTY; without even the implied warranty of
2785-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2786-# GNU Affero General Public License for more details.
2787-#
2788-# You should have received a copy of the GNU Affero General Public License
2789-# along with this program. If not, see <http://www.gnu.org/licenses/>.
2790-
2791-TEMP_D=""
2792-command -v unshare-pidns >/dev/null 2>&1 || PATH="${0%/*}:$PATH"
2793-
2794-error() { echo "$@" 1>&2; }
2795-fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
2796-
2797-_dl() {
2798- local url="$1" out="$2" ret=0
2799- local tmp="$out.$$"
2800- wget "$url" --progress=dot:mega -O "$tmp" && mv "$tmp" "$out" || {
2801- ret=$?
2802- error "Failed downloading to $out: $url"
2803- rm -f "$tmp"
2804- }
2805- return $ret
2806-}
2807-
2808-dl() {
2809- local url="$1" out="${2:-${1##*/}}"
2810- if [ -n "${CACHE_D}" ]; then
2811- local cfile="${CACHE_D}/${url##*/}"
2812- if [ ! -f "$cfile" ]; then
2813- _dl "$url" "$cfile" || return
2814- fi
2815- [ "$cfile" -ef "$out" ] && return
2816- cp "$cfile" "$out"
2817- return
2818- fi
2819-
2820- _dl "$url" "$out"
2821-}
2822-
2823-cleanup() { [ -d "${TEMP_D}" ] && rm -Rf "${TEMP_D}"; }
2824-
2825-function usage() {
2826- echo "Usage $0 [options] <URL> <SHA256> <out file>"
2827- echo "Options:"
2828- echo " --curtin-path Path to any curtin files to include in the image."
2829- echo " --packages Any extra packages to install into the image."
2830-
2831-}
2832-
2833-short_opts="c:p:h"
2834-long_opts="curtin-path:,packages:,help"
2835-
2836-getopt_out=$(getopt --name "${##*/}" --options "${short_opts}" --long "${long_opts}" -- "$@")
2837-if [ $? -ne 0 ]; then
2838- usage
2839- exit 1
2840-fi
2841-
2842-eval set -- "$getopt_out"
2843-while true; do
2844- case "$1" in
2845- -c|--curtin-path)
2846- curtin_path=$2
2847- shift 2
2848- ;;
2849- -p|--packages)
2850- packages=$2
2851- shift 2
2852- ;;
2853- -h|--help)
2854- usage
2855- exit 0
2856- ;;
2857- --)
2858- shift
2859- break
2860- ;;
2861- esac
2862-done
2863-
2864-if [ "$1" == "maasify" ]; then
2865- [ "$(id -u)" = "0" ] || { error "not root, sorry"; exit 1; }
2866- root_d=$2
2867- out=$3
2868- if [ -n "$curtin_path" ]; then
2869- mkdir -p "$root_d/curtin" ||
2870- { error "failed to create /curtin"; return 1; }
2871- cp -r "$curtin_path/"* "$root_d/curtin/" || {
2872- error "failed copying $CURTIN_PATH to $root_d/curtin";
2873- return 1;
2874- }
2875- chmod +x "$root_d/curtin/"* ||
2876- { error "failed chmod +x $root_d/curtin/*"; return 1; }
2877- fi
2878-
2879- if [ -n "$packages" ]; then
2880- # We need working DNS to pull packages from the repo
2881- cp /etc/resolv.conf "${root_d}/etc/resolv.conf"
2882- for package in $(echo $packages | sed 's/,/ /g'); do
2883- LANG=C unshare-pidns chroot "$root_d" yum -y install $package || {
2884- error "failed to install $package"
2885- exit 1
2886- }
2887- done
2888- # Don't ship with yum cache
2889- LANG=C unshare-pidns chroot "$root_d" yum clean all || {
2890- error "failed to clear yum cache"
2891- exit 1
2892- }
2893- # Upstream ships with DNS information in /etc/resolv.conf, ship a
2894- # clean version.
2895- rm "${root_d}/etc/resolv.conf"
2896- touch "${root_d}/etc/resolv.conf"
2897- chown root:root "${root_d}/etc/resolv.conf"
2898- chmod 644 "${root_d}/etc/resolv.conf"
2899- fi
2900-
2901- error "Taring up image contents... into $out"
2902- gzflag="--use-compress-program=gzip"
2903- if command -v pigz >/dev/null 2>&1; then
2904- gzflag="--use-compress-program=pigz"
2905- fi
2906- tar --directory "$root_d" --create --preserve-permissions \
2907- --one-file-system \
2908- --sparse --file "$out" $gzflag \
2909- --xattrs "--xattrs-include=*" . || {
2910- error "failed tar command"
2911- rm -f "$out"
2912- exit 1
2913- }
2914-else
2915- if [ $# -ne 3 ]; then
2916- usage
2917- exit 1
2918- fi
2919- url=$1
2920- sha256=$2
2921- if [ "$(dirname $3)" == "." ]; then
2922- out="${PWD}/${3}"
2923- else
2924- out=$3
2925- fi
2926-
2927- error "final output will be in ${out}"
2928-
2929- mkdir -p $(dirname "$out")
2930-
2931- cache_d="${CACHE_D:-$PWD/cache}"
2932- [ -d "$cache_d" ] || mkdir -p "$cache_d" || fail "failed mkdir $cache_d"
2933-
2934- TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX")
2935- trap cleanup EXIT
2936-
2937- if [ -f "$url" ]; then
2938- img_path="$url"
2939- else
2940- img_path="${cache_d}/${url##*/}"
2941- if [ ! -f "${img_path}" ]; then
2942- dl "$url" "$img_path" ||
2943- fail "failed download $url"
2944- else
2945- error "using cached '${url##*/}' in ${cache_d}"
2946- fi
2947-
2948- # We were given a SHA512 instead of a SHA256
2949- if [ ${#sha256} -eq 128 ]; then
2950- error "Checking sha512sum for $img_path"
2951- sha512_out=$(sha512sum "$img_path") ||
2952- fail "failed: sha512sum $img_path"
2953- sha512_out=${sha512_out% *}
2954- if [ "$sha512_out" != "$sha256" ]; then
2955- fail "Error: unexpected sha512 of $img_path $sha512_out != $sha256"
2956- fi
2957- else
2958- error "Checking sha256sum for $img_path"
2959- sha256_out=$(sha256sum "$img_path") ||
2960- fail "failed: sha256sum $img_path"
2961- sha256_out=${sha256_out% *}
2962- if [ "$sha256_out" != "$sha256" ]; then
2963- fail "Error: unexpected sha256 of $img_path $sha256_out != $sha256"
2964- fi
2965- fi
2966-
2967- fout=$(LANG=C file "$img_path") ||
2968- fail "failed file $img_path"
2969- case "${fout#$img_path: }" in
2970- "XZ compressed data"*)
2971- new_img_path="${img_path%.xz}"
2972- if [ -f "$new_img_path" ]; then
2973- error "using cached uncompressed '$new_img_path'"
2974- else
2975- error "Decompressing XZ image..."
2976- xzcat "$img_path" > "${new_img_path}" ||
2977- { rm -f "$new_img_path"; fail "failed xzcat"; }
2978- fi
2979- img_path="${new_img_path}"
2980- ;;
2981- esac
2982- fi
2983- working_img="${TEMP_D}/${img_path##*/}"
2984-
2985- error "copying $img_path to $working_img"
2986- cp "$img_path" "$working_img" ||
2987- fail "failed copying image ${img_path} -> ${working_img}"
2988-
2989- cb_args="maasify _MOUNTPOINT_ $out"
2990- [ -n "$curtin_path" ] && cb_args="$cb_args --curtin-path $curtin_path"
2991- [ -n "$packages" ] && cb_args="$cb_args --packages $packages"
2992- sudo \
2993- CACHE_D="${cache_d}" \
2994- ${http_proxy:+"http_proxy=${http_proxy}"} \
2995- ${https_proxy:+"https_proxy=${https_proxy}"} \
2996- mount-image-callback --proc --dev "$working_img" -- \
2997- "$0" $cb_args
2998-
2999- error "wrote $out"
3000-fi
3001-
3002-# vi: ts=4 expandtab
3003
3004=== target is u'moved-to-git'
3005=== modified file 'bin/meph2-build'
3006--- bin/meph2-build 2016-01-12 21:50:59 +0000
3007+++ bin/meph2-build 1970-01-01 00:00:00 +0000
3008@@ -1,28 +0,0 @@
3009-#!/usr/bin/env python3
3010-
3011-import os
3012-import sys
3013-
3014-
3015-def call_entry_point(name):
3016- (istr, dot, ent) = name.rpartition('.')
3017- try:
3018- __import__(istr)
3019- except ImportError:
3020- # if that import failed, check dirname(__file__/..)
3021- # to support ./bin/program with modules in .
3022- _tdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
3023- sys.path.insert(0, _tdir)
3024- try:
3025- __import__(istr)
3026- except ImportError as e:
3027- sys.stderr.write("Unable to find %s: %s\n" % (name, e))
3028- sys.exit(2)
3029-
3030- sys.exit(getattr(sys.modules[istr], ent)())
3031-
3032-if __name__ == '__main__':
3033- call_entry_point("meph2.commands.build_image.main")
3034-
3035-# vi: ts=4 expandtab syntax=python
3036-
3037
3038=== target is u'moved-to-git'
3039=== modified file 'bin/meph2-cloudimg-sync'
3040--- bin/meph2-cloudimg-sync 2015-09-11 19:10:40 +0000
3041+++ bin/meph2-cloudimg-sync 1970-01-01 00:00:00 +0000
3042@@ -1,27 +0,0 @@
3043-#!/usr/bin/env python3
3044-
3045-import os
3046-import sys
3047-
3048-
3049-def call_entry_point(name):
3050- (istr, dot, ent) = name.rpartition('.')
3051- try:
3052- __import__(istr)
3053- except ImportError:
3054- # if that import failed, check dirname(__file__/..)
3055- # to support ./bin/program with modules in .
3056- _tdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
3057- sys.path.insert(0, _tdir)
3058- try:
3059- __import__(istr)
3060- except ImportError as e:
3061- sys.stderr.write("Unable to find %s: %s\n" % (name, e))
3062- sys.exit(2)
3063-
3064- sys.exit(getattr(sys.modules[istr], ent)())
3065-
3066-if __name__ == '__main__':
3067- call_entry_point("meph2.commands.cloudimg_sync.main")
3068-
3069-# vi: ts=4 expandtab syntax=python
3070
3071=== target is u'moved-to-git'
3072=== modified file 'bin/meph2-import'
3073--- bin/meph2-import 2016-09-26 19:23:50 +0000
3074+++ bin/meph2-import 1970-01-01 00:00:00 +0000
3075@@ -1,27 +0,0 @@
3076-#!/usr/bin/env python3
3077-
3078-import os
3079-import sys
3080-
3081-
3082-def call_entry_point(name):
3083- (istr, dot, ent) = name.rpartition('.')
3084- try:
3085- __import__(istr)
3086- except ImportError:
3087- # if that import failed, check dirname(__file__/..)
3088- # to support ./bin/program with modules in .
3089- _tdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
3090- sys.path.insert(0, _tdir)
3091- try:
3092- __import__(istr)
3093- except ImportError as e:
3094- sys.stderr.write("Unable to find %s: %s\n" % (name, e))
3095- sys.exit(2)
3096-
3097- sys.exit(getattr(sys.modules[istr], ent)())
3098-
3099-if __name__ == '__main__':
3100- call_entry_point("meph2.commands.mimport.main")
3101-
3102-# vi: ts=4 expandtab syntax=python
3103
3104=== target is u'moved-to-git'
3105=== modified file 'bin/meph2-util'
3106--- bin/meph2-util 2015-09-11 19:10:40 +0000
3107+++ bin/meph2-util 1970-01-01 00:00:00 +0000
3108@@ -1,27 +0,0 @@
3109-#!/usr/bin/env python3
3110-
3111-import os
3112-import sys
3113-
3114-
3115-def call_entry_point(name):
3116- (istr, dot, ent) = name.rpartition('.')
3117- try:
3118- __import__(istr)
3119- except ImportError:
3120- # if that import failed, check dirname(__file__/..)
3121- # to support ./bin/program with modules in .
3122- _tdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
3123- sys.path.insert(0, _tdir)
3124- try:
3125- __import__(istr)
3126- except ImportError as e:
3127- sys.stderr.write("Unable to find %s: %s\n" % (name, e))
3128- sys.exit(2)
3129-
3130- sys.exit(getattr(sys.modules[istr], ent)())
3131-
3132-if __name__ == '__main__':
3133- call_entry_point("meph2.commands.meph2_util.main")
3134-
3135-# vi: ts=4 expandtab syntax=python
3136
3137=== target is u'moved-to-git'
3138=== added file 'bin/moved-to-git'
3139--- bin/moved-to-git 1970-01-01 00:00:00 +0000
3140+++ bin/moved-to-git 2018-09-21 12:24:04 +0000
3141@@ -0,0 +1,10 @@
3142+#!/bin/sh
3143+me=$(readlink -f "$0")
3144+mydir=${me%/*}
3145+readme="$mydir/../README"
3146+[ -f "$readme" ] || {
3147+ echo "ERROR: maas-images moved to git." 1>&2
3148+ exit 1
3149+}
3150+cat "$readme" 1>&2
3151+exit 1
3152
3153=== modified file 'bin/netboot-mirror'
3154--- bin/netboot-mirror 2015-09-11 19:10:40 +0000
3155+++ bin/netboot-mirror 1970-01-01 00:00:00 +0000
3156@@ -1,27 +0,0 @@
3157-#!/usr/bin/env python3
3158-
3159-import os
3160-import sys
3161-
3162-
3163-def call_entry_point(name):
3164- (istr, dot, ent) = name.rpartition('.')
3165- try:
3166- __import__(istr)
3167- except ImportError:
3168- # if that import failed, check dirname(__file__/..)
3169- # to support ./bin/program with modules in .
3170- _tdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
3171- sys.path.insert(0, _tdir)
3172- try:
3173- __import__(istr)
3174- except ImportError as e:
3175- sys.stderr.write("Unable to find %s: %s\n" % (name, e))
3176- sys.exit(2)
3177-
3178- sys.exit(getattr(sys.modules[istr], ent)())
3179-
3180-if __name__ == '__main__':
3181- call_entry_point("meph2.commands.netboot_mirror.main")
3182-
3183-# vi: ts=4 expandtab syntax=python
3184
3185=== target is u'moved-to-git'
3186=== modified file 'bin/unshare-pidns'
3187--- bin/unshare-pidns 2017-05-03 11:27:18 +0000
3188+++ bin/unshare-pidns 1970-01-01 00:00:00 +0000
3189@@ -1,24 +0,0 @@
3190-#!/bin/sh
3191-has_unshare_pid() {
3192- command -v unshare >/dev/null 2>&1 || return 1
3193- local helpout=""
3194- helpout=$(unshare --help) || return 1
3195- case "$helpout" in
3196- *--fork*--pid*|*--pid*--fork*) :;;
3197- *) return 1;;
3198- esac
3199- return 0
3200-}
3201-if has_unshare_pid; then
3202- exec unshare --fork --pid -- "$@"
3203-else
3204- rval=${M2E_REQUIRE_UNSHARE:-0}
3205- case "$rval" in
3206- 0) :;;
3207- *) echo "unshare pid not available (M2E_REQUIRE_UNSHARE=$rval)." 1>&2;
3208- exit 3;;
3209- esac
3210- exec "$@"
3211-fi
3212-
3213-# vi: ts=4 expandtab
3214
3215=== target is u'moved-to-git'
3216=== removed directory 'conf'
3217=== removed file 'conf/bootloaders.yaml'
3218--- conf/bootloaders.yaml 2018-08-07 21:31:31 +0000
3219+++ conf/bootloaders.yaml 1970-01-01 00:00:00 +0000
3220@@ -1,67 +0,0 @@
3221-product_id: "com.ubuntu.maas.daily:1:{os}:{firmware_platform}:{arch}"
3222-content_id: "com.ubuntu.maas:daily:1:bootloader-download"
3223-
3224-bootloaders:
3225- - firmware-platform: pxe
3226- packages:
3227- - pxelinux
3228- - syslinux-common
3229- arch: i386
3230- arches: i386,amd64
3231- archive: http://archive.ubuntu.com/ubuntu
3232- release: bionic
3233- os: pxelinux
3234- files:
3235- - usr/lib/PXELINUX/pxelinux.0
3236- - usr/lib/PXELINUX/lpxelinux.0
3237- - usr/lib/syslinux/modules/bios/*.c32
3238- - firmware-platform: uefi
3239- packages:
3240- - shim-signed
3241- - grub-efi-amd64-signed
3242- arch: amd64
3243- arches: amd64
3244- archive: http://archive.ubuntu.com/ubuntu
3245- release: bionic
3246- os: grub-efi-signed
3247- files:
3248- - usr/lib/shim/shimx64.efi.signed, bootx64.efi
3249- - usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed, grubx64.efi
3250- - firmware-platform: uefi
3251- packages:
3252- - grub-efi-arm64-bin
3253- arch: arm64
3254- arches: arm64
3255- archive: http://ports.ubuntu.com
3256- release: bionic
3257- os: grub-efi
3258- files:
3259- - usr/lib/grub/arm64-efi/
3260- grub_format: arm64-efi
3261- grub_output: grubaa64.efi
3262- grub_config: |
3263- # MAAS GRUB2 pre-loader configuration file
3264-
3265- # Load based on MAC address first.
3266- configfile (pxe)/grub/grub.cfg-${net_default_mac}
3267-
3268- # Failed to load based on MAC address.
3269- # Load arm64 by default, UEFI only supported by 64-bit
3270- configfile (pxe)/grub/grub.cfg-default-arm64
3271- - firmware-platform: open-firmware
3272- packages:
3273- - grub-ieee1275-bin
3274- arch: ppc64el
3275- arches: ppc64el,ppc64
3276- archive: http://ports.ubuntu.com
3277- release: xenial
3278- os: grub-ieee1275
3279- files:
3280- - usr/lib/grub/powerpc-ieee1275/
3281- grub_format: powerpc-ieee1275
3282- grub_output: bootppc64.bin
3283- grub_config: |
3284- configfile (pxe)/grub/grub.cfg-${net_default_mac}
3285- configfile (pxe)/grub/grub.cfg-default-ppc64el
3286-
3287-# vi: syntax=yaml nowrap
3288
3289=== removed file 'conf/centos.yaml'
3290--- conf/centos.yaml 2018-09-18 13:38:31 +0000
3291+++ conf/centos.yaml 1970-01-01 00:00:00 +0000
3292@@ -1,87 +0,0 @@
3293-image_index: http://cloud.centos.org/centos/{version}/images/image-index
3294-
3295-product_id: "com.ubuntu.maas.daily:centos-bases:{version}:{arch}"
3296-content_id: "com.ubuntu.maas:daily:centos-bases-download"
3297-os: centos
3298-arch: amd64
3299-
3300-versions:
3301- centos70:
3302- version: 7.0
3303- path_version: 7
3304- release_title: "CentOS 7.0"
3305- curtin_files: "{curtin_path}/centos7"
3306- # The upstream revision to create MAAS images for. All other versions
3307- # are ignored if this is defined.
3308- revision: 1808
3309- # The lp:maas-images release. This defaults to 01. Changing this will
3310- # cause a new build of the revision to be imported.
3311- release: 02
3312- packages:
3313- # cloud-init depends on packages from EPEL
3314- - epel-release
3315- - bash-completion
3316- - linux-firmware
3317- # XXX ltrager 2017-07-28 - COPR doesn't provide a URL to the latest
3318- # package build. Instead it expects you to first add the repo which
3319- # is what is included in this package.
3320- - https://copr-be.cloud.fedoraproject.org/results/%40cloud-init/el-stable/epel-7-x86_64/00581936-cloud-init-el-release/cloud-init-el-release-7-1.noarch.rpm
3321- # The image most likely already has cloud-init, this pulls Canonical's
3322- # version
3323- - cloud-init
3324- # bridge-utils is required by cloud-init to configure networking.
3325- # Without it cloud-init will try to install it which will not work in
3326- # isolated environments.
3327- - bridge-utils
3328- # Tools needed to allow custom storage to be deployed without
3329- # accessing the Internet.
3330- # grub2-efi-x64 contains the signed bootloader which currently does not
3331- # chainboot - RHBZ #1623296
3332- # - grub2-efi-x64
3333- # - shim-x64
3334- # RHBZ #1101352
3335- - grub2-efi-x64-modules
3336- - grub2-tools
3337- - efibootmgr
3338- - dosfstools
3339- - lvm2
3340- - mdadm
3341- - device-mapper-multipath
3342- - iscsi-initiator-utils
3343- centos66:
3344- version: 6.6
3345- release_title: "CentOS 6.6"
3346- curtin_files: "{curtin_path}/centos6"
3347- # The upstream revision to create MAAS images for. All other versions
3348- # are ignored if this is defined.
3349- revision: 1808
3350- # The lp:maas-images release. This defaults to 01. Changing this will
3351- # cause a new build of the revision to be imported.
3352- release: 02
3353- packages:
3354- # cloud-init depends on packages from EPEL
3355- - epel-release
3356- - bash-completion
3357- # XXX ltrager 2017-07-28 - COPR doesn't provide a URL to the latest
3358- # package build. Instead it expects you to first add the repo which
3359- # is what is included in this package.
3360- - https://copr-be.cloud.fedoraproject.org/results/%40cloud-init/el-stable/epel-6-x86_64/00581936-cloud-init-el-release/cloud-init-el-release-7-1.noarch.rpm
3361- # The image most likely already has cloud-init, this pulls Canonical's
3362- # version
3363- - cloud-init
3364- # bridge-utils is required by cloud-init to configure networking.
3365- # Without it cloud-init will try to install it which will not work in
3366- # isolated environments.
3367- - bridge-utils
3368- # Tools needed to allow custom storage to be deployed without
3369- # accessing the Internet.
3370- - efibootmgr
3371- - btrfs-progs
3372- - dosfstools
3373- - lvm2
3374- - mdadm
3375- - xfsprogs
3376- - device-mapper-multipath
3377- - iscsi-initiator-utils
3378-
3379-# vi: syntax=yaml nowrap
3380
3381=== removed file 'conf/meph-v2.yaml'
3382--- conf/meph-v2.yaml 2018-05-07 14:03:39 +0000
3383+++ conf/meph-v2.yaml 1970-01-01 00:00:00 +0000
3384@@ -1,226 +0,0 @@
3385-# kernel entries are a list of
3386-# kernel-release, arch, primary-subarch, flavor, kernel-pkgname, subarches
3387-# we use the anchors to make subarches more compact
3388-#
3389-# builtin_kernel is "builtin" kernel.
3390-# default is 'linux-generic'
3391-#
3392-# kernel arrays are
3393-# krel, karch, primary-subarch, flavor, kernel-package, [subarches], {khdata}
3394-#
3395-# 'khdata' is an optional dictionary used to tell which dtb files to pull or
3396-# what kernel helper to run on the kernel and initramfs.
3397-
3398-subarches:
3399- - &sa_hwe_p [generic, hwe-p]
3400- - &sa_hwe_q [generic, hwe-p, hwe-q]
3401- - &sa_hwe_r [generic, hwe-p, hwe-q, hwe-r]
3402- - &sa_hwe_s [generic, hwe-p, hwe-q, hwe-r, hwe-s]
3403- - &sa_hwe_t [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t]
3404- - &sa_hwe_u [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u]
3405- - &sa_hwe_v [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v]
3406- - &sa_hwe_w [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w]
3407- - &sa_hwe_x [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x]
3408- - &sa_hwe_y [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y]
3409- - &sa_hwe_z [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y, hwe-z]
3410- - &sa_hwe_a [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y, hwe-z, hwe-a]
3411- - &sa_hwe_b [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y, hwe-z, hwe-a, hwe-b]
3412- - &sa_hwe_c [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y, hwe-z, hwe-a, hwe-b, hwe-c]
3413- - &arm_hwe_t [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t]
3414- - &arm_hwe_u [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u]
3415- - &arm_hwe_v [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v]
3416- - &arm_hwe_w [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w]
3417- - &arm_hwe_x [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x]
3418- - &arm_hwe_y [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y]
3419- - &arm_hwe_z [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y, hwe-z]
3420- - &arm_hwe_a [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y, hwe-z, hwe-a]
3421- - &arm_hwe_b [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y, hwe-z, hwe-a, hwe-b]
3422- - &arm_hwe_c [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x, hwe-y, hwe-z, hwe-a, hwe-b, hwe-c]
3423-
3424-misc:
3425- - &glpae generic-lpae
3426- - &xguboot xgene-uboot
3427- - &mustang xgene-uboot-mustang
3428- - &kh-mustang {suffix: .xgene-mustang, kihelper: kh-xgene,
3429- di-format: 'xgene', dtb: 'apm-mustang.dtb'}
3430- - &kh-xgene {suffix: .xgene, kihelper: "kh-xgene", di-format: 'xgene'}
3431-
3432-releases:
3433- - version: "18.10"
3434- release: cosmic
3435- kernels:
3436- - [cosmic, amd64, hwe-c, generic, linux-signed-generic, *sa_hwe_c]
3437- - [cosmic, arm64, hwe-c, generic, linux-generic, *sa_hwe_c]
3438- - [cosmic, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3439- - [cosmic, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3440- - [cosmic, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3441- - [cosmic, armhf, hwe-c, generic, linux-generic, *arm_hwe_c]
3442- - [cosmic, i386, hwe-c, generic, linux-generic, *sa_hwe_c]
3443- - [cosmic, ppc64el, hwe-c, generic, linux-generic, *sa_hwe_c]
3444- - [cosmic, s390x, hwe-c, generic, linux-generic, *sa_hwe_c]
3445- - version: "18.04"
3446- release: bionic
3447- kernels:
3448- - [bionic, amd64, hwe-b, generic, linux-signed-generic, *sa_hwe_b]
3449- - [bionic, arm64, hwe-b, generic, linux-generic, *sa_hwe_b]
3450- - [bionic, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3451- - [bionic, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3452- - [bionic, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3453- - [bionic, armhf, hwe-b, generic, linux-generic, *arm_hwe_b]
3454- - [bionic, i386, hwe-b, generic, linux-generic, *sa_hwe_b]
3455- - [bionic, ppc64el, hwe-b, generic, linux-generic, *sa_hwe_b]
3456- - [bionic, s390x, hwe-b, generic, linux-generic, *sa_hwe_b]
3457- - version: "17.10"
3458- release: artful
3459- kernels:
3460- - [artful, amd64, hwe-a, generic, linux-signed-generic, *sa_hwe_a]
3461- - [artful, arm64, hwe-a, generic, linux-generic, *sa_hwe_a]
3462- - [artful, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3463- - [artful, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3464- - [artful, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3465- - [artful, armhf, hwe-a, generic, linux-generic, *arm_hwe_a]
3466- - [artful, i386, hwe-a, generic, linux-generic, *sa_hwe_a]
3467- - [artful, ppc64el, hwe-a, generic, linux-generic, *sa_hwe_a]
3468- - [artful, s390x, hwe-a, generic, linux-generic, *sa_hwe_a]
3469- - version: "17.04"
3470- release: zesty
3471- kernels:
3472- - [zesty, amd64, hwe-z, generic, linux-signed-generic, *sa_hwe_z]
3473- - [zesty, arm64, hwe-z, generic, linux-generic, *sa_hwe_z]
3474- - [zesty, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3475- - [zesty, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3476- - [zesty, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3477- - [zesty, armhf, hwe-z, generic, linux-generic, *arm_hwe_z]
3478- - [zesty, i386, hwe-z, generic, linux-generic, *sa_hwe_z]
3479- - [zesty, ppc64el, hwe-z, generic, linux-generic, *sa_hwe_z]
3480- - [zesty, s390x, hwe-z, generic, linux-generic, *sa_hwe_z]
3481- - version: "16.10"
3482- release: yakkety
3483- kernels:
3484- - [yakkety, amd64, hwe-y, generic, linux-signed-generic, *sa_hwe_y]
3485- - [yakkety, arm64, hwe-y, generic, linux-generic, *sa_hwe_y]
3486- - [yakkety, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3487- - [yakkety, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3488- - [yakkety, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3489- - [yakkety, armhf, hwe-y, generic, linux-generic, *arm_hwe_y]
3490- - [yakkety, i386, hwe-y, generic, linux-generic, *sa_hwe_y]
3491- - [yakkety, ppc64el, hwe-y, generic, linux-generic, *sa_hwe_y]
3492- - [yakkety, s390x, hwe-y, generic, linux-generic, *sa_hwe_y]
3493- - version: "16.04"
3494- release: xenial
3495- kernels:
3496- - [xenial, amd64, hwe-x, generic, linux-signed-generic, *sa_hwe_x]
3497- - [xenial, arm64, hwe-x, generic, linux-generic, *sa_hwe_x]
3498- - [xenial, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3499- - [xenial, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3500- - [xenial, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3501- - [xenial, armhf, hwe-x, generic, linux-generic, *arm_hwe_x]
3502- - [xenial, i386, hwe-x, generic, linux-generic, *sa_hwe_x]
3503- - [xenial, ppc64el, hwe-x, generic, linux-generic, *sa_hwe_x]
3504- - [xenial, s390x, hwe-x, generic, linux-generic, *sa_hwe_x]
3505- - version: "15.10"
3506- builtin_kernel: linux-generic
3507- release: wily
3508- kernels:
3509- - [wily, armhf, hwe-w, generic, linux-generic, *arm_hwe_w]
3510- - [wily, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3511- - [wily, i386, hwe-w, generic, linux-generic, *sa_hwe_w]
3512- - [wily, amd64, hwe-w, generic, linux-signed-generic, *sa_hwe_w]
3513- - [wily, ppc64el, hwe-w, generic, linux-generic, *sa_hwe_w]
3514- - [wily, arm64, hwe-w, generic, linux-generic, *sa_hwe_w]
3515- - [wily, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3516- - [wily, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3517- - version: "15.04"
3518- release: vivid
3519- builtin_kernel: linux-generic
3520- kernels:
3521- - [vivid, armhf, hwe-v, generic, linux-generic, *arm_hwe_v]
3522- - [vivid, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3523- - [vivid, i386, hwe-v, generic, linux-generic, *sa_hwe_v]
3524- - [vivid, amd64, hwe-v, generic, linux-signed-generic, *sa_hwe_v]
3525- - [vivid, ppc64el, hwe-v, generic, linux-generic, *sa_hwe_v]
3526- - [vivid, arm64, hwe-v, generic, linux-generic, *sa_hwe_v]
3527- - [vivid, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3528- - [vivid, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3529- - version: "14.10"
3530- builtin_kernel: linux-generic
3531- release: utopic
3532- kernels:
3533- - [utopic, armhf, hwe-u, generic, linux-generic, *arm_hwe_u]
3534- - [utopic, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3535- - [utopic, i386, hwe-u, generic, linux-generic, *sa_hwe_u]
3536- - [utopic, amd64, hwe-u, generic, linux-signed-generic, *sa_hwe_u]
3537- - [utopic, ppc64el, hwe-u, generic, linux-generic, *sa_hwe_u]
3538- - [utopic, arm64, hwe-u, generic, linux-generic, *sa_hwe_u]
3539- - [utopic, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3540- - [utopic, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3541- - version: "14.04"
3542- builtin_kernel: linux-generic
3543- release: trusty
3544- kernels:
3545- - [trusty, armhf, hwe-t, generic, linux-generic, *arm_hwe_t]
3546- - [trusty, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3547- - [trusty, i386, hwe-t, generic, linux-generic, *sa_hwe_t]
3548- - [trusty, amd64, hwe-t, generic, linux-signed-generic, *sa_hwe_t]
3549- - [trusty, ppc64el, hwe-t, generic, linux-generic, *sa_hwe_t]
3550- - [trusty, arm64, hwe-t, generic, linux-generic, *sa_hwe_t]
3551- - [trusty, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3552- - [trusty, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3553- - [utopic, amd64, hwe-u, generic, linux-signed-generic-lts-utopic, *sa_hwe_u]
3554- - [utopic, arm64, hwe-u, generic, linux-generic-lts-utopic, *sa_hwe_u]
3555- - [utopic, armhf, hwe-u, generic, linux-generic-lts-utopic, *sa_hwe_u]
3556- - [utopic, i386, hwe-u, generic, linux-generic-lts-utopic, *sa_hwe_u]
3557- - [utopic, ppc64el, hwe-u, generic, linux-generic-lts-utopic, *sa_hwe_u]
3558- - [vivid, amd64, hwe-v, generic, linux-signed-generic-lts-vivid, *sa_hwe_v]
3559- - [vivid, arm64, hwe-v, generic, linux-generic-lts-vivid, *sa_hwe_v]
3560- - [vivid, armhf, hwe-v, generic, linux-generic-lts-vivid, *sa_hwe_v]
3561- - [vivid, i386, hwe-v, generic, linux-generic-lts-vivid, *sa_hwe_v]
3562- - [vivid, ppc64el, hwe-v, generic, linux-generic-lts-vivid, *sa_hwe_v]
3563- - [wily, amd64, hwe-w, generic, linux-signed-generic-lts-wily, *sa_hwe_w]
3564- - [wily, arm64, hwe-w, generic, linux-generic-lts-wily, *sa_hwe_w]
3565- - [wily, armhf, hwe-w, generic, linux-generic-lts-wily, *sa_hwe_w]
3566- - [wily, i386, hwe-w, generic, linux-generic-lts-wily, *sa_hwe_w]
3567- - [wily, ppc64el, hwe-w, generic, linux-generic-lts-wily, *sa_hwe_w]
3568- - [xenial, amd64, hwe-x, generic, linux-signed-generic-lts-xenial, *sa_hwe_x]
3569- - [xenial, arm64, hwe-x, generic, linux-generic-lts-xenial, *sa_hwe_x]
3570- - [xenial, armhf, hwe-x, generic, linux-generic-lts-xenial, *sa_hwe_x]
3571- - [xenial, i386, hwe-x, generic, linux-generic-lts-xenial, *sa_hwe_x]
3572- - [xenial, ppc64el, hwe-x, generic, linux-generic-lts-xenial, *sa_hwe_x]
3573- - version: "13.10"
3574- builtin_kernel: linux-generic
3575- release: saucy
3576- kernels:
3577- - [saucy, armhf, hwe-s, generic, linux-generic, *sa_hwe_s]
3578- - [saucy, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3579- - [saucy, i386, hwe-s, generic, linux-generic, *sa_hwe_t]
3580- - [saucy, amd64, hwe-s, generic, linux-signed-generic, *sa_hwe_t]
3581- - version: "12.04"
3582- release: precise
3583- builtin_kernel: {armhf: linux-highbank, default: 'linux-generic'}
3584- kernels:
3585- - [precise, i386, hwe-p, generic, linux-generic, *sa_hwe_p]
3586- - [precise, amd64, hwe-p, generic, linux-signed-generic, *sa_hwe_p]
3587- - [precise, armhf, highbank, highbank, linux-highbank, [highbank]]
3588- - [quantal, i386, hwe-q, generic, linux-generic-lts-quantal, *sa_hwe_q]
3589- - [quantal, amd64, hwe-q, generic, linux-signed-generic-lts-quantal, *sa_hwe_q]
3590- - [raring, i386, hwe-r, generic, linux-generic-lts-raring, *sa_hwe_r]
3591- - [raring, amd64, hwe-r, generic, linux-signed-generic-lts-raring, *sa_hwe_r]
3592- - [saucy, i386, hwe-s, generic, linux-generic-lts-saucy, *sa_hwe_s]
3593- - [saucy, amd64, hwe-s, generic, linux-signed-generic-lts-saucy, *sa_hwe_s]
3594- - [trusty, i386, hwe-t, generic, linux-generic-lts-trusty, *sa_hwe_t]
3595- - [trusty, amd64, hwe-t, generic, linux-signed-generic-lts-trusty, *sa_hwe_t]
3596-
3597-# enable_proposed: True
3598-
3599-## Notes:
3600-## * there are no hwe installer kernels for armhf
3601-## nothing named 'saucy-highbank' at
3602-## http://ports.ubuntu.com/ubuntu-ports/dists/precise-updates/main/installer-armhf/current/images/MD5SUMS
3603-## so for now, we just don't have a stream for that.
3604-## * kernel meta package in all cases here is linux-image-<flavor>
3605-
3606-default_target: http://images.maas.io/ephemeral-v2/daily/streams/v1/com.ubuntu.maas:daily:v2:download.json
3607-content_id: com.ubuntu.maas:daily:v2:download
3608-product_id_pre: com.ubuntu.maas.daily:v2:boot
3609-
3610-# vi: syntax=yaml nowrap
3611
3612=== removed file 'conf/meph-v3.yaml'
3613--- conf/meph-v3.yaml 2018-05-04 17:21:27 +0000
3614+++ conf/meph-v3.yaml 1970-01-01 00:00:00 +0000
3615@@ -1,228 +0,0 @@
3616-# kernel entries are a list of
3617-# kernel-release, arch, primary-subarch, flavor, kernel-pkgname, subarches
3618-# we use the anchors to make subarches more compact
3619-#
3620-# builtin_kernel is "builtin" kernel.
3621-# default is 'linux-generic'
3622-#
3623-# kernel arrays are
3624-# krel, karch, primary-subarch, flavor, kernel-package, [subarches], {khdata}
3625-#
3626-# 'khdata' is an optional dictionary used to tell which dtb files to pull or
3627-# what kernel helper to run on the kernel and initramfs.
3628-
3629-# Previous to 16.04 subarches were named using the format
3630-# hwe-<first letter of release>. From 16.04 onwards kernels come in the format
3631-# hwe-<release version>. Because the version has a '.' in it we keep the old
3632-# naming format for the anchors.
3633-subarches:
3634- - &sa_hwe_p [generic, hwe-p]
3635- - &sa_hwe_q [generic, hwe-p, hwe-q]
3636- - &sa_hwe_r [generic, hwe-p, hwe-q, hwe-r]
3637- - &sa_hwe_s [generic, hwe-p, hwe-q, hwe-r, hwe-s]
3638- - &sa_hwe_t [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t]
3639- - &sa_hwe_u [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u]
3640- - &sa_hwe_v [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v]
3641- - &sa_hwe_w [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w]
3642- - &sa_hwe_x [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04]
3643- - &sa_hwe_x_edge [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, hwe-16.04, hwe-16.10]
3644- - &sa_hwe_x_legacy [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, hwe-x]
3645- - &sa_hwe_y [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10]
3646- - &sa_hwe_z [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10, ga-17.04]
3647- - &sa_hwe_a [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10, ga-17.04, ga-17.10]
3648- - &sa_hwe_b [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10, ga-17.04, ga-17.10, ga-18.04]
3649- - &sa_hwe_cc [generic, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10, ga-17.04, ga-17.10, ga-18.04, ga-18.10]
3650- - &arm_hwe_t [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t]
3651- - &arm_hwe_u [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u]
3652- - &arm_hwe_v [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v]
3653- - &arm_hwe_w [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w]
3654- - &arm_hwe_x [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04]
3655- - &arm_hwe_x_edge [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, hwe-16.04, hwe-16.10]
3656- - &arm_hwe_y [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10]
3657- - &arm_hwe_z [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10, ga-17.04]
3658- - &arm_hwe_a [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10, ga-17.04, ga-17.10]
3659- - &arm_hwe_b [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10, ga-17.04, ga-17.10, ga-18.04]
3660- - &arm_hwe_cc [generic, highbank, hwe-p, hwe-q, hwe-r, hwe-s, hwe-t, hwe-u, hwe-v, hwe-w, ga-16.04, ga-16.10, ga-17.04, ga-17.10, ga-18.04, ga-18.10]
3661-
3662-misc:
3663- - &glpae generic-lpae
3664- - &xguboot xgene-uboot
3665- - &mustang xgene-uboot-mustang
3666- - &kh-mustang {suffix: .xgene-mustang, kihelper: kh-xgene,
3667- di-format: 'xgene', dtb: 'apm-mustang.dtb'}
3668- - &kh-xgene {suffix: .xgene, kihelper: "kh-xgene", di-format: 'xgene'}
3669-
3670-releases:
3671- - version: "18.10"
3672- release: cosmic
3673- kernels:
3674- - [cosmic, amd64, ga-18.10, generic, linux-signed-generic, *sa_hwe_cc]
3675- - [cosmic, amd64, ga-18.10, lowlatency, linux-signed-image-lowlatency, *sa_hwe_cc]
3676- - [cosmic, arm64, ga-18.10, generic, linux-generic, *sa_hwe_cc]
3677- - [cosmic, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3678- - [cosmic, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3679- - [cosmic, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3680- - [cosmic, armhf, ga-18.10, generic, linux-generic, *arm_hwe_cc]
3681- - [cosmic, i386, ga-18.10, generic, linux-generic, *sa_hwe_cc]
3682- - [cosmic, i386, ga-18.10, lowlatency, linux-image-lowlatency, *sa_hwe_cc]
3683- - [cosmic, ppc64el, ga-18.10, generic, linux-generic, *sa_hwe_cc]
3684- - [cosmic, s390x, ga-18.10, generic, linux-generic, *sa_hwe_cc]
3685- - version: "18.04"
3686- release: bionic
3687- kernels:
3688- - [bionic, amd64, ga-18.04, generic, linux-signed-generic, *sa_hwe_b]
3689- - [bionic, amd64, ga-18.04, lowlatency, linux-signed-image-lowlatency, *sa_hwe_b]
3690- - [bionic, arm64, ga-18.04, generic, linux-generic, *sa_hwe_b]
3691- - [bionic, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3692- - [bionic, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3693- - [bionic, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3694- - [bionic, armhf, ga-18.04, generic, linux-generic, *arm_hwe_b]
3695- - [bionic, i386, ga-18.04, generic, linux-generic, *sa_hwe_b]
3696- - [bionic, i386, ga-18.04, lowlatency, linux-image-lowlatency, *sa_hwe_b]
3697- - [bionic, ppc64el, ga-18.04, generic, linux-generic, *sa_hwe_b]
3698- - [bionic, s390x, ga-18.04, generic, linux-generic, *sa_hwe_b]
3699- - version: "17.10"
3700- release: artful
3701- kernels:
3702- - [artful, amd64, ga-17.10, generic, linux-signed-generic, *sa_hwe_a]
3703- - [artful, amd64, ga-17.10, lowlatency, linux-signed-image-lowlatency, *sa_hwe_a]
3704- - [artful, arm64, ga-17.10, generic, linux-generic, *sa_hwe_a]
3705- - [artful, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3706- - [artful, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3707- - [artful, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3708- - [artful, armhf, ga-17.10, generic, linux-generic, *arm_hwe_a]
3709- - [artful, i386, ga-17.10, generic, linux-generic, *sa_hwe_a]
3710- - [artful, i386, ga-17.10, lowlatency, linux-image-lowlatency, *sa_hwe_a]
3711- - [artful, ppc64el, ga-17.10, generic, linux-generic, *sa_hwe_a]
3712- - [artful, s390x, ga-17.10, generic, linux-generic, *sa_hwe_a]
3713- - version: "17.04"
3714- release: zesty
3715- kernels:
3716- - [zesty, amd64, ga-17.04, generic, linux-signed-generic, *sa_hwe_z]
3717- - [zesty, amd64, ga-17.04, lowlatency, linux-signed-image-lowlatency, *sa_hwe_z]
3718- - [zesty, arm64, ga-17.04, generic, linux-generic, *sa_hwe_z]
3719- - [zesty, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3720- - [zesty, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3721- - [zesty, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3722- - [zesty, armhf, ga-17.04, generic, linux-generic, *arm_hwe_z]
3723- - [zesty, i386, ga-17.04, generic, linux-generic, *sa_hwe_z]
3724- - [zesty, i386, ga-17.04, lowlatency, linux-image-lowlatency, *sa_hwe_z]
3725- - [zesty, ppc64el, ga-17.04, generic, linux-generic, *sa_hwe_z]
3726- - [zesty, s390x, ga-17.04, generic, linux-generic, *sa_hwe_z]
3727- - version: "16.10"
3728- release: yakkety
3729- kernels:
3730- - [yakkety, amd64, ga-16.10, generic, linux-signed-generic, *sa_hwe_y]
3731- - [yakkety, amd64, ga-16.10, lowlatency, linux-signed-image-lowlatency, *sa_hwe_y]
3732- - [yakkety, arm64, ga-16.10, generic, linux-generic, *sa_hwe_y]
3733- - [yakkety, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3734- - [yakkety, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3735- - [yakkety, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3736- - [yakkety, armhf, ga-16.10, generic, linux-generic, *arm_hwe_y]
3737- - [yakkety, i386, ga-16.10, generic, linux-generic, *sa_hwe_y]
3738- - [yakkety, i386, ga-16.10, lowlatency, linux-image-lowlatency, *sa_hwe_y]
3739- - [yakkety, ppc64el, ga-16.10, generic, linux-generic, *sa_hwe_y]
3740- - [yakkety, s390x, ga-16.10, generic, linux-generic, *sa_hwe_y]
3741- - version: "16.04"
3742- release: xenial
3743- kernels:
3744- - [xenial, amd64, ga-16.04, generic, linux-signed-generic, *sa_hwe_x]
3745- - [xenial, amd64, ga-16.04, lowlatency, linux-signed-lowlatency, *sa_hwe_x]
3746- - [xenial, amd64, hwe-16.04, generic, linux-signed-generic-hwe-16.04, *sa_hwe_x]
3747- - [xenial, amd64, hwe-16.04, lowlatency, linux-signed-lowlatency-hwe-16.04, *sa_hwe_x]
3748- - [xenial, amd64, hwe-16.04-edge, generic, linux-signed-generic-hwe-16.04-edge, *sa_hwe_x_edge]
3749- - [xenial, amd64, hwe-16.04-edge, lowlatency, linux-signed-lowlatency-hwe-16.04-edge, *sa_hwe_x_edge]
3750- - [xenial, arm64, ga-16.04, generic, linux-generic, *sa_hwe_x]
3751- - [xenial, arm64, hwe-16.04, generic, linux-generic-hwe-16.04, *sa_hwe_x]
3752- - [xenial, arm64, hwe-16.04-edge, generic, linux-generic-hwe-16.04-edge, *sa_hwe_x_edge]
3753- - [xenial, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3754- - [xenial, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3755- - [xenial, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3756- - [xenial, armhf, ga-16.04, generic, linux-generic, *arm_hwe_x]
3757- - [xenial, armhf, hwe-16.04, generic, linux-generic-hwe-16.04, *arm_hwe_x]
3758- - [xenial, armhf, hwe-16.04-edge, generic, linux-generic-hwe-16.04-edge, *arm_hwe_x_edge]
3759- - [xenial, i386, ga-16.04, generic, linux-generic, *sa_hwe_x]
3760- - [xenial, i386, ga-16.04, lowlatency, linux-lowlatency, *sa_hwe_x]
3761- - [xenial, i386, hwe-16.04, generic, linux-generic-hwe-16.04, *sa_hwe_x]
3762- - [xenial, i386, hwe-16.04, lowlatency, linux-lowlatency-hwe-16.04, *sa_hwe_x]
3763- - [xenial, i386, hwe-16.04-edge, generic, linux-generic-hwe-16.04-edge, *sa_hwe_x_edge]
3764- - [xenial, i386, hwe-16.04-edge, lowlatency, linux-lowlatency-hwe-16.04-edge, *sa_hwe_x_edge]
3765- - [xenial, ppc64el, ga-16.04, generic, linux-generic, *sa_hwe_x]
3766- - [xenial, ppc64el, hwe-16.04, generic, linux-generic-hwe-16.04, *sa_hwe_x]
3767- - [xenial, ppc64el, hwe-16.04-edge, generic, linux-generic-hwe-16.04-edge, *sa_hwe_x_edge]
3768- - [xenial, s390x, ga-16.04, generic, linux-generic, *sa_hwe_x]
3769- - [xenial, s390x, hwe-16.04, generic, linux-generic-hwe-16.04, *sa_hwe_x]
3770- - [xenial, s390x, hwe-16.04-edge, generic, linux-generic-hwe-16.04-edge, *sa_hwe_x_edge]
3771- - version: "14.04"
3772- builtin_kernel: linux-generic
3773- release: trusty
3774- kernels:
3775- - [trusty, armhf, hwe-t, generic, linux-generic, *arm_hwe_t]
3776- - [trusty, armhf, *glpae, *glpae, linux-generic-lpae, [*glpae]]
3777- - [trusty, i386, hwe-t, generic, linux-generic, *sa_hwe_t]
3778- - [trusty, amd64, hwe-t, generic, linux-signed-generic, *sa_hwe_t]
3779- - [trusty, ppc64el, hwe-t, generic, linux-generic, *sa_hwe_t]
3780- - [trusty, arm64, hwe-t, generic, linux-generic, *sa_hwe_t]
3781- - [trusty, arm64, *xguboot, generic, linux-generic, [*xguboot], *kh-xgene]
3782- - [trusty, arm64, *mustang, generic, linux-generic, [*mustang], *kh-mustang]
3783- - [utopic, amd64, hwe-u, generic, linux-signed-generic-lts-utopic, *sa_hwe_u]
3784- - [utopic, arm64, hwe-u, generic, linux-generic-lts-utopic, *sa_hwe_u]
3785- - [utopic, armhf, hwe-u, generic, linux-generic-lts-utopic, *sa_hwe_u]
3786- - [utopic, i386, hwe-u, generic, linux-generic-lts-utopic, *sa_hwe_u]
3787- - [utopic, ppc64el, hwe-u, generic, linux-generic-lts-utopic, *sa_hwe_u]
3788- - [vivid, amd64, hwe-v, generic, linux-signed-generic-lts-vivid, *sa_hwe_v]
3789- - [vivid, arm64, hwe-v, generic, linux-generic-lts-vivid, *sa_hwe_v]
3790- - [vivid, armhf, hwe-v, generic, linux-generic-lts-vivid, *sa_hwe_v]
3791- - [vivid, i386, hwe-v, generic, linux-generic-lts-vivid, *sa_hwe_v]
3792- - [vivid, ppc64el, hwe-v, generic, linux-generic-lts-vivid, *sa_hwe_v]
3793- - [wily, amd64, hwe-w, generic, linux-signed-generic-lts-wily, *sa_hwe_w]
3794- - [wily, arm64, hwe-w, generic, linux-generic-lts-wily, *sa_hwe_w]
3795- - [wily, armhf, hwe-w, generic, linux-generic-lts-wily, *sa_hwe_w]
3796- - [wily, i386, hwe-w, generic, linux-generic-lts-wily, *sa_hwe_w]
3797- - [wily, ppc64el, hwe-w, generic, linux-generic-lts-wily, *sa_hwe_w]
3798- - [xenial, amd64, hwe-x, generic, linux-signed-generic-lts-xenial, *sa_hwe_x_legacy]
3799- - [xenial, amd64, hwe-x, lowlatency, linux-signed-lowlatency-lts-xenial, *sa_hwe_x_legacy]
3800- - [xenial, arm64, hwe-x, generic, linux-generic-lts-xenial, *sa_hwe_x_legacy]
3801- - [xenial, armhf, hwe-x, generic, linux-generic-lts-xenial, *sa_hwe_x_legacy]
3802- - [xenial, i386, hwe-x, generic, linux-generic-lts-xenial, *sa_hwe_x_legacy]
3803- - [xenial, i386, hwe-x, lowlatency, linux-lowlatency, *sa_hwe_x_legacy]
3804- - [xenial, ppc64el, hwe-x, generic, linux-generic-lts-xenial, *sa_hwe_x_legacy]
3805- - version: "12.04"
3806- release: precise
3807- builtin_kernel: {armhf: linux-highbank, default: 'linux-generic'}
3808- kernels:
3809- - [precise, i386, hwe-p, generic, linux-generic, *sa_hwe_p]
3810- - [precise, amd64, hwe-p, generic, linux-generic, *sa_hwe_p]
3811- - [precise, armhf, highbank, highbank, linux-highbank, [highbank]]
3812- - [quantal, i386, hwe-q, generic, linux-generic-lts-quantal, *sa_hwe_q]
3813- - [quantal, amd64, hwe-q, generic, linux-signed-generic-lts-quantal, *sa_hwe_q]
3814- - [raring, i386, hwe-r, generic, linux-generic-lts-raring, *sa_hwe_r]
3815- - [raring, amd64, hwe-r, generic, linux-signed-generic-lts-raring, *sa_hwe_r]
3816- - [saucy, i386, hwe-s, generic, linux-generic-lts-saucy, *sa_hwe_s]
3817- - [saucy, amd64, hwe-s, generic, linux-signed-generic-lts-saucy, *sa_hwe_s]
3818- - [trusty, i386, hwe-t, generic, linux-generic-lts-trusty, *sa_hwe_t]
3819- - [trusty, amd64, hwe-t, generic, linux-signed-generic-lts-trusty, *sa_hwe_t]
3820-
3821-# enable_proposed: True
3822-
3823-# If available pull and publish SquashFS images from upstream
3824-squashfs: True
3825-
3826-## Notes:
3827-## * there are no hwe installer kernels for armhf
3828-## nothing named 'saucy-highbank' at
3829-## http://ports.ubuntu.com/ubuntu-ports/dists/precise-updates/main/installer-armhf/current/images/MD5SUMS
3830-## so for now, we just don't have a stream for that.
3831-## * kernel meta package in all cases here is linux-image-<flavor>
3832-
3833-default_target: http://images.maas.io/ephemeral-v3/daily/streams/v1/com.ubuntu.maas:daily:v3:download.json
3834-content_id: com.ubuntu.maas:daily:v3:download
3835-product_id_pre: com.ubuntu.maas.daily:v3:boot
3836-
3837-# By default maas-images uses the krel in the boot path. This worked for the v2
3838-# stream because there was only one kernel per release/arch/krel/kflavor. The
3839-# v3 stream has multiple kernels per release/arch/krel/kflavor so use the
3840-# subarch instead.
3841-kname: '%(subarch)s'
3842-
3843-# vi: syntax=yaml nowrap
3844
3845=== removed directory 'curtin'
3846=== removed directory 'curtin/centos6'
3847=== removed symlink 'curtin/centos6/curtin-hooks'
3848=== target was u'python_wrapper'
3849=== removed file 'curtin/centos6/curtin-hooks.py'
3850--- curtin/centos6/curtin-hooks.py 2017-08-02 19:10:25 +0000
3851+++ curtin/centos6/curtin-hooks.py 1970-01-01 00:00:00 +0000
3852@@ -1,393 +0,0 @@
3853-#!/usr/bin/env python
3854-
3855-from __future__ import (
3856- absolute_import,
3857- print_function,
3858- unicode_literals,
3859- )
3860-
3861-import codecs
3862-import os
3863-import re
3864-import sys
3865-
3866-from curtin import (
3867- block,
3868- config,
3869- util,
3870- )
3871-
3872-try:
3873- from curtin import FEATURES as curtin_features
3874-except ImportError:
3875- curtin_features = []
3876-
3877-write_files = None
3878-try:
3879- from curtin.futil import write_files
3880-except ImportError:
3881- pass
3882-
3883-centos_apply_network_config = None
3884-try:
3885- if 'CENTOS_APPLY_NETWORK_CONFIG' in curtin_features:
3886- from curtin.commands.curthooks import centos_apply_network_config
3887-except ImportError:
3888- pass
3889-
3890-"""
3891-CentOS 6
3892-
3893-Currently Support:
3894-
3895-- Legacy boot
3896-- DHCP of BOOTIF
3897-
3898-Not Supported:
3899-
3900-- UEFI boot (*Bad support, most likely wont support)
3901-- Multiple network configration
3902-- IPv6
3903-"""
3904-
3905-FSTAB_PREPEND = """\
3906-#
3907-# /etc/fstab
3908-# Created by MAAS fast-path installer.
3909-#
3910-# Accessible filesystems, by reference, are maintained under '/dev/disk'
3911-# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
3912-#
3913-"""
3914-
3915-FSTAB_APPEND = """\
3916-tmpfs /dev/shm tmpfs defaults 0 0
3917-devpts /dev/pts devpts gid=5,mode=620 0 0
3918-sysfs /sys sysfs defaults 0 0
3919-proc /proc proc defaults 0 0
3920-"""
3921-
3922-GRUB_CONF = """\
3923-#
3924-# /boot/grub/grub.conf
3925-# Created by MAAS fast-path installer.
3926-#
3927-default 0
3928-timeout 0
3929-title MAAS
3930- root {grub_root}
3931- kernel /boot/{vmlinuz} root=UUID={root_uuid} {extra_opts}
3932- initrd /boot/{initrd}
3933-"""
3934-
3935-
3936-def get_block_devices(target):
3937- """Returns list of block devices for the given target."""
3938- devs = block.get_devices_for_mp(target)
3939- blockdevs = set()
3940- for maybepart in devs:
3941- (blockdev, part) = block.get_blockdev_for_partition(maybepart)
3942- blockdevs.add(blockdev)
3943- return list(blockdevs)
3944-
3945-
3946-def get_root_info(target):
3947- """Returns the root partitions information."""
3948- rootpath = block.get_devices_for_mp(target)[0]
3949- rootdev = os.path.basename(rootpath)
3950- blocks = block._lsblock()
3951- return blocks[rootdev]
3952-
3953-
3954-def read_file(path):
3955- """Returns content of a file."""
3956- with codecs.open(path, encoding='utf-8') as stream:
3957- return stream.read()
3958-
3959-
3960-def write_fstab(target, curtin_fstab):
3961- """Writes the new fstab, using the fstab provided
3962- from curtin."""
3963- fstab_path = os.path.join(target, 'etc', 'fstab')
3964- fstab_data = read_file(curtin_fstab)
3965- with open(fstab_path, 'w') as stream:
3966- stream.write(FSTAB_PREPEND)
3967- stream.write(fstab_data)
3968- stream.write(FSTAB_APPEND)
3969-
3970-
3971-def extract_kernel_params(data):
3972- """Extracts the kernel parametes from the provided
3973- grub config data."""
3974- match = re.search('^\s+kernel (.+?)$', data, re.MULTILINE)
3975- return match.group(0)
3976-
3977-
3978-def strip_kernel_params(params, strip_params=[]):
3979- """Removes un-needed kernel parameters."""
3980- new_params = []
3981- for param in params:
3982- remove = False
3983- for strip in strip_params:
3984- if param.startswith(strip):
3985- remove = True
3986- break
3987- if remove is False:
3988- new_params.append(param)
3989- return new_params
3990-
3991-
3992-def get_boot_file(target, filename):
3993- """Return the full filename of file in /boot on target."""
3994- boot_dir = os.path.join(target, 'boot')
3995- files = [
3996- fname
3997- for fname in os.listdir(boot_dir)
3998- if fname.startswith(filename)
3999- ]
4000- if not files:
4001- return None
4002- return files[0]
4003-
4004-
4005-def write_grub_conf(target, grub_root, extra=[]):
4006- """Writes a new /boot/grub/grub.conf with the correct
4007- boot arguments."""
4008- root_info = get_root_info(target)
4009- grub_path = os.path.join(target, 'boot', 'grub', 'grub.conf')
4010- extra_opts = ' '.join(extra)
4011- vmlinuz = get_boot_file(target, 'vmlinuz')
4012- initrd = get_boot_file(target, 'initramfs')
4013- with open(grub_path, 'w') as stream:
4014- stream.write(
4015- GRUB_CONF.format(
4016- grub_root=grub_root,
4017- vmlinuz=vmlinuz,
4018- initrd=initrd,
4019- root_uuid=root_info['UUID'],
4020- extra_opts=extra_opts) + '\n')
4021-
4022-
4023-def get_extra_kernel_parameters():
4024- """Extracts the extra kernel commands from /proc/cmdline
4025- that should be placed onto the host.
4026-
4027- Any command following the '--' entry should be placed
4028- onto the host.
4029- """
4030- cmdline = read_file('/proc/cmdline')
4031- cmdline = cmdline.split()
4032- if '--' not in cmdline:
4033- return []
4034- idx = cmdline.index('--') + 1
4035- if idx >= len(cmdline) + 1:
4036- return []
4037- return strip_kernel_params(
4038- cmdline[idx:],
4039- strip_params=['initrd=', 'BOOT_IMAGE=', 'BOOTIF='])
4040-
4041-
4042-def get_grub_root(target):
4043- """Extracts the grub root (hdX,X) from the grub command.
4044-
4045- This is used so the correct root device is used to install
4046- stage1/stage2 boot loader.
4047-
4048- Note: grub-install normally does all of this for you, but
4049- since the grub is older, it has an issue with the ISCSI
4050- target as /dev/sda and cannot enumarate it with the BIOS.
4051- """
4052- with util.RunInChroot(target) as in_chroot:
4053- data = '\n'.join([
4054- 'find /boot/grub/stage1',
4055- 'quit',
4056- ]).encode('utf-8')
4057- out, err = in_chroot(['grub', '--batch'],
4058- data=data, capture=True)
4059- regex = re.search('^\s+(\(.+?\))$', out, re.MULTILINE)
4060- return regex.groups()[0]
4061-
4062-
4063-def grub_install(target, root):
4064- """Installs grub onto the root."""
4065- root_dev = root.split(',')[0] + ')'
4066- with util.RunInChroot(target) as in_chroot:
4067- data = '\n'.join([
4068- 'root %s' % root,
4069- 'setup %s' % root_dev,
4070- 'quit',
4071- ]).encode('utf-8')
4072- in_chroot(['grub', '--batch'],
4073- data=data)
4074-
4075-
4076-def set_autorelabel(target):
4077- """Creates file /.autorelabel.
4078-
4079- This is used by SELinux to relabel all of the
4080- files on the filesystem to have the correct
4081- security context. Without this SSH login will
4082- fail.
4083- """
4084- path = os.path.join(target, '.autorelabel')
4085- open(path, 'a').close()
4086-
4087-
4088-def get_boot_mac():
4089- """Return the mac address of the booting interface."""
4090- cmdline = read_file('/proc/cmdline')
4091- cmdline = cmdline.split()
4092- try:
4093- bootif = [
4094- option
4095- for option in cmdline
4096- if option.startswith('BOOTIF')
4097- ][0]
4098- except IndexError:
4099- return None
4100- _, mac = bootif.split('=')
4101- mac = mac.split('-')[1:]
4102- return ':'.join(mac)
4103-
4104-
4105-def get_interface_names():
4106- """Return a dictionary mapping mac addresses to interface names."""
4107- sys_path = "/sys/class/net"
4108- ifaces = {}
4109- for iname in os.listdir(sys_path):
4110- mac = read_file(os.path.join(sys_path, iname, "address"))
4111- mac = mac.strip().lower()
4112- ifaces[mac] = iname
4113- return ifaces
4114-
4115-
4116-def get_ipv4_config(iface, data):
4117- """Returns the contents of the interface file for ipv4."""
4118- config = [
4119- 'TYPE="Ethernet"',
4120- 'NM_CONTROLLED="no"',
4121- 'USERCTL="yes"',
4122- ]
4123- if 'hwaddress' in data:
4124- config.append('HWADDR="%s"' % data['hwaddress'])
4125- else:
4126- # Last ditch effort, use the device name, it probably won't match
4127- # though!
4128- config.append('DEVICE="%s"' % iface)
4129- if data['auto']:
4130- config.append('ONBOOT="yes"')
4131- else:
4132- config.append('ONBOOT="no"')
4133-
4134- method = data['method']
4135- if method == 'dhcp':
4136- config.append('BOOTPROTO="dhcp"')
4137- config.append('PEERDNS="yes"')
4138- config.append('PERSISTENT_DHCLIENT="1"')
4139- if 'hostname' in data:
4140- config.append('DHCP_HOSTNAME="%s"' % data['hostname'])
4141- elif method == 'static':
4142- config.append('BOOTPROTO="none"')
4143- config.append('IPADDR="%s"' % data['address'])
4144- config.append('NETMASK="%s"' % data['netmask'])
4145- if 'broadcast' in data:
4146- config.append('BROADCAST="%s"' % data['broadcast'])
4147- if 'gateway' in data:
4148- config.append('GATEWAY="%s"' % data['gateway'])
4149- elif method == 'manual':
4150- config.append('BOOTPROTO="none"')
4151- return '\n'.join(config)
4152-
4153-
4154-def write_interface_config(target, iface, data):
4155- """Writes config for interface."""
4156- family = data['family']
4157- if family != "inet":
4158- # Only supporting ipv4 currently
4159- print(
4160- "WARN: unsupported family %s, "
4161- "failed to configure interface: %s" (family, iface))
4162- return
4163- config = get_ipv4_config(iface, data)
4164- path = os.path.join(
4165- target, 'etc', 'sysconfig', 'network-scripts', 'ifcfg-%s' % iface)
4166- with open(path, 'w') as stream:
4167- stream.write(config + '\n')
4168-
4169-
4170-def write_network_config(target, mac):
4171- """Write network configuration for the given MAC address."""
4172- inames = get_interface_names()
4173- iname = inames[mac.lower()]
4174- write_interface_config(
4175- target, iname, {
4176- 'family': 'inet',
4177- 'hwaddress': mac.upper(),
4178- 'auto': True,
4179- 'method': 'dhcp'
4180- })
4181-
4182-
4183-def apply_networking(cfg, target, bootmac):
4184- if 'network' in cfg and centos_apply_network_config:
4185- centos_apply_network_config(cfg['network'], target)
4186- return
4187-
4188- if 'network' in cfg:
4189- sys.stderr.write("WARN: network configuration provided, but "
4190- "no support for applying. Using basic config.")
4191- write_network_config(target, bootmac)
4192-
4193-
4194-def handle_cloudconfig(cfg, target):
4195- if not cfg.get('cloudconfig'):
4196- return
4197- if not write_files:
4198- sys.stderr.write(
4199- "WARN: Unable to handle 'cloudconfig' section in config."
4200- "No 'write_files' found from curtin.\n")
4201- return
4202-
4203- base_dir = os.path.join(target, 'etc/cloud/cloud.cfg.d')
4204- write_files(cfg['cloudconfig'], base_dir)
4205-
4206-
4207-def main():
4208- state = util.load_command_environment()
4209- target = state['target']
4210- if target is None:
4211- print("Target was not provided in the environment.")
4212- sys.exit(1)
4213- fstab = state['fstab']
4214- if fstab is None:
4215- print("/etc/fstab output was not provided in the environment.")
4216- sys.exit(1)
4217- bootmac = get_boot_mac()
4218- if bootmac is None:
4219- print("Unable to determine boot interface.")
4220- sys.exit(1)
4221- devices = get_block_devices(target)
4222- if not devices:
4223- print("Unable to find block device for: %s" % target)
4224- sys.exit(1)
4225-
4226- write_fstab(target, fstab)
4227-
4228- grub_root = get_grub_root(target)
4229- write_grub_conf(target, grub_root, extra=get_extra_kernel_parameters())
4230- grub_install(target, grub_root)
4231-
4232- set_autorelabel(target)
4233-
4234- if state.get('config'):
4235- cfg = config.load_config(state['config'])
4236- else:
4237- cfg = {}
4238-
4239- handle_cloudconfig(cfg, target)
4240-
4241- apply_networking(cfg, target, bootmac)
4242-
4243-
4244-if __name__ == "__main__":
4245- main()
4246
4247=== removed symlink 'curtin/centos6/finalize'
4248=== target was u'python_wrapper'
4249=== removed file 'curtin/centos6/finalize.py'
4250--- curtin/centos6/finalize.py 2016-05-11 18:47:46 +0000
4251+++ curtin/centos6/finalize.py 1970-01-01 00:00:00 +0000
4252@@ -1,99 +0,0 @@
4253-#!/usr/bin/env python
4254-
4255-from __future__ import (
4256- absolute_import,
4257- print_function,
4258- unicode_literals,
4259- )
4260-
4261-import json
4262-import os
4263-import sys
4264-
4265-from curtin import util
4266-
4267-
4268-DATASOURCE_LIST = """\
4269-datasource_list: [ MAAS ]
4270-"""
4271-
4272-DATASOURCE = """\
4273-datasource:
4274- MAAS: {{consumer_key: {consumer_key}, metadata_url: '{url}',
4275- token_key: {token_key}, token_secret: {token_secret}}}
4276-"""
4277-
4278-
4279-def get_datasource(**kwargs):
4280- """Returns the format cloud-init datasource."""
4281- return DATASOURCE_LIST + DATASOURCE.format(**kwargs)
4282-
4283-
4284-def load_config(path):
4285- """Loads the curtin config."""
4286- with open(path, 'r') as stream:
4287- return json.load(stream)
4288-
4289-
4290-def extract_maas_parameters(config):
4291- """Extracts the needed values from the debconf
4292- entry."""
4293- params = {}
4294- for line in config.splitlines():
4295- cloud, key, type, value = line.split()[:4]
4296- if key == "cloud-init/maas-metadata-url":
4297- params['url'] = value
4298- elif key == "cloud-init/maas-metadata-credentials":
4299- values = value.split("&")
4300- for oauth in values:
4301- key, value = oauth.split('=')
4302- if key == 'oauth_token_key':
4303- params['token_key'] = value
4304- elif key == 'oauth_token_secret':
4305- params['token_secret'] = value
4306- elif key == 'oauth_consumer_key':
4307- params['consumer_key'] = value
4308- return params
4309-
4310-
4311-def get_maas_debconf_selections(config):
4312- """Gets the debconf selections from the curtin config."""
4313- try:
4314- return config['debconf_selections']['maas']
4315- except KeyError:
4316- return None
4317-
4318-
4319-def write_datasource(target, data):
4320- """Writes the cloudinit config into
4321- /etc/cloud/cloud.cfg.d/90_datasource.cfg."""
4322- path = os.path.join(
4323- target, 'etc', 'cloud', 'cloud.cfg.d', '90_datasource.cfg')
4324- with open(path, 'w') as stream:
4325- stream.write(data + '\n')
4326-
4327-
4328-def main():
4329- state = util.load_command_environment()
4330- target = state['target']
4331- if target is None:
4332- print("Target was not provided in the environment.")
4333- sys.exit(1)
4334- config_f = state['config']
4335- if config_f is None:
4336- print("Config was not provided in the environment.")
4337- sys.exit(1)
4338- config = load_config(config_f)
4339-
4340- debconf = get_maas_debconf_selections(config)
4341- if debconf is None:
4342- print("Failed to get the debconf_selections.")
4343- sys.exit(1)
4344-
4345- params = extract_maas_parameters(debconf)
4346- datasource = get_datasource(**params)
4347- write_datasource(target, datasource)
4348-
4349-
4350-if __name__ == "__main__":
4351- main()
4352
4353=== removed file 'curtin/centos6/python_wrapper'
4354--- curtin/centos6/python_wrapper 2016-05-11 18:47:46 +0000
4355+++ curtin/centos6/python_wrapper 1970-01-01 00:00:00 +0000
4356@@ -1,11 +0,0 @@
4357-#!/bin/bash
4358-
4359-export PYTHONPATH='/curtin'
4360-
4361-# Ubuntu 16.04 only ships with Python 3 while previous versions only ship
4362-# with Python 2.
4363-if type -p python > /dev/null; then
4364- exec python "$0.py" "$@"
4365-else
4366- exec python3 "$0.py" "$@"
4367-fi
4368
4369=== removed directory 'curtin/centos7'
4370=== removed symlink 'curtin/centos7/curtin-hooks'
4371=== target was u'python_wrapper'
4372=== removed file 'curtin/centos7/curtin-hooks.py'
4373--- curtin/centos7/curtin-hooks.py 2018-08-17 20:11:27 +0000
4374+++ curtin/centos7/curtin-hooks.py 1970-01-01 00:00:00 +0000
4375@@ -1,396 +0,0 @@
4376-#!/usr/bin/env python
4377-
4378-from __future__ import (
4379- absolute_import,
4380- print_function,
4381- unicode_literals,
4382- )
4383-
4384-import codecs
4385-import importlib
4386-import os
4387-import re
4388-import sys
4389-
4390-from curtin import (
4391- block,
4392- config,
4393- log,
4394- util,
4395- )
4396-
4397-
4398-def try_import(path, unavailable=None, condition=True):
4399- """Import path (module.submodule.attribute) and return it.
4400- return unavailable if
4401- - condition is not true
4402- - import fails
4403- - attribute does not exist in module."""
4404- if not condition:
4405- return unavailable
4406- modname, _, attrname = path.rpartition(".")
4407- try:
4408- mod = importlib.import_module(modname)
4409- imported = getattr(mod, attrname, None)
4410- except ImportError:
4411- imported = None
4412- return imported if imported else unavailable
4413-
4414-
4415-curtin_features = try_import("curtin.FEATURES", [])
4416-write_files = try_import("curtin.futil.write_files")
4417-centos_apply_network_config = try_import(
4418- "curtin.commands.curthooks.centos_apply_network_config",
4419- condition='CENTOS_APPLY_NETWORK_CONFIG' in curtin_features)
4420-centos_curthooks = try_import(
4421- "curtin.commands.curthooks.builtin_curthooks",
4422- condition='CENTOS_CURTHOOK_SUPPORT' in curtin_features)
4423-
4424-
4425-FSTAB_PREPEND = """\
4426-#
4427-# /etc/fstab
4428-# Created by MAAS fast-path installer.
4429-#
4430-# Accessible filesystems, by reference, are maintained under '/dev/disk'
4431-# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
4432-#
4433-"""
4434-
4435-FSTAB_UEFI = """\
4436-LABEL=uefi-boot /boot/efi vfat defaults 0 0
4437-"""
4438-
4439-GRUB_PREPEND = """\
4440-# Set by MAAS fast-path installer.
4441-GRUB_TIMEOUT=0
4442-GRUB_TERMINAL_OUTPUT=console
4443-GRUB_DISABLE_OS_PROBER=true
4444-"""
4445-
4446-
4447-def get_block_devices(target):
4448- """Returns list of block devices for the given target."""
4449- devs = block.get_devices_for_mp(target)
4450- blockdevs = set()
4451- for maybepart in devs:
4452- (blockdev, part) = block.get_blockdev_for_partition(maybepart)
4453- blockdevs.add(blockdev)
4454- return list(blockdevs)
4455-
4456-
4457-def get_root_info(target):
4458- """Returns the root partitions information."""
4459- rootpath = block.get_devices_for_mp(target)[0]
4460- rootdev = os.path.basename(rootpath)
4461- blocks = block._lsblock()
4462- return blocks[rootdev]
4463-
4464-
4465-def read_file(path):
4466- """Returns content of a file."""
4467- with codecs.open(path, encoding='utf-8') as stream:
4468- return stream.read()
4469-
4470-
4471-def write_fstab(target, curtin_fstab):
4472- """Writes the new fstab, using the fstab provided
4473- from curtin."""
4474- fstab_path = os.path.join(target, 'etc', 'fstab')
4475- fstab_data = read_file(curtin_fstab)
4476- with open(fstab_path, 'w') as stream:
4477- stream.write(FSTAB_PREPEND)
4478- stream.write(fstab_data)
4479- if util.is_uefi_bootable():
4480- stream.write(FSTAB_UEFI)
4481-
4482-
4483-def strip_kernel_params(params, strip_params=[]):
4484- """Removes un-needed kernel parameters."""
4485- new_params = []
4486- for param in params:
4487- remove = False
4488- for strip in strip_params:
4489- if param.startswith(strip):
4490- remove = True
4491- break
4492- if remove is False:
4493- new_params.append(param)
4494- return new_params
4495-
4496-
4497-def get_extra_kernel_parameters():
4498- """Extracts the extra kernel commands from /proc/cmdline
4499- that should be placed onto the host.
4500-
4501- Any command following the '--' entry should be placed
4502- onto the host.
4503- """
4504- cmdline = read_file('/proc/cmdline')
4505- cmdline = cmdline.split()
4506- if '--' not in cmdline:
4507- return []
4508- idx = cmdline.index('--') + 1
4509- if idx >= len(cmdline) + 1:
4510- return []
4511- return strip_kernel_params(
4512- cmdline[idx:],
4513- strip_params=['initrd=', 'BOOT_IMAGE=', 'BOOTIF='])
4514-
4515-
4516-def update_grub_default(target, extra=[]):
4517- """Updates /etc/default/grub with the correct options."""
4518- grub_default_path = os.path.join(target, 'etc', 'default', 'grub')
4519- kernel_cmdline = ' '.join(extra)
4520- with open(grub_default_path, 'a') as stream:
4521- stream.write(GRUB_PREPEND)
4522- stream.write('GRUB_CMDLINE_LINUX=\"%s\"\n' % kernel_cmdline)
4523-
4524-
4525-def grub2_install(target, root):
4526- """Installs grub2 to the root."""
4527- with util.RunInChroot(target) as in_chroot:
4528- in_chroot(['grub2-install', '--recheck', root])
4529-
4530-
4531-def grub2_mkconfig(target):
4532- """Writes the new grub2 config."""
4533- with util.RunInChroot(target) as in_chroot:
4534- in_chroot(['grub2-mkconfig', '-o', '/boot/grub2/grub.cfg'])
4535-
4536-
4537-def get_efibootmgr_value(output, key):
4538- """Parses the `output` from 'efibootmgr' to return value for `key`."""
4539- for line in output.splitlines():
4540- split = line.split(':')
4541- if len(split) == 2:
4542- curr_key = split[0].strip()
4543- value = split[1].strip()
4544- if curr_key == key:
4545- return value
4546-
4547-
4548-def get_file_efi_loaders(output):
4549- """Parses the `output` from 'efibootmgr' to return all loaders that exist
4550- in '\EFI' path."""
4551- return re.findall(
4552- r"^Boot(?P<hex>[0-9a-fA-F]{4})\*?\s*\S+\s+.*File\(\\EFI.*$",
4553- output, re.MULTILINE)
4554-
4555-
4556-def grub2_install_efi(target):
4557- """Configure for EFI.
4558-
4559- First capture the currently booted loader (normally a network device),
4560- then perform grub installation (adds a new bootloader and adjusts the
4561- boot order), finally re-adjust the boot order so that the currently booted
4562- loader is set to boot first in the new order.
4563- """
4564- with util.RunInChroot(target) as in_chroot:
4565- stdout, _ = in_chroot(['efibootmgr', '-v'], capture=True)
4566- currently_booted = get_efibootmgr_value(stdout, 'BootCurrent')
4567- loaders = get_file_efi_loaders(stdout)
4568- if currently_booted in loaders:
4569- loaders.remove(currently_booted)
4570- for loader in loaders:
4571- in_chroot(['efibootmgr', '-B', '-b', loader], capture=True)
4572- in_chroot([
4573- 'grub2-install', '--target=x86_64-efi',
4574- '--efi-directory', '/boot/efi',
4575- '--recheck'])
4576- stdout, _ = in_chroot(['efibootmgr'], capture=True)
4577- currently_booted = get_efibootmgr_value(stdout, 'BootCurrent')
4578- boot_order = get_efibootmgr_value(stdout, 'BootOrder').split(',')
4579- if currently_booted in boot_order:
4580- boot_order.remove(currently_booted)
4581- boot_order = [currently_booted] + boot_order
4582- new_boot_order = ','.join(boot_order)
4583- in_chroot(['efibootmgr', '-o', new_boot_order])
4584-
4585-
4586-def set_autorelabel(target):
4587- """Creates file /.autorelabel.
4588-
4589- This is used by SELinux to relabel all of the
4590- files on the filesystem to have the correct
4591- security context. Without this SSH login will
4592- fail.
4593- """
4594- path = os.path.join(target, '.autorelabel')
4595- open(path, 'a').close()
4596-
4597-
4598-def get_boot_mac():
4599- """Return the mac address of the booting interface."""
4600- cmdline = read_file('/proc/cmdline')
4601- cmdline = cmdline.split()
4602- try:
4603- bootif = [
4604- option
4605- for option in cmdline
4606- if option.startswith('BOOTIF')
4607- ][0]
4608- except IndexError:
4609- return None
4610- _, mac = bootif.split('=')
4611- mac = mac.split('-')[1:]
4612- return ':'.join(mac)
4613-
4614-
4615-def get_interface_names():
4616- """Return a dictionary mapping mac addresses to interface names."""
4617- sys_path = "/sys/class/net"
4618- ifaces = {}
4619- for iname in os.listdir(sys_path):
4620- mac = read_file(os.path.join(sys_path, iname, "address"))
4621- mac = mac.strip().lower()
4622- ifaces[mac] = iname
4623- return ifaces
4624-
4625-
4626-def get_ipv4_config(iface, data):
4627- """Returns the contents of the interface file for ipv4."""
4628- config = [
4629- 'TYPE="Ethernet"',
4630- 'NM_CONTROLLED="no"',
4631- 'USERCTL="yes"',
4632- ]
4633- if 'hwaddress' in data:
4634- config.append('HWADDR="%s"' % data['hwaddress'])
4635- # Fallback to using device name
4636- else:
4637- config.append('DEVICE="%"' % iface)
4638- if data['auto']:
4639- config.append('ONBOOT="yes"')
4640- else:
4641- config.append('ONBOOT="no"')
4642-
4643- method = data['method']
4644- if method == 'dhcp':
4645- config.append('BOOTPROTO="dhcp"')
4646- config.append('PEERDNS="yes"')
4647- config.append('PERSISTENT_DHCLIENT="1"')
4648- if 'hostname' in data:
4649- config.append('DHCP_HOSTNAME="%s"' % data['hostname'])
4650- elif method == 'static':
4651- config.append('BOOTPROTO="none"')
4652- config.append('IPADDR="%s"' % data['address'])
4653- config.append('NETMASK="%s"' % data['netmask'])
4654- if 'broadcast' in data:
4655- config.append('BROADCAST="%s"' % data['broadcast'])
4656- if 'gateway' in data:
4657- config.append('GATEWAY="%s"' % data['gateway'])
4658- elif method == 'manual':
4659- config.append('BOOTPROTO="none"')
4660- return '\n'.join(config)
4661-
4662-
4663-def write_interface_config(target, iface, data):
4664- """Writes config for interface."""
4665- family = data['family']
4666- if family != "inet":
4667- # Only supporting ipv4 currently
4668- print(
4669- "WARN: unsupported family %s, "
4670- "failed to configure interface: %s" (family, iface))
4671- return
4672- config = get_ipv4_config(iface, data)
4673- path = os.path.join(
4674- target, 'etc', 'sysconfig', 'network-scripts', 'ifcfg-%s' % iface)
4675- with open(path, 'w') as stream:
4676- stream.write(config + '\n')
4677-
4678-
4679-def write_network_config(target, mac):
4680- """Write network configuration for the given MAC address."""
4681- inames = get_interface_names()
4682- iname = inames[mac.lower()]
4683- write_interface_config(
4684- target, iname, {
4685- 'family': 'inet',
4686- 'hwaddress': mac.upper(),
4687- 'auto': True,
4688- 'method': 'dhcp'
4689- })
4690-
4691-
4692-def apply_networking(cfg, target, bootmac):
4693- if 'network' in cfg and centos_apply_network_config:
4694- centos_apply_network_config(cfg['network'], target)
4695- return
4696-
4697- if 'network' in cfg:
4698- sys.stderr.write("WARN: network configuration provided, but "
4699- "no support for applying. Using basic config.")
4700- write_network_config(target, bootmac)
4701-
4702-
4703-def handle_cloudconfig(cfg, target):
4704- if not cfg.get('cloudconfig'):
4705- return
4706- if not write_files:
4707- sys.stderr.write(
4708- "WARN: Unable to handle 'cloudconfig' section in config."
4709- "No 'write_files' found from curtin.\n")
4710- return
4711-
4712- base_dir = os.path.join(target, 'etc/cloud/cloud.cfg.d')
4713- write_files(cfg['cloudconfig'], base_dir)
4714-
4715-
4716-def main():
4717- # Enable logging to stdout for curtin functions
4718- verbosity = int(os.environ.get("CURTIN_VERBOSITY", 1))
4719- log.basicConfig(stream=sys.stdout, verbosity=verbosity)
4720-
4721- state = util.load_command_environment()
4722- target = state['target']
4723- if target is None:
4724- print("Target was not provided in the environment.")
4725- sys.exit(1)
4726- fstab = state['fstab']
4727- if fstab is None:
4728- print("/etc/fstab output was not provided in the environment.")
4729- sys.exit(1)
4730- bootmac = get_boot_mac()
4731- if bootmac is None:
4732- print("Unable to determine boot interface.")
4733- sys.exit(1)
4734- devices = get_block_devices(target)
4735- if not devices:
4736- print("Unable to find block device for: %s" % target)
4737- sys.exit(1)
4738-
4739- if state.get('config'):
4740- cfg = config.load_config(state['config'])
4741- else:
4742- cfg = {}
4743-
4744- # Run builtin hooks if curtin has the feature and maas sent storage cfg
4745- if centos_curthooks and cfg.get('storage'):
4746- # centos_curthooks will complete successfully or raise an exception.
4747- # Not handling the exception here means we will exit this program with
4748- # a non-zero value
4749- centos_curthooks(cfg, target, state)
4750- return
4751-
4752- write_fstab(target, fstab)
4753-
4754- update_grub_default(
4755- target, extra=get_extra_kernel_parameters())
4756- grub2_mkconfig(target)
4757- if util.is_uefi_bootable():
4758- grub2_install_efi(target)
4759- else:
4760- for dev in devices:
4761- grub2_install(target, dev)
4762-
4763- set_autorelabel(target)
4764-
4765- handle_cloudconfig(cfg, target)
4766-
4767- apply_networking(cfg, target, bootmac)
4768-
4769-
4770-if __name__ == "__main__":
4771- main()
4772
4773=== removed symlink 'curtin/centos7/finalize'
4774=== target was u'python_wrapper'
4775=== removed file 'curtin/centos7/finalize.py'
4776--- curtin/centos7/finalize.py 2018-09-13 08:07:51 +0000
4777+++ curtin/centos7/finalize.py 1970-01-01 00:00:00 +0000
4778@@ -1,108 +0,0 @@
4779-#!/usr/bin/env python
4780-
4781-from __future__ import (
4782- absolute_import,
4783- print_function,
4784- unicode_literals,
4785- )
4786-
4787-import json
4788-import os
4789-import sys
4790-
4791-from curtin import util
4792-try:
4793- from curtin import FEATURES as curtin_features
4794-except ImportError:
4795- curtin_features = []
4796-
4797-
4798-DATASOURCE_LIST = """\
4799-datasource_list: [ MAAS ]
4800-"""
4801-
4802-DATASOURCE = """\
4803-datasource:
4804- MAAS: {{consumer_key: {consumer_key}, metadata_url: '{url}',
4805- token_key: {token_key}, token_secret: {token_secret}}}
4806-"""
4807-
4808-
4809-def get_datasource(**kwargs):
4810- """Returns the format cloud-init datasource."""
4811- return DATASOURCE_LIST + DATASOURCE.format(**kwargs)
4812-
4813-
4814-def load_config(path):
4815- """Loads the curtin config."""
4816- with open(path, 'r') as stream:
4817- return json.load(stream)
4818-
4819-
4820-def extract_maas_parameters(config):
4821- """Extracts the needed values from the debconf
4822- entry."""
4823- params = {}
4824- for line in config.splitlines():
4825- cloud, key, type, value = line.split()[:4]
4826- if key == "cloud-init/maas-metadata-url":
4827- params['url'] = value
4828- elif key == "cloud-init/maas-metadata-credentials":
4829- values = value.split("&")
4830- for oauth in values:
4831- key, value = oauth.split('=')
4832- if key == 'oauth_token_key':
4833- params['token_key'] = value
4834- elif key == 'oauth_token_secret':
4835- params['token_secret'] = value
4836- elif key == 'oauth_consumer_key':
4837- params['consumer_key'] = value
4838- return params
4839-
4840-
4841-def get_maas_debconf_selections(config):
4842- """Gets the debconf selections from the curtin config."""
4843- try:
4844- return config['debconf_selections']['maas']
4845- except KeyError:
4846- return None
4847-
4848-
4849-def write_datasource(target, data):
4850- """Writes the cloudinit config into
4851- /etc/cloud/cloud.cfg.d/90_datasource.cfg."""
4852- path = os.path.join(
4853- target, 'etc', 'cloud', 'cloud.cfg.d', '90_datasource.cfg')
4854- with open(path, 'w') as stream:
4855- stream.write(data + '\n')
4856-
4857-
4858-def main():
4859- # The builtin Curtin hooks handle writing the datasource as
4860- # 50-cloudconfig-maas-reporting.cfg. Running this creates duplicated data
4861- # at 90_datasource.cfg.
4862- if 'CENTOS_CURTHOOK_SUPPORT' in curtin_features:
4863- return
4864- state = util.load_command_environment()
4865- target = state['target']
4866- if target is None:
4867- print("Target was not provided in the environment.")
4868- sys.exit(1)
4869- config_f = state['config']
4870- if config_f is None:
4871- print("Config was not provided in the environment.")
4872- sys.exit(1)
4873- config = load_config(config_f)
4874-
4875- debconf = get_maas_debconf_selections(config)
4876- if debconf is None:
4877- print("Failed to get the debconf_selections.")
4878- sys.exit(1)
4879-
4880- params = extract_maas_parameters(debconf)
4881- datasource = get_datasource(**params)
4882- write_datasource(target, datasource)
4883-
4884-
4885-if __name__ == "__main__":
4886- main()
4887
4888=== removed file 'curtin/centos7/python_wrapper'
4889--- curtin/centos7/python_wrapper 2016-05-11 18:47:46 +0000
4890+++ curtin/centos7/python_wrapper 1970-01-01 00:00:00 +0000
4891@@ -1,11 +0,0 @@
4892-#!/bin/bash
4893-
4894-export PYTHONPATH='/curtin'
4895-
4896-# Ubuntu 16.04 only ships with Python 3 while previous versions only ship
4897-# with Python 2.
4898-if type -p python > /dev/null; then
4899- exec python "$0.py" "$@"
4900-else
4901- exec python3 "$0.py" "$@"
4902-fi
4903
4904=== removed directory 'exdata'
4905=== removed file 'exdata/README'
4906--- exdata/README 2014-03-07 22:06:52 +0000
4907+++ exdata/README 1970-01-01 00:00:00 +0000
4908@@ -1,19 +0,0 @@
4909-each directory under here is a disjoint source/site.
4910- * muc/ (maas.ubuntu.com)
4911- * hcc/ (hyperscale.canonica.com)
4912-
4913-files in those directories are products.
4914-they contain the same basic layout as a product_id in a content_id.
4915-
4916-The intent is to build a tool that can do this:
4917-
4918- * mk-exdata --output=muc-output/ --content-id=maas.ubuntu.com:boot \
4919- muc/precise-*
4920- this would create a index.json in muc-output with valid stream.
4921- it would just create the files and insert checksums and sizes.
4922-
4923- Other parameters would be '--as-of-date=20140213' to only produce
4924- output as of that date, and '--max=3' to limit the output to only
4925- the latest 3 in each entry.
4926-
4927- mk-exdata would fill in the paths per the '_path'.
4928
4929=== removed file 'exdata/dates.txt'
4930--- exdata/dates.txt 2014-03-07 22:06:52 +0000
4931+++ exdata/dates.txt 1970-01-01 00:00:00 +0000
4932@@ -1,10 +0,0 @@
4933-20120426: 12.04 precise
4934-20120824: 12.04.1 precise-polish
4935-20121018: 12.10 quantal
4936-20130214: 12.04.2 precise-hwe-q
4937-20130425: 13.04 raring
4938-20130823: 12.04.3 precise-hwe-r
4939-20131017: 13.10 saucy
4940-20140206: 12.04.4 precise-hwe-s
4941-20140417: 14.04 trusty
4942-20140828: 12.04.5 precise-hwe-t
4943
4944=== removed directory 'exdata/hcc'
4945=== removed file 'exdata/hcc/info.txt'
4946--- exdata/hcc/info.txt 2014-03-07 22:06:52 +0000
4947+++ exdata/hcc/info.txt 1970-01-01 00:00:00 +0000
4948@@ -1,1 +0,0 @@
4949-# this would be example data that would appear on hyperscale.canonical.com
4950
4951=== removed directory 'exdata/muc'
4952=== removed file 'exdata/muc/precise-armhf-p.yaml'
4953--- exdata/muc/precise-armhf-p.yaml 2014-03-07 22:06:52 +0000
4954+++ exdata/muc/precise-armhf-p.yaml 1970-01-01 00:00:00 +0000
4955@@ -1,55 +0,0 @@
4956-"com.ubuntu.maas:boot:12.04:armhf":
4957- _path: "%(release)s/%(arch)s/hwe-p/%(version_id)s/%(item_id)s"
4958- release: "precise"
4959- version: "12.04"
4960- arch: "armhf"
4961- subarches: "generic,hwe-p"
4962- versions:
4963- "20120426":
4964- items:
4965- boot-kernel: {}
4966- boot-initrd: {}
4967- di-kernel: {}
4968- di-initrd: {}
4969- root-image:
4970- path: "%(release)s/%(arch)s/20120425/root-image"
4971- "20120824":
4972- items:
4973- boot-kernel: {}
4974- boot-initrd: {}
4975- di-kernel: {}
4976- di-initrd: {}
4977- root-image:
4978- path: "%(release)s/%(arch)s/20120823/root-image"
4979- "20130214":
4980- items:
4981- boot-kernel: {}
4982- boot-initrd: {}
4983- di-kernel: {}
4984- di-initrd: {}
4985- root-image:
4986- path: "%(release)s/%(arch)s/20130213/root-image"
4987- "20130823":
4988- items:
4989- boot-kernel: {}
4990- boot-initrd: {}
4991- di-kernel: {}
4992- di-initrd: {}
4993- root-image:
4994- path: "%(release)s/%(arch)s/20130822/root-image"
4995- "20140206":
4996- items:
4997- boot-kernel: {}
4998- boot-initrd: {}
4999- di-kernel: {}
5000- di-initrd: {}
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches