source: lliurex-enterprise-mount/trunk/fuentes/install-files/usr/bin/lliurex-enterprise-mount-editor @ 1012

Last change on this file since 1012 was 1012, checked in by jrpelegrina, 5 years ago

First release to xenial

  • Property svn:executable set to *
File size: 14.1 KB
Line 
1#!/usr/bin/env python
2
3import gi
4gi.require_version('Gtk','3.0')
5from gi.repository import Gtk, Gdk, GObject,GLib
6import os
7import xmlrpclib
8import sys
9import pwd
10import time
11import imp
12import glob
13
14import gettext
15_=gettext.gettext
16gettext.textdomain('lliurex-enterprise-mount')
17
18import signal
19signal.signal(signal.SIGINT, signal.SIG_DFL)
20
21GVA_COLOR="#afcdf6"
22WHITE_COLOR="#ffffff"
23RED_COLOR="#ff4545"
24
25class LliurexGvaEditor:
26       
27        LLIUREX_GVA="/usr/share/lliurex-enterprise-mount/scripts/lliurex-enterprise-mount-common"
28       
29        def __init__(self):
30
31                self.remote_path=None
32                self.selection=None
33
34                self.paths={}
35                self.paths["own_domain"]=os.path.expanduser("~/.lliurex-enterprise-mount/own-domain/")
36                self.paths["external_domain"]=os.path.expanduser("~/.lliurex-enterprise-mount/external-domains/")
37                self.paths["gui_odfile"]=self.paths["own_domain"]+"lliurex-enterprise-mount-editor"
38               
39                if os.path.exists(self.LLIUREX_GVA):
40
41                        try:
42                                obj=imp.load_source("EnterpriseMountCommon",self.LLIUREX_GVA)
43                                gui=obj.EnterpriseMountCommon()
44                                self.remote_path=gui.get_windows_home_directory(os.environ["USER"])
45                                if self.remote_path!=None:
46                                       
47                                        tmp=self.remote_path.split("/")
48                                        server=tmp[2]
49                                        path=tmp[3]
50                                        user_path=os.environ["HOME"]+"/"+path
51                                       
52                                        self.remote_path=user_path+"/"+os.environ["USER"].upper()
53                               
54                        except Exception as e:
55                                print e
56                                self.remote_path=None
57               
58                self.create_dirs()
59                self.start_gui()
60                Gtk.main()
61               
62        #def init
63
64       
65        def create_dirs(self):
66               
67                for item in self.paths:
68                        if "file" not in item:
69                                if not os.path.exists(self.paths[item]):
70                                        os.makedirs(self.paths[item])
71               
72        #def create_dirs
73
74       
75        def start_gui(self):
76               
77                if os.path.exists("/srv/svn/trusty/lliurex-gva/trunk/fuentes/install-files/usr/share/lliurex-enterprise-mount/rsrc/lliurex-enterprise-mount-editor.glade"):
78                        glade_path="/srv/svn/trusty/lliurex-gva/trunk/fuentes/install-files/usr/share/lliurex-enterprise-mount/rsrc/lliurex-enterprise-mount-editor.glade"
79                else:
80                        glade_path="/usr/share/lliurex-enterprise-mount/rsrc/lliurex-enterprise-mount-editor.glade"
81                builder=Gtk.Builder()
82                builder.set_translation_domain("lliurex-enterprise-mount")
83                builder.add_from_file(glade_path)
84               
85                self.window=builder.get_object("window1")
86                self.add_button=builder.get_object("add_button")
87                self.main_exit=builder.get_object("exitbutton")
88                self.remove_button=builder.get_object("remove_button")
89                self.treeview=builder.get_object("treeview3")
90                self.treeview.connect("row-activated",self.double_click)
91               
92                self.add_dialog=builder.get_object("dialog1")
93                self.server_entry=builder.get_object("server_entry1")
94                self.shared_entry=builder.get_object("shared_entry1")
95                self.mount_entry=builder.get_object("mount_entry1")
96                self.add_button2=builder.get_object("add_button2")
97                self.edit_button=builder.get_object("edit_button")
98                self.cancel_button=builder.get_object("cancel_button")
99               
100                self.save_dialog=builder.get_object("dialog2")
101                self.save_button=builder.get_object("save_button")
102                self.back_button=builder.get_object("back_button")
103                self.exit_button=builder.get_object("exit_button")
104               
105                self.add_dialog.connect("delete_event",self.hide_dialog)
106                self.add_button2.connect("clicked",self.add_dialog_clicked)
107                self.cancel_button.connect("clicked",self.cancel_clicked)
108                self.shared_entry.connect("changed",self.shared_entry_changed)
109                self.edit_button.connect("clicked",self.edit_clicked)
110               
111                self.save_button.connect("clicked",self.save_clicked)
112                self.back_button.connect("clicked",self.back_clicked)
113                self.exit_button.connect("clicked",Gtk.main_quit)
114                self.save_dialog.connect("delete_event",self.hide_dialog)
115               
116                self.window.connect("delete_event",self.quit)
117                self.add_button.connect("clicked",self.add_clicked)
118                self.main_exit.connect("clicked",self.quit,None)
119                self.remove_button.connect("clicked",self.remove_clicked)
120               
121                self.custom_grid=builder.get_object("custom_grid")
122                self.user_grid=builder.get_object("user_grid")
123               
124                self.serverc_entry=builder.get_object("server_entry")
125                self.sharedc_entry=builder.get_object("shared_entry")
126                self.mountc_entry=builder.get_object("mount_entry")
127                self.userc_entry=builder.get_object("user_entry")
128                self.passwordc_entry=builder.get_object("password_entry")
129               
130                self.ud_radiobutton=builder.get_object("userdomain_radiobutton")
131                self.cd_radiobutton=builder.get_object("customdomain_radiobutton")
132                self.ud_radiobutton.connect("toggled",self.ud_toggled)
133               
134                self.sharedc_entry.connect("changed",self.shared_entry_changed)
135
136                self.custom_grid.hide()
137               
138                self.set_values()
139               
140                self.window.show()
141               
142        #def start_gui
143       
144       
145        def ud_toggled(self,widget):
146               
147                if widget.get_active():
148                        if self.serverc_entry.get_text()!="":
149                                self.server_entry.set_text(self.serverc_entry.get_text())
150                        if self.sharedc_entry.get_text()!="":
151                                self.shared_entry.set_text(self.sharedc_entry.get_text())
152                        if self.mountc_entry.get_text()!="":
153                                self.mount_entry.set_text(self.mountc_entry.get_text())
154                        self.user_grid.show()
155                        self.custom_grid.hide()
156                else:
157                        if self.server_entry.get_text()!="":
158                                self.serverc_entry.set_text(self.server_entry.get_text())
159                        if self.shared_entry.get_text()!="":
160                                self.sharedc_entry.set_text(self.shared_entry.get_text())
161                        if self.mount_entry.get_text():
162                                self.mountc_entry.set_text(self.mount_entry.get_text())
163                        self.user_grid.hide()
164                        self.custom_grid.show()
165                       
166        #def ud_toggled
167       
168       
169        def parse_file(self):
170               
171                ret=[]
172               
173                for section in ["own_domain","external_domain"]:
174               
175                        for item in glob.glob(self.paths[section]+"*"):
176                                if not os.path.isfile(item):
177                                        continue
178                                       
179                                if item.endswith(".credentials"):
180                                        continue
181                               
182                                f=open(item)
183                                lines=f.readlines()
184                                f.close()
185                               
186                                for line in lines:
187                                        line=line.strip("\n")
188                                        if section=="own_domain":
189                                                try:
190                                                        server,shared,mountpoint=line.split(",")[:3]
191                                                        ret.append([server,shared,mountpoint,"",item])
192                                                       
193                                                except:
194                                                        pass
195                                        if section=="external_domain":
196                                                try:
197                                                        server,shared,mountpoint=line.split(",")[:3]
198                                                        user,password=self.parse_credentials(item+".credentials")
199                                                        ret.append([server,shared,mountpoint,"%s,%s"%(user,password),item])
200                                                       
201                                                except Exception as e:
202                                                        pass
203                                               
204       
205                return ret
206               
207        #def parse_file
208       
209       
210        def set_values(self):
211               
212                self.liststore=Gtk.ListStore(str,str,str,str,str,str)
213                self.treeview.set_model(self.liststore)
214               
215                column=Gtk.TreeViewColumn(_("Server"))
216                renderer=Gtk.CellRendererText()
217                column.pack_start(renderer,True)
218                column.add_attribute(renderer,"text",0)
219                column.add_attribute(renderer,"background",5)
220                self.treeview.append_column(column)
221               
222                column=Gtk.TreeViewColumn(_("Shared"))
223                renderer=Gtk.CellRendererText()
224                column.pack_start(renderer,True)
225                column.add_attribute(renderer,"text",1)
226                column.add_attribute(renderer,"background",5)
227                self.treeview.append_column(column)
228               
229                column=Gtk.TreeViewColumn(_("Mount point"))
230                renderer=Gtk.CellRendererText()
231                column.pack_start(renderer,True)
232                column.add_attribute(renderer,"text",2)
233                column.add_attribute(renderer,"background",5)
234                self.treeview.append_column(column)
235               
236                data=self.parse_file()
237                self.orig_store=Gtk.ListStore(str,str,str,str,str,str)
238               
239                for x in data:
240
241                        if len(x[3])>0:
242                               
243                                color=RED_COLOR
244                                if os.path.exists(x[4]):
245                                       
246                                        username,password=self.parse_credentials(x[4]+".credentials")
247                                        if username!="" and password!="":
248                                                color=GVA_COLOR
249                                               
250                                x.append(color)
251                               
252                        else:
253                                x.append(WHITE_COLOR)
254                       
255                        self.liststore.append(x)
256                        self.orig_store.append(x)
257                       
258       
259               
260        #def set_values
261       
262        def parse_credentials(self,fname):
263               
264                username=""
265                password=""
266
267                if os.path.exists(fname):
268               
269                        f=open(fname)
270                        lines=f.readlines()
271                        f.close()
272                       
273                        try:
274                       
275                                for line in lines:
276                                        line=line.strip("\n")
277                                       
278                                        if "username" in line:
279                                                username=line.split("=")[1]
280                                        if "password" in line:
281                                                password=line.split("=")[1]
282                        except:
283                               
284                                pass
285               
286                return (username,password)
287               
288        #def parse_credentials
289       
290        def shared_entry_changed(self,widget):
291               
292                if self.ud_radiobutton.get_active():
293               
294                        txt=os.path.expanduser("~/")+self.shared_entry.get_text()
295               
296                        self.mount_entry.set_text(txt.replace(" ","_"))
297                       
298                else:
299                       
300                        txt=os.path.expanduser("~/")+self.sharedc_entry.get_text()
301               
302                        self.mountc_entry.set_text(txt.replace(" ","_"))
303               
304        #def shared_entry_changed
305               
306        def save_clicked(self,widget):
307               
308                tmp={}
309               
310                for x in self.liststore:
311                        server,share,mpoint,credentials,fname=x[0],x[1],x[2],x[3],x[4]
312                        if fname not in tmp:
313                                tmp[fname]=[]
314                        tmp[fname].append((server,share,mpoint,credentials))
315                       
316                tmp2={}
317               
318                for x in self.orig_store:
319                        server,share,mpoint,credentials,fname=x[0],x[1],x[2],x[3],x[4]
320                        if fname not in tmp2:
321                                tmp2[fname]=[]
322                        tmp2[fname].append((server,share,mpoint,credentials))
323                       
324
325                for fname in tmp2:
326                        if fname not in tmp:
327                                try:
328                                        print("* Deleting %s ..."%fname)
329                                        os.remove(fname)
330                                       
331                                        if self.paths["external_domain"] in fname:
332                                                if os.path.exists(fname+".credentials"):
333                                                        print("\t* Deleting credentials file ...")
334                                                        os.remove(fname+".credentials")
335                                       
336                                except:
337                                        pass
338                       
339                for fname in tmp:
340                       
341                        if fname not in tmp2 or tmp[fname]!=tmp2[fname]:
342                       
343                                print "* Editing %s ..."%fname
344                       
345                                f=open(fname,"w")
346                                for item in tmp[fname]:
347                                       
348                                        server,share,mpoint,credentials=item
349                                        f.write("%s,%s,%s\n"%(server,share,mpoint))
350                                        if len(credentials)>1:
351                                                f2=open(fname+".credentials","w")
352                                                user,password=credentials.split(",")
353                                                f2.write("username=%s\n"%user)
354                                                f2.write("password=%s\n"%password)
355                                                f2.close()
356                                       
357                                f.close()
358                               
359               
360                Gtk.main_quit()
361               
362        #def save-clicked
363       
364       
365        def back_clicked(self,widget):
366               
367                self.save_dialog.hide()
368               
369        #def back_clicked
370       
371       
372        def add_dialog_clicked(self,widget):
373               
374                if self.ud_radiobutton.get_active():
375               
376                        server=self.server_entry.get_text()
377                        shared=self.shared_entry.get_text()
378                        mountpoint=self.mount_entry.get_text()
379                        moptions=""
380                        color=WHITE_COLOR
381                       
382                else:
383                       
384                        server=self.serverc_entry.get_text()
385                        shared=self.sharedc_entry.get_text()
386                        mountpoint=self.mountc_entry.get_text()
387                        username=self.userc_entry.get_text()
388                        password=self.passwordc_entry.get_text()
389                        color=GVA_COLOR
390                        moptions=self.userc_entry.get_text()+","+self.passwordc_entry.get_text()
391       
392                if shared!="" and server!="":
393                       
394                        if self.selection==None:
395                                if moptions=="":
396                                        self.liststore.append([server,shared,mountpoint,moptions,self.paths["gui_odfile"],color])
397                                else:
398                                        fname=self.generate_fname(server)
399                                        self.liststore.append([server,shared,mountpoint,moptions,fname,color])
400                        else:
401                                data,treeiter=self.selection
402                               
403                                if moptions!="" and self.paths["own_domain"] in data[4]:
404                                        data[4]=self.generate_fname(server)
405                                self.liststore[treeiter]=[server,shared,mountpoint,moptions,data[4],color]
406                               
407                        if self.ud_radiobutton.get_active() or (self.cd_radiobutton.get_active() and self.userc_entry.get_text()!="" and self.passwordc_entry.get_text()!=""):
408                                self.add_dialog.hide()
409                       
410        #def add_dialog_clicked
411       
412       
413        def generate_fname(self,server):
414               
415                if not os.path.exists(self.paths["external_domain"]+server):
416                       
417                        fname=self.paths["external_domain"]+server
418                        tmp=fname
419                       
420                        flist=[]
421                        for x in self.liststore:
422                                flist.append(x[4])
423                               
424                        count=1
425                        while tmp in flist:
426                                tmp=fname+str(count)
427                                count+=1
428                       
429                        return tmp
430               
431                count=1
432               
433                while True:
434                        if not os.path.exists(self.paths["external_domain"]+server+str(count)):
435                                fname=self.paths["external_domain"]+server+str(count)
436                                tmp=fname
437                               
438                                flist=[]
439                                for x in self.liststore:
440                                        flist.append(x[4])
441                               
442                                while tmp in flist:
443                                        tmp=fname+str(count)
444                                        count+=1
445                       
446                                return tmp
447                               
448                               
449                        count+=1
450                       
451        #def generate_fname
452                       
453                               
454               
455        #def generate_fname
456       
457        def cancel_clicked(self,widget):
458               
459                self.add_dialog.hide()
460               
461        #def cancel_clicked
462       
463       
464        def hide_dialog(self,widget,data=None):
465               
466                widget.hide()
467                return True
468               
469        #def hide_dialog
470       
471
472       
473        def check_store(self):
474               
475                if len(self.orig_store)!=len(self.liststore):
476                        return False
477               
478                list1=[]
479                for item in self.liststore:
480                        list1.append((item[0],item[1],item[2],item[3],item[4]))
481               
482                list2=[]
483                for item in self.orig_store:
484                        list2.append((item[0],item[1],item[2],item[3],item[4]))
485                       
486                for item in list1:
487                        if item not in list2:
488                                return False
489                               
490                return True
491               
492        #def check_store
493       
494        def quit(self,widget,data):
495               
496                if self.check_store():
497                        Gtk.main_quit()
498                else:
499                        self.save_dialog.show()
500                        return True
501               
502        #def quit
503       
504        def add_clicked(self,widget):
505               
506                self.add_dialog.set_title(_("Add mount point"))
507                self.selection=None
508                self.server_entry.set_text("")
509                self.shared_entry.set_text("")
510                self.mount_entry.set_text("")
511                self.serverc_entry.set_text("")
512                self.sharedc_entry.set_text("")
513                self.mountc_entry.set_text("")
514                self.userc_entry.set_text("")
515                self.passwordc_entry.set_text("")
516                self.ud_radiobutton.set_active(True)
517                self.add_dialog.show()
518
519               
520        #def add_clicked
521       
522        def edit_clicked(self,widget):
523               
524                select = self.treeview.get_selection()
525                model,treeiter=select.get_selected()
526                if treeiter!=None:
527                        self.add_dialog.set_title(_("Edit mount point"))
528                        server,shared,mountpoint,credentials,fname,color=model[treeiter]
529                       
530                        if credentials=="":
531                               
532                                self.ud_radiobutton.set_active(True)
533                                self.server_entry.set_text(server)
534                                self.shared_entry.set_text(shared)
535                                self.mount_entry.set_text(mountpoint)
536                                self.selection=([server,shared,mountpoint,"",fname],treeiter)
537                               
538                        else:
539                               
540                                self.cd_radiobutton.set_active(True)
541                                self.serverc_entry.set_text(server)
542                                self.sharedc_entry.set_text(shared)
543                                self.mountc_entry.set_text(mountpoint)
544                                uname,password=credentials.strip("\n").split(",")
545                                self.userc_entry.set_text(uname)
546                                self.passwordc_entry.set_text(password)
547                                self.selection=([server,shared,mountpoint,"%s,%s"%(uname,password),fname],treeiter)
548                               
549                               
550                        self.add_dialog.show()
551               
552        #def edit_clicked
553       
554        def remove_clicked(self,widget):
555               
556                select = self.treeview.get_selection()
557                model,treeiter=select.get_selected()
558                if treeiter!=None:
559                        self.liststore.remove(treeiter)
560               
561        #def remove_clicked
562       
563       
564        def double_click(self, tv, treepath, tvcolumn):
565               
566                self.edit_clicked(None)
567               
568        #def double_click
569       
570       
571#class LliurexGvaEditor
572
573if __name__=="__main__":
574       
575        lge=LliurexGvaEditor()
576       
Note: See TracBrowser for help on using the repository browser.