]> git.proxmox.com Git - mirror_lxc.git/blame - templates/lxc-download.in
download: Fix previous change
[mirror_lxc.git] / templates / lxc-download.in
CommitLineData
71d3a659
SG
1#!/bin/sh
2
3# Client script for LXC container images.
4#
5# Copyright © 2014 Stéphane Graber <stgraber@ubuntu.com>
6#
7# This library is free software; you can redistribute it and/or
8# modify it under the terms of the GNU Lesser General Public
9# License as published by the Free Software Foundation; either
10# version 2.1 of the License, or (at your option) any later version.
11
12# This library is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15# Lesser General Public License for more details.
16
17# You should have received a copy of the GNU Lesser General Public
18# License along with this library; if not, write to the Free Software
19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
20# USA
21
22set -eu
23
24LXC_TEMPLATE_CONFIG="@LXCTEMPLATECONFIG@"
25LXC_HOOK_DIR="@LXCHOOKDIR@"
26LOCALSTATEDIR="@LOCALSTATEDIR@"
27
28# Defaults
29DOWNLOAD_DIST=
30DOWNLOAD_RELEASE=
31DOWNLOAD_ARCH=
32DOWNLOAD_VARIANT="default"
33DOWNLOAD_SERVER="images.linuxcontainers.org"
34DOWNLOAD_KEYID="0xBAEFF88C22F6E216"
4eb706b3 35DOWNLOAD_KEYSERVER="hkp://pool.sks-keyservers.net"
71d3a659
SG
36DOWNLOAD_VALIDATE="true"
37DOWNLOAD_FLUSH_CACHE="false"
41670b35 38DOWNLOAD_FORCE_CACHE="false"
71d3a659
SG
39DOWNLOAD_MODE="system"
40DOWNLOAD_USE_CACHE="false"
41DOWNLOAD_URL=
42DOWNLOAD_SHOW_HTTP_WARNING="true"
43DOWNLOAD_SHOW_GPG_WARNING="true"
b0f0932a 44DOWNLOAD_READY_GPG="false"
71d3a659 45DOWNLOAD_COMPAT_LEVEL=1
10a5fab6 46DOWNLOAD_LIST_IMAGES="false"
9accc2ef 47DOWNLOAD_BUILD=
b0f0932a 48DOWNLOAD_INTERACTIVE="false"
71d3a659
SG
49
50LXC_NAME=
51LXC_PATH=
52LXC_ROOTFS=
53LXC_MAPPED_UID=
2133f58c 54LXC_MAPPED_GID=
71d3a659 55
4eb706b3
SG
56# Deal with GPG over http proxy
57if [ -n "${http_proxy:-}" ]; then
58 DOWNLOAD_KEYSERVER="${DOWNLOAD_KEYSERVER}:80"
59fi
60
71d3a659
SG
61# Some useful functions
62cleanup() {
63 if [ -d "$DOWNLOAD_TEMP" ]; then
64 rm -Rf $DOWNLOAD_TEMP
65 fi
66}
67
68download_file() {
69 if ! wget -q https://${DOWNLOAD_SERVER}/$1 -O $2 >/dev/null 2>&1; then
70 if ! wget -q http://${DOWNLOAD_SERVER}/$1 -O $2 >/dev/null 2>&1; then
71 if [ "$3" = "noexit" ]; then
72 return 1
73 else
fad96766 74 echo "ERROR: Failed to download http://${DOWNLOAD_SERVER}/$1" 1>&2
71d3a659
SG
75 exit 1
76 fi
77 elif [ "$DOWNLOAD_SHOW_HTTP_WARNING" = "true" ]; then
78 DOWNLOAD_SHOW_HTTP_WARNING="false"
79 echo "WARNING: Failed to download the file over HTTPs." 1>&2
80 echo -n " The file was instead download over HTTP. " 1>&2
81 echo "A server replay attack may be possible!" 1>&2
82 fi
83 fi
84}
85
fad96766 86download_sig() {
33aa351a
SG
87 if ! download_file $1 $2 noexit; then
88 if [ "$DOWNLOAD_VALIDATE" = "true" ]; then
89 if [ "$3" = "normal" ]; then
90 echo "ERROR: Failed to download http://${DOWNLOAD_SERVER}/$1" 1>&2
91 exit 1
92 else
93 return 1
94 fi
95 else
96 return 0
97 fi
fad96766
DE
98 fi
99}
100
71d3a659
SG
101gpg_setup() {
102 if [ "$DOWNLOAD_VALIDATE" = "false" ]; then
103 return
104 fi
105
b0f0932a
SG
106 if [ "$DOWNLOAD_READY_GPG" = "true" ]; then
107 return
108 fi
109
71d3a659
SG
110 echo "Setting up the GPG keyring"
111
112 mkdir -p "$DOWNLOAD_TEMP/gpg"
113 chmod 700 "$DOWNLOAD_TEMP/gpg"
114 export GNUPGHOME="$DOWNLOAD_TEMP/gpg"
115 if ! gpg --keyserver $DOWNLOAD_KEYSERVER \
116 --recv-keys ${DOWNLOAD_KEYID} >/dev/null 2>&1; then
117 echo "ERROR: Unable to fetch GPG key from keyserver."
118 exit 1
119 fi
b0f0932a
SG
120
121 DOWNLOAD_READY_GPG="true"
71d3a659
SG
122}
123
124gpg_validate() {
125 if [ "$DOWNLOAD_VALIDATE" = "false" ]; then
126 if [ "$DOWNLOAD_SHOW_GPG_WARNING" = "true" ]; then
127 echo "WARNING: Running without gpg validation!" 1>&2
128 fi
129 DOWNLOAD_SHOW_GPG_WARNING="false"
130 return 0
131 fi
132
133 if ! gpg --verify $1 >/dev/zero 2>&1; then
134 echo "ERROR: Invalid signature for $1" 1>&2
135 exit 1
136 fi
137}
138
139in_userns() {
140 [ -e /proc/self/uid_map ] || { echo no; return; }
141 [ "$(wc -l /proc/self/uid_map | awk '{ print $1 }')" -eq 1 ] || \
142 { echo yes; return; }
143 line=$(awk '{ print $1 " " $2 " " $3 }' /proc/self/uid_map)
144 [ "$line" = "0 0 4294967295" ] && { echo no; return; }
145 echo yes
146}
147
148relevant_file() {
149 FILE_PATH="${LXC_CACHE_PATH}/$1"
150 if [ -e "${FILE_PATH}-${DOWNLOAD_MODE}" ]; then
151 FILE_PATH="${FILE_PATH}-${DOWNLOAD_MODE}"
152 fi
153 if [ -e "$FILE_PATH.${DOWNLOAD_COMPAT_LEVEL}" ]; then
154 FILE_PATH="${FILE_PATH}.${DOWNLOAD_COMPAT_LEVEL}"
155 fi
156
157 echo $FILE_PATH
158}
159
160usage() {
161 cat <<EOF
162LXC container image downloader
163
164Required arguments:
165[ -d | --dist <distribution> ]: The name of the distribution
166[ -r | --release <release> ]: Release name/version
167[ -a | --arch <architecture> ]: Architecture of the container
71d3a659
SG
168
169Optional arguments:
10a5fab6
SG
170[ -h | --help ]: This help message
171[ -l | --list ]: List all available images
71d3a659
SG
172[ --variant <variant> ]: Variant of the image (default: "default")
173[ --server <server> ]: Image server (default: "images.linuxcontainers.org")
174[ --keyid <keyid> ]: GPG keyid (default: 0x...)
175[ --keyserver <keyserver> ]: GPG keyserver to use
176[ --no-validate ]: Disable GPG validation (not recommended)
177[ --flush-cache ]: Flush the local copy (if present)
9accc2ef 178[ --force-cache ]; Force the use of the local copy even if expired
71d3a659
SG
179
180LXC internal arguments (do not pass manually!):
181[ --name <name> ]: The container name
182[ --path <path> ]: The path to the container
183[ --rootfs <rootfs> ]: The path to the container's rootfs
2133f58c
SH
184[ --mapped-uid <map> ]: A uid map (user namespaces)
185[ --mapped-gid <map> ]: A gid map (user namespaces)
71d3a659
SG
186EOF
187 return 0
188}
189
10a5fab6 190options=$(getopt -o d:r:a:hl -l dist:,release:,arch:,help,list,variant:,\
c1becef2 191server:,keyid:,no-validate,flush-cache,force-cache,name:,path:,\
2133f58c 192rootfs:,mapped-uid:,mapped-gid: -- "$@")
71d3a659
SG
193
194if [ $? -ne 0 ]; then
195 usage
196 exit 1
197fi
198eval set -- "$options"
199
200while :; do
201 case "$1" in
10a5fab6
SG
202 -h|--help) usage && exit 1;;
203 -l|--list) DOWNLOAD_LIST_IMAGES="true"; shift 1;;
71d3a659
SG
204 -d|--dist) DOWNLOAD_DIST=$2; shift 2;;
205 -r|--release) DOWNLOAD_RELEASE=$2; shift 2;;
206 -a|--arch) DOWNLOAD_ARCH=$2; shift 2;;
207 --variant) DOWNLOAD_VARIANT=$2; shift 2;;
208 --server) DOWNLOAD_SERVER=$2; shift 2;;
209 --keyid) DOWNLOAD_KEYID=$2; shift 2;;
210 --no-validate) DOWNLOAD_VALIDATE="false"; shift 1;;
211 --flush-cache) DOWNLOAD_FLUSH_CACHE="true"; shift 1;;
9accc2ef 212 --force-cache) DOWNLOAD_FORCE_CACHE="true"; shift 1;;
71d3a659
SG
213 --name) LXC_NAME=$2; shift 2;;
214 --path) LXC_PATH=$2; shift 2;;
215 --rootfs) LXC_ROOTFS=$2; shift 2;;
216 --mapped-uid) LXC_MAPPED_UID=$2; shift 2;;
2133f58c 217 --mapped-gid) LXC_MAPPED_GID=$2; shift 2;;
71d3a659
SG
218 *) break;;
219 esac
220done
221
222# Check for required binaries
223for bin in tar xz wget; do
224 if ! type $bin >/dev/null 2>&1; then
225 echo "ERROR: Missing required tool: $bin" 1>&2
226 exit 1
227 fi
228done
229
230# Check for GPG
231if [ "$DOWNLOAD_VALIDATE" = "true" ]; then
232 if ! type gpg >/dev/null 2>&1; then
233 echo "ERROR: Missing recommended tool: gpg" 1>&2
234 echo "You can workaround this by using --no-validate." 1>&2
235 exit 1
236 fi
237fi
238
239# Check that we have all variables we need
240if [ -z "$LXC_NAME" ] || [ -z "$LXC_PATH" ] || [ -z "$LXC_ROOTFS" ]; then
241 echo "ERROR: Not running through LXC." 1>&2
242 exit 1
243fi
244
245if [ "$(in_userns)" = "yes" ]; then
246 if [ -z "$LXC_MAPPED_UID" ] || [ "$LXC_MAPPED_UID" = "-1" ]; then
247 echo "ERROR: In a user namespace without a map." 1>&2
248 exit 1
249 fi
250 DOWNLOAD_MODE="user"
251fi
252
b0f0932a
SG
253if [ -z "$DOWNLOAD_DIST" ] || [ -z "$DOWNLOAD_RELEASE" ] || \
254 [ -z "$DOWNLOAD_ARCH" ]; then
255 DOWNLOAD_INTERACTIVE="true"
71d3a659
SG
256fi
257
258# Trap all exit signals
259trap cleanup EXIT HUP INT TERM
843a5874
SG
260
261if ! type mktemp >/dev/null 2>&1; then
262 DOWNLOAD_TEMP=/tmp/lxc-download.$$
263 mkdir -p $DOWNLOAD_TEMP
264else
265 DOWNLOAD_TEMP=$(mktemp -d)
266fi
71d3a659 267
10a5fab6 268# Simply list images
b0f0932a
SG
269if [ "$DOWNLOAD_LIST_IMAGES" = "true" ] || \
270 [ "$DOWNLOAD_INTERACTIVE" = "true" ]; then
10a5fab6
SG
271 # Initialize GPG
272 gpg_setup
273
274 # Grab the index
275 DOWNLOAD_INDEX_PATH=/meta/1.0/index-${DOWNLOAD_MODE}
276
277 echo "Downloading the image index"
278 if ! download_file ${DOWNLOAD_INDEX_PATH}.${DOWNLOAD_COMPAT_LEVEL} \
279 ${DOWNLOAD_TEMP}/index noexit ||
280 ! download_sig ${DOWNLOAD_INDEX_PATH}.${DOWNLOAD_COMPAT_LEVEL}.asc \
281 ${DOWNLOAD_TEMP}/index.asc noexit; then
282 download_file ${DOWNLOAD_INDEX_PATH} ${DOWNLOAD_TEMP}/index normal
283 download_sig ${DOWNLOAD_INDEX_PATH}.asc \
284 ${DOWNLOAD_TEMP}/index.asc normal
285 fi
286
287 gpg_validate ${DOWNLOAD_TEMP}/index.asc
288
289 # Parse it
290 echo ""
291 echo "---"
292 echo "DIST\tRELEASE\tARCH\tVARIANT\tBUILD"
293 echo "---"
294 while read line; do
295 # Basic CSV parser
296 OLD_IFS=$IFS
297 IFS=";"
298 set -- $line
299 IFS=$OLD_IFS
300
301 [ -n "$DOWNLOAD_DIST" ] && [ "$1" != "$DOWNLOAD_DIST" ] && continue
302 [ -n "$DOWNLOAD_RELEASE" ] && [ "$2" != "$DOWNLOAD_RELEASE" ] && continue
303 [ -n "$DOWNLOAD_ARCH" ] && [ "$3" != "$DOWNLOAD_ARCH" ] && continue
304 [ -n "$DOWNLOAD_VARIANT" ] && [ "$4" != "$DOWNLOAD_VARIANT" ] && continue
305 [ -z "$5" ] || [ -z "$6" ] && continue
306
307 echo "$1\t$2\t$3\t$4\t$5"
308 done < ${DOWNLOAD_TEMP}/index
309 echo "---"
310
b0f0932a
SG
311 if [ "$DOWNLOAD_LIST_IMAGES" = "true" ]; then
312 exit 1
313 fi
314
315 # Interactive mode
316 echo ""
317
318 if [ -z "$DOWNLOAD_DIST" ]; then
319 echo -n "Distribution: "
320 read DOWNLOAD_DIST
321 fi
322
323 if [ -z "$DOWNLOAD_RELEASE" ]; then
324 echo -n "Release: "
325 read DOWNLOAD_RELEASE
326 fi
327
328 if [ -z "$DOWNLOAD_ARCH" ]; then
329 echo -n "Architecture: "
330 read DOWNLOAD_ARCH
331 fi
332
333 echo ""
10a5fab6
SG
334fi
335
71d3a659
SG
336# Setup the cache
337if [ "$DOWNLOAD_MODE" = "system" ]; then
b56661fe 338 LXC_CACHE_BASE="$LOCALSTATEDIR/cache/lxc/"
71d3a659
SG
339else
340 LXC_CACHE_BASE="$HOME/.cache/lxc/"
71d3a659
SG
341fi
342
b56661fe
SG
343LXC_CACHE_PATH="$LXC_CACHE_BASE/download/$DOWNLOAD_DIST"
344LXC_CACHE_PATH="$LXC_CACHE_PATH/$DOWNLOAD_RELEASE/$DOWNLOAD_ARCH/"
345LXC_CACHE_PATH="$LXC_CACHE_PATH/$DOWNLOAD_VARIANT"
346
71d3a659
SG
347if [ -d "$LXC_CACHE_PATH" ]; then
348 if [ "$DOWNLOAD_FLUSH_CACHE" = "true" ]; then
349 echo "Flushing the cache..."
350 rm -Rf $LXC_CACHE_PATH
9accc2ef
SG
351 elif [ "$DOWNLOAD_FORCE_CACHE" = "true" ]; then
352 DOWNLOAD_USE_CACHE="true"
71d3a659
SG
353 else
354 DOWNLOAD_USE_CACHE="true"
355 if [ -e "$(relevant_file expiry)" ]; then
356 if [ "$(cat $(relevant_file expiry))" -lt $(date +%s) ]; then
357 echo "The cached copy has expired, re-downloading..."
358 DOWNLOAD_USE_CACHE="false"
71d3a659
SG
359 fi
360 fi
361 fi
362fi
363
364# Download what's needed
365if [ "$DOWNLOAD_USE_CACHE" = "false" ]; then
366 # Initialize GPG
367 gpg_setup
368
369 # Grab the index
370 DOWNLOAD_INDEX_PATH=/meta/1.0/index-${DOWNLOAD_MODE}
371
372 echo "Downloading the image index"
373 if ! download_file ${DOWNLOAD_INDEX_PATH}.${DOWNLOAD_COMPAT_LEVEL} \
374 ${DOWNLOAD_TEMP}/index noexit ||
33aa351a 375 ! download_sig ${DOWNLOAD_INDEX_PATH}.${DOWNLOAD_COMPAT_LEVEL}.asc \
71d3a659
SG
376 ${DOWNLOAD_TEMP}/index.asc noexit; then
377 download_file ${DOWNLOAD_INDEX_PATH} ${DOWNLOAD_TEMP}/index normal
fad96766 378 download_sig ${DOWNLOAD_INDEX_PATH}.asc \
33aa351a 379 ${DOWNLOAD_TEMP}/index.asc normal
71d3a659
SG
380 fi
381
382 gpg_validate ${DOWNLOAD_TEMP}/index.asc
383
384 # Parse it
385 while read line; do
386 # Basic CSV parser
387 OLD_IFS=$IFS
388 IFS=";"
389 set -- $line
390 IFS=$OLD_IFS
391
392 if [ "$1" != "$DOWNLOAD_DIST" ] || \
393 [ "$2" != "$DOWNLOAD_RELEASE" ] || \
394 [ "$3" != "$DOWNLOAD_ARCH" ] || \
395 [ "$4" != "$DOWNLOAD_VARIANT" ] || \
396 [ -z "$6" ]; then
397 continue
398 fi
399
9accc2ef 400 DOWNLOAD_BUILD=$5
71d3a659
SG
401 DOWNLOAD_URL=$6
402 break
403 done < ${DOWNLOAD_TEMP}/index
404
405 if [ -z "$DOWNLOAD_URL" ]; then
406 echo "ERROR: Couldn't find a matching image." 1>&1
407 exit 1
408 fi
409
9accc2ef
SG
410 if [ -d "$LXC_CACHE_PATH" ] && [ -f "$LXC_CACHE_PATH/build_id" ] && \
411 [ "$(cat $LXC_CACHE_PATH/build_id)" = "$DOWNLOAD_BUILD" ]; then
412 echo "The cache is already up to date."
413 echo "Using image from local cache"
414 else
415 # Download the actual files
416 echo "Downloading the rootfs"
417 download_file $DOWNLOAD_URL/rootfs.tar.xz \
418 ${DOWNLOAD_TEMP}/rootfs.tar.xz normal
419 download_sig $DOWNLOAD_URL/rootfs.tar.xz.asc \
420 ${DOWNLOAD_TEMP}/rootfs.tar.xz.asc normal
421 gpg_validate ${DOWNLOAD_TEMP}/rootfs.tar.xz.asc
422
423 echo "Downloading the metadata"
424 download_file $DOWNLOAD_URL/meta.tar.xz \
425 ${DOWNLOAD_TEMP}/meta.tar.xz normal
426 download_sig $DOWNLOAD_URL/meta.tar.xz.asc \
427 ${DOWNLOAD_TEMP}/meta.tar.xz.asc normal
428 gpg_validate ${DOWNLOAD_TEMP}/meta.tar.xz.asc
429
430 if [ -d $LXC_CACHE_PATH ]; then
431 rm -Rf $LXC_CACHE_PATH
432 fi
433 mkdir -p $LXC_CACHE_PATH
434 mv ${DOWNLOAD_TEMP}/rootfs.tar.xz $LXC_CACHE_PATH
435 if ! tar Jxf ${DOWNLOAD_TEMP}/meta.tar.xz -C $LXC_CACHE_PATH; then
436 echo "ERROR: Invalid rootfs tarball." 2>&1
437 exit 1
438 fi
71d3a659 439
9accc2ef
SG
440 echo $DOWNLOAD_BUILD > $LXC_CACHE_PATH/build_id
441
442 if [ -n "$LXC_MAPPED_UID" ] && [ "$LXC_MAPPED_UID" != "-1" ]; then
0d656b05 443 chown -R $LXC_MAPPED_UID $LXC_CACHE_BASE >/dev/null 2>&1 || true
9accc2ef 444 fi
2133f58c
SH
445 if [ -n "$LXC_MAPPED_GID" ] && [ "$LXC_MAPPED_GID" != "-1" ]; then
446 chgrp -R $LXC_MAPPED_GID $LXC_CACHE_BASE >/dev/null 2>&1 || true
447 fi
9accc2ef 448 echo "The image cache is now ready"
71d3a659 449 fi
71d3a659
SG
450else
451 echo "Using image from local cache"
452fi
453
454# Unpack the rootfs
455echo "Unpacking the rootfs"
fecf101c
SG
456
457EXCLUDES=""
458excludelist=$(relevant_file excludes)
459if [ -f "${excludelist}" ]; then
460 while read line; do
461 EXCLUDES="$EXCLUDES --exclude=$line"
462 done < $excludelist
71d3a659
SG
463fi
464
fecf101c
SG
465tar --anchored ${EXCLUDES} --numeric-owner -xpJf \
466 ${LXC_CACHE_PATH}/rootfs.tar.xz -C ${LXC_ROOTFS}
467
468mkdir -p ${LXC_ROOTFS}/dev/pts/
469
71d3a659
SG
470# Setup the configuration
471configfile=$(relevant_file config)
472fstab=$(relevant_file fstab)
473if [ ! -e $configfile ]; then
474 echo "ERROR: meta tarball is missing the configuration file" 1>&2
475 exit 1
476fi
477
478## Extract all the network config entries
479sed -i -e "/lxc.network/{w ${LXC_PATH}/config-network" -e "d}" \
480 ${LXC_PATH}/config
481
482## Extract any other config entry
483sed -i -e "/lxc./{w ${LXC_PATH}/config-auto" -e "d}" ${LXC_PATH}/config
484
485## Append the defaults
486echo "" >> ${LXC_PATH}/config
487echo "# Distribution configuration" >> ${LXC_PATH}/config
488cat $configfile >> ${LXC_PATH}/config
489
490## Add the container-specific config
491echo "" >> ${LXC_PATH}/config
492echo "# Container specific configuration" >> ${LXC_PATH}/config
493if [ -e "${LXC_PATH}/config-auto" ]; then
494 cat ${LXC_PATH}/config-auto >> ${LXC_PATH}/config
495 rm ${LXC_PATH}/config-auto
496fi
497if [ -e "$fstab" ]; then
498 echo "lxc.mount = ${LXC_PATH}/fstab" >> ${LXC_PATH}/config
499fi
500echo "lxc.utsname = ${LXC_NAME}" >> ${LXC_PATH}/config
501
502## Re-add the previously removed network config
503if [ -e "${LXC_PATH}/config-network" ]; then
504 echo "" >> ${LXC_PATH}/config
505 echo "# Network configuration" >> ${LXC_PATH}/config
506 cat ${LXC_PATH}/config-network >> ${LXC_PATH}/config
507 rm ${LXC_PATH}/config-network
508fi
509
510TEMPLATE_FILES="${LXC_PATH}/config"
511
512# Setup the fstab
513if [ -e $fstab ]; then
514 cp ${fstab} ${LXC_PATH}/fstab
515 TEMPLATE_FILES="$TEMPLATE_FILES ${LXC_PATH}/fstab"
516fi
517
518# Look for extra templates
519if [ -e "$(relevant_file templates)" ]; then
520 while read line; do
521 fullpath=${LXC_ROOTFS}/$line
522 [ ! -e "$fullpath" ] && continue
523 TEMPLATE_FILES="$TEMPLATE_FILES $fullpath"
524 done < $(relevant_file templates)
525fi
526
527# Replace variables in all templates
528for file in $TEMPLATE_FILES; do
fad96766 529 [ ! -f "$file" ] && continue
71d3a659
SG
530
531 sed -i "s#LXC_NAME#$LXC_NAME#g" $file
532 sed -i "s#LXC_PATH#$LXC_PATH#g" $file
533 sed -i "s#LXC_ROOTFS#$LXC_ROOTFS#g" $file
534 sed -i "s#LXC_TEMPLATE_CONFIG#$LXC_TEMPLATE_CONFIG#g" $file
535 sed -i "s#LXC_HOOK_DIR#$LXC_HOOK_DIR#g" $file
536done
537
538if [ -n "$LXC_MAPPED_UID" ] && [ "$LXC_MAPPED_UID" != "-1" ]; then
0d656b05 539 chown $LXC_MAPPED_UID $LXC_PATH/config $LXC_PATH/fstab >/dev/null 2>&1 || true
71d3a659 540fi
2133f58c
SH
541if [ -n "$LXC_MAPPED_GID" ] && [ "$LXC_MAPPED_GID" != "-1" ]; then
542 chgrp $LXC_MAPPED_GID $LXC_PATH/config $LXC_PATH/fstab >/dev/null 2>&1 || true
543fi
71d3a659
SG
544
545if [ -e "$(relevant_file create-message)" ]; then
546 echo ""
547 echo "---"
548 cat "$(relevant_file create-message)"
549fi
550
551exit 0