#! /usr/bin/env python
# ========= accounts.py =========================================#
# Création automatique de comptes utilisateurs Unix & Samba sur #
# un serveur Linux destiné à la gestion d'un intranet scolaire #
# Ce script a été testé seulement sous Linux SuSE 6.3 -> 8.1 #
# Il n'y est attaché aucune garantie ! #
# #
# Si vous souhaitez que le script crée une base de données MySQL #
# pour chaque élève, le module _mysql doit être installé. #
# #
# Explications : voir http://www.ulg.ac.be/cifen/inforef/swi #
# (C) Gérard Swinnen, Liège (Belgique). - Licence : GPL #
# ===============================================================#
import string # fonctions de traitement des chaînes
import os # appels au système d'exploitation
import sys # fonctions système généralistes
from crypt import crypt # fonctions de cryptage
from whrandom import randint # générateur de nombres aléatoires
from os.path import exists # test d'existence d'un chemin
import pwd # accès aux infos de /etc/passwd
import grp # accès aux infos de /etc/group
version = '31/5/2003'
profGrp = "profs"
lettres = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
lettresAcc = lettres + "éèçàùêëâî-" + string.digits
prof = {} # dictionnaire des profs titulaires de chaque classe
dataB ={} # dico mémorisant les classes qui utilisent des bases de d.
eleves ={} # dico contenant les listes d'élèves de chaque classe
http_perso = "/home/siteweb/pagesperso.htm" # page d'entrée intranet
def creaPagesWeb():
# Création des pages d'index dans le répertoire /home/siteweb
# Page principale (index menant vers les classes) :
if exists(http_perso):
print "La page d'index principale pour l'accès aux sites perso. " +\
"des élèves\n existe déjà en \n %s" % (http_perso)
print "Vous devrez compléter cette page manuellement."
else:
of = open("/home/siteweb/pagesperso.htm", "w")
of.write('\n
\n')
of.write('Accès aux pages personnelles, classe par classe :
\n')
for gr in grpList:
of.write(" %s
\n" % (gr, gr))
of.write("\n\n")
of.close()
# Création des pages index de chaque classe :
for gr in grpList:
of = open("/home/siteweb/%s.htm" % (gr), "w")
of.write('\n\n')
of.write('Pages personnelles des élèves de %s :
\n' % (gr))
# Création d'un tableau d'une seule ligne :
of.write('\n\n\n')
li = eleves[gr] # liste contenant un tuple pour chaque élève
li.sort() # tri dans l'ordre alphabétique
n2 = (len(li)+1)/2 # moitié du nombre d'élèves dans cette classe
c = 0
for el in li: # el est un tuple (identifiant, descript.)
of.write(" %s \n" % (gr, el[0], el[1]))
c = c+1
if c == n2:
# Passage dans la 2e case du tableau :
of.write(" | \n\n")
of.write(" | \n
\n
\n\n\n")
of.close()
def deleteLine(keyword,fichier):
# du spécifié, supprimer les lignes qui commencent par
# la chaîne suivie d'un ":"
if len(keyword) == 0:
return
# 1) renommer le fichier source, puis l'ouvrir en lecture :
os.rename(fichier,'dataSrc')
fis = open('dataSrc', 'r')
# 2) créer un nouveau fichier et l'ouvrir en écriture :
fid = open(fichier, 'w')
# 3) transférer de l'un à l'autre, en filtrant :
while 1:
li = fis.readline() # lire les lignes une par une
if len(li) == 0: # détecter la fin de fichier
break
ll = string.split(li,':') # séparer les sous-chaînes
if ll[0] == keyword: # sauter les lignes qui commencent
pass # par une sous-chaîne identique à keyword
else:
fid.write(li) # transcrire les autres
fis.close()
fid.close()
os.system('chmod 600 '+ fichier) # attributs de sécurité
# 4) effacer l'ancienne version :
os.remove('dataSrc')
def sambaPass(user,passwd):
# Pour inscrire le mot de passe dans la base de sécurité de Samba, on doit
# utiliser la commande , laquelle attend 2 entrées clavier
# (c.à.d. le mot de passe, 2 fois pour confirmation).
# La solution pour passer ces entrées est d'ouvrir un 'pipe' à l'aide de
# la fonction os.popen("commande"). Cette fonction retourne un
# "objet fichier" relié au pipe, auquel on peut appliquer les méthodes
# applicables aux fichiers, telle write() :
of = os.popen("smbpasswd -a -s %s" % (user), 'w')
of.write(passwd +'\n' +passwd +'\n')
# La méthode close() de l'objet fichier renvoie le code d'erreur éventuel :
if of.close():
print "** Pas moyen d'ajouter cet utilisateur dans /etc/private/smbpasswd."
os.system("userdel %s" % (user))
print " => le compte utilisateur n'a pas été créé."
def deleteDirectory(dir):
# Effacement du répertoire (après confirmation s'il n'est pas vide)
if exists(dir):
try:
os.rmdir(dir)
except:
print "*********************** !! ATTENTION !! ************************"
print "Le répertoire %s contient encore les éléments suivants :" % (dir)
print os.listdir(dir)
dd = raw_input("Etes-vous certain de vouloir l'effacer (o/n) ? ")
if string.lower(dd[0]) == 'o':
os.system('rm -R ' + dir) # -R pour récursivité
else:
print "Le répertoire %s n'existe pas !" % (dir)
def createSmbpasswd():
# Création de la base de sécurité Samba (fichier /etc/private/smbpasswd)
if not exists('/etc/private'):
os.mkdir('/etc/private', 0500)
while 1:
tt = os.system('cat /etc/passwd | mksmbpasswd.sh > /etc/private/smbpasswd')
if tt == 0:
break
else:
# Dans certaines distributions SuSE Linux, le script mksmbpasswd
# n'est pas accessible par défaut. L'installer si nécessaire :
print "** Script mksmbpasswd.sh inactif - Essai d'installation : "
# recherche dans plusieurs chemins possibles :
for chem in ['/usr/lib/samba/scripts','/usr/share/samba/script']:
tt = os.system("cp %s/mksmbpasswd.sh /usr/local/bin" % chem)
if tt == 0:
break
if tt == 0:
tt = os.system('chmod 500 /usr/local/bin/mksmbpasswd.sh')
if tt == 0:
print "OK - Script installé et fonctionnel."
else:
print "** Script installé mais pas exécutable ???"
sys.exit()
else:
print "** Script introuvable - Veuillez l'installer manuellement."
sys.exit()
def savePasswords():
# Sauvegarde des fichiers de mots de passe préexistants (Unix & Samba)
pwFiles =["/etc/private/smbpasswd","/etc/passwd"]
for pFile in pwFiles:
n =0
while 1:
if not exists(pFile + "Bak" + str(n)):
bkFile = pFile + "Bak" + str(n)
break
else:
n = n+1
os.system("cp " + pFile + " " + bkFile)
print "Note : le fichier %s précédent est" % (pFile)
print "sauvegardé sous le nom %s." % (bkFile)
def oui_ou_non(question):
# Pose la et renvoie une réponse formatée : 'o' ou 'n'
while 1:
reponse = raw_input(question + " (o/n) ? : ")
if reponse =='':
continue
reponse = string.lower(reponse[0])
if reponse =='o' or reponse =='n':
break
return reponse
def existsUser(u):
# Vérifier si l'utilisateur u est bien répertorié dans /etc/passwd
try:
t = pwd.getpwnam(u) # retourne un tuple avec paramètres user
except:
return 0
else:
return 1
def existsGroup(g):
# Vérifier si le groupe g est bien répertorié dans /etc/group
try:
t = grp.getgrnam(g) # retourne un tuple avec paramètres du groupe
except:
return 0
else:
return 1
def notUnixWord(mot):
# est-il un label UNIX correct ? retourne 1 si non
if len(mot) <1 or len(mot) >8:
return 1
# le premier caractère doit être alphabétique :
if mot[0] not in lettres:
return 1
# les autres caractères doivent être alphanumériques :
for c in mot:
if not (c in lettres or c in string.digits):
return 1
return 0
def prepMysql():
# Préparation de la conversation avec le serveur MySQL
ermsg ="***** Les opérations sur les bases de données sont annulées."
try:
import _mysql
except:
print "***** Erreur : Le module MySQL pour Python est introuvable :"
print ermsg
return 0
server = raw_input("Nom ou adresse IP de la machine serveur MySQL : ")
boss = raw_input("Identifiant de l'administrateur MySQL : ")
pwd = raw_input("Mot de passe correspondant : ")
# Tentative de connexion à la base de données principale :
try:
db = _mysql.connect(host =server, user =boss, passwd =pwd, db ="mysql")
except:
print "***** Impossible d'établir la connexion avec le serveur MySQL :"
print ermsg
return 0
return db
def createGroup(group):
# Création du groupe Unix + création des répertoires associés
global profGrp, prof, dataB, boss, quotas
if existsGroup(group):
print "Le groupe-classe %s existe déjà." % (group)
else:
print "=== Création du groupe-classe %s : ===" % (group)
os.system('groupadd '+ group)
# Création des répertoires associés au groupe :
try:
os.mkdir('/home/' + group, 0755)
os.mkdir('/home/' + group + '/bureau', 0755)
os.mkdir('/home/' + group + '/apps', 0755)
os.mkdir('/home/' + group + '/start', 0755)
os.mkdir('/home/' + group + '/smenu', 0755)
except OSError,Errno:
if Errno[0] == 17: # error
print"Le répertoire home existe déjà pour le groupe %s." % (group)
else:
print "***** Erreur système N°", Errno
# Installation d'un papier peint Windows par défaut :
if wallpap:
os.system("cp %s /home/%s/background" % (wallpap, group))
# Création des répertoires associés au groupe :
try:
os.mkdir('/home/siteweb/' + group, 0755)
except OSError,Errno: # error
if Errno[0] == 17:
print"Le rép. home/siteweb existe déjà pour le groupe %s." % (group)
else:
print "Erreur système N°", Errno
# Le propriétaire des répertoires créés est un membre du groupe.
# Par défaut, son nom est celui du groupe, converti en minuscules:
boss = string.lower(group)
if not existsUser(boss):
print "Il est créé automatiquement un utilisateur propriétaire"
print "pour l'environnement de travail de cette classe."
print 'Son nom est : "%s".' % (boss)
bossPass = 'abcde' # mot de passe
b = raw_input("Mot de passe du propriétaire [abcde] : ")
if len(b) >0:
bossPass = b
# Pour comprendre ce qui suit, veuillez consulter la documentation
# concernant le cryptage des mots de passe UNIX :
salt = chr(randint(1,26)+64) + chr(randint(1,26)+96)
crPass = crypt(bossPass,salt)
# Répertoire personnel du Boss = rép. réservé au groupe :
os.system("useradd -g %s -p %s -d /home/%s -c propriétaire %s"
% (group, crPass, group, boss))
# Enreg. du mot de passe également crypté à la mode Samba
# (l'utilisateur concerné doit exister au préalable !) :
sambaPass(boss, bossPass)
if not exists("/home/" + group):
print "??? Répertoire /home/%s inexistant ???" % (group)
sys.exit()
if not exists("/home/siteweb/" + group):
print "??? Répertoire /home/siteweb/%s inexistant ???" % (group)
sys.exit()
# Recherche du nom de groupe associé au répertoire de la classe :
st = os.stat("/home/%s" % (group)) # renvoie un tuple avec attributs du rép.
gid = st[5] # l'élément n°5 est l'id. du groupe
gp = grp.getgrgid(gid) # renvoie un tuple avec param. du groupe
gnm = gp[0] # le nom du groupe est l'élément n°0
# Si ce groupe est encore , on le change -> groupe de profs :
if gnm =='root':
# Choix du groupe de profs administrateur des répertoires élèves :
print "Un groupe de professeurs aura droit de regard sur les"
print "répertoires personnels des élèves de cette classe."
print "Quel nom choisissez-vous pour ce groupe de profs ?"
print "(Le groupe sera créé s'il n'existe pas déjà) [%s] : " % (profGrp),
b = raw_input()
if len(b) >0:
profGrp = b
os.system('groupadd '+ profGrp)
else:
print "Groupe de professeurs responsable de celle classe : [%s]" % (gnm)
profGrp = gnm
prof[group] = profGrp # mémorisation pour la suite
# (Ré)Appropriation des répertoires attribués à la classe :
os.system("chown %s /home/%s" % (boss, group))
os.system("chgrp %s /home/%s" % (prof[group], group))
os.system("chmod 755 /home/%s" % (group))
os.system("chown %s /home/siteweb/%s" % (boss, group))
os.system("chgrp %s /home/siteweb/%s" % (prof[group], group))
os.system("chmod 755 /home/siteweb/%s" % (group))
# Bases de données :
if mysql =='o':
dataB[group] = oui_ou_non("Faut-il créer des bases de données pour cette classe")
else:
dataB[group] ='n'
def setBossQuota(group):
# Attribution de quotas au "chef" de groupe :
global quotas
if not existsGroup(group):
return
if quotas =='o':
while 1:
proto ='quota50'
print """Veuillez entrer le nom de l'utilisateur choisi comme
prototype pour l'établissement des quotas disque
attribués à ces élèves [%s] : """ % (proto),
b = raw_input()
if len(b) >0:
proto = b
if existsUser(proto):
# attribution de ces quotas au "chef" du groupe :
os.system("edquota -p %s -u %s" % (proto, string.lower(group)))
break
else:
print "******* Cet utilisateur n'existe pas !!!"
def setUsersQuota():
# Etablissement des quotas de chaque utilisateur enregistré.
# est un dictionnaire contenant les listes d'élèves
# nouvellement répertoriés dans chaque groupe-classe :
for gr in grpList:
li = eleves[gr] # liste contenant un tuple pour chaque élève
for el in li: # el est un tuple (identifiant, descript.)
# établissement des quotas (semblables à ceux du "chef" de
# groupe, celui-ci ayant déjà reçu les siens du prototype).
print "Etablissement des quotas disque pour %s" % (el[0])
proto = string.lower(gr)
os.system("edquota -p %s -u %s" % (proto, el[0]))
def scanUsers(step):
# Parcours du fichier contenant les des données utilisateur, avec
# création ou rafraîchissement des comptes personnels.
# Dans le même temps, il se construit une liste des groupes-classe
# nouvellement scannés (grpList), ainsi qu'un dictionnaire des élèves
# correspondants (eleves) :
global linUsers, deskPath, appsPath, mysql
fichier = open(usersFile,'r')
count = 0
while 1:
ligne = fichier.readline()
if not ligne: # détection de la fin de fichier
break # (la ligne lue est vide)
# nom de l'utilisateur, groupe, mot de passe, commentaire :
count = count +1
ll = string.split(ligne) # découpage de la ligne
if len(ll) <3: # ligne incomplète (moins de 3 champs)
print "*** Ligne %s incomplète dans le fichier source. ***" % (count)
continue
if len(ll[0]) <9 and len(ll[1]) <9 and len(ll[2]) <9:
# analyse de la ligne suivant nouv. convention (champs séparés par espaces):
user = ll[0]
group = ll[1]
passw = ll[2]
comment = string.join(ll[3:])
else:
# analyse de la ligne suivant ancienne convention (champs de taille fixe):
user = string.strip(ligne[:8])
group = string.strip(ligne[8:16]) # élimination des espaces
passw = string.strip(ligne[16:24]) # en début et fin de chaîne
comment = string.strip(ligne[24:])
# Vérifications diverses :
# D'abord s'assurer que les identifiants sont OK :
if notUnixWord(user) or notUnixWord(group):
print
print "User = %s , Group = %s, Passwd = %s ???" % (user,group,passw)
print "*** Ligne %s incorrecte dans le fichier source. Job annulé. ***" % (count)
sys.exit()
# Ensuite s'assurer que le commentaire associé à chaque utilisateur ne
# contienne que des caractères "autorisés" (sinon -> erreur système).
if len(comment) ==0:
comment ='---'
else:
# Construire d'abord la liste des caractères "illégaux" présents :
lc =[]
for cx in comment:
if cx not in lettresAcc:
lc.append(cx)
# remplacer les caractères "illégaux" trouvés par des '_' :
for cx in lc:
comment = string.replace(comment,cx,'_')
# Si l'on ne souhaite pas rafraîchir l'ensemble, il faut ignorer
# les utilisateurs déjà enregistrés :
if choix =='a' and existsUser(user):
continue
# Construction de la liste des groupes rencontrés en cours de scan:
if not(group in grpList):
grpList.append(group) # on ajoute le groupe à la liste
eleves[group] =[] # préparation d'une liste d'élèves
# Création du groupe et de ses répertoires associés :
if step == 1:
print ""
createGroup(group)
setBossQuota(group)
if step == 2:
# Création des utilisateurs et de leurs répertoires personnels,
# ou rafraîchissement de ces mêmes répertoires :
if not existsGroup(group):
continue
# Construction du dictionnaire des élèves répertoriés. Ce dico sera
# utilisé + loin pour établir les quotas et créer les pages Web.
# (ajout d'un tuple (identifiant, description) à la liste de classe):
lco = string.split(comment,'_') #
comRed = lco[0] +" " +lco[1] # isoler Prénom et Nom
eleves[group].append((user, comRed))
# le rép. attribué à chaque élève est un sous-rép. de celui du groupe :
homeDir = '/home/%s/%s' % (group, user)
if existsUser(user):
print "L'utilisateur %s existe déjà." % (user)
else:
# Création de l'utilisateur (Unix & Samba)
# Voir documentation sur le cryptage des mots de passe :
salt = chr(randint(1,26)+64) + chr(randint(1,26)+96)
crPass = crypt(passw,salt)
# Ajout d'un compte utilisateur :
os.system("useradd -g %s -p %s -d %s -c %s %s"
% (group, crPass, homeDir, comment, user))
# encodage des mots de passe également à la sauce Samba :
sambaPass(user, passw)
# Création des sous-répertoires personnels privés pour chacun :
if not exists(homeDir):
os.mkdir(homeDir)
os.mkdir(homeDir + '/bureau', 0755)
os.mkdir(homeDir + '/apps', 0755)
# os.mkdir(homeDir + '/start', 0755) # abandonné car sans intérêt
# os.mkdir(homeDir + '/smenu', 0755) # et même dangereux (virus)
# Installation d'un 'papier peint' par défaut :
if not exists(homeDir + "/background"):
if exists("/home/%s/background" % (group)):
os.system("cp /home/%s/background %s" % (group, homeDir))
# Installation des icônes de raccourcis Windows :
if len(deskPath) >0:
os.system("cp -R %s/* %s/bureau" % (deskPath, homeDir))
if len(appsPath) >0:
os.system("cp -R %s/* %s/apps" % (appsPath, homeDir))
# copie d'un "squelette" d'environnement Linux s'il y a lieu:
if linUsers =='o':
# copie des fichiers et sous-répertoires normaux :
os.system("cp -au /etc/skel/* %s" % (homeDir))
# copie des fichiers et sous-répertoires cachés :
os.system("cp -au /etc/skel/.[^.]* %s" % (homeDir))
# Note : la syntaxe utilisée ci-dessus fait appel à l'expression
# régulière [^.] pour désigner "tout autre caractère que le point"
# (on copie ainsi tout ce qui commence par un point et un seul,
# en évitant de copier aussi le répertoire parent)
# (Ré)Appropriations :
os.system("chgrp -R %s /home/%s/%s" % (prof[group], group, user))
os.system("chown -R %s /home/%s/%s" % (user, group, user))
os.system("chmod 2770 /home/%s/%s" % (group, user))
# Droits d'accès : le 2 en premier lieu positionne le bit GID,
# De ce fait les fichiers mémorisés dans ce répertoire seront
# attribués au même groupe que le répertoire lui-même :
# en l'occurrence, le groupe de profs titulaires.
# Répertoire personnel accessible aux autres en lecture :
if not exists("/home/siteweb/%s/%s" % (group, user)):
os.mkdir("/home/siteweb/%s/%s" % (group, user))
# (Ré)Appropriations :
os.system("chgrp -R %s /home/siteweb/%s/%s" % (prof[group], group, user))
os.system("chown -R %s /home/siteweb/%s/%s" % (user, group, user))
os.system("chmod 2775 /home/siteweb/%s/%s" % (group, user))
# Création d'une base de données MySQL personnelle pour chacun :
if dataB[group] =='o':
try:
database.query("CREATE DATABASE %s_db" % (user))
except:
print "* Impossible de créer la base de données %s_db" % (user)
print " (probablement parce qu'elle existe déjà)."
else:
q1 = "GRANT SELECT,INSERT,UPDATE,CREATE,DELETE" +\
"""ON %s_db.* TO %s@""" % (user, user)
q2 = '"%"'
q3 = " IDENTIFIED BY '%s'" % (passw)
database.query(q1 +q2 +q3)
q2 = 'localhost'
database.query(q1 +q2 +q3)
elif step == 5:
# Suppression des utilisateurs :
if existsUser(user):
os.system("smbpasswd -d %s" % (user))
# la ligne ci-dessus ne fait que désactiver les comptes Samba
# la fonction ci-dessous efface les lignes correspondantes :
if exists('/etc/private/smbpasswd'):
deleteLine(user, '/etc/private/smbpasswd')
os.system('userdel ' + user)
# Suppression des répertoires de l'utilisateur :
os.system("rm -R /home/%s/%s" % (group, user)) # -R pour récursivité
os.system("rm -R /home/siteweb/%s/%s" % (group, user))
# Suppression de sa base de données MySQL :
if mysql =="o":
try:
database.query("DROP DATABASE %s_db" % (user))
except:
print "* Impossible d'effacer la base de données %s_db." % (user)
else:
print "L'utilisateur %s n'existe pas !!!" % (user)
fichier.close()
######################## Main program ###########################
print """
=================================================================
Création automatique de comptes utilisateurs Window$ & Linux.
(C) G.Swinnen - Version du %s - Licence GPL
Des explications détaillées sont disponibles sur :
http://www.ulg.ac.be/cifen/inforef/swi)
=================================================================
Il faut avoir préparé à l'avance un fichier texte contenant une
ligne pour chaque élève, avec les champs suivants séparés par des
espaces : Identifiant de l'élève (max 8c), Classe(max 8c),
Mot de passe(max 8c), Commentaire(max 40c).
Ce fichier peut être créé aisément à partir de la base de données
PROECO, au moyen du logiciel NETUSERS du même auteur
(ce logiciel doit être utilisé sous Window$).
Pour que les mots de passe soient transcrits aussi dans la base
de sécurité de Samba (laquelle doit obligatoirement se trouver dans
/etc/private/smbpasswd), il faut s'assurer que le serveur Samba soit
actif. Vérifiez également que smb.conf contienne bien la ligne :
smb passwd file = /etc/private/smbpasswd
... / ...""" % (version)
k = raw_input()
print """Si vous le souhaitez, des quotas d'espace disque peuvent être
automatiquement établis pour chaque élève, mais pour cela il faudra
que le système de quotas ait activé au préalable, de la manière
habituelle. Il faudra également avoir défini à l'avance les quotas
d'un ou de plusieurs utilisateurs qui serviront de "prototypes"
(Créez par exemple des utilisateurs quota10, quota20, etc).
Vous pourrez établir ou modifier les quotas à tout moment durant
l'année scolaire, en relançant le présent script.
... / ..."""
k = raw_input()
print """Afin que les répertoires personnels des élèves soient accessibles
à certains professeurs, le script vous propose de créer un ou
plusieurs groupes système (Vous pouvez créer un groupe différent
pour chaque classe si nécessaire). Il vous incombera ensuite
d'incorporer les identifiants des professeurs concernés dans ces
groupes (en éditant le fichier /etc/group).
(NB: un même professeur peut faire partie de plusieurs groupes).
... / ..."""
k = raw_input()
print """Le script vous propose aussi de créer automatiquement
une base de données pour chaque élève sur le serveur MySQL du
réseau. Cela suppose bien entendu qu'un tel serveur ait été
installé au préalable, et qu'il soit activé avant l'exécution du
présent script.
... / ..."""
k = raw_input()
usersFile = raw_input("Veuillez entrer le nom du fichier décrivant les élèves : ")
if not exists(usersFile):
print 'Ce fichier est introuvable ! Recommencez.'
sys.exit()
choix = raw_input("""
Veuillez à présent entrer :
'c' pour créer des comptes utilisateur pour tous les élèves,
pour établir/modifier leurs quotas disque, ou encore
pour rafraîchir la structure de leur répertoire perso.
'a' pour ajouter de nouveaux comptes utilisateurs d'élèves
(sans rafraîchir l'ensemble)
's' pour supprimer les comptes de tous les élèves
'q' pour quitter le présent script sans rien faire : """)
choix = string.lower(choix[0])
grpList =[] #
scanUsers(0) # test du fichier source
grpList =[] #
mysql ='n'
if choix =='s':
print '''
***** !! ATTENTION !! **********************************************
* Toutes les données contenues dans les répertoires personnels *
* de ces élèves seront effacées sans possibilité de récupération ! *
********************************************** !! ATTENTION !! *****
'''
confirm = oui_ou_non("Confirmez-vous l'effacement")
if confirm =='o':
mysql = oui_ou_non("Faut-il aussi effacer les bases de données")
if mysql =='o':
database = prepMysql() # connexion au serveur
if database ==0:
mysql ='n' # la connexion a échoué
savePasswords() # sauvegarde préalable des fichiers passwd
scanUsers(5) # suppression des utilisateurs (les groupes restent).
print "Les groupes ci-dessous doivent-ils aussi être effacés :"
for g in grpList:
print g,
print
delgr = oui_ou_non("Effacer ces groupes")
if delgr =='o':
for group in grpList:
deleteDirectory('/home/' + group)
deleteDirectory('/home/siteweb/' + group)
if exists('/home/' + group) or exists('/home/siteweb/' + group):
# Ne pas supprimer le groupe si l'un ou l'autre des
# répertoires correspondants n'a pas été effacé
print "Le groupe %s n'a pas été supprimé." % (group)
else:
os.system('smbpasswd -d ' + string.lower(group))
if exists('/etc/private/smbpasswd'):
deleteLine(string.lower(group), '/etc/private/smbpasswd')
os.system('userdel ' + string.lower(group))
os.system('groupdel ' + group)
elif choix =='c' or choix =='a':
quotas = oui_ou_non("""
Désirez-vous établir ou modifier des quotas d'espace disque
pour ces élèves""")
print "## Environnement de travail sous Window$ ##"
while 1:
wallpap = '/home/background'
print """
Vous pouvez indiquer ici le chemin d'un "papier peint" Window$
qui sera installé comme fond d'écran par défaut dans le répertoire
personnel de chacun, sous le nom de fichier .
(Chaque éleve pourra ensuite remplacer ce fichier à son gré)
Attention : le fichier doit obligatoirement être de type .BMP
Veuillez indiquer le chemin d'un tel fichier (ou *) :
[%s] """ % (wallpap)
b =raw_input()
if len(b) >0:
wallpap = b
if wallpap == "*" or exists(wallpap):
break
while 1:
deskPath = '/home/bureau'
print """
Veuillez indiquer ci-dessous le chemin d'un répertoire
contenant les icônes de raccourcis Windows à disposer sur le
bureau de chaque élève (ou *) : [%s] """ % (deskPath),
b =raw_input()
if len(b) >0:
deskPath = b
if exists(deskPath) or deskPath =="*":
break
else:
print "* Répertoire inexistant !"
while 1:
appsPath = '/home/apps'
print """
Veuillez encore indiquer ci-dessous le chemin d'un répertoire
contenant les icônes de raccourcis Windows à disposer dans
le 'menu démarrer' de chaque élève (ou *) :
[%s] """ % (appsPath)
b =raw_input()
if len(b) >0:
appsPath = b
if exists(appsPath) or appsPath =="*":
break
else:
print "* Répertoire inexistant !"
linUsers = oui_ou_non("""
Désirez-vous installer un environnement Linux pour chaque utilisateur ?
(Répondez NON à cette question si vos postes de travail fonctionnent
sous Window$ exclusivement) """)
mysql = oui_ou_non("""
Désirez-vous créer automatiquement une base de données MySQL pour
chaque élève ? (Si vous répondez Oui, les noms de ces bases de données
seront construits sur la base des identifiants des élèves. Par exemple,
l'élève se verra attribuer une base dont le sera )
Faut-il créer ces bases de données""")
if choix =='c':
html = oui_ou_non("""
Désirez-vous créer automatiquement une page Web d'intranet pour chaque
classe, avec les hyperliens menant aux pages perso. des élèves ?
(Ces pages seront installées dans /home/siteweb, et la première
d'entre elles sera nommée pagesperso.htm""")
print
# Création du répertoire réservé aux pages Web perso. des élèves :
if not exists('/home/siteweb'):
os.mkdir('/home/siteweb',0755)
# Création de la base de sécurité de Samba si elle n'existe pas déjà :
if not exists('/etc/private/smbpasswd'):
print "Base de données smbpasswd inexistante - Essai de création :"
createSmbpasswd()
os.chmod('/etc/private/smbpasswd', 0600)
print "OK - Base de données smbpasswd à présent installée."
# Suppression de la ligne correspondant aux comptes NIS (éventuelle) :
deleteLine('+', '/etc/private/smbpasswd')
# Connexion au serveur de bases de données MySQL :
if mysql =='o':
database = prepMysql()
if database ==0:
mysql ='n' # la connexion a échoué
##### Création des comptes #####
scanUsers(1) # création des groupes
print
scanUsers(2) # création des utilisateurs
if quotas =='o':
print
setUsersQuota() # établissement des quota
if choix =='c':
creaPagesWeb() # création des pages Web d'intranet
### Fermeture de la connexion au serveur MySQL :
if mysql =='o':
database.close()
print '''
Job terminé.
'''