Ceci est la configuration :
- OSX Yosemite
- Service basé sur Java qui est lancé en utilisant un LaunchDaemon
- Le service est lancé avec un utilisateur personnalisé qui est créé pendant l'installation
- L'utilisateur a un répertoire personnel personnalisé pour sauvegarder certaines informations, comme les préférences
Voici comment l'utilisateur est créé :
DEAMON_USER="{{daemonUser}}"
HOME_DIRECTORY="{{homeDirectory}}"
SERVICE_DESCRIPTION="{{displayName}}"
# trouver le prochain UID et GID qui est en-dessous de 500, afin que nous puissions créer l'utilisateur du service
# si l'utilisateur ou le groupe existe déjà, il utilisera cet ID existant et fera quand même le reste. Nous pourrions avoir des modifications à apporter.
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 "Utilisera '${NEXTUID}' comme Identifiant Utilisateur et '${NEXTGID}' comme ID de groupe pour l'Utilisateur '${DEAMON_USER}'"
#########################################################################################################
dscl . -create "/Users/${DEAMON_USER}" UniqueID "${NEXTUID}"
dscl . -create "/Users/${DEAMON_USER}" PrimaryGroupID "${NEXTGID}"
dscl . -create "/Users/${DEAMON_USER}" NFSHomeDirectory "${HOME_DIRECTORY}"
# Impossible de se connecter en tant qu'utilisateur standard
dscl . -create "/Users/${DEAMON_USER}" UserShell /usr/bin/false
dscl . -create "/Users/${DEAMON_USER}" RealName "${SERVICE_DESCRIPTION} Administrateur"
# Mot de passe inutilisable pour les utilisateurs standard
dscl . -create "/Users/${DEAMON_USER}" Password \*
#########################################################################################################
#########################################################################################################
dscl . -create "/Groups/${DEAMON_USER}" PrimaryGroupID "${NEXTGID}"
# Mot de passe inutilisable pour les utilisateurs standard
dscl . -create "/Groups/${DEAMON_USER}" Password \*
#########################################################################################################
# créer le répertoire personnel
mkdir -p "${HOME_DIRECTORY}/Bibliothèque/Préférences" && chown -R "${DEAMON_USER}:${DEAMON_USER}" "${HOME_DIRECTORY}" || true
Le service crée généralement des préférences utilisateur qui sont ensuite stockées dans le répertoire ~/Bibliothèque/Préférences
- dans un magasin pris en charge par plist.
Mais pas avec l'utilisateur créé ci-dessus. Les préférences ne sont jamais sauvegardées. Je sais qu'il y a un service qui garde les préférences en synchronisation avec la mémoire et le système de fichiers (il ne fonctionne pas pour le nouvel utilisateur).
La question est : qu'est-ce qui ne va pas avec Java - que faudrait-il faire pour corriger cela - ou avec la manière dont l'utilisateur système est créé.
Même un simple programme Java comme celui-ci ne déclenche pas l'écriture des préférences :
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" ) );
}
}
Exécuter ce programme avec l'utilisateur du service produira le mauvais résultat et ne créera pas un fichier de préférences Java pour mettre à jour un existant.