Skip to content

Commit

Permalink
Merge pull request #178 from hypriot/check-cloud-config-comment
Browse files Browse the repository at this point in the history
Check for #cloud-config comment in first line
  • Loading branch information
StefanScherer authored Jun 1, 2020
2 parents aa8107c + f0aeb1c commit a26609c
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 15 deletions.
41 changes: 26 additions & 15 deletions flash
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@ fi

case "${OSTYPE}" in
darwin*)
alias grep="grep --color=never"
size_opt="-f %z"
bs_size=1m

Expand All @@ -153,12 +152,16 @@ case "${OSTYPE}" in

validate_yaml() {
set +e
if _RET=$(ruby -e "require 'yaml';YAML.load_file('$1')" 2>&1); then
set -e
return 0
if [[ $(sed -n '/^#cloud-config/p;q' "$1") ]]; then
if _RET=$(ruby -e "require 'yaml';YAML.load_file('$1')" 2>&1); then
set -e
return 0
fi
echo "File $1 is not a valid YAML file!"
echo "$_RET" | grep --color=never -v "from "
else
echo "File $1 is not a valid YAML file! It must contain #cloud-config in the first line."
fi
echo "File $1 is not a valid YAML file!"
echo "$_RET" | grep -v "from "
set -e
false
}
Expand All @@ -183,7 +186,7 @@ case "${OSTYPE}" in
# Show in the standard output the devices that are a likely
# destination for the tool to write an image to.
show_devices() {
diskutil list | grep FDisk_partition_scheme | awk 'NF>1{print $NF}'
diskutil list | grep --color=never FDisk_partition_scheme | awk 'NF>1{print $NF}'
}

# Check that the target device can be written. It will return 0 in
Expand All @@ -197,7 +200,7 @@ case "${OSTYPE}" in
_RET=1
return
fi
readonlymedia=$(diskutil info "$disk" | grep "Read-Only Media" | awk 'NF>1{print $NF}')
readonlymedia=$(diskutil info "$disk" | grep --color=never "Read-Only Media" | awk 'NF>1{print $NF}')
if [[ $readonlymedia == "No" ]] ; then
_RET=1
else
Expand Down Expand Up @@ -232,7 +235,7 @@ case "${OSTYPE}" in
mv "$rawdisk" "${rawdisk}.readonly.dmg"
hdiutil convert "${rawdisk}.readonly.dmg" -format UDRW -o "$rawdisk"
rm -f "${rawdisk}.readonly.dmg"
disk=$(hdiutil attach "$rawdisk" | grep FAT | sed 's/s1 .*$//')
disk=$(hdiutil attach "$rawdisk" | grep --color=never FAT | sed 's/s1 .*$//')
echo mounted FAT partition to "$disk"
if [ "$disk" == "" ]; then
echo Failed attaching "$rawdisk"
Expand Down Expand Up @@ -331,16 +334,24 @@ case "${OSTYPE}" in
}

validate_yaml() {
## NO-OP in Linux
true
set +e
if [[ $(sed -n '/^#cloud-config/p;q' "$1") ]]; then
# no further yaml validation on Linux right now
set -e
return 0
else
echo "File $1 is not a valid YAML file! It must contain #cloud-config in the first line."
fi
set -e
false
}

# Try to identify the most likely device that the user will use to
# write an image to.
#
# @return _RET the name of the device to use
autodetect_device() {
_RET=$(lsblk -p -n -o NAME -d | grep mmcblk || true)
_RET=$(lsblk -p -n -o NAME -d | grep --color=never mmcblk || true)
}

# Show in the standard output the devices that are a likely
Expand Down Expand Up @@ -385,7 +396,7 @@ case "${OSTYPE}" in
return
fi

if sudo hdparm -r "$disk" | grep -q off; then
if sudo hdparm -r "$disk" | grep --color=never -q off; then
_RET=1
else
_RET=0
Expand Down Expand Up @@ -428,7 +439,7 @@ case "${OSTYPE}" in
#
# @param arg1 the disk to unmount
umount_disk() {
for i in $(df |grep "$1" | awk '{print $1}')
for i in $(df |grep --color=never "$1" | awk '{print $1}')
do
sudo umount "$i"
done
Expand Down Expand Up @@ -585,7 +596,7 @@ if [[ -z $CONFIGURE_ONLY ]] ; then
command -v unzip 2>/dev/null || error "Error: unzip not found. Aborting" 1
echo "Uncompressing ${image} ..."
unzip -o "${image}" -d /tmp
image=$(unzip -l "${image}" | grep -v Archive: | grep img | awk 'NF>1{print $NF}')
image=$(unzip -l "${image}" | grep --color=never -v Archive: | grep --color=never img | awk 'NF>1{print $NF}')
image="/tmp/${image}"
echo "Use ${image}"
fi
Expand Down
14 changes: 14 additions & 0 deletions test/cloud-init.bats
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,20 @@ teardown() {
unstub_diskutil
}

@test "cloud-init: flash aborts if YAML is missing #cloud-config comment" {
run ./flash -f -d $img -u test/resources/missing-comment.yml cloud-init.img
assert_failure

assert_output_contains "is not a valid YAML file"
}

@test "cloud-init: flash aborts if YAML does not start with #cloud-config comment" {
run ./flash -f -d $img -u test/resources/comment-not-in-first-line.yml cloud-init.img
assert_failure

assert_output_contains "is not a valid YAML file"
}

@test "cloud-init: flash aborts if YAML is not valid" {
if [ "${OS}" == "Darwin" ]; then
run ./flash -f -d $img -u test/resources/bad.yml cloud-init.img
Expand Down
3 changes: 3 additions & 0 deletions test/resources/comment-not-in-first-line.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
hostname: good
manage_etc_hosts: true
#cloud-config
2 changes: 2 additions & 0 deletions test/resources/missing-comment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hostname: good
manage_etc_hosts: true

0 comments on commit a26609c

Please sign in to comment.