source: lliurex-moving-core/trunk/fuentes/src/net/Lliurex/Classroom/MovingProfiles/__init__.py @ 6779

Last change on this file since 6779 was 6779, checked in by hectorgh, 19 months ago

supporting spaces when rsyncing

File size: 6.1 KB
Line 
1import re
2import fnmatch
3import os
4import commands
5import subprocess
6import shutil
7import glob
8
9import xmlrpclib
10
11import locale
12import gettext
13
14locale.textdomain("xdg-user-dirs")
15gettext.textdomain("xdg-user-dirs")
16
17
18class MovingProfiles:
19       
20               
21       
22        def __init__(self,login,port=9779):
23       
24                self.ignore={"/":[".xinputrc"],".config":["/user-dirs.*","/google-chrome/Singleton*","/chromium/Singleton*","/libreoffice/4/.lock"],".mozilla":["/firefox/*.default/storage","/firefox/*.default/lock"],".local":["/share/teamviewer*","/share/Trash/*","/share/gvfs-metadata/*"]}
25               
26                self.login=login
27                server_port=str(port)
28               
29                server_name="server"
30               
31                self.connection_string = "https://"+server_name+":"+server_port
32                proxy = xmlrpclib.ServerProxy(self.connection_string)
33                               
34                #perform a cached read                         
35                self.cfg = proxy.get_list(login,"MovingProfiles")
36               
37
38               
39        def isInclude(self,filename):
40               
41                reti=[]
42                for name in self.cfg["include"]:
43                        value=self.cfg["include"][name]
44                        if fnmatch.fnmatchcase(filename,value):
45                                reti.append(name)
46                               
47                               
48                if len(reti)==0:
49                        return None
50                else:
51                        return reti
52               
53               
54        def isExclude(self,filename):
55               
56                rete=[]
57                for name in self.cfg["exclude"]:
58                        value=self.cfg["exclude"][name]
59                        if fnmatch.fnmatchcase(filename,value):
60                                rete.append(name)
61                               
62                if len(rete)==0:
63                        return None
64                else:
65                        return rete
66       
67       
68        def Match(self,fname):
69               
70                include=False
71
72               
73                for name in self.cfg["include"]:
74                        value=self.cfg["include"][name]
75                        if fnmatch.fnmatchcase(fname,value):
76                                include=True
77
78                                break
79                               
80                if include:
81                        for name in self.cfg["exclude"]:
82                                value=self.cfg["exclude"][name]
83                                if fnmatch.fnmatchcase(fname,value):
84
85                                        return False
86                                       
87                        return True
88                               
89                else:
90                        return False
91               
92       
93        def MatchFolder(self,path):
94       
95                mlist=[]
96       
97                for fname in os.listdir(path):
98                        if(self.Match(fname)):
99                                mlist.append(fname)
100                               
101                return mlist
102                       
103               
104       
105               
106        def Clear(self):
107                self.cfg={"include":{},"exclude":{}}
108                       
109               
110        def Save(self):
111                proxy = xmlrpclib.ServerProxy(self.connection_string)   
112                proxy.save_conf(self.login,"MovingProfiles",self.cfg)
113
114
115
116        def GetProfilePath(self):
117               
118                try:
119                       
120                        home=os.path.expanduser("~")
121                        execfile(home+"/.config/user-dirs.dirs")
122                        documents_dir=locals()["XDG_DOCUMENTS_DIR"].split("/")[1]
123                        moving_profiles="%s/%s/.moving_profiles/"%(home,documents_dir)
124                       
125                except Exception as e:
126               
127                        try:
128                                user=os.getenv("USER")
129                                documents=gettext.gettext("Documents")
130                                moving_profiles = "/home/%s/%s/.moving_profiles/"%(user,documents)
131                               
132                        except:
133                                print ("[GetProfilePath] Failed constructing home path")
134                                raise
135               
136
137                return moving_profiles
138               
139
140        def FinalActions(self):
141               
142                path="/usr/share/lliurex-moving-core/postactions/"
143               
144                for f in sorted(glob.glob(path+"*")):
145                        print("* Executing %s ..."%f)
146                        os.system(f + " || true")               
147               
148        #def FinalActions
149
150               
151        def LoadSession(self):
152                moving_path=self.GetProfilePath()
153                home=os.path.expanduser("~")
154               
155                if not os.path.exists(moving_path):
156                        # at least execute final actions before exiting
157                        self.FinalActions()
158                        raise Exception("Profile dir not found, aborting load")
159                       
160                       
161                print("[LoadSession] Synchronization")
162                print("[LoadSession] Stage 1")
163               
164               
165                cmd=["rsync","-aAX","--delete","--ignore-errors"]
166               
167                profile_files=self.MatchFolder(moving_path)
168               
169                for fname in profile_files:
170                        print("[rsync] "+fname)
171
172                        ecmd=[]
173                        if(fname in self.ignore):
174                                elist=self.ignore[fname]
175                                for erule in elist:
176                                        ecmd.append("--exclude=%s"%erule)
177                                        print("* excluding: "+erule)
178                                       
179                       
180                        source = '"%s/%s"'%(moving_path,fname)
181                        destination='"%s/%s"'%(home,fname)
182
183                        if(os.path.isdir(source)):
184                                source=source+"/"
185                                destination=destination+"/"
186                       
187                        rcmd = cmd + ecmd + [source,destination]
188                        plain_cmd=" ".join(rcmd)
189                        plain_cmd+=" || true"
190                       
191                        subprocess.call(plain_cmd,shell=True)
192                       
193               
194
195                print("[LoadSession] Stage 2")
196
197                home_files = self.MatchFolder(home)
198               
199                for hname in home_files:
200                        if not hname in profile_files:
201                                hpath=home+"/"+hname
202                               
203                                print("[rm] "+hname)
204                               
205                                rm=os.remove
206                               
207                                if(os.path.isdir(hpath)):
208                                        rm=shutil.rmtree
209                               
210                                rm(hpath)
211
212                # Stage 3
213                print("[LoadSession] Stage 3")
214                self.FinalActions()
215
216
217
218        def SaveSession(self):
219                moving_path=self.GetProfilePath()
220                print("[SaveSession] moving path: "+moving_path)
221               
222                if not os.path.exists(moving_path):
223                        print("[SaveSession] Creating profile path")
224                        try:
225                                os.makedirs(moving_path)
226                        except:
227                                raise
228                               
229                               
230               
231                cmd=["rsync","-aAX","--delete","--ignore-errors"]
232               
233               
234
235                print("rsync cmd:")
236                for c in cmd:
237                        print(c)
238               
239                home=os.path.expanduser("~")
240                print("[SaveSession] Synchronization")
241                print("[SaveSession] Stage 1")
242               
243                home_files = self.MatchFolder(home)
244                for fname in home_files:
245                        fpath=home+"/"+fname
246                       
247                        if(os.path.isdir(fpath)):
248                                fpath=fpath+"/"
249                       
250                        print("[rsync] "+fname)
251
252                        ecmd = []
253
254                        if(fname in self.ignore):
255                                elist = self.ignore[fname]
256                                for erule in elist:
257                                        ecmd.append("--exclude=%s"%erule)
258                                        print("* excluding: "+erule)           
259
260
261                        source = home +"/" + fname
262                        destination = moving_path+"/"+fname
263
264                        if(os.path.isdir(source)):
265                                source=source+"/"
266                                destination=destination+"/"
267
268                       
269                        rcmd = cmd + ecmd + [source,destination]                       
270                        subprocess.call(rcmd)   
271               
272                                       
273                       
274                print("[SaveSession] Stage 2")
275               
276                for fname in os.listdir(moving_path):
277                        if not fname in home_files:
278                                fpath=moving_path+"/"+fname
279                               
280                                print("[rm] "+fname)
281                               
282                                rm=os.remove
283
284                                if(os.path.isdir(fpath)):
285                                        rm=shutil.rmtree
286                                       
287                                rm(fpath)
288                               
289                               
290
291        def Backup(self,name):
292                backup_path=self.GetProfilePath()+"../.moving_profiles_backup/"+name
293               
294                print("[Backup] backup path: "+backup_path)
295               
296                if(os.path.exists(backup_path)):
297                        print("[Backup] "+name+" already exists")
298                        return
299                else:
300                        try:
301                                os.makedirs(backup_path)
302                        except:
303                                raise
304                       
305                       
306               
307                cmd=["rsync","-az","--delete"]
308               
309               
310               
311                home=os.path.expanduser("~")
312               
313                print("[Backup] Backing up as "+name)
314
315               
316                home_files = self.MatchFolder(home)
317                for fname in home_files:
318                        fpath=home+"/"+fname
319                       
320                        if(os.path.isdir(fpath)):
321                                fpath=fpath+"/"
322                       
323                        print("[rsync] "+fname)
324                       
325                        rcmd = cmd + [fpath, backup_path+"/"+fname ]                   
326                        subprocess.call(rcmd)   
327
Note: See TracBrowser for help on using the repository browser.