pthbs-enter-gen (2925B)
1 #!/bin/sh -e 2 3 if test $# != 1; then 4 printf >2 'usage: %s\n' "pthbs-enter-gen /path/to/env.hash" 5 printf >2 'Error: expected 1 argument, got%s\n' "$#" 6 exit 2 7 fi 8 envtop=$1 9 envdir=$envtop/env 10 envcommand=$envtop/command 11 12 case $(basename "$envtop") in 13 (env.*) ;; 14 (*) 15 printf >&2 "Error: '%s' doesn't look like environment path!\n" "$envtop" 16 exit 1;; 17 esac 18 19 mkdir -p "$envdir" 20 21 if ! test -d "$envcommand"; then 22 printf >&2 "Error: '%s' doesn't exist!\n" "$envcommand" 23 fi 24 printf '%s\n' "$envcommand" >"$envdir/PATH" 25 26 27 if test -d "$envtop/.env-template"; then 28 for f in "$envtop/.env-template"/*; do 29 if ! test -f "$f"; then 30 case "$f" in 31 ($envtop/.env-template/\*) continue;; 32 esac 33 printf >2 'Error: expected plain file while generating env: %s\n' "$f" 34 exit 1 35 fi 36 sed "s|@ENVROOT@|$envtop|g" <"$f" >"$envdir/${f##*/}" 37 done 38 fi 39 40 mkscript() { 41 exe=$envcommand/$1 42 cat >"$exe.new" 43 chmod +x "$exe.new" 44 mv "$exe.new" "$exe" 45 } 46 47 exe=$envcommand/pthbs-enter 48 if test -x "$envcommand/execlineb" && test -x "$envcommand/s6-envdir"; then 49 mkscript pthbs-enter <<EOF 50 #!$envcommand/execlineb -S0 51 "$envcommand/s6-envdir" "$envdir" "$envcommand/exec" \$@ 52 EOF 53 "$envcommand/pthbs-enter" true # TODO: don't run executables without sandbox 54 mkscript pthbs-enter-execlineb <<EOF 55 #!$envcommand/execlineb -S0 56 "$envcommand/s6-envdir" "$envdir" "$envcommand/execlineb" \$@ 57 EOF 58 if test -x "$envcommand/sh"; then 59 mkscript pthbs-enter-sh <<EOF 60 #!$envcommand/execlineb -S0 61 "$envcommand/s6-envdir" "$envdir" "$envcommand/sh" \$@ 62 EOF 63 fi 64 elif test -x "$envcommand/sh" && test -x "$envcommand/envdir"; then 65 mkscript pthbs-enter <<EOF 66 #!$envcommand/sh 67 exec "$envcommand/envdir" "$envdir" "$envcommand/env" -- "\$@" 68 EOF 69 "$envcommand/pthbs-enter" true # TODO: don't run executables without sandbox 70 mkscript pthbs-enter-sh <<EOF 71 #!$envcommand/sh 72 exec "$envcommand/envdir" "$envdir" "$envcommand/sh" "\$@" 73 EOF 74 fi 75 76 if test -x "$envcommand/install-as-current-environment.postinstall"; then 77 mkscript install-as-current-environment <<EOF 78 #!$envcommand/execlineb -P 79 "$envcommand/s6-envdir" "$envdir" "$envcommand/exec" 80 ifelse -n { test -L /run/current } { 81 if { ln -s -f -v "$envtop" /run/current } 82 "$envcommand/install-as-current-environment.postinstall" 83 } 84 foreground { 85 fdmove -c 1 2 86 printf "* Swapping /run/current from %s to " "$envtop" 87 readlink /run/command 88 } 89 getpid NS_PID 90 importas -i NS_PID NS_PID 91 if { mv -v /run/current /run/previous.\${NS_PID} } 92 if { ln -s -f -v "$envtop" /run/current } 93 ifelse { 94 "$envcommand/install-as-current-environment.postinstall" /run/previous.\${NS_PID} 95 } { } 96 foreground { 97 fdmove -c 1 2 98 printf "* %s returned error, reverting to " "$envcommand/install-as-current-environment.postinstall" 99 readlink /run/previous.\${NS_PID} 100 } 101 if { rm -v /run/current } 102 if { mv -v /run/previous.\${NS_PID} /run/current } 103 #foreground { /run/current/command/install-as-current-environment.postinstall } 104 exit 1 105 EOF 106 fi