This commit is contained in:
Vincent Le Gallic 2013-04-15 20:15:09 +02:00
parent 5f48855b39
commit afe4e126fb
7 changed files with 0 additions and 0 deletions

68
archive/active_sql.sh Executable file
View file

@ -0,0 +1,68 @@
#!/bin/sh
#
# active_sql.sh
#
# Syntaxe : active_sql login pass
#
# Création d'une base mysql nommée web_login
#
# Djoume - 29/06/2002
#
CSQL="/usr/bin/mysql -p "
PASSWORD=/etc/passwd
if [ 2 -ne "$#" ] ; then
echo "Création d'une base mysql"
echo "Erreur : il faut 2 arguments"
echo "Syntaxe :"
echo "active_sql.sh login pass"
echo "La base créé s'appellera 'web_login'"
exit 1
fi
nom_base="web_$1"
echo "Création de la base $nom_base"
echo "login : $1"
echo "pass : $2"
# On verifie que l'utilisateur existe
if awk 'BEGIN{FS=":"}{print $1}' < $PASSWORD | grep -w -e $1 > /dev/null; then
echo "$1 existe dans $PASSWORD."
else echo "Attention $1 n'existe pas dans $PASSWORD !"
fi
echo "Continuer ? (o/n)"
read rep;
case $rep in
y | Y | o | O)
echo "Création de la base..."
$CSQL -e "create database $nom_base;"
if [ 0 -ne $? ]; then
echo "Erreur lors de la création de la base."
exit 1
fi
echo "Attribution des privilièges..."
$CSQL -e "grant SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER on $nom_base.* to $1@localhost;"
if [ 0 -ne $? ]; then
echo "Erreur lors l'attribution des privileges."
exit 1
fi
echo "Attribution du mot de passe..."
$CSQL -e "set password for $1@localhost=password('$2');"
if [ 0 -ne $? ]; then
echo "Erreur lors l'attribution du mot de passe."
exit 1
fi
echo "Done."
;;
*)
echo "Annulation..."
exit 0
;;
esac
exit 0

View file

@ -0,0 +1,13 @@
#!/bin/sh
# Ce script reconstitue la base mkinfos et tout ce qui va avec
# (liste des pages html, etc...)
cd /usr/scripts/listepagesperso
# mkinfos (génération de la base)
python mkinfos/mkinfos.py > /var/local/pages_persos/erreurs.txt
cp /tmp/infos.db /var/local/pages_persos/
# mkhtml (construction de la page html à partir de base)
python mkinfos/mkhtml.py > /home/httpd/html/pages-index.html

View file

@ -0,0 +1,43 @@
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
"""
Module BuildDb.py
Ce module regarde les repertoire dans le home, puis
interroge chaque compte pour lire le .info, le .plan etc...
"""
import os
from string import *
import CompteRec
def GrabInfos(aDB):
""" Liste le contenu de /home .
le resultat est stocke dans le CInfoDb fourni en argument (aDB)
"""
# Pour debug : on peut ne tester que i comptes
i = -1
maison = os.listdir('/home')
for login in maison:
compte = CompteRec.CCompte(login)
if compte: # il y a un .info, un .plan ou un .www :
aDB.Put(login,compte)
i = i - 1
if not i: break # en debogage, on ne mouline pas tous les comptes !
########################
# debug :
if 0:
import InfoDb
GrabInfos(InfoDb.CInfoDb("/tmp/test","n"))

View file

@ -0,0 +1,275 @@
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
#
#########################################################################
#
# Structure de la base de données :
#
# (clef = nom login) ---> (objet de classe CCompte)
#
#
# Contenu de la classe CCompte : les champs du fichier .info, plus un
# champ "plan" contenant le .plan .
#
#########################################################################
import os
from string import *
class CCompte:
""" Classe CCompte : image d'un compte.
Cette classe encapsule le contenu des fichiers .info et .plan
pour le compte de login self.Compte """
Compte = None
Actif = 0 # true si un .info ou un .plan existent.
Pseudo = None
Email = None # automatiquement mis à Compte@rip.ens-cachan.fr
Logo = None
Photo = None
Nom = None
Devise = None
Projet = None
Section = None
Adresse = None
Telephone = None
Plan = None
URL = None # nom de fichier relatif de la page Web
# en général .www/index.html
# ou alors URL
def __init__(self,login = ""):
""" Initialisation.
Cette méthode analyse le contenu du compte (login) et remplit
self en conséquence. Il est renvoyé 0 dans self.Actif si le compte
ne contient ni .info ni .plan. """
self.Actif = 0
self.Compte = strip(login)
if not login : return # en principe, on est en de-shelvage ...
Path = "/home/" + login + "/"
try: # lecture du .info
f_info = open(Path + ".info","r")
info = f_info.readlines()
self.ParseInfo(info,login)
except:
# faut probablement gueuler (sauf si le fichier est
# légitimement absent)
pass
if not (self.URL):
url = ""
# rien mis ? on essaye index.html et index.htm dans .www/ :
if os.path.isfile("/home/"+login+"/www/index.html"):
url = "/~"+login+"/index.html"
elif os.path.isfile("/home/"+login+"/www/index.htm"):
url = "/~"+login+"/index.htm"
elif os.path.isfile("/home/"+login+"/www/default.htm"):
url = "/~"+login+"/default.htm"
self.URL = url
try: # lecture du .plan
f_plan = open(Path + ".plan","r")
self.Plan = f_plan.readlines()[:30]
self.Active = 1
except:
pass
try: # lecture du .project
f_project = open(Path + ".project","r")
self.Projet = f_project.readlines()[:30]
self.Active = 1
except:
pass
# à ce stade, l'objet est prêt à l'emploi
def ParseInfo (self,info , login):
""" Analyse un fichier .info.
cette routine analyse un fichier .info et transfère ses
informations si elles sont cohérentes.
Les erreurs sont envoyees a self.DisplayError
"""
nom = None
compte = None
pseudo = None
email = login + "@crans.org"
logo = None
photo = None
devise = None
projet = None
section = None
adresse = None
telephone = None
url = None
version = 1
for ligne in info :
if lstrip(ligne)[:1] == '#': continue # commentaire
ligne = rstrip(ligne) # vire le \012 final
spl_ligne = split(ligne,":")
champ = lower(strip(spl_ligne[0]))
valeur = strip(join(spl_ligne[1:],":"))
try:
if champ=="compte": compte = strip(valeur)
elif champ=="nom": nom = valeur
elif champ=="pseudo": pseudo = valeur
elif champ=="email": email = valeur
elif champ=="logo": logo = valeur
elif champ=="photo": photo = valeur
elif champ=="devise": devise = valeur
elif champ=="section": section = valeur
elif champ=="adresse": adresse = valeur
elif champ=="telephone": telephone = valeur
elif champ=="url" : url = valeur
elif champ=="version" : version = atoi(strip(valeur))
except:
erreur = [" une erreur est survenue sur le champ "+champ+
". Il y a toutes les chances que tu n'aie pas "
" respecté la syntaxe de .info. \012",
" selon toutes probabilités, une autre erreur "
"va se déclencher... on laisse courir.\012",
" (non critique)","\012"]
self.DisplayError(login,erreur)
pass
if (url) and (url[:7] != "http://") and (url[:1] != "/"):
# c'est un nom de fichier.... on verifie qu'il commence par .www
if url[:5] != ".www/" :
erreur = ["Le champ url doit etre un URL ou un nom de fichier"
"commencant par .www/ \012","(non critique) \012",
"\012"]
self.DisplayError(login,erreur)
else: # c'est bon.. on en fait un url relatif au site...
url = "/~"+login+url[:4]
pass
if strip(compte) != strip(login):
erreur = ["Le champ 'Compte' et le login ne correspondent pas !",
" (fatal) ",""]
self.DisplayError(login,erreur)
raise SyntaxError
if version < 1:
erreur = ["La version du fichier (champ Version) est inférieure ",
"a 1 ",
"(non critique)",""]
self.DisplayError(login,erreur)
#raise SyntaxError
if version > 1:
erreur = ["Ce mkinfos est probablement obsolète ou une erreur "
" existe sur le champ Version. ",
" (non critique)",""]
self.DisplayError(login,erreur)
self.Compte = compte
self.Actif = 1
self.Pseudo = pseudo
self.Email = email
self.Logo = logo
self.Photo = photo
self.Devise = devise
self.Section = section
self.Projet = projet
self.Adresse = adresse
self.Telephone = telephone
self.Nom = nom
self.URL = url
if logo:
try:
self.FindLogo()
except:
erreur = ["Erreur a la récupération du logo",
"(non critique)",
""]
self.DisplayError(login,erreur)
pass
def DisplayError(self, login, errorlines):
""" Affiche une erreur de compilation du .info de 'login'.
errorlines contient un tableau de chaines de caracteres.
En general, on changera cette routine (par exemple pour
envoyer un mail a 'login'
"""
print "Erreur dans .info , compte =",login
for i in errorlines:
print i
print ""
def FindLogo(self):
""" Récupere le logo.
Cette routine récupere le logo contenu dans le champ Logo du compte
'account' et le stocke dans $InfoDir/$login.logo.extension
Le champ Logo du compte est alors mis à jour.
"""
import urllib # urllib.urlopen()
import posixpath # posixpath.splitext()
# Où sont stockés les logos
InfoDir = "/home/httpd/html/info-2/"
InfoPath = "/info-2/"
if not self.Logo:
return # rien a faire !
logopath = self.Logo
self.Logo = ""
olddir = os.getcwd()
os.chdir("/home/"+self.Compte)
try:
rf = urllib.urlopen(logopath)
base,ext = posixpath.splitext(logopath)
logoname = self.Compte + ".logo" + ext
f = open(InfoDir + logoname,"w")
data = rf.read(-1) # tout d'un coup !
f.write(data) # hop !
# on ferme !
f.close()
rf = None
# bon on peut mettre a jour le compte maintenant !
self.Logo = InfoPath + logoname
finally:
os.chdir(olddir)
# A ce stade : on a defini une classe "CCompte" capable d'analyser le .info
# et le .plan, une fois donne un nom de login.
# test debug :
if 0:
A = CCompte("chepelov")
print A.__dict__

View file

@ -0,0 +1,36 @@
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
"""
Structure de la base de données :
(clef = nom login) ---> (objet de classe CCompte)
les objets CCompte sont decrits dans CompteRec.py
"""
import shelve
class CInfoDb:
""" Encapsule une base de donnees de .info
La structure de cet objet est simple, pour chaque login est stocke de
facon persistante l'objet CCompte associe.
"""
db = None
def __init__(self,filename,mode="rw"):
self.db = shelve.open(filename,mode)
def __del__(self):
self.db.close()
def Put(self,name,obj):
""" Ajoute un element."""
self.db[name] = obj
def Get(self,name):
""" recupere un element. """
return self.db[name]

View file

@ -0,0 +1,100 @@
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
# première version cradobeurk par Chep
# version améliorée le 26 07 2001 par Tiresias
# chawatage pour déplacement des configs dans /CRANS -- Nico 22/12/01
# idem dans /usr/scripts/ -- Nico 19/04/05
import InfoDb
import array
import sys
import commands
#Excluded = ['snepa','lasauce','cineclub','innomine','hubris','gmpcad',
# 'jdr','coope','asme','sono','rilem','krobot']
Excluded = []
DB=InfoDb.CInfoDb("/var/local/pages_persos/infos.db","r")
keys = DB.db.keys()
keys.sort()
print """<html>
<head>
<title>Liste des pages perso</title>
</head>
<body bgcolor="#FFFFFF" link="#FF9900" vlink="#990099" alink="#FFCC00">
<font face="Verdana, Tahoma, Arial, Helvetica, sans-serif" color="#000000" style="font-size: x-small">
<H1 align="center">Liste des Pages Perso</H1>
<p align="center">
<em><strong>Note :</strong> Les pages suivantes ne sont pas contrôlées par
l'assocation et leur contenu est sous la responsabilité de leur auteur respectif.
</em>
</p>
<table width="100%"> <!-- j'ai horreur d'écrire du legalese, mais il faut, avec les ricains. Chep-->
<tr>"""
compteur = 4
for key in keys:
compte = DB.Get(key)
#sys.stderr.write('%s\n'%key)
try:
if compte.URL and not (compte.Compte in Excluded):
s = ' <td align="center" valign="center" width="25%">\n\
<font style="font-size: x-small" face="Verdana, Tahoma, Arial, Helvetica, sans-serif" color="#000000" >\n'
if compte.Logo : l = compte.Logo
else: l = "/images/crans-mini.jpg"
url = compte.URL
s = s + ' <a href="' + url + '"><img src="'+l+'" alt="*" border=0></a><br>'
if compte.Nom: nom = compte.Nom
else: nom = compte.Compte
s = s + '\n <b> <a href="' + url + '">' + nom + '</a></b><br>'
if compte.Pseudo:
s = s + '\n «'+compte.Pseudo+'»<br>'
if compteur == 0:
print " </tr>\n <tr>"
print s, # qu'il y ait ou non un pseudo !!!
if compte.Devise:
s = '\n <font style="font-size: xx-small"><i>'+compte.Devise+'</i></font>'
print s,
print '\n </font>\n </td>'
compteur = (compteur + 1)%4
except:
pass
print " </tr>\n\
</table>\n\
<hr>\n Dernière mise à jour : %s\n" % \
(commands.getoutput("date '+%A %d %B %Y à %X'"))
print """ <hr>
Si <a href="/docs/montre-page.html">ça ne marche pas</a> (tu as
fait une page mais elle ne s'affiche pas), lis
<a href="/docs/montre-page.html">ceci</a>.
</font>
</body>
</html>"""

View file

@ -0,0 +1,41 @@
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
"""Le programme mkinfos.
Ce programme crée une base /tmp/infos.db qui reflete l'état des comptes
(fichiers .info, .plan et présence de .www/index.html)
La vocation de ce programme est de tourner au moins une fois toutes les
24 heures.
"""
import BuildDb
import InfoDb
import CompteRec
def DisplayError(self, login, errorlines):
""" Affiche une erreur de compilation du .info de 'login'.
errorlines contient un tableau de chaines de caracteres.
Cette routine est une redefinition de CompteRec.CCompte.DisplayError
"""
msg = [login]
msg = msg + ["Il y a une erreur dans ton fichier .info ! "]
msg = msg + [""]
msg = msg + ["voila le texte de l'erreur : "]
for i in errorlines :
msg = msg + [i]
msg = msg + [""]
msg = msg + [" -- le démon 'mkinfos' "]
for i in msg:
print i
print "Création de la base temporaire /tmp/infos.db ... "
CompteRec.CCompte.DisplayError = DisplayError
BuildDb.GrabInfos(InfoDb.CInfoDb("/tmp/infos.db","n"))