source: n4d-backup-manager/trunk/fuentes/n4d-backup-manager.install/usr/share/n4d/python-plugins/support/BackupManager.py @ 5239

Last change on this file since 5239 was 5239, checked in by jrpelegrina, 2 years ago

Updated bdd pmb version when backup is restored

File size: 5.2 KB
Line 
1##################################################
2#In order to add a backup:
3# - Instatiate backupmanager class
4# - Asign backup name, app files, dbfiles and dirs (if any)
5# - For an example take a look to PmbManager or MoodleManager
6##################################################
7
8import tempfile
9import shutil
10import os
11import subprocess
12import tarfile
13import time   
14
15class BackupManager:
16        def __init__(self,app=''):
17                #Need to def files and dirs for moodle, pmb and others
18                self.apps_files={}
19                self.apps_dbFiles={} 
20                self.apps_dirs={}
21                self.db_configPath='/etc/lliurex-sgbd'
22                self.backupName=''
23                self.app=app
24       
25        def set_app_dbFiles(self,dbFiles):
26                self.apps_dbFiles=dbFiles
27
28        def set_app_files(self,files):
29                self.apps_files=files
30
31        def set_app_dirs(self,dirs):
32                self.apps_dirs=dirs
33
34        def set_backup_name(self,backupName=None):
35                self.backupName=backupName
36                return self.backupName
37
38        def get_time(self):
39                return self.backupName
40
41        def get_db_name(self,app):
42                try:
43                        files=os.listdir(self.db_configPath)
44                        dbName=''
45                        dbConfig=''
46                        for i in files:
47                                if app in i:
48                                        dbConfig=i
49                                        break
50                        if os.path.exists(self.db_configPath+'/'+dbConfig):
51                                for line in open(self.db_configPath+'/'+dbConfig):
52                                        if line.startswith("DB_NAME"):
53                                                dbName=str(line.split("=")[-1])
54                                                dbName=dbName.rstrip()
55                                                dbName=dbName.lstrip()
56                                                break
57                               
58                except Exception as e:
59                        print e
60                        return [False,str(e)]
61                return dbName
62
63
64        def backup(self,dir="/backup"):
65                try:
66                        file_path=dir+"/"+self.get_time()
67                        tar=tarfile.open(file_path,"w:gz")
68                        if self.app in self.apps_files:
69                                for f in list(self.apps_files[self.app]):
70                                        #Add file to tar
71                                        if os.path.exists(f):
72                                                tar.add(f)
73                        if self.app in self.apps_dirs: 
74                                for d in list(self.apps_dirs[self.app]):
75                                        if os.path.exists(d):
76                                        #Add dir to tar
77                                                tar.add(d)
78                        if self.app in self.apps_dbFiles:
79                                dbDumpFile=self.dumpDb(str(self.app))
80                                if dbDumpFile!='':
81                                        if os.path.exists(dbDumpFile):
82                                                        tar.add(dbDumpFile)
83                                        else:
84                                                print "%s database not found!!" % str(self.app)
85                                else:
86                                        print "%s database not found!!" % str(self.app)
87
88                        tar.close()
89                        return [True,file_path]
90                except Exception as e:
91                        print e
92                        return [False,str(e)]
93
94        def restore(self,file_path=None):
95                try:
96                        if file_path==None:
97                                for f in sorted(os.listdir("/backup"),reverse=True):
98                                        if self.backupName in f:
99                                                file_path="/backup/"+f
100                                                break
101
102                        if file_path==None:
103                                return [False,"Backup file not found"]
104                        if os.path.exists(file_path):
105                                tmp_dir=tempfile.mkdtemp()
106                                tar=tarfile.open(file_path)
107                                tar.extractall(tmp_dir)
108                                tar.close()
109                                if self.app in self.apps_files:
110                                        for f in list(self.apps_files[self.app]):
111                                                tmp_path=tmp_dir+f
112                                                #Avoid cname restore
113                                                if not "/var/lib/dnsmasq/config/" in tmp_path:
114                                                        if os.path.exists(tmp_path):
115                                                                shutil.copy(tmp_path,f)
116                               
117                                if self.app in self.apps_dirs:
118                                        for d in list(self.apps_dirs[self.app]):
119                                                tmp_path=tmp_dir+d
120                                                if os.path.exists(tmp_path):
121#                                                       self.mkdir(d)
122                                                        cmd="cp -r " + tmp_path + "/* " + d
123                                                        if not os.path.exists(d):
124                                                                os.makedirs(d)
125                                                        os.system(cmd)
126       
127                                sw_updateDb=False
128                                if os.path.exists(tmp_dir+"/tmp"):
129                                        for f in os.listdir(tmp_dir+"/tmp"):
130                                                if ".sql" in f:
131                                                        self.restoreDb(tmp_dir+"/tmp/"+f)
132                                                        sw_updateDb=True
133
134                                if sw_updateDb:
135                                        try:
136                                                cmd="mysql_upgrade"
137                                                os.system(cmd)
138                                        except Exception as e:
139                                                print e
140
141                                self._fix_root_pwd()
142                                return [True,""]
143
144                except Exception as e:
145                        print e
146                        return [False,str(e)]
147                #Tmpdir is now ready
148
149        def _fix_root_pwd(self):
150                cmd='/usr/sbin/lliurex-sgbd --upgrade lliurex-'+self.app
151                os.system(cmd)
152               
153        #_fix_root_pwd
154
155        def existsDb(self,dbName):
156                cmd='/usr/sbin/lliurex-sgbd --db_is_present ' + dbName
157                try:
158                        sp=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
159                        output=sp.communicate()
160                        dbExists=str(output[0])
161                        if dbExists.rstrip() == 'YES':
162                                dbExists=True
163                        else:
164                                dbExists=False
165                except: 
166                        dbExists=False
167                return dbExists
168
169        def dumpDb(self,db,path='/tmp'):
170                try:
171                        dbName=self.get_db_name(db)
172                        if self.existsDb(dbName):
173                                dbUser='root'
174#                               dbPass=''
175#                               for dbFile in list(self.apps_dbFiles[db]):
176#                                       if "debian-db.php" in dbFile:
177#                                               for line in open(dbFile):
178#                                                       if "dbuser" in line:
179#                                                               dbUser=str(line.split("=")[-1])
180#                                                               dbUser=dbUser.rstrip()
181#                                                               dbUser=dbUser[:-1]
182#                                                       elif "dbpass" in line:
183#                                                               dbPass=str(line.split("=")[-1])
184#                                                               dbPass=dbPass.rstrip()
185#                                                               dbPass=dbPass[:-1]
186#                                                       if (dbUser!='' and dbPass!=''):
187#                                                               break
188#                                       if (dbUser!='' and dbPass!=''):
189#                                               break
190#                               if (dbUser!='' and dbPass!=''):
191                                cmd='mysqldump --single-transaction --default-character-set=utf8 --routines --databases ' + dbName + ' --flush-privileges -u' + dbUser +' -p$(mysql_root_passwd -g)' + ' ' + dbName + '  > ' + path + '/' + dbName + '.sql'
192                                os.system(cmd)
193                                return path+'/'+ dbName+".sql"
194                        else:
195                                return ''
196                except Exception as e:
197                        print e
198                        pass
199       
200        def restoreDb(self,dbDump_path):
201                try:
202                        cmd="mysql -u root -p$(mysql_root_passwd -g) < "+ dbDump_path
203                        os.system(cmd)
204                except Exception as e:
205                        print e
206                        return [False,str(e)]
207       
Note: See TracBrowser for help on using the repository browser.