= Installation de auf-django-users sur une base de données NSS existante =

La procédure que je vais décrire (ainsi que les commandes SQL) est quasiment exactement ce qu'il faut faire pour installer auf-django-users sur le modèle de base de données décrit ici :
http://wiki.auf.org/wikiteki/AuthentificationCentralis%C3%A9e/NssMysql. On part de l'ancien modèle de Nss qui est existe déjà dans plusieurs implantations. 

L'idée générale est de ramener la base de données dans un schéma tel que l'application auf-django-users puisse en gérer les utilisateurs qui se trouvent dans la table users.

==  Commençons par installer les paquets necessaires ==
Rajoutons cette ligne dans /etc/apt/sources.list : 
{{{
deb http://apt.auf.org lenny auf
}}}

Puis installons successivement : '''apache2''', '''auf-keyring''', '''auf-django-users''', '''libapache2-mod-wsgi'''.

== Tapons les commandes SQL necessaires ==

Je suppose que la base de données s'appelle '''authnss''', que l'utilisateur à configurer dans l'appli sera '''django''' et que son mot de passe sera '''sabata''' et qu'il se connectera depuis la machine elle même '''127.0.0.1'''.

Et ça donne ça :

{{{
// Création de l'utilisateur qui accèdera à la base de données
mysql> grant
    -> select, insert, update, delete, create, drop, alter, index
    -> on authnss.*
    -> to django@127.0.0.1
    -> identified by "sabata";

// Ajout de la colonne source : Les utilisateurs locaux auront LOCAL comme source
// L'appli ne gèrera que les comptes locaux
mysql> alter table users 
    -> add column  source 
    -> varchar(15) 
    -> default 'LOCAL'         
    -> not null; 

// Ajout d'une date de création
mysql> alter table users 
    -> add column creation datetime 
    -> default "1970/01/01" 
    ->  not null ; 

// Ajout d'une date de modification
mysql> alter table users 
    -> add column modification 
    -> datetime 
    -> default "1970/01/01"; 

// Préparation à la suppression de la clé primaire uid
mysql>  ALTER TABLE users MODIFY uid int(11) NOT NULL UNIQUE;

// On remplit les champs de création et de modification à partir de maintenant pour tous les comptes (un point de départ)
mysql> update users 
    -> set creation = now() , modification = now() 
    -> where uid <> 'quelquechose'; 

// Tous les utilisateurs étant locaux, on met la source à LOCAL
mysql> update users 
    -> set source = 'LOCAL' 
    -> where source <> 'LOCAL'; 

// gid est un entier int10
mysql> alter table users 
    -> modify column gid 
    -> int(10) 
    -> not null default 10000; 

// gid à 10000 pour tout le monde : un groupe users sera créé par la suite avec gid 10000
mysql> update users 
    -> set gid = 10000 
    -> where gid <> 10000 ; 

// Voilà ! Création du groupe users gid 10000
mysql> insert into groups
    -> values ('users','x','10000');

// Changement du champ rowid en id : on utilise plutôt id dans auf-django-users
mysql> alter table grouplist 
    -> change rowid id 
    -> int(10) auto_increment ; 

// Changement de clé primaire : username devient la clé
mysql>  ALTER TABLE users DROP PRIMARY KEY, ADD PRIMARY KEY(username);

// On augmente la taille de username dans grouplist
mysql>  ALTER TABLE grouplist modify username varchar(128) NOT NULL; 

}}}
'''FIN des commandes SQL'''

==  Configuration de auf-django-users et lancement ==

# vi /etc/auf-django-users/conf.py 
{{{
DATABASE_ENGINE = 'mysql'    # parce que nous avons une base de données mysql
DATABASE_NAME = 'authnss'    # parce que notre base de donées s'appelle authnss
DATABASE_USER = 'django'             # L'utilisateur qui a reçu les droits necessaires
DATABASE_PASSWORD = 'sabata'         # Son mot de passe
DATABASE_HOST = '127.0.0.1'          # L'IP du serveur qui a la base de données
}}}
Rien d'autre ne change dans le fichier à ce stade

# auf-django-users-manage.py syncdb
Puis repondre aux questions qui sont posées : l'administrateur de django-users, son email, son mot de passe, ...
Si on a des erreurs à ce niveau, c'est que nous avons raté quelque chose dans ce qui est fait plus haut, lire correctement les erreurs et faire le changement qu'il faut dans la base de données à l'aide d'une requête SQL en se basant sur les commandes SQL plus haut.

Puis ajoutons cette ligne dans un virtualhost : 
{{{ Include /etc/auf-django-users/apache.conf }}}

# apache2ctl graceful #
Puis accédons à notre page web avec le nom donné dans le virtualhost.

==  Cas d'erreur ==

On rencontre dans certains cas d'utilisation de l'appli des erreurs du genre '''data truncated''' ou des trucs qui parlent de lignes trop longues ...
Ce type d'erreur est plutôt lié à la base de données mysql et non à django.
Il faut donc encore taper quelques SQL pour corriger :
{{{
mysql> alter table auth_group default character set utf8;
mysql> alter table auth_group_permissions default character set utf8;
mysql> alter table auth_message default character set utf8;
mysql> alter table auth_premission default character set utf8;
mysql> alter table auth_user default character set utf8;
mysql> alter table auth_user_groups default character set utf8;
mysql> alter table auth_user_user_permissions default character set utf8;
mysql> alter table django_admin_log default character set utf8;
mysql> alter table django_content_type default character set utf8;
mysql> alter table django_session default character set utf8;
}}}
Puis refaire le syncdb (auf-django-users-manage.py syncdb) et le rechargement de apache.

==  Cas de base de données un peu plus sophistiquées ==

En général, la différence se situe au niveau du champ id_noyau qui existe au niveau de la table users.
Il faut donc transformer id_noyau en source comme ceci :
{{{
mysql> alter table users 
    -> change column id_noyau  source 
    -> varchar(15) 
    -> default 'LOCAL'         
    -> not null; 
}}}

Puis, il n'y a pas qu'une seule source qui est locale, mais plusieurs.

En générale :
 * ce qui est égal à -1 dans id_noyau correspondra à LOCAL pour source
 * ce qui est -2 pour id_noyau sera AUF pour source
 * si autre chose existe, on pourra trouver des noms les correspondant.
Ce qui donne les requêtes suivantes :
{{{
mysql> update users
    -> set source = 'LOCAL'
    -> where source = -1;

mysql> update users set source = 'AUF' where source = -2;

mysql> update users set source = 'Autre' where source <> 'AUF' and source <> 'LOCAL';
}}}

Les autres requêtes qui ne portent pas sur source ne changent pas, elles sont les mêmes que celles déjà écrites plus haut.

== Pour les plus curieux ==

Vous pouvez voir dans ce répertoire : '''/usr/share/python-support/auf-django-users/aufusers''' et écrire vos propres contrib ; '''update-python-modules auf-django-users''' pour valider les modifs.