El servicio OSX con usuario personalizado no escribe las Preferencias de Java

0

Esta es la configuración:

  • OSX Yosemite
  • servicio basado en Java que se está iniciando con LaunchDaemon
  • El servicio se inicia con un usuario personalizado que se crea durante la instalación
  • El usuario tiene un directorio de inicio personalizado para guardar cierta información, como las preferencias

Aquí es cómo se crea el usuario:

DEAMON_USER="{{daemonUser}}"
HOME_DIRECTORY="{{homeDirectory}}"
SERVICE_DESCRIPTION="{{displayName}}"

# find the next UID and GID that is below 500, so that we can create the service user
# if the user or group already exists, it will use this existing ID and still do the rest. We might have changes to commit.
NEXTUID=$(ID='dscl . -read "/Users/${DEAMON_USER}" UniqueID 2> /dev/null | awk '{print $2}'' && [ ! -z "$ID" ] && echo "$ID" || dscl . -list /Users UniqueID | awk 'BEGIN{i=0}{if($2>i&&$2<500)i=$2}END{print i+1}')
NEXTGID=$(ID='dscl . -read "/Groups/${DEAMON_USER}" PrimaryGroupID 2> /dev/null | awk '{print $2}'' && [ ! -z "$ID" ] && echo "$ID" || dscl . -list /Groups PrimaryGroupID | awk 'BEGIN{i=0}{if($2>i&&$2<500)i=$2}END{print i+1}')

echo "Will use '${NEXTUID}' as UserID and '${NEXTGID}' as group ID for User '${DEAMON_USER}'"

#########################################################################################################
dscl . -create "/Users/${DEAMON_USER}" UniqueID "${NEXTUID}"
dscl . -create "/Users/${DEAMON_USER}" PrimaryGroupID "${NEXTGID}"
dscl . -create "/Users/${DEAMON_USER}" NFSHomeDirectory "${HOME_DIRECTORY}"

# Can't login as standard user
dscl . -create "/Users/${DEAMON_USER}" UserShell /usr/bin/false
dscl . -create "/Users/${DEAMON_USER}" RealName "${SERVICE_DESCRIPTION} Administrator"

# Unusable password for standard users
dscl . -create "/Users/${DEAMON_USER}" Password \*
#########################################################################################################

#########################################################################################################
dscl . -create "/Groups/${DEAMON_USER}" PrimaryGroupID "${NEXTGID}"
# Unusable password for standard users
dscl . -create "/Groups/${DEAMON_USER}" Password \*
#########################################################################################################

# make home directory
mkdir -p "${HOME_DIRECTORY}/Library/Preferences" && chown -R "${DEAMON_USER}:${DEAMON_USER}" "${HOME_DIRECTORY}" || true

El servicio generalmente crea preferencias de usuario que luego se almacenan en el directorio ~/Library/Preferences - en un almacén respaldado por plist.

Pero no con el usuario creado anteriormente. Las preferencias nunca se guardan. Sé que hay un servicio que mantiene las preferencias sincronizadas con la memoria y el sistema de archivos (no se está ejecutando para el nuevo usuario).

La pregunta es: ¿qué está mal con Java? ¿qué se necesita para corregirlo? o con la forma en que se crea el usuario del sistema.

Incluso un programa java simple como el siguiente no activa la escritura de las preferencias:

import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
public class prefTest {
    public static void main( String[] args ) throws BackingStoreException {
        System.out.println( System.getProperty( "user.home" ) );
        Preferences userRoot = Preferences.userRoot();
        userRoot.put( "Test", "Value" );
        userRoot.flush();
        System.out.println( userRoot.get( "Test", "DEFAULT" ) );
    }
}

La ejecución de este programa con el usuario del servicio dará como resultado un resultado incorrecto y no creará un archivo de preferencias de Java para actualizar una existente.

    
pregunta gamma 21.09.2016 - 13:33

1 respuesta

1

Parece que encontré una solución por mi cuenta. John Keates ha hecho algunos buenos puntos que me hicieron revisar un poco más la web.

Lo resolví utilizando las siguientes dos líneas con el script de creación de usuario:

dscl . -delete /Users/_helpdesk PasswordPolicyOptions
dscl . -delete /Users/_helpdesk AuthenticationAuthority
    
respondido por el gamma 22.09.2016 - 08:19

Lea otras preguntas en las etiquetas