Parce que «Ça peut toujours servir»™ et que de toutes façons il y en a déjà des bouts qui sont dans le dépôt et que c'est chiant de git add -f.
Et puis bon, ça fait que 3Mo
This commit is contained in:
parent
29f50c2ed9
commit
3bde363deb
299 changed files with 17466 additions and 0 deletions
194
archive/python-lib/affich_tools.py
Normal file
194
archive/python-lib/affich_tools.py
Normal file
|
@ -0,0 +1,194 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
|
||||
""" Collection de fonction/classe pour avoir un bel affichage
|
||||
|
||||
Copyright (C) Frédéric Pauget
|
||||
Licence : GPLv2
|
||||
"""
|
||||
|
||||
import sys, sre, os, tempfile
|
||||
|
||||
if 'TERM' in os.environ:
|
||||
el = os.popen('tput cr ; tput el').read()
|
||||
else:
|
||||
el = os.popen('tput -Tvt100 cr ; tput -Tvt100 el').read()
|
||||
|
||||
def dialog(backtitle,arg) :
|
||||
""" Affiche la boite de dialogue défine avec les arguments fournis
|
||||
(cf man dialog)
|
||||
si tout se déroule bien retourne :
|
||||
[ 0, [ reponse(s) ] ]
|
||||
si annulatin retourne :
|
||||
[ 1, [] ]
|
||||
si appui sur ESC demande confirmation de l'abandon et exécute sys.exit(0)
|
||||
si erreur dans les arguments raise RuntimeError
|
||||
"""
|
||||
f = tempfile.NamedTemporaryFile()
|
||||
cmd = u'/usr/bin/dialog --backtitle "%s" --cancel-label "Retour" %s 2>%s' % (backtitle,arg,f.name)
|
||||
res = os.system(cmd.encode('iso-8859-15','ignore'))
|
||||
|
||||
if res == 256 :
|
||||
# Annuler
|
||||
f.close()
|
||||
return [ 1, [] ]
|
||||
|
||||
# Lecture du fichier de résultat et effacement
|
||||
try:
|
||||
result=f.readlines()
|
||||
f.close()
|
||||
except :
|
||||
result = [ "n'importe quoi", '']
|
||||
res = 65280
|
||||
|
||||
# Traitement
|
||||
if res==65280 and result:
|
||||
# Erreur dans les arguments
|
||||
raise RuntimeError( arg, result[1].strip() )
|
||||
elif res==65280 :
|
||||
# Appui sur ESC
|
||||
arg1 = u'--title "Annulation" --yesno "Quitter ?\nLes dernières modifications seront perdues." 6 48'
|
||||
print backtitle
|
||||
cmd = u'/usr/bin/dialog --backtitle "%s" %s' % (backtitle,arg1)
|
||||
res = os.system(cmd.encode('iso-8859-15','ignore') )
|
||||
if res==0 : sys.exit(0)
|
||||
else : return dialog(backtitle,arg)
|
||||
elif not result : result=['']
|
||||
|
||||
return [ 0, result ]
|
||||
|
||||
def coul(txt,col):
|
||||
"""
|
||||
Retourne la chaine donnée encadrée des séquences qui
|
||||
vont bien pour obtenir la couleur souhaitée
|
||||
Les couleur sont celles de codecol
|
||||
Il est possible de changer la couleur de fond grace aux couleur f_<couleur>
|
||||
"""
|
||||
codecol={'rouge' : 31 , 'vert' : 32 , 'jaune' : 33 , 'bleu': 34 , 'violet' : 35 , 'cyan' : 36 , 'gras' : 50}
|
||||
try :
|
||||
if col[:2]=='f_' : add=10; col=col[2:]
|
||||
else : add=0
|
||||
txt = "\033[1;%sm%s\033[1;0m" % (codecol[col]+add,txt)
|
||||
finally :
|
||||
return txt
|
||||
|
||||
OK = coul('OK','vert')
|
||||
WARNING = coul('WARNING','jaune')
|
||||
ERREUR = coul('ERREUR','rouge')
|
||||
|
||||
def cprint(txt,col):
|
||||
print coul(txt,col)
|
||||
|
||||
def tableau(largeurs,data) :
|
||||
"""
|
||||
retourne une chaine formatée repésentant un tableau
|
||||
largeur est la liste des largeurs des colones
|
||||
data est une liste de tuples :
|
||||
[ ( données entète), (données ligne1), .... ]
|
||||
"""
|
||||
sep_col = u'|'
|
||||
|
||||
# Si l'une des largeurs est '*', alors on la met la plus grande possible
|
||||
if '*' in largeurs:
|
||||
rows, cols = get_screen_size()
|
||||
nlargeurs = []
|
||||
for n in largeurs:
|
||||
if n != '*':
|
||||
nlargeurs.append(n)
|
||||
else:
|
||||
nlargeurs.append(max(cols - sum(filter(lambda x:x!='*',largeurs)) - len(largeurs) - 1, 3))
|
||||
largeurs = nlargeurs
|
||||
|
||||
# Ligne de séparation entète corps
|
||||
s=u'\n'
|
||||
for l in largeurs :
|
||||
s+= sep_col + u'-'*l
|
||||
s += sep_col + u'\n'
|
||||
|
||||
nb_cols = len(largeurs)
|
||||
|
||||
# Remplissage tableau
|
||||
f=u''
|
||||
for ligne in data :
|
||||
for i in range(0, nb_cols) :
|
||||
f+= sep_col
|
||||
# Centrage
|
||||
l = len(sre.sub('\x1b\[1;([0-9]|[0-9][0-9])m','',ligne[i])) # Longeur sans les chaines de formatage
|
||||
if l >= largeurs[i] :
|
||||
f += ligne[i]
|
||||
else :
|
||||
n = largeurs[i] - l
|
||||
f += u' '*(n/2) + ligne[i] + u' '*(n/2 + n%2)
|
||||
f+= sep_col + u'\n'
|
||||
|
||||
# Final
|
||||
f = f.replace(u'\n',s,1) # Insertion du séparateur entète - corps
|
||||
return f[:-1] # Supression du \n final
|
||||
|
||||
def get_screen_size():
|
||||
"""Retourne la taille de l'écran.
|
||||
|
||||
Sous la forme d'un tuble (colonnes, lignes)"""
|
||||
try:
|
||||
from termios import TIOCGWINSZ
|
||||
from struct import pack, unpack
|
||||
from fcntl import ioctl
|
||||
s = pack("HHHH", 0, 0, 0, 0)
|
||||
rows, cols = unpack("HHHH", ioctl(sys.stdout.fileno(), TIOCGWINSZ, s))[:2]
|
||||
return (rows, cols)
|
||||
except:
|
||||
return (80, 24)
|
||||
|
||||
def prompt(prompt, defaut=''):
|
||||
""" Pose la question prompt, retourne la réponse """
|
||||
sys.stdout.write(coul(prompt,'gras'))
|
||||
if defaut :
|
||||
sys.stdout.write(" ["+defaut+"]")
|
||||
sys.stdout.write(" ")
|
||||
v=sys.stdin.readline().strip()
|
||||
if not v : v = defaut
|
||||
return v
|
||||
|
||||
class anim :
|
||||
""" Permet de créer une animation :
|
||||
truc................./
|
||||
truc.................-
|
||||
truc.................\
|
||||
truc.................|
|
||||
ou une barre de progression si le nombre total d'itérations est founi.
|
||||
"""
|
||||
def __init__(self,truc,iter=0) :
|
||||
""" Affichage de :
|
||||
truc................."""
|
||||
self.txt = truc + '.'*(50-len(truc))
|
||||
self.c = 1
|
||||
self.iter = iter
|
||||
sys.stdout.write(self.txt)
|
||||
sys.stdout.flush()
|
||||
|
||||
def reinit(self) :
|
||||
""" Efface la ligne courrante et
|
||||
affiche : truc................. """
|
||||
sys.stdout.write(el + self.txt)
|
||||
if self.iter :
|
||||
sys.stdout.write(' '*28)
|
||||
sys.stdout.write(el + self.txt)
|
||||
sys.stdout.flush()
|
||||
|
||||
def cycle(self) :
|
||||
""" Efface la ligne courrante et
|
||||
affiche : truc..................?
|
||||
? caratère variant à chaque appel """
|
||||
sys.stdout.write(el + self.txt)
|
||||
if self.iter!=0 :
|
||||
sys.stdout.write('[')
|
||||
av = float(self.c) / float(self.iter)
|
||||
n = int(20 * av)
|
||||
sys.stdout.write('='*n)
|
||||
sys.stdout.write('>')
|
||||
sys.stdout.write(' '*(20 - n))
|
||||
sys.stdout.write('] %3i%%' % int(100 * av) )
|
||||
else :
|
||||
sys.stdout.write('/-\|'[self.c%4])
|
||||
sys.stdout.flush()
|
||||
self.c += 1
|
47
archive/python-lib/daemon.py
Normal file
47
archive/python-lib/daemon.py
Normal file
|
@ -0,0 +1,47 @@
|
|||
# -*- python -*-
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
|
||||
import sys,os
|
||||
|
||||
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
|
||||
'''This forks the current process into a daemon.
|
||||
The stdin, stdout, and stderr arguments are file names that
|
||||
will be opened and be used to replace the standard file descriptors
|
||||
in sys.stdin, sys.stdout, and sys.stderr.
|
||||
These arguments are optional and default to /dev/null.
|
||||
Note that stderr is opened unbuffered, so
|
||||
if it shares a file with stdout then interleaved output
|
||||
may not appear in the order that you expect.
|
||||
'''
|
||||
# Do first fork.
|
||||
try:
|
||||
pid = os.fork()
|
||||
if pid > 0:
|
||||
sys.exit(0) # Exit first parent.
|
||||
except OSError, e:
|
||||
sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) )
|
||||
sys.exit(1)
|
||||
|
||||
# Decouple from parent environment.
|
||||
os.chdir("/")
|
||||
os.umask(022)
|
||||
os.setsid()
|
||||
|
||||
# Do second fork.
|
||||
try:
|
||||
pid = os.fork()
|
||||
if pid > 0:
|
||||
sys.exit(0) # Exit second parent.
|
||||
except OSError, e:
|
||||
sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) )
|
||||
sys.exit(1)
|
||||
|
||||
# Now I am a daemon!
|
||||
|
||||
# Redirect standard file descriptors.
|
||||
si = file(stdin, 'r')
|
||||
so = file(stdout, 'a+')
|
||||
se = file(stderr, 'a+', 0)
|
||||
os.dup2(si.fileno(), sys.stdin.fileno())
|
||||
os.dup2(so.fileno(), sys.stdout.fileno())
|
||||
os.dup2(se.fileno(), sys.stderr.fileno())
|
79
archive/python-lib/lock.py
Normal file
79
archive/python-lib/lock.py
Normal file
|
@ -0,0 +1,79 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
|
||||
""" Gestion de lock
|
||||
|
||||
Copyright (C) Frédéric Pauget
|
||||
Licence : GPLv2
|
||||
"""
|
||||
|
||||
import os,string,time,sys, affich_tools
|
||||
from commands import getoutput
|
||||
from user_tests import getuser
|
||||
|
||||
def make_lock(lock_file, lock_comment='',nowait=1) :
|
||||
""" Création d'un lock
|
||||
si nowait=0 fait un sys.exit(254) quand un ancien lock actif est rencontré
|
||||
"""
|
||||
if os.path.isfile(lock_file) :
|
||||
### Lock existant
|
||||
|
||||
# Lecture du lock
|
||||
fd = open(lock_file, "r")
|
||||
pid= fd.readline().strip()
|
||||
user = fd.readline().strip()
|
||||
fd.close()
|
||||
|
||||
# Informations sur le processus lockant
|
||||
if os.system( "ps %s > /dev/null 2>&1" % pid ) :
|
||||
# Le script lockant ne tourne plus
|
||||
os.remove(lock_file)
|
||||
elif nowait :
|
||||
sys.stderr.write('Lock : %s\n' % lock_file)
|
||||
l=getoutput('ps -o etime --no-headers %s' % pid)
|
||||
data = [ user , pid , l.strip() ]
|
||||
|
||||
# Formatate de etime
|
||||
s = data[-1].split('-')
|
||||
if len(s)==2 :
|
||||
txt = '%s jour(s) ' % s[0]
|
||||
s=s[1]
|
||||
else :
|
||||
txt = ''
|
||||
s=s[0]
|
||||
|
||||
s = s.split(':')
|
||||
if len(s) == 3 :
|
||||
txt = '%sh%smin%ss' % tuple(s)
|
||||
elif len(s) == 2 :
|
||||
txt = '%smin%ss' % tuple(s)
|
||||
else :
|
||||
txt = '???'
|
||||
|
||||
data[-1]=txt
|
||||
|
||||
sys.stderr.write('\tpropriétaire : %s\n\tpid : %s\n\tdémarré depuis %s\n' % tuple(data) )
|
||||
sys.exit(254)
|
||||
else :
|
||||
# Il faut attendre
|
||||
a = affich_tools.anim('\tattente du lock')
|
||||
for i in range(8) :
|
||||
time.sleep(1)
|
||||
a.cycle()
|
||||
sys.stdout.write('\r')
|
||||
return make_lock(lock_name, lock_comment)
|
||||
|
||||
### Prise du lock
|
||||
lock_fd=open(lock_file, "w")
|
||||
lock_fd.write("%s\n%s\n%s" % (os.getpid(), getuser(), lock_comment) )
|
||||
lock_fd.close()
|
||||
|
||||
def remove_lock( lock_file ) :
|
||||
""" Destruction du lock """
|
||||
try :
|
||||
fd = open(lock_file, "r")
|
||||
if fd.readline().strip()=="%s" % os.getpid():
|
||||
os.remove(lock_file)
|
||||
fd.close()
|
||||
except :
|
||||
None
|
38
archive/python-lib/user_tests.py
Normal file
38
archive/python-lib/user_tests.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
|
||||
""" Fonctions de tests sur l'utilisateur
|
||||
|
||||
Copyright (C) Frédéric Pauget
|
||||
Licence : GPLv2
|
||||
"""
|
||||
|
||||
import os, commands, pwd
|
||||
|
||||
def getuser() :
|
||||
""" Retourne l'utilisateur lancant les scripts """
|
||||
user = os.getenv('SUDO_USER')
|
||||
if not user :
|
||||
user = pwd.getpwuid(os.getuid())[0]
|
||||
return user
|
||||
|
||||
def groups(login='') :
|
||||
""" Retourne liste des groupes (gid) auquels appartient l'utilisateur
|
||||
fourni, si aucun utilisateur est founit prend l'utilisateur loggué """
|
||||
if login == '' : login = getuser()
|
||||
return commands.getoutput('id -G %s' % login).split()
|
||||
|
||||
def isadm(login='') :
|
||||
""" Retourne True si l'utilisateur est dans le groupe 4 (adm)
|
||||
Si login='', prend l'utilisateur loggué """
|
||||
return '4' in groups(login)
|
||||
|
||||
def isdeconnecteur(login='') :
|
||||
""" Retourne True si l'utilisateur est dans le groupe 610 (disconnect)
|
||||
Si login='', prend l'utilisateur loggué """
|
||||
return isadm(login) or '610' in groups(login)
|
||||
|
||||
def iscableur(login='') :
|
||||
""" Retourne True si l'utilisateur est dans le groupe 604 (respbat)
|
||||
Si login='', prend l'utilisateur loggué """
|
||||
return isadm(login) or '604' in groups(login)
|
Loading…
Add table
Add a link
Reference in a new issue