Générer ses comptes kwartz depuis SIECLE et Pronote

Plusieurs fois par an, il faut générer les fichiers d’importation pour kwartz. Sconet/kwartz permet déjà cela, mais il ne n’associe pas automatiquement les profs à leurs classes. J’ai donc développé un petit outil en python qui utilise les données de Pronote pour créer ces affectations (de manière optionnelle).

Récupération des données

Exportation de SIECLE

(Pour obtenir la liste des élèves et leurs affectations.)

Avec le compte d’un personnel administratif, se connecter sur SIECLE puis faire une exportation xml de la Base Élève Établissement (BEE). Le fichier obtenu étant zippé, il faut de décompresser avant utilisation.

Exportation Kwartz

(Pour obtenir l’état actuel des comptes.)

À partir de la version 5, dans l’onglet Utilisateurs > Gestion des comptes > Exporter > Exporter le fichier
Le fichier arrive sur le compte winadmin de kwartz (\\kwartz\winadmin\Listes utilisateurs).

Exportation Pronote

(Facultatif – Pour obtenir la liste des profs et leurs affectations.)

Se connecter en administrateur à Pronote puis :
Fichier > Autres imports/exports > Exporter un fichier texte
Dans la liste déroulante « Type de données à exporter », choisir Services, puis cliquer sur Exporter.

La moulinette

Avec nos fichiers, il ne reste plus qu’à lancer le script en précisant le nom du groupe dans lequel se trouve les profs sur kwartz :

python3 crea_kwartz.py profs ElevesSansAdresses.xml Exportation_kwartz.txt [EXP_SERVICES_pronote.txt]

Quatre fichiers sont générés :
* Aajouter.txt pour les comptes à ajouter ;
* Amodifier.txt pour les comptes à modifier ;
* Asupprimer.txt pour les comptes à désactiver (à affecter au groupe « anciens »), ou à supprimer ;
* Messages.txt contenant tous les messages d’avertissement provoqués par la génération des trois fichiers précédant.

Reste plus qu’à retourner sur kwartz ( Utilisateurs > Importer ) pour mettre à jour les comptes.

J’essaierais d’ajouter une interface web à l’occasion pour rendre plus pratique l’exécution du script :)

Kwartz et OwnCloud

Depuis la version 5, kwartz intègre une solution ownCloud (toujours en version 4.0.7 jusque aujourd’hui, c’est-à-dire la 6.0r1). Un des cotés pratique de ownCloud est le client de synchronisation ; voici comment le paramétrer.

Il faut d’abord récupérer une version du owncloud-client compatible ; en l’occurrence il s’agit de la 1.0.5. Comme cette version n’est plus distribuée depuis Mathusalem, je l’ai mis à disposition sur un de mes serveurs.

Pendant l’installation, il faut préciser l’adresse de son serveur (« http://IP_DU_SERVEUR_KWARTZ/owncloud »), ainsi que ses identifiants de connexion :
owncloud_serveur

Puis il faut valider le certificat de sécurité ssl du serveur :
owncloud_ssl

Après l’installation, il faut encore supprimer le profil créé par défaut, ajouter une nouvelle synchronisation en sélectionnant un dossier local, puis en choisissant le dossier à synchroniser (par exemple « Home/Travail/synchro » pour synchroniser le dossier « synchro » du répertoire de travail) :
owncloud_synchro

En précisant uniquement « Home/Travail », cela synchronise tout le répertoire de travail :)

Personnaliser le portail captif de Kwartz

Kwartz 5 et supérieur permet d’utiliser un portail captif pour les connexions wifi. Celui-ci est personnalisable ; ce qui pratique si on veut en faire une version qui est adaptée aux périphériques mobiles (ce qui n’est pas le cas de la version originale).

Il faut d’abord récupérer l’archive contenant les sources html/css du portail : dans Réseau > Portail captif > Personnalisation > Obtenir l’interface par défaut

En décompressant l’archive, il faut maintenant modifier les fichiers login.html et kwartz.css. En suite, il ne reste plus qu’à recompresser le tout dans un zip, et à l’envoyer sur le serveur : dans Réseau > Portail captif > Personnalisation > Parcourir, puis « Transférer le fichier … ».

Je mets en téléchargement ma version modifiée ^^ (En gros j’ai ajouté un tag meta viewport et un clospan oublié, retiré le margin du body, et ajouté un dégradé css en background).

Faire un fsck sur un disque vdi

La virtualisation, c’est bien ; mais comment vérifier l’état d’une partition root dans un disque vdi (sans utiliser de livecd :) ? qemu-nbd !

Sur debian, il faut d’abord installer le paquet qemu, puis charger le module :

rmmod nbd
modprobe nbd max_part=16

(max_part est le nombre maximum de partitions)

On monte l’image avec :

qemu-nbd -c /dev/nbd0 MON_IMAGE.vdi

On obtient un nouveau device /dev/nbd0 et pour chaque partition /dev/nbd0p1...2...3... que l’on peut utiliser avec mount.

Une fois terminé, on démonte le tout avec :

qemu-nbd -d /dev/nbd0

Avec une couche LVM en plus, le mapper trouve automatiquement les correspondances. Pour vérifier, on peut lister les partitions avec la commande pvs.

Reste plus qu’à lancer l’analyse :

fsck -f /dev/MON_IMAGE/root 

Source : http://serverfault.com/questions/210684/how-do-you-mount-a-vdi-image-on-linux

Partager une même installation PlayOnLinux avec les autres utilisateurs

Maintenant que nous avons un linux intégré au kwartz, il serait intéressant d’émuler des applications conçues pour windows, comme Office 2010. C’est exactement ce que permet wine et l’interface qui repose dessus : PlayOnLinux (abrégé POL).

Première limitation de wine, et donc de PlayOnLinux : l’installation d’une application est spécifique à un utilisateur (dans le dossier ~/.PlayOnLinux). Dans un environnement multi-utilisateurs, pas possible d’installer un programme de 2 Go à chaque fois. Une idée serait de copier un dossier POL fonctionnel, et de faire un lien symbolique dessus. Mais seconde limitation de wine : il faut aussi être propriétaire de ces fichiers.

On va donc avoir besoin d’un script qui modifie notre copie de POL à la connexion d’un utilisateur ; ceci n’est possible qu’en root, donc on va devoir configurer aussi sudo. Et il faudra encore modifier les raccourcis définis dans PlayOnLinux (~/.PlayOnLinux/shortcuts) pour qu’ils pointent bien chez l’utilisateur en cours. Tout un programme :)

Préparation de PlayOnLinux et sudo

Après avoir installé le logiciel (ici Office 2010) sur un compte de référence, copions le contenu de ~/.PlayOnLinux dans un dossier commun, par exemple /var/POL :

rm -rf /var/POL
cp -R ~/.PlayOnLinux /var/POL

Ensuite, créons un script de démarrage (/usr/local/bin/office.sh) qui prend en paramètre le nom de l’utilisateur se connectant :

#!/bin/bash
# Attribution du dossier POL
# $1 : username
groupe=$(id -gn $1)
uid=$(id -u $1)
POL=/var/POL
home=$(eval echo ~$1)
lien=$home/.PlayOnLinux

# Sauvegarde du lien précédent
if [ -d "$lien" ]; then
    mv $lien $lien.bak
fi
# Spécifique à Office 2010 : création du dossier utilisateur ...
users=$POL/wineprefix/Office2010/drive_c/users/$uid
mkdir $users
# ... et des liens symboliques pour que office puisse retrouver 
# les dossiers "Mes documents" et "Bureau"
if [ ! -h $users/Mes\ documents ];then
	ln -s $home $users/Mes\ documents
fi
if [ ! -h $users/Bureau ];then
	ln -s $home/Bureau/ $users/Bureau
fi
# Changement de propriétaire du dossier de POL
chown -h -R $1:$groupe $POL
ln -s $POL $lien
chown -h -R $1:$groupe $lien
# Copie des raccourcis sur le bureau
cp --preserve=ownership $POL/shortcuts/*.desktop $home/Bureau

On autorise à exécuter ce script en sudo (en fait, chown nécessite d’être root) sans mot de passe en créant un fichier /etc/sudoers.d/office contenant :

%users ALL=NOPASSWD: /usr/local/bin/office.sh

Ne pas oublier de le verrouiller en écriture pour éviter les fuites :

chmod +x-w /usr/local/bin/office.sh

Modification des raccourcis

Comme on a déplacé le dossier POL, les raccourcis permettant de lancer les apllications ne fonctionnent plus. Dans le dossier /var/POL/shortcuts, il faut d’abord modifier le script d’exécution ; par exemple avec Word 2010 :

#!/bin/bash
[ "$PLAYONLINUX" = "" ] && exit 0
source "$PLAYONLINUX/lib/sources"
export WINEPREFIX="$(eval echo ~$USER)/.PlayOnLinux//wineprefix/Office2010"
export WINEDEBUG="-all"
cd "$WINEPREFIX/drive_c/./Program Files/Microsoft Office/Office14"
POL_Wine "WINWORD.EXE"  "$@"

En fait, comme ~ n’est pas reconnu proprement, j’ai modifié la variable WINEPREFIX et la commande cd. « $(eval echo ~$USER) » permet de retrouver l’adresse absolue du home de l’utilisateur en cours.

On peut aussi créer un raccourci bureau ; pour cela on va créer un fichier Word_2010.destop comme suit :

[Desktop Entry]
Encoding=UTF-8
Name=Word 2010
Comment=PlayOnLinux
Type=Application
Exec=/usr/share/playonlinux/playonlinux --run "Microsoft Word 2010" %F
Icon=/var/POL/icones/full_size/Microsoft Word 2010
Name[fr_FR]=Word 2010
StartupWMClass=Word 2010.exe
Categories=

Ne pas oublier de lui donner les droits d’exécution :

chmod +x Word_2010.destop

Exécution à la connexion

Reste encore à lancer tout cela à l’ouverture d’une session graphique ; modifions le fichier /etc/xprofile comme suit :

#!/bin/sh
bash -c "sudo /usr/local/bin/office.sh $(whoami) > ~/.office.log 2>&1"

sudo permet de changer le propriétaire du dossier /var/POL, bash permet de lancer le script avec bash (et non sh qui est utilisé par défaut), et $(whoami) permet d’avoir le login de la personne se connectant. Et en cas de soucis, on a même un log dans le dossier personnel (~/.office.log).

Tada !

Création d’un réseau téléphonique SIP avec Asterisk

Le but est de mettre en place un serveur de téléphonie SIP interne.

D’abord, quelques points de vocabulaire :
* le registar est le serveur SIP ;
* une extension est en fait un « numéro de téléphone » ;
* l’identity est composée au moins d’un nom de compte, d’un mot de passe et de l’IP du serveur asterisk.

Le serveur

La première chose à faire est d’installer un serveur linux ; ici, j’ai utilisé un serveur Debian 7.

Au passage, j’ai testé AsteriskNow une distribution « prête à l’emploi », avec une sympathique interface web pour gérer son serveur facilement ! Le seul défaut que j’ai noté : l’impossibilité de faire passer les mises à jours à travers mon proxy (c’est apparemment un bug connu de freepbx).

Installons donc Asterisk manuellement :

apt-get install asterisk asterisk-config asterisk-prompt-fr-proformatique

La configuration d’Asterisk passe principalement par trois fichiers :
* /etc/asterisk/asterisk.conf : la configuration générale ;
* /etc/asterisk/sip.conf : le paramétrage du SIP et des comptes ;
* /etc/asterisk/extension.conf : la déclaration des numéros de téléphone.

Pour la configuration générale :

[general]
defaultexpirey=1800
dtmfmode=auto
qualify=yes

Pour chaque téléphone, il faut déclarer le poste dans /etc/asterisk/sip.conf (en remplaçant ce qui est en majuscule) :

[NOM_DU_TEL]
username=NOM_DU_TEL
secret=MOT_DE_PASSE
host=dynamic
context=SALLE_XXX
language=fr

On peut simplifier cela en créant un template de configuration :

[NOM_DU_TEMPLATE](!)
    language=fr
    host=dynamic
    type=friend...
...
[NOM_DU_TEL](NOM_DU_TEMPLATE)
    username=...

Il faut encore associer les numéros de téléphone aux postes ; dans /etc/asterisk/extension.conf :

[SALLE_XXX]
exten => 11,1,Dial(SIP/NOM_DU_TEL)
exten => 12,1,Dial(SIP/NOM_DU_TEL2)
...

Traduction : en composant le 11, on contact le poste NOM_DU_TEL

Reste plus qu’à lancer le service :

/etc/init.d/asterisk start

La conférence

Pour créer une salle de conférence, Astersik inclut un module appelé ConfBridge (remplaçant de MeetMe). Le fichier /etc/asterisk/confbridge.conf permet de définir notamment un nombre maximum de membres par conférence ; par exemple, ici pour avoir au maximum 10 participants :

[default_bridge]
max_members=10

Reste plus qu’à créer un numéro spécifique pour y accéder ; par exemple, voici ce qu’il faut ajouter à /etc/asterisk/extensions.conf pour que le 101 renvoie vers une salle de conférence :

exten => 101,1,Answer()
exten => 101,n,ConfBridge(101)

Interaction avec le serveur

Le serveur tourne comme un démon ; pour interagir avec lui, il faut se connecter sur sa console : asterisk -rv. De la, on a accès à un petit shell dont voici quelques commandes :

CLI> sip show peers    Affiche la liste des équipements connectés
CLI> core restart now  Redémarre le serveur
CLI> core reload       Recharge la configuration (après modification des fichiers de conf)
CLI> dialplan show     Affiche les extensions connues

Les téléphones

Ici, le but est d’authentifier chaque téléphone sur notre nouveau registar. Les téléphones dont je disposes sont des Snom 300 et des 320 (les deux configurations sont très proches).

Le paramétrage des ces téléphones se fait par une interface web. Voici ce que j’ai activé :
Setup > Advanced > QoS/Security > HTTP server
Définir un identifiant/mot de passe pour l’accès web

Setup > Identity 1 > Login
On rentre ici les paramètres de connexion au registar :
– account : le username
– password : le secret
– registar : l’ip du serveur asterisk

Setup > Identity 1 > RTP => RTP Encryption: off
Désactivation du RTP (Real Time Protocol) chiffré (cela posait des problèmes chez moi)

Setup > Advanced > Behavior > Keys => Block DND : on
Désactivation du DND (Do not disturb)

Setup > Advanced > QoS/Security > Security => Administrator Mode : off
Pour empêcher de passer en admin sur le tel

Setup > Advanced > Update => Update Mode : Never update, do not load settings
Pour éviter un message d’erreur concernant l’absence de provisioning (que l’on n’utilise pas ici)

Il est possible d’exporter la configuration d’un téléphone (sans les mots de passe d’administration)
Status > Settings > « Click _here_ to save the settings. »
L’importation se fait à partir de :
Setup > Advanced > Update > Upload Setting File manually
Reste alors à modifier les mots de passe et les identity.

Pour la suite

À voir pour la suite : la connexion avec un fournisseur SIP externe pour pouvoir passer des appels vers l’extérieur, et ajouter des ordinateurs à ce réseau pour pouvoir faire interagir téléphones et postes informatique (Jitsi à l’air prometteur pour cela).

Liens utiles

* http://artisan.karma-lab.net/comment-mettre-place-sa-telephonie-grace-a-asterisk : Pour l’installation d’un serveur asterisk
* https://wiki.asterisk.org/wiki/display/AST/ConfBridge+10#ConfBridge10-ConfBridgeConcepts : Pour la création d’une salle de conférence

Client linux (xubuntu 14) et réseau kwartz

Cet article fait suite à un article précédent concernant ubuntu 13. Entre temps, je suis passé sur xubuntu 14 qui est pour moi plus léger et plus adaptable à mes besoins ^^

Récupération du nom de l’ordinateur par dhcp

Lors de la création d’une image linux, le fichier /etc/hostname (qui indique l’identité de l’ordinateur) est enregistré lui aussi. Ainsi, chaque image déployée aura le même nom inscrit… pas cool. L’idée ici est de récupérer de manière dynamique le nom de l’ordinateur sur le kwartz et de mettre à jour le fichier hostname.

Le script fournit par Iris (un hook à ajouter au démon dhcp) ne fonctionnait pas chez moi. Je l’ai simplement remplacé par un petit changement de paramètre au niveau du démon, dans /etc/dhcp/dhclient.conf : en désactivant le « send host-name », cela force d’une certaine manière le dhcp à mettre à jour /etc/hostname avec la bonne valeur.

Personnalisation des sessions

Pour créer des raccourcis pour chaque nouvel utilisateur, il suffit de copier le fichier .desktop correspondant dans le dossier /etc/skel/Bureau/
Ne pas oublier d’ajouter le droit d’exécution sur les fichiers :
chmod +x /etc/skel/Bureau/*.desktop

Pour le paramétrage de Firefox, il faut modifier le fichier /etc/firefox/syspref.js (pour la syntaxe, voir cette article sur mozillazine).

Modification de l’écran de connexion lightdm

On va modifier /etc/lightdm/lightdm.conf pour que lightdm offre/masque quelques fonctionnalités :
[SeatDefaults]
greeter-show-manual-login=true
# Pour pouvoir se connecter avec un nouveau nom sur l'ordinateur
allow-guest=false
# Désactive le compte invité
greeter-show-remote-login=false
# Désactive la connexion à distance (en utilisant un autre serveur pour s'authentifier)
greeter-hide-users=true
# Cache les utilisateurs précédents (et les comptes locaux)

Ajout automatique des imprimantes

Cups est trop efficace sur ce point : dès qu’on l’installe, il trouve toutes les imprimantes du réseau. Impossible de mettre ça dans les mains des élèves :)
D’abord, il faut désactiver la découverte automatique en remplaçant « Browsing On » par Browsing Off » dans /etc/cups/cupsd.conf .

Ensuite, j’ai créé un script d’installation qui se lance au démarrage de l’ordinateur et qui va lire un fichier ini présent sur le réseau et installer les bonnes imprimantes. La méthode d’installation et le format du fichier ini sont décrites dans l’entête du script : ptr.sh.

Conclusion

Tout ces choses sont repris dans le fichier integration_xubuntu_1404.sh

J’ai aussi séparé dans un script spécifique un ensemble d’installations/configurations pas indispensables mais toujours pratique à avoir et à adapter à son environnement : configurations_supplementaires.sh. On y trouve l’installation de paquets pédagogiques courants (java, geogebra, freeplane, etc.), et de quoi utiliser Micro$oft Office 2010 par wine/PlayOnLinux.