#!/usr/bin/python # # # Simple Multisync backup directory to mysql database synchronizer # # import MySQLdb import sys import os import quopri #quote printable if len(sys.argv)!=2: print "Usage: %s filename of multisync backup" % (sys.argv[0]) sys.exit() #config settings DATABASE="addrbook" PATH=sys.argv[1] TABLE="adresses" TBL_NAME="VORNAME" TBL_SN="NACHNAME" TBL_NR_CELL="NR_MOBIL" TBL_NR_WORK="NR_WORK" TBL_NR_HOME="NR_HOME" TBL_NR_VOICE="NR_VOICE" TBL_EMAIL="EMAIL" TBL_HOMEPAGE="HOMEPAGE" TBL_BIRTHDAY="BIRTHDAY" TBL_ADDRESS="ADDRESS" TBL_NOTE="NOTE" TBL_ID="ID" DB_HOST="localhost" DB_USER="root" DB_PASS="" #end config settings #database wrapper class mysql: def __init__(self):#connect to server and select database try: self.connection = MySQLdb.connect (host = DB_HOST, user = DB_USER, passwd = DB_PASS) self.query("USE "+DATABASE); except MySQLdb.Error, e: print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1) def query(self,query): #send a query and checking for errors, returns result (for selects) try: cursor=self.connection.cursor() cursor.execute(query) except MySQLdb.Error, e: print "Error %d: %s, query: '%s'" % (e.args[0], e.args[1],query) return cursor def update(self,query): #querys for updates/inserts (no return value) cursor=self.query(query) cursor.close() def initialize(self): #create database and table self.update("CREATE DATABASE IF NOT EXISTS "+DATABASE) self.update("USE "+DATABASE) self.update("DROP TABLE "+TABLE) self.update("CREATE TABLE "+TABLE+" ("+ TBL_NAME +" CHAR(255),"+ TBL_SN +" CHAR(255),"+ TBL_NR_CELL +" CHAR(255),"+ TBL_NR_WORK +" CHAR(255),"+ TBL_NR_HOME +" CHAR(255),"+ TBL_NR_VOICE +" CHAR(255),"+ TBL_EMAIL +" CHAR(255),"+ TBL_HOMEPAGE +" CHAR(255),"+ TBL_BIRTHDAY +" DATE,"+ TBL_ADDRESS +" CHAR(255),"+ TBL_NOTE +" CHAR(255),"+ TBL_ID +" CHAR(255),"+ " unique("+TBL_ID+"))") def close(self): self.connection.close() class entry: #for easier entry handling def __init__(self): self.name=[] self.value=[] def add(self,name,value): self.name.append(name) self.value.append(value) def count(self): return len(self.name) def getname(self,id): return self.name[id] def getvalue(self,id): return self.value[id] #Parse the vcard and insert it into the db def vcard(handle,filename): line=handle.readline() if line[:11]!="VERSION:2.1": print "Warn: Unknown Version in File %s" % (file) handle.close() return ent=entry() pre='' for line in handle.readlines(): #parse all lines of a file line=pre+line[:len(line)-2] pre='' if line[-1:]=="=": #merge newlines to one line pre=line[:len(line)-1] continue line=quopri.decodestring(line) #decode quoted-printable string arr=line.split(":",1) if len(arr)!=2: print "Error in "+filename+" line: "+line print arr continue attr=arr[0].split(";") name=attr[0] basename=filename.split('/'); if name == "N": nachname=arr[1].split(";",1) ent.add(TBL_SN,nachname[0]) if len(nachname)>1: ent.add(TBL_NAME,nachname[1].replace(";","")) elif name == "BDAY": ent.add(TBL_BIRTHDAY,arr[1]) elif name == "ADR": ent.add(TBL_ADDRESS,arr[1].replace(";"," ")) elif name == "NOTE": ent.add(TBL_NOTE,arr[1]) elif name == "EMAIL": ent.add(TBL_EMAIL,arr[1]) elif name == "URL": ent.add(TBL_HOMEPAGE,arr[1]) elif name == "TEL": if (len(attr)>1): if attr[1]=='CELL': ent.add(TBL_NR_CELL,arr[1]) elif attr[1]=='HOME': ent.add(TBL_NR_HOME,arr[1]) elif attr[1]=='WORK': ent.add(TBL_NR_WORK,arr[1]) else: print 'Unknown telephone number: '+attr[1] else: ent.add(TBL_NR_VOICE,arr[1]) elif name == "LABEL": #ignored, because of duplicate a=1 elif name == "FN": #ignored, because of duplicate a=1 elif name == "END": #ignored, no data a=1 else: print "Unknown attribute: %s in %s, not inserting into db" % (name,file) ent=entry() handle.close() if (ent.count>0): ent.add(TBL_ID,basename[len(basename)-1]) names="("+ent.getname(0) values=" VALUES ( '"+ent.getvalue(0)+"'" for i in range(ent.count()-1): names=names+","+ent.getname(i+1) values=values+",'"+ent.getvalue(i+1)+"'" names=names+")" values=values+")" mysql.update("INSERT INTO "+ TABLE + names + values) mysql=mysql() mysql.initialize() for filename in os.listdir(PATH): file=PATH+filename handle = open (file,"r") line=handle.readline() if line[:11]=="BEGIN:VCARD": vcard(handle,file); handle.close() elif line[:15]=="BEGIN:VCALENDAR": print "VCALENDER is unsupported: %s" % (filename) handle.close() else: print "Unknown File: %s head: %s" % (filename,line) mysql.update("COMMIT"); mysql.close()