summaryrefslogtreecommitdiff
path: root/doc/sources/ovf/make-iso
blob: 91d0e2e5d7ccdd6222cc0798e1c2f9cb5ec173a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/bin/bash

VERBOSITY=0
PROPERTIES=( instance-id   hostname              user-data seedfrom )
DEFAULTS=(   "i-ovfdemo00" "ovfdemo.localdomain" ""        ""       )

DEF_OUTPUT="ovftransport.iso"
TEMP_D=""

error() { echo "$@" 1>&2; }
fail() { [ $# -eq 0 ] || error "$@"; exit 1; }

# propvalue(name, value)
propvalue() {
	local prop="" val="$2" i=0
	for prop in "${PROPERTIES[@]}"; do
		if [ "$prop" = "$1" ]; then
			[ $# -eq 1 ] || DEFAULTS[$i]="$2"
			_RET=${DEFAULTS[$i]}
			return
		fi
		i=$(($i+1))
	done
	return
}

Usage() {
	cat <<EOF
Usage: ${0##*/} ovf-env.xml.tmpl [user-data-file]

   create an an ovf transport iso with ovf-env.xml.tmpl
   as ovf-env.xml on the iso.

   if user-data-file is given, the file's contents will be base64 encoded
   and stuffed inside ovf-env.xml. This will override the '--user-data'
   argument.

   options:
     -o | --output OUTPUT    write output to OUTPUT [default: $DEF_OUTPUT]
     -v | --verbose          increase verbosity

EOF
	local i=""
	for i in "${PROPERTIES[@]}"; do
		propvalue "$i"
		printf "%10s--%-17s%s\n" "" "$i" "set $i. [default: '$_RET']"
	done
	cat <<EOF

   Example:
     $ ${0##*/} --hostname "foobar.mydomain" ovf-env.xml.tmpl user-data

EOF
}

bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error "$@"; exit 1; }
cleanup() {
   [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}"
}

debug() {
	local level=${1}; shift;
	[ "${level}" -ge "${VERBOSITY}" ] && return
	error "${@}"
}

short_opts="ho:v"
long_opts="help,output:,verbose"
for i in "${PROPERTIES[@]}"; do
	long_opts="$long_opts,$i:"
done
getopt_out=$(getopt --name "${0##*/}" \
	--options "${short_opts}" --long "${long_opts}" -- "$@") &&
	eval set -- "${getopt_out}" ||
	bad_Usage

## <<insert default variables here>>
output="${DEF_OUTPUT}"
user_data=""

while [ $# -ne 0 ]; do
	cur=${1}; next=${2};
	case "$cur" in
		-h|--help) Usage ; exit 0;;
		-o|--output) output=${2}; shift;;
		-v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
		--) shift; break;;
		--*)
			for i in "${PROPERTIES[@]}" _none_; do
				[ "${cur#--}" == "$i" ] || continue
				[ "$i" != "user-data" ] ||
					next=$(echo "$next" | base64 --wrap=0) ||
						fail "failed to base64 encode userdata"
				propvalue "$i" "$next"
				break
			done
			[ "$i" = "_none_" ] && bad_Usage "confused by $cur"
			;;
	esac
	shift;
done

[ $# -eq 1 -o $# -eq 2 ] ||
	bad_Usage "wrong number of arguments"

env_tmpl="$1"
ud_file="$2"

[ -f "$env_tmpl" ] || bad_Usage "$env_tmpl: not a file"
[ -z "$ud_file" -o -f "$ud_file" ] ||
	bad_Usage "$ud_file: not a file"

TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX") ||
   fail "failed to make tempdir"
trap cleanup EXIT

mkdir "$TEMP_D/iso" && iso_d="$TEMP_D/iso" ||
	fail "failed to make a tempdir?"
ovf_env="$TEMP_D/iso/ovf-env.xml"

if [ -n "$ud_file" ]; then
	user_data=$(base64 --wrap=0 "$ud_file") ||
		fail "failed to base64 encode $ud_file. Do you have base64 installed?"
	propvalue user-data "$user_data"
fi

changes=( )
for i in "${PROPERTIES[@]}"; do
	changes[${#changes[@]}]="-e"
	propvalue "$i"
	changes[${#changes[@]}]="s|@@$i@@|$_RET|g"
done

sed "${changes[@]}" "$env_tmpl" > "$ovf_env" ||
		fail "failed to replace string in $env_tmpl"

if [ "${#changes[@]}" -ne 0 ]; then
	cmp "$ovf_env" "$env_tmpl" >/dev/null &&
		fail "nothing replaced in $ovf_env.  template is identical to output"
fi

debug 1 "creating iso with: genisoimage -o tmp.iso -r iso"
( cd "$TEMP_D" && 
	genisoimage -V OVF-TRANSPORT -o tmp.iso -r iso 2>/dev/null ) ||
	fail "failed to create iso. do you have genisoimage?"

if [ "$output" = "-" ]; then
	cat "$TEMP_D/tmp.iso"
else
	cp "$TEMP_D/tmp.iso" "$output" ||
		fail "failed to write to $output"
fi

error "wrote iso to $output"
exit 0
# vi: ts=4 noexpandtab