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

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

should fix spaces

File size: 6.2 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                        source = '"%s"'%source
188                        destination = '"%s"'%destination
189                       
190                        rcmd = cmd + ecmd + [source,destination]
191                        plain_cmd=" ".join(rcmd)
192                        plain_cmd+=" || true"
193                       
194                        subprocess.call(plain_cmd,shell=True)
195                       
196               
197
198                print("[LoadSession] Stage 2")
199
200                home_files = self.MatchFolder(home)
201               
202                for hname in home_files:
203                        if not hname in profile_files:
204                                hpath=home+"/"+hname
205                               
206                                print("[rm] "+hname)
207                               
208                                rm=os.remove
209                               
210                                if(os.path.isdir(hpath)):
211                                        rm=shutil.rmtree
212                               
213                                rm(hpath)
214
215                # Stage 3
216                print("[LoadSession] Stage 3")
217                self.FinalActions()
218
219
220
221        def SaveSession(self):
222                moving_path=self.GetProfilePath()
223                print("[SaveSession] moving path: "+moving_path)
224               
225                if not os.path.exists(moving_path):
226                        print("[SaveSession] Creating profile path")
227                        try:
228                                os.makedirs(moving_path)
229                        except:
230                                raise
231                               
232                               
233               
234                cmd=["rsync","-aAX","--delete","--ignore-errors"]
235               
236               
237
238                print("rsync cmd:")
239                for c in cmd:
240                        print(c)
241               
242                home=os.path.expanduser("~")
243                print("[SaveSession] Synchronization")
244                print("[SaveSession] Stage 1")
245               
246                home_files = self.MatchFolder(home)
247                for fname in home_files:
248                        fpath=home+"/"+fname
249                       
250                        if(os.path.isdir(fpath)):
251                                fpath=fpath+"/"
252                       
253                        print("[rsync] "+fname)
254
255                        ecmd = []
256
257                        if(fname in self.ignore):
258                                elist = self.ignore[fname]
259                                for erule in elist:
260                                        ecmd.append("--exclude=%s"%erule)
261                                        print("* excluding: "+erule)           
262
263
264                        source = home +"/" + fname
265                        destination = moving_path+"/"+fname
266
267                        if(os.path.isdir(source)):
268                                source=source+"/"
269                                destination=destination+"/"
270
271                        source = '"%s"'%source
272                        destination = '"%s"'%destination
273                       
274                        rcmd = cmd + ecmd + [source,destination]                       
275                        subprocess.call(rcmd)   
276               
277                                       
278                       
279                print("[SaveSession] Stage 2")
280               
281                for fname in os.listdir(moving_path):
282                        if not fname in home_files:
283                                fpath=moving_path+"/"+fname
284                               
285                                print("[rm] "+fname)
286                               
287                                rm=os.remove
288
289                                if(os.path.isdir(fpath)):
290                                        rm=shutil.rmtree
291                                       
292                                rm(fpath)
293                               
294                               
295
296        def Backup(self,name):
297                backup_path=self.GetProfilePath()+"../.moving_profiles_backup/"+name
298               
299                print("[Backup] backup path: "+backup_path)
300               
301                if(os.path.exists(backup_path)):
302                        print("[Backup] "+name+" already exists")
303                        return
304                else:
305                        try:
306                                os.makedirs(backup_path)
307                        except:
308                                raise
309                       
310                       
311               
312                cmd=["rsync","-az","--delete"]
313               
314               
315               
316                home=os.path.expanduser("~")
317               
318                print("[Backup] Backing up as "+name)
319
320               
321                home_files = self.MatchFolder(home)
322                for fname in home_files:
323                        fpath=home+"/"+fname
324                       
325                        if(os.path.isdir(fpath)):
326                                fpath=fpath+"/"
327                       
328                        print("[rsync] "+fname)
329                       
330                        rcmd = cmd + [fpath, backup_path+"/"+fname ]                   
331                        subprocess.call(rcmd)   
332
Note: See TracBrowser for help on using the repository browser.