Archiver dossier tar gz

Comment compresser tout un dossier


import tarfile,os


def arch_dir(filename_arch, source_path):

    #'/home/pascal/test4.tar.gz'
    tf = tarfile.open(filename_arch,'w:gz')
    tf.add(source_path,arcname = os.path.split(source_path)[-1])
    tf.close()


if __name__=='__main__':
 
 src='/home/pascal/dev/bottle'
 arc='/home/pascal/test1.tar.gz'
 
 arch_dir(arc,src)

variation BD SQL Server

variation BD SQL Server

Le code ci dessus créer la classe sign qui permet de générer les clefs checksum de tous les objets (table,procédures stockée fonction et vues) d’une base de données SQL server.

Usage:

 

méthode
description
sign() créer une instance de la classe
connect() se connecte au serveur de données (ms SQL server)
checksum() calcul la clef de chaque objet de la bd
checksumTables() calcule la clef de toutes les tables de la bd
checksumScripts() calcule la clef de touts les script procédures fonctions vues
save() enregistre le résultat du calcul dans un fichier

 

 

#-*-coding:utf-8-*-
 
"""
    Objet
    Calcul des clefs checksum de chaque objet d'une base SQL
    Tables/Procédures/fonctions/vues
"""
 
import pymssql
import Tkinter, tkFileDialog # pour save
import time
import datetime
 
class sign(dict):
    def __init__(self):
        pass
    def connect(self,srv,db,usr=None,pwd=None):
        """connexion à un serveur ms sql server"""
        self.server=srv
        self.database=db
        
        if usr:
            self.cnx= pymssql.connect(host=srv,user=usr,password=pwd,database=db)
        else:
            self.cnx= pymssql.connect(host=srv,user=usr,trusted=True)
                    
    def scripts(self):
        """retrourne la liste des nom de fonctions, vue, et procedures de la bd"""
        rq = "select name from sysobjects where xtype in ('P','V','IF','TF','FN')"
        crs=self.cnx.cursor()
        crs.execute(rq)
        ds=crs.fetchall()
        crs.close()
        T=[]
        for dr in ds:
            T.append(dr[0])
        return T
    
    def tables(self):
        """liste des tables """
        rq="select name from sysobjects where xtype in ('U')"
        crs=self.cnx.cursor()
        crs.execute(rq)
        ds=crs.fetchall()
        crs.close()
        T=[]
        for dr in ds:
            T.append(dr[0])
        return T
    
    def checksumScript(self,scriptName):
        """ Objet calcul la clef du script passé en param """    
 
        self.sqlexec("create table #script(texte varchar(255))")
        self.sqlexec("insert into #script exec ('sp_helptext ''%s''')" % scriptName)
        R=self.checksumTable("#script")
        self.sqlexec("drop table #script")
        return R
        
    def checksumTable(self,tableName):
        """ Objet calcul la clef de la table passée en param """
        rq="select  checksum_agg(binary_checksum(*)) from %s" % tableName
        R= self.sqlGetValue(rq)
        if not R:
            R=0
        return R
    
    def sqlGetValue(self, requete):
        """retourne une valeur scalaire d'une requete sql"""
        crs=self.cnx.cursor()
        crs.execute(requete)
        dr=crs.fetchone()
        R=dr[0]
        crs.close()
        return R
        
    def sqlGetValues(self, requete):
        """retourne la premiere colonne d'un jeu de donnée sous form de liste"""
        crs=self.cnx.cursor()
        crs.execute(requete)
        ds=crs.fetchall()
        crs.close()
        T=[]
        for dr in ds:
            T.append(dr[0])
        return T
    
    def sqlexec(self,requete):
        """execute l'instruction sql passée en param"""
        crs=self.cnx.cursor()
        crs.execute(requete)
        crs.close()
    
    def checksumTables(self):
        """calcul la clef de toutes les tables de la bd"""
        self.type='tables'
        self.clear()
        for t in self.tables():
            self[t]=self.checksumTable(t)
        
    def checksumScripts(self):
        """calcul la clef de tous les scripts de la bd"""
        self.type='scripts'
        self.clear()
        for s in self.scripts():
            self[s]=self.checksumScript(s)
        
    def checksum(self):
        """calcul la clef de tous les scripts et tables de la bd"""
        self.type='all'
        self.clear()
        for x in self.tables():
            self[x]=self.checksumTable(x)
        for x in self.scripts():
            self[x]=self.checksumScript(x)
 
    def close(self):
        self.cnx.close()
    
    def save(self, fichier=None):
        """Sauvegarde des checksum calculés dans un fichier"""
        if not fichier:
            strdate=datetime.datetime.today().strftime('%Y-%m-%d_%Hh%M')
            model= 'checksum.%s.%s.%s.%s.txt'%(self.server.replace('\\','.'),self.database,self.type,strdate)
            title='Enregistrer sous...'
            fichier=tkFileDialog.asksaveasfilename(parent= Tkinter.Tk(),title=title,initialfile=model)
        if fichier:
            f=open(fichier,'w')
            
            T=self.keys()
            T.sort()
            for t in T:
                f.write('%s %i\n' % (t,self[t]))
            
            f.close()
 
# ------------------------------------------------------------ OK 26-10-2011
# USAGE
# créer une nouvelle instance
s=sign()
# se connecte à une bd  par nom utilisateur/mot de passe
s.connect(SERVEUR,BASE,USER,PASS)
# se connecte à une bd  par authentification approuvée (LDAP)
#s.connect(SERVEUR,BASE)
 
# calcul des checksum des tables et des scripts (tout)
#s.checksum()
# calcul des checksum des tables
s.checksumTables()
# calcul des checksum des scripts
#s.checksumScripts()
#listes des tables
#s.tables()
#liste des scripts
#s.scripts
#Sauvegarde des checksum calculés dans un fichier
s.save()
s.close()
 

PDF

Deux librairies très utiles:

reportLab: qui permet d’ecrire des pdf à partir de rien doc assez complète (en) graphic paragraphe…

pyPdf: qui permet de manipuler des pdf existant notament de fusionner des pages pour produire de nouveaux pdf

Combinaison des deux permet de créer un model de formulaire et de rajouter des données à la volée pour produire rapidement de documents variable.

Dans mon cas : Un modèle riche avec mise en forme. openOffice -> modele.pdf

+ base de données dont les champs doivent être fusionnés avec le doc modèle. (la fusion native ooo ne s’avérant pas hyper clean…)

 

Exemple reportLab en oeuvre

from reportlab.pdfgen import canvas
from reportlab.lib.units import mm
cnv=canvas.Canvas(fichier)
cnv.setTitle('Grand titre')	
cnv.setFont("Helvetica-Bold",11)
cnv.drawString(90*mm, 111*mm,'mon texte')
textobject = cnv.beginText()
textobject.setTextOrigin(135*mm, 168*mm)
textobject.setFont("Helvetica-Oblique", 8)
textobject.textLines('''ligne1.\n ligne 2...'''))
cnv.drawText(textobject)
cnv.save()

Exemple de fusion de la première pag de 2 pdfs:

#-*-coding:utf-8-*-
from pyPdf import PdfFileWriter, PdfFileReader
# pdf entrée 1
pdf_file_model = PdfFileReader(file("Model.pdf", "rb"))
pdf_page_model = pdf_file_model.getPage(0)
# pdf entrée 2
pdf_file_data = PdfFileReader(file("test.pdf", "rb"))
pdf_page_data = pdf_file_data.getPage(0)
# fusion / merge
pdf_page_model.mergePage(pdf_page_data)
# pdf sortie
output = PdfFileWriter()
# ajout les données de la fusion sur la sortie
output.addPage(pdf_page_model)
# ecrit la sortie dans un fichier
outputStream = file("doc-output.pdf", "wb")
output.write(outputStream)
outputStream.close()

 

LDAP

install python-ldap

apt-get install python-ldap

Authentification

#-*-coding: utf-8-*-
def ldap_auth(srv_ldap, user_dn, user_pw ):
    """ Fonction qui prend un serveur ldap un nom d'utilisateur et un mot de passe
        retourne True si l'utilisateur est reconnu ou pas
    """
    import ldap
    import sys
    
    if user_pw and user_dn:
        
        server=srv_ldap
        try:
            conx = ldap.initialize(server)
            try:
                conx.simple_bind_s(user_dn, user_pw)
                conx.unbind()
                return True
            except ldap.INVALID_CREDENTIALS:
                print "Your username or password is incorrect."
                return False
        except ldap.LDAPError, e:
            if type(e.message) == dict and e.message.has_key('desc'):
                print e.message['desc']
            else:
                print e
            return False
        return False
    else:
        return False

Champs

def ldap_get_val(srv,usr,pwd, baseDN,searchFilter, listFields):
    """ 
        Entree
            srv = serveur ldap
            usr = utilisateur valide de l'annuaire
            pwd= mot de passe de l'utilisateur
            searchFilter=motif de recherche (recherche les noued contenant ce motif)
            listFields=liste des champs attendus
             
        Sortie
            Liste de liste des champs voulus
    """
    import ldap
    ## first you must open a connection to the server
    try:
        #ldap.set_option(ldap.OPT_REFERRALS, 0)
        l=ldap.initialize(srv)     
        l.bind(usr, pwd)
        l.protocol_version = ldap.VERSION3     
         
    except ldap.LDAPError, e:
        print e
        # handle error however you like
    ## The next lines will also need to be changed to support your search requirements and directory
    searchScope = ldap.SCOPE_SUBTREE
    ## retrieve all attributes - again adjust to your needs - see documentation for more options
    retrieveAttributes = None 
     
    try:
        ldap_result_id = l.search(baseDN, searchScope, searchFilter, retrieveAttributes)
        result_set = []
        while 1 :
            result_type, result_data = l.result(ldap_result_id, 0)
            if (result_data == []):
                break
            else:
                if result_type == ldap.RES_SEARCH_ENTRY:
                    tupl=result_data[0]
                    node=tupl[0]
                    dic=tupl[1]
                    result_set.append( [dic[x] for x in listFields])
                     
        return result_set
    except ldap.LDAPError, e:
        print e
#-*-coding:utf-8-*-
import ldap
from noyau.var import param
def verifier(srv_ldap,domaine, user_dn, user_pw ):
	""" Fonction qui prend un serveur ldap un nom d'utilisateur et un mot de passe
		retourne True si l'utilisateur est reconnu ou pas
	"""
	if user_pw and user_dn:
		if domaine:
			user_dn = domaine + '\\' + user_dn
		try:
			conx = ldap.initialize(srv_ldap)
			try:
				conx.simple_bind_s(user_dn, user_pw)
				conx.unbind()
				return True
			except ldap.INVALID_CREDENTIALS:
				print "Votre identifiant ou votre mot de passe est incorrect."
				return False
		except ldap.LDAPError, e:
			return False
	else:
		return False

 

 

Notification gnome

Notification

#!/usr/bin/python
 
import sys
import pynotify
titre="Salut Pascal"
message="Petite notification\npour te dire que tout est ok\nBye"
if not pynotify.init ("icon-summary-body"):
    sys.exit (1)
n = pynotify.Notification (titre,  message)
n.show ()