Durante el late_command
paso de una instalación desatendida, estoy ejecutando un script de shell:
d-i preseed/late_command string in-target /bin/sh -c './execute-script.sh'
Cuando se alcanza el paso late_command, la interfaz de usuario (fondo azul, ventana gris) muestra el mensaje "Ejecutando preseed...":
Me pregunto si hay alguna forma de mostrar otros mensajes en función de lo que execute-script.sh
está haciendo.
Ingenuamente pensé que usar el STDOUT normal con ecos funcionaría, pero parece más complicado.
Mis búsquedas hasta ahora me han llamado la atención sobre un uso potencial de debconf
pero no he podido encontrar ninguna manera.
La versión actual de mi script se modificó según la respuesta de @Andrew:
#!/bin/sh
. /usr/share/debconf/confmodule
. "./variables.sh"
logFile="/target${INSTALLATION_LOG_LOCATION}"
templatePath="/target/tmp/deployment_progress_tracker.templates"
cat > "${templatePath}" << 'EOF'
Template: deployment_progress_tracker/progress/fallback
Type: text
Description: ${STEP}...
EOF
debconf-loadtemplate deployment_progress_tracker "${templatePath}"
db_progress START 0 1 deployment_progress_tracker/progress
watchLogs () {
deploymentDone=false
while ! $deploymentDone
do
if [ -f "${logFile}" ]; then
step=$(grep -E -o -a -h "Progress-step: .*" "${logFile}" | tail -1 | sed 's/Progress-step: //')
if [ -z "${step##*$DEPLOYMENT_FINISHED*}" ]; then
deploymentDone=true
elif [ -n "${step}" ]; then
db_subst deployment_progress_tracker/progress/fallback STEP "${step}"
db_progress INFO deployment_progress_tracker/progress/fallback
fi
fi
sleep 3
done
}
(
watchLogs;
rm -f "${templatePath}";
db_progress SET 1;
sleep 1;
db_progress STOP;
db_unregister deployment_progress_tracker/progress;
) &
El script anterior dará como resultado lo siguiente:
Y conduce de regreso al menú del instalador (al elegir Finalizar, la instalación ejecutará nuevamente la parte preestablecida y fallará, al elegir Abortar no se desmontará el ISO ni se reiniciará; de todos modos, estoy tratando de que tanto el desmontaje como el reinicio se realicen automáticamente):
Respuesta1
Estará bastante limitado debconf
y puede que no valga la pena el esfuerzo. No creo que puedas hacerlo en absoluto con la ejecución de un script in-target
. Tuve éxito al utilizar el siguiente fragmento y secuencia de comandos preestablecidos con Debian Buster. Cambia el texto donde Running Preseed...
se muestra tres veces. Se mostrará
Step A
Step B
Running c...
(la opción "alternativa")
Archivo preestablecido parcial para descargar y ejecutar un script.
d-i preseed/late_command string \
wget -P /run http://REDACTED/my_script.sh ; \
chmod 755 /run/my_script.sh ; \
/run/my_script.sh
Contenido de my_script.sh
.
#!/bin/sh
. /usr/share/debconf/confmodule
set -e
# create a templates file with the strings for debconf to display
cat > /run/my_script.templates << 'EOF'
Template: my_script/progress/a
Type: text
Description: Step A
Template: my_script/progress/b
Type: text
Description: Step B
Template: my_script/progress/fallback
Type: text
Description: Running ${STEP}...
EOF
# use the utility to load the generated template file
debconf-loadtemplate my_script /run/my_script.templates
# pause just to show "Running Preseed..."
sleep 2
# foreach 3 steps tell debconf which template string to display
for step in a b c; do
if ! db_progress INFO my_script/progress/$step; then
db_subst my_script/progress/fallback STEP "$step"
db_progress INFO my_script/progress/fallback
fi
case $step in
"a")
# run commands or scripts in the installer environment (this uses the sleep command in the installer environment)
sleep 10
;;
"b")
# run commands or scripts in the chroot environment (this uses the sleep command from the installed system)
in-target sleep 10
;;
"c")
# just another sample step
sleep 10
;;
esac
done
El script y el archivo de plantillas generado se basan en el finish-install
( debian-installer
paquete)guionyplantillas.