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

Last change on this file since 2647 was 2647, checked in by Juanma, 3 years ago

Minor bug fixing

File size: 5.0 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                                try:
81                                        if os.path.exists(dbDumpFile):
82                                                tar.add(dbDumpFile)
83                                except Exception as e:
84                                        print "%s database not found!!" % str(application)
85                                        continue
86
87                        tar.close()
88                        return [True,file_path]
89                except Exception as e:
90                        print e
91                        return [False,str(e)]
92
93        def restore(self,file_path=None):
94                try:
95                        if file_path==None:
96                                for f in sorted(os.listdir("/backup"),reverse=True):
97                                        if self.backupName in f:
98                                                file_path="/backup/"+f
99                                                break
100
101                        if file_path==None:
102                                return [False,"Backup file not found"]
103                        if os.path.exists(file_path):
104                                tmp_dir=tempfile.mkdtemp()
105                                tar=tarfile.open(file_path)
106                                tar.extractall(tmp_dir)
107                                tar.close()
108                                if self.app in self.apps_files:
109                                        for f in list(self.apps_files[self.app]):
110                                                tmp_path=tmp_dir+f
111                                                #Avoid cname restore
112                                                if not "/var/lib/dnsmasq/config/" in tmp_path:
113                                                        if os.path.exists(tmp_path):
114                                                                shutil.copy(tmp_path,f)
115                               
116                                if self.app in self.apps_dirs:
117                                        for d in list(self.apps_dirs[self.app]):
118                                                tmp_path=tmp_dir+d
119                                                if os.path.exists(tmp_path):
120#                                                       self.mkdir(d)
121                                                        cmd="cp -r " + tmp_path + "/* " + d
122                                                        if not os.path.exists(d):
123                                                                os.makedirs(d)
124                                                        os.system(cmd)
125       
126                                sw_updateDb=False
127                                if os.path.exists(tmp_dir+"/tmp"):
128                                        for f in os.listdir(tmp_dir+"/tmp"):
129                                                if ".sql" in f:
130                                                        self.restoreDb(tmp_dir+"/tmp/"+f)
131                                                        sw_updateDb=True
132
133                                if sw_updateDb:
134                                        try:
135                                                cmd="mysql_upgrade"
136                                                os.system(cmd)
137                                        except Exception as e:
138                                                print e
139                                return [True,""]
140
141                except Exception as e:
142                        print e
143                        return [False,str(e)]
144                 #Tmpdir is now ready
145
146        def existsDb(self,dbName):
147                cmd='/usr/sbin/lliurex-sgbd --db_is_present ' + dbName
148                sp=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
149                output=sp.communicate()
150                dbExists=str(output[0])
151                if dbExists.rstrip() == 'YES':
152                        dbExists=True
153                else:
154                        dbExists=False
155               
156                return dbExists
157
158        def dumpDb(self,db,path='/tmp'):
159                try:
160                        dbName=self.get_db_name(db)
161                        if self.existsDb(dbName):
162                                dbUser='root'
163#                               dbPass=''
164#                               for dbFile in list(self.apps_dbFiles[db]):
165#                                       if "debian-db.php" in dbFile:
166#                                               for line in open(dbFile):
167#                                                       if "dbuser" in line:
168#                                                               dbUser=str(line.split("=")[-1])
169#                                                               dbUser=dbUser.rstrip()
170#                                                               dbUser=dbUser[:-1]
171#                                                       elif "dbpass" in line:
172#                                                               dbPass=str(line.split("=")[-1])
173#                                                               dbPass=dbPass.rstrip()
174#                                                               dbPass=dbPass[:-1]
175#                                                       if (dbUser!='' and dbPass!=''):
176#                                                               break
177#                                       if (dbUser!='' and dbPass!=''):
178#                                               break
179#                               if (dbUser!='' and dbPass!=''):
180                                cmd='mysqldump --single-transaction --default-character-set=utf8 --routines --databases ' + dbName + ' --flush-privileges -u' + dbUser +' -p$(mysql_root_passwd -g)' + ' ' + dbName + '  > ' + path + '/' + dbName + '.sql'
181                                os.system(cmd)
182                                return path+'/'+ dbName+".sql"
183                        else:
184                                return False
185                except Exception as e:
186                        print e
187                        return [False,str(e)]
188       
189        def restoreDb(self,dbDump_path):
190                try:
191                        cmd="mysql -u root -p$(mysql_root_passwd -g) < "+ dbDump_path
192                        os.system(cmd)
193                except Exception as e:
194                        print e
195                        return [False,str(e)]
196       
Note: See TracBrowser for help on using the repository browser.