@@ -26,6 +26,117 @@ function applyResultsFile() {
2626 set +a
2727}
2828
29+ function loadEnvFromFile() {
30+ local source=${1?Missing required source argument}
31+ local downloaded=
32+
33+ if isURL " $source " ; then
34+ mkdir -p /data/.tmp
35+ downloaded=$( mktemp -p /data/.tmp)
36+ log " Downloading env file from $source "
37+ if ! get -o " $downloaded " " $source " ; then
38+ logError " Failed to download env file from $source "
39+ rm -f " $downloaded "
40+ return 1
41+ fi
42+ log " Loading env vars from $source "
43+ applyResultsFile " $downloaded "
44+ rm -f " $downloaded "
45+ elif [ -f " $source " ]; then
46+ log " Loading env vars from $source "
47+ applyResultsFile " $source "
48+ else
49+ logError " Env file not found: $source "
50+ return 1
51+ fi
52+ }
53+
54+ function loadEnvFromArchive() {
55+ local source=${1?Missing required source argument}
56+ local entry=${2:- .env}
57+ local archive=
58+ local downloaded=
59+ local tmpdir
60+ local rc=0
61+
62+ mkdir -p /data/.tmp
63+
64+ if isURL " $source " ; then
65+ downloaded=$( mktemp -p /data/.tmp)
66+ log " Downloading archive from $source "
67+ if ! get -o " $downloaded " " $source " ; then
68+ logError " Failed to download archive from $source "
69+ rm -f " $downloaded "
70+ return 1
71+ fi
72+ archive=$downloaded
73+ elif [ -f " $source " ]; then
74+ archive=$source
75+ else
76+ logError " Archive not found: $source "
77+ return 1
78+ fi
79+
80+ tmpdir=$( mktemp -d -p /data/.tmp)
81+ if extract " $archive " " $tmpdir " " $entry " && [ -f " $tmpdir /$entry " ]; then
82+ log " Loading env vars from '$entry ' in $source "
83+ applyResultsFile " $tmpdir /$entry "
84+ else
85+ logError " Failed to load env entry '$entry ' from $source "
86+ rc=1
87+ fi
88+
89+ rm -rf " $tmpdir "
90+ [[ -n " $downloaded " ]] && rm -f " $downloaded "
91+ return $rc
92+ }
93+
94+ function loadEnvFromGenericPack() {
95+ : " ${GENERIC_PACKS:= ${GENERIC_PACK:- } } "
96+ : " ${GENERIC_PACKS_PREFIX:= } "
97+ : " ${GENERIC_PACKS_SUFFIX:= } "
98+
99+ if [[ -z " ${GENERIC_PACKS} " ]]; then
100+ logWarning " LOAD_ENV_FROM_GENERIC_PACK is set but GENERIC_PACK(S) is empty"
101+ return 0
102+ fi
103+
104+ mkdir -p /data/.tmp
105+ IFS=' ,' read -ra packs <<< " ${GENERIC_PACKS}"
106+ local loaded=0
107+ local pack packEntry packFile tmpdir
108+ for packEntry in " ${packs[@]} " ; do
109+ pack=" ${GENERIC_PACKS_PREFIX}${packEntry}${GENERIC_PACKS_SUFFIX} "
110+ if isURL " $pack " ; then
111+ mkdir -p /data/packs
112+ if ! packFile=$( get -o /data/packs --output-filename --skip-up-to-date " $pack " ) ; then
113+ logError " Failed to download generic pack $pack "
114+ return 1
115+ fi
116+ else
117+ packFile=$pack
118+ fi
119+
120+ if [[ ! -f " $packFile " ]]; then
121+ logError " Generic pack not found: $packFile "
122+ return 1
123+ fi
124+
125+ tmpdir=$( mktemp -d -p /data/.tmp)
126+ # Packs without a .env are valid — silently skip; the unpack step still applies them.
127+ if extract " $packFile " " $tmpdir " .env 2> /dev/null && [ -f " $tmpdir /.env" ]; then
128+ log " Loading env vars from .env in $pack "
129+ applyResultsFile " $tmpdir /.env"
130+ loaded=$(( loaded + 1 ))
131+ fi
132+ rm -rf " $tmpdir "
133+ done
134+
135+ if (( loaded == 0 )) ; then
136+ logWarning " LOAD_ENV_FROM_GENERIC_PACK is set but no pack in GENERIC_PACK(S) contained a .env"
137+ fi
138+ }
139+
29140function join_by() {
30141 local d=$1
31142 shift
@@ -445,17 +556,19 @@ function isType() {
445556function extract() {
446557 src=${1?}
447558 destDir=${2?}
559+ shift 2
560+ # remaining args are paths within the archive to extract; if none, extract everything
448561
449562 type=$( file -b --mime-type " ${src} " )
450563 case " ${type} " in
451564 application/zip)
452- unzip -o -q -d " ${destDir} " " ${src} "
565+ unzip -o -q -d " ${destDir} " " ${src} " " $@ "
453566 ;;
454567 application/x-tar | application/gzip | application/x-gzip | application/x-bzip2)
455- tar -C " ${destDir} " -xf " ${src} "
568+ tar -C " ${destDir} " -xf " ${src} " " $@ "
456569 ;;
457570 application/zstd | application/x-zstd)
458- tar -C " ${destDir} " --use-compress-program=unzstd -xf " ${src} "
571+ tar -C " ${destDir} " --use-compress-program=unzstd -xf " ${src} " " $@ "
459572 ;;
460573 * )
461574 logError " Unsupported archive type: $type "
0 commit comments