Fix a minor bash variable expansion error
[snf-image] / snf-image-helper / tasks / 30MountImage.in
1 #! /bin/bash
2
3 # Copyright (C) 2011 GRNET S.A. 
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 # 02110-1301, USA.
19
20 ### BEGIN TASK INFO
21 # Provides:             MountImage
22 # RunBefore:            UmountImage
23 # Short-Description:    Mount the partition that hosts the image
24 ### END TASK INFO
25
26 set -e
27 . "@commondir@/common.sh"
28
29 trap task_cleanup EXIT
30 report_task_start
31
32 if [ ! -d "$SNF_IMAGE_TARGET" ]; then
33     log_error "Target dir:\`$SNF_IMAGE_TARGET' is missing"
34 fi
35
36 if [ -z "$SNF_IMAGE_PROPERTY_ROOT_PARTITION" ]; then
37     log_error "Required image property \`ROOT_PARTITION' not defined or empty"
38 fi
39
40 rootdev="${SNF_IMAGE_DEV}${SNF_IMAGE_PROPERTY_ROOT_PARTITION}"
41
42 if [ ! -b "$rootdev" ]; then
43     log_error "Root partition device:\`$rootdev' is not a block device. " \
44         "Please check if the value for image property \`ROOT_PARTITION' " \
45         "(=$SNF_IMAGE_PROPERTY_ROOT_PARTITION) is valid."
46 fi
47
48 if [[ "$SNF_IMAGE_PROPERTY_OSFAMILY" == *bsd ]]; then
49     if ! $DUMPFS_UFS "$rootdev" &> /dev/null; then
50         os=${SNF_IMAGE_PROPERTY_OSFAMILY^^[bsd]}
51         log_error "For ${os^?} images only UFS root partitions are supported."
52     fi
53     ufstype="$(get_ufstype "$rootdev")"
54     if [ "x$ufstype" = "x" ]; then
55         exit 1
56     fi
57     $MOUNT -t ufs -o ufstype="$ufstype,rw" "$rootdev" "$SNF_IMAGE_TARGET"
58 else
59     $MOUNT -o rw "$rootdev" "$SNF_IMAGE_TARGET"
60 fi
61
62 if [ "$SNF_IMAGE_PROPERTY_OSFAMILY" != "linux" ]; then
63     exit 0
64 fi
65
66 if [ ! -f "${SNF_IMAGE_TARGET}/etc/fstab" ]; then
67     log_error "/etc/fstab is missing from the root file system"
68 fi
69
70 # Read the local partitions from fstab and get a sorted list:
71 #<mount_point> <device> <options>
72 fstab="$(grep -v ^\# "${SNF_IMAGE_TARGET}/etc/fstab" | awk '{ if (match($3, "ext[234]")) { print $2,$1,$4 } }' | sort -bd)"
73
74 # Mount non-root filesystems
75 while read line; do
76     read -ra entry <<< "$line"
77     # Skip root. It is already mounted
78     if [ "${entry[0]}" = "/" ]; then
79         continue
80     fi
81
82     if [[ ${entry[1]} =~ ^(LABEL|UUID)= ]]; then
83         entry[1]=$(findfs "${entry[1]}")
84     fi
85
86     # I'm in doupt. Sould I mount the filesystems with the mount options
87     # found in the image's /etc/fstab or not?
88     $MOUNT "${entry[1]}" "${SNF_IMAGE_TARGET}${entry[0]}" # -o "${entry[2]}"
89
90 done <<< "$fstab"
91
92 exit 0
93
94 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :