Ignore:
Timestamp:
Mar 7, 2017, 2:35:35 PM (2 years ago)
Author:
jrpelegrina
Message:

WIP in gui. Improve manage gdrive functions

Location:
lliurex-gdrive/trunk/fuentes/lliurex-gdrive-gui.install/usr/share/lliurex-gdrive
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • lliurex-gdrive/trunk/fuentes/lliurex-gdrive-gui.install/usr/share/lliurex-gdrive/LliurexGoogleDriveManager.py

    r3812 r3829  
    66import subprocess
    77import shutil
     8import urllib2
    89
    910
    1011DEBUG=True
    1112GDRIVE_CONFIG_DIR=os.path.expanduser("~/.gdfuse/")
     13LLIUREX_CONFI_FILE='/home/lliurex/config'
    1214
    1315class LliurexGoogleDriveManager:
     
    6870               
    6971                        if "1970-" in line:
    70                                 self.dprint("%s not configured"%profile)
    71                                 return False
    72                        
     72                                msg_error="%s not configured"%profile
     73                                self.dprint(msg_error)
     74                                return {"result":False,"output":None,"error":msg_error}
     75                       
     76
     77                        return {"result":True,"output":None,"error":None}
     78
     79                else:
     80                        msg_error="%s not yet create"%profile
     81
     82                        self.dprint(msg_error)
     83                        return {"result":False,"output":None,"error": msg_error}
     84
     85               
     86        #def check_configuration
     87
     88        def check_google_connections(self):
     89
     90                try:
     91                        req=urllib2.Request("http://google.com")
     92                        res=urllib2.urlopen(req)
    7393                        return True
    74                 else:
    75                         self.dprint("%s not yet create"%profile)
     94                except:
    7695                        return False
    7796
    78                
    79         #def check_configuration
    8097       
    8198        def mount_drive(self,profile,mountpoint):
    8299               
    83100                if os.path.exists(GDRIVE_CONFIG_DIR+profile):
    84                         if self.check_config(profile):
     101                        check= self.check_config(profile)
     102                        if check["result"]:
    85103                                #if profile in self.profiles_config:
    86104                                        #mount_point=os.path.expanduser(self.profiles_config[profile]["mountpoint"])
     
    93111                                                                os.makedirs(mountpoint)
    94112                                                        except:
    95                                                                 self.dprint("Unable to create '%s' mount destination"%mountpoint)
    96                                                                 return False
     113                                                                error_msg="Unable to create '%s' mount destination"%mountpoint
     114                                                                self.dprint(error_msg)
     115                                                                return {"result":False,"out":None,"error":error_msg}
    97116                                                               
    98117
    99118                                                if os.access(mountpoint,os.W_OK):
    100                                                         os.system(self.mount_cmd%(profile,mountpoint))
    101                                                         return True
     119                                                        #os.system(self.mount_cmd%(profile,mountpoint))
     120                                                        cmd=self.mount_cmd%(profile,mountpoint)
     121                                                        p=subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
     122                                                        poutput,perror=p.communicate()
     123                                                        if len(perror)==0:
     124                                                                return {"result":True,"out":str(poutput),"error":str(perror)}
     125                                                        else:
     126                                                                error_msg="Error mount '%s':'%s'"%(mountpoint,str(perror))
     127                                                                self.dprint(error_msg)
     128                                                                                                                               
    102129                                                else:
    103                                                        
    104                                                         self.dprint("'%s' mount destination is not owned by user"%mountpoint)
     130                                                        error_msg="'%s' mount destination is not owned by user"%mountpoint
     131                                                        self.dprint(error_msg)
    105132                                                       
    106133                                        else:
    107                                                 self.dprint("'%s' mountpoint not configured"%profile)
    108                                 #else:
    109                                         #self.dprint("'%s' profile unknown"%profile)
    110                 else:
    111                         self.dprint("'%s' GDrive profile path does not exist"%profile)
    112                        
    113                        
    114                 return False
    115                
     134                                                error_msg="'%s' mountpoint not configured"%profile
     135                                                self.dprint(error_msg)
     136                        else:
     137                                error_msg="'%s' profile unknown"%profile
     138                                self.dprint(error_msg)
     139                else:
     140                        error_msg="'%s' GDrive profile path does not exist"%profile
     141                        self.dprint(error_msg)
     142                       
     143                       
     144                return {"result":False,"output":None,"error":error_msg}
     145
    116146        #def mount_drive
    117147       
     
    171201                return {"status":status,"size":mountpoint_size,"used":mountpoint_used,"available":mountpoint_available,"Used%":mountpoint_per}         
    172202               
    173        
    174         def create_profile(self,info,profile):
     203
     204        def check_profile_info(self,profile,mountpoint,edition):
     205       
     206                if not edition:
     207                        if profile=="":
     208                                return False
     209                        else:
     210                                for item in self.profiles_config:
     211                                        if profile==item:
     212                                                return False
     213
     214                for item in self.profiles_config:
     215                        if profile!=item:
     216                                if mountpoint==self.profiles_config[item]["mountpoint"]:
     217                                        return False
     218
     219                return True                                                             
     220       
     221        def create_profile(self,profile):
    175222
    176223                result=False
    177224
    178225                profile=str(profile)
    179                 mountpoint=info[profile]["mountpoint"]
    180 
    181 
    182                 if not self.check_config(profile):
     226                path=GDRIVE_CONFIG_DIR+profile+"/config"
     227
     228                if not self.check_config(profile)["result"]:
    183229                        os.system("google-drive-ocamlfuse -label %s"%profile)
    184230                        self.dprint("'%s' profile has been create"%profile)
    185                         result=self.mount_drive(profile,mountpoint)
    186 
    187                 if result:
     231
     232                        if os.path.exists(GDRIVE_CONFIG_DIR+profile):
     233                                shutil.copy(LLIUREX_CONFI_FILE,path )
     234                return True
     235                               
     236                       
     237               
     238        #def create_profile
     239
     240        def create_mountpoint(self,info,profile):
     241
     242                mountpoint=info[profile]["mountpoint"]
     243                result=self.mount_drive(profile,mountpoint)
     244
     245                if result["result"]:
    188246                        self.save_profiles(info)
    189247                else:
    190                         shutil.rmtree(os.path.join(GDRIVE_CONFIG_DIR+profile))
    191                         self.dprint("'%s' profile has been delete"%profile)
     248                        if profile !="":
     249                                shutil.rmtree(os.path.join(GDRIVE_CONFIG_DIR+profile))
     250                                self.dprint("'%s' profile has been delete"%profile)
    192251                       
    193252                return result
    194253
    195                         # llx config file
    196                         # clean cache google-drive-ocamlfuse -cc
    197                
    198                
    199         #def save_profiles
     254        def dismount_mountpoint(self,mountpoint):
     255
     256                cmd='fusermount -u ' + mountpoint
     257                p=subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     258                poutput,perror=p.communicate()
     259
     260                return {"output":poutput,"error":perror}
    200261
    201262
     
    205266
    206267                profile=str(profile)
    207                 mountpoint=info[profile]["mountpoint"]
     268                mountpoint=self.profiles_config[profile]["mountpoint"]
    208269
    209270
     
    213274                       
    214275                        if is_mountpoint_mounted["status"]:
    215                                 cmd='fusermount -u ' + mountpoint
    216                                 os.system(cmd)
    217                                 self.dprint("'%s' mountpoint has been unmonted"%mountpoint)
    218 
    219                         shutil.rmtree(os.path.join(GDRIVE_CONFIG_DIR+profile))
    220                         self.dprint("'%s' profile has been delete"%profile)
     276                                dismount=self.dismount_mountpoint(mountpoint)
     277
     278                                if len(dismount["error"])==0:
     279                                        self.dprint("'%s' mountpoint has been dismounted"%mountpoint)
     280                                        if profile!="":
     281                                                shutil.rmtree(os.path.join(GDRIVE_CONFIG_DIR+profile))
     282                                                self.dprint("'%s' profile has been delete"%profile)
     283                                else:
     284                                        self.dprint("Error dismounted '%s': '%s'"%(mountpoint,str(dismount["error"])))
     285                                        result=False
    221286                       
    222287
     
    232297        def edit_profile(self,info,profile):
    233298
    234                 result=True
     299                result={"result":True,"output":None,"error":None}
     300
    235301                old_mountpoint=self.profiles_config[profile]["mountpoint"]
    236302                old_automount=self.profiles_config[profile]["automount"]
     
    243309
    244310                        if status["status"]:
    245                                 cmd='fusermount -u ' + old_mountpoint
    246                                 os.system(cmd)
    247                                 self.dprint("'%s' mountpoint has been unmonted"%old_mountpoint)
     311                                dismount=self.dismount_mountpoint(old_mountpoint)
     312
     313                                if len(dismount["error"])==0:
     314                                        self.dprint("'%s' mountpoint has been dismounted"%old_mountpoint)       
    248315                       
    249316                        result=self.mount_drive(profile,new_mountpoint)
    250317
    251                 if result:
     318                if result["result"]:
    252319                        self.save_profiles(info)
    253320               
     
    263330                        os.system(cmd)
    264331                       
    265                         self.dprint("'%s' mountpoint has been unmonted"%mountpoint)     
     332                        self.dprint("'%s' mountpoint has been dismounted"%mountpoint)   
    266333                        return False
    267334
  • lliurex-gdrive/trunk/fuentes/lliurex-gdrive-gui.install/usr/share/lliurex-gdrive/ProfileBox.py

    r3812 r3829  
    1010import time
    1111import threading
     12import multiprocessing
    1213import sys
    1314import os
     15import psutil
    1416
    1517_=gettext.gettext
     
    2325EDIT_IMAGE=RSRC+"rsrc/edit.svg"
    2426DELETE_IMAGE=RSRC+"rsrc/trash.svg"
     27MAX_RETRY_INTENTS=90000
    2528
    2629class ProfileBox(Gtk.VBox):
     
    5053                self.automount_label=builder.get_object("automount_label")
    5154                self.automount_entry=builder.get_object("automount_entry")
     55                self.profile_msg=builder.get_object("profile_msg")
     56                self.profile_pbar_label=builder.get_object("profile_pbar_label")
     57                self.profile_pbar=builder.get_object("profile_pbar")
    5258                self.accept_add_profile_button=builder.get_object("accept_add_profile_button")
    5359                self.cancel_add_profile_button=builder.get_object("cancel_add_profile_button")
     
    6066       
    6167                self.edition=False
     68                self.profile_pbar.hide()
     69                self.profile_pbar_label.hide()
     70
     71                self.init_threads()
     72
    6273                #self.current_var=None
    6374                #self.current_id=None
     
    6879        #def __init__
    6980       
    70        
     81        def init_threads(self):
     82
     83                self.create_profile_t=multiprocessing.Process(target=self.create_profile)
     84                self.create_mountpoint_t=threading.Thread(target=self.create_mountpoint)
     85                self.edit_profile_t=threading.Thread(target=self.edit_profile)
     86
     87               
     88                self.create_profile_t.daemon=True
     89                self.create_mountpoint_t.daemon=True
     90                self.edit_profile_t.daemon=True
     91
     92                self.create_mountpoint_t.done=False
     93                self.edit_profile_t.done=False
     94
     95                self.create_profile_t.launched=False
     96                self.create_mountpoint_t.launched=False
     97                self.edit_profile_t.launched=False
     98               
     99                GObject.threads_init()
     100
     101
    71102        def set_css_info(self):
    72103               
     
    127158                self.mountpoint_entry.set_filename(os.environ["HOME"])
    128159                self.automount_entry.set_state(False)
     160                self.profile_msg.set_text("")
    129161                self.edition=False
    130                
     162
     163                self.init_threads()
     164               
     165                self.profile_msg.set_text("")
     166                self.profile_pbar.hide()
    131167                self.new_profile_window.show()
    132168
     
    155191                if status:
    156192                        mount_image=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
     193                        button.set_tooltip_text(_("Dismount profile"))
    157194                else:
    158195                        mount_image=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
     196                        button.set_tooltip_text(_("Mount profile"))
    159197       
    160198                hbox.get_children()[4].set_image(mount_image)
     
    177215                self.edition=True
    178216
     217                self.init_threads()
     218
     219                self.profile_msg.set_text("")
     220                self.profile_pbar.hide()
    179221                self.new_profile_window.show() 
    180222
     
    224266                if status["status"]:
    225267                        mount_image=Gtk.Image.new_from_file(MOUNT_ON_IMAGE)
     268                        mount.set_tooltip_text(_("Dismount profile"))
    226269                else:
    227270                        mount_image=Gtk.Image.new_from_file(MOUNT_OFF_IMAGE)
     271                        mount.set_tooltip_text(_("Mount profile"))
    228272       
    229273                mount.add(mount_image)
     
    232276                mount.set_name("MOUNT_ITEM_BUTTON")
    233277                mount.connect("clicked",self.sync_profile_clicked,hbox)
    234                 mount.set_tooltip_text(_("Mount profile"))
     278               
    235279                hbox.pack_start(profile_image,False,False,0)
    236280                hbox.pack_start(profile,False,False,0)
     
    249293
    250294        def accept_add_profile_clicked(self,widget):
    251                
     295
     296
    252297                profile=self.profile_entry.get_text()
    253                 profile=profile.strip(" ")
     298                self.new_profile=profile.strip(" ")
    254299                email=self.email_entry.get_text()
    255                 email=email.strip(" ")
    256                 mountpoint=self.mountpoint_entry.get_filename()
    257                 automount=self.automount_entry.get_state()
    258 
    259                 self.profiles_info[profile]={}
    260                 self.profiles_info[profile]["email"]=email
    261                 self.profiles_info[profile]["mountpoint"]=mountpoint
    262                 self.profiles_info[profile]["automount"]=automount
    263 
    264 
    265                 if not self.edition:
    266                         result=self.core.LliurexGoogleDriveManager.create_profile(self.profiles_info,profile)
    267                        
    268                         if result:
    269                                 self.new_profile_button(profile,email,mountpoint)
    270                                 self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()
    271                
     300                self.new_email=email.strip(" ")
     301                self.new_mountpoint=self.mountpoint_entry.get_filename()
     302                self.new_automount=self.automount_entry.get_state()
     303
     304                self.profiles_info[self.new_profile]={}
     305                self.profiles_info[self.new_profile]["email"]=self.new_email
     306                self.profiles_info[self.new_profile]["mountpoint"]=self.new_mountpoint
     307                self.profiles_info[self.new_profile]["automount"]=self.new_automount
     308
     309                if self.core.LliurexGoogleDriveManager.check_profile_info(self.new_profile,self.new_mountpoint,self.edition):
     310
     311                        if not self.edition:
     312                                if not self.create_profile_t.launched:
     313                                        self.profile_msg.set_text(_("Now a browser window will be open to grant permison\n.When a google-appear close a browser"))
     314                                        self.profile_pbar.show()
     315                                        self.retry=0
     316                                        GLib.timeout_add(100,self.pulsate_add_profile)
     317                               
     318               
     319                        else:
     320                                if not self.edit_profile_t.launched:
     321                                        GLib.timeout_add(100,self.pulsate_edit_profile)
    272322                else:
    273                         result=self.core.LliurexGoogleDriveManager.edit_profile(self.profiles_info,profile)
    274                        
    275                         if result:
    276                                 self.profile_to_edit.get_children()[3].set_text(mountpoint)
    277                                 self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()
    278 
    279                
     323                        self.profile_msg.set_text(_("Error in entry form"))                             
     324                               
     325               
     326       
     327        #def accept_add_profile_clickedef       
     328
     329        def pulsate_add_profile(self):
     330
     331                self.retry=self.retry+1
     332                self.profile_pbar.pulse()
     333               
     334                if not self.create_profile_t.launched:
     335                        self.create_profile_t.start()
     336                        self.create_profile_t.launched=True
     337
     338                if not self.create_profile_t.is_alive():
     339                        if not self.create_mountpoint_t.launched:
     340                                self.create_mountpoint_t.start()
     341                                self.create_mountpoint_t.launched=True
     342
     343                        if self.create_mountpoint_t.done:
     344                                if self.create_result["result"]:
     345                                                self.new_profile_button(self.new_profile,self.new_email,self.new_mountpoint)
     346                                                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()   
     347                                                self.new_profile_window.hide() 
     348                                else:
     349                                        self.profile_pbar.hide()
     350                                        self.profile_msg.set_text(_("An error ocurrend creating profile:" + str(self.create_result["error"])))
     351
     352                                return False
     353                                               
     354                if self.create_profile_t.launched:
     355                        if self.create_profile_t.is_alive():
     356                                if self.retry>MAX_RETRY_INTENTS:
     357                                        parent=psutil.Process(self.create_profile_t.pid)
     358                                        for child in parent.children(recursive=True):
     359                                                child.kill()
     360                                        self.create_profile_t.terminate()       
     361                                        return True
     362                                else:   
     363                                        return True
     364                                       
     365                if self.create_mountpoint_t.launched:
     366                        if not self.create_mountpoint_t.done:
     367                                return True                                     
     368
     369        def create_profile(self):
     370                result=self.core.LliurexGoogleDriveManager.create_profile(self.new_profile)
     371
     372
     373        def create_mountpoint(self):
     374
     375
     376                self.create_result=self.core.LliurexGoogleDriveManager.create_mountpoint(self.profiles_info,self.new_profile)
     377                self.create_mountpoint_t.done=True
     378               
     379
     380
     381        def pulsate_edit_profile(self):
     382
     383                if not self.edit_profile_t.launched:
     384                        self.edit_profile_t.start()
     385                        self.edit_profile_t.launched=True
     386
     387                if self.edit_profile_t.done:
     388                        print self.edit_result
     389                        if self.edit_result["result"]:
     390                                self.profile_to_edit.get_children()[3].set_text(self.new_mountpoint)
     391                                self.profiles_info=self.core.LliurexGoogleDriveManager.profiles_config.copy()   
     392                                self.new_profile_window.hide() 
     393                                return False
     394                                               
     395
     396
     397                if self.edit_profile_t.launched:
     398                        if not self.edit_profile_t.done:
     399                                return True
     400
     401        def edit_profile(self):
     402                self.edit_result=self.core.LliurexGoogleDriveManager.edit_profile(self.profiles_info,self.new_profile)
     403                self.edit_profile_t.done=True
     404
     405        def cancel_add_profile_clicked(self,widget):
    280406               
    281407                self.new_profile_window.hide()
    282408
    283         #def accept_add_profile_clickedef       
    284 
    285         def cancel_add_profile_clicked(self,widget):
    286                
    287                 self.new_profile_window.hide()
    288 
    289409       
    290410        #def cancel_add_profile_clicked
  • lliurex-gdrive/trunk/fuentes/lliurex-gdrive-gui.install/usr/share/lliurex-gdrive/rsrc/lliurex-gdrive.ui

    r3806 r3829  
    6767  </object>
    6868  <object class="GtkWindow" id="new_profile_window">
     69    <property name="width_request">500</property>
     70    <property name="height_request">300</property>
    6971    <property name="can_focus">False</property>
    7072    <property name="modal">True</property>
     
    150152                <child>
    151153                  <object class="GtkEntry" id="profile_entry">
     154                    <property name="width_request">300</property>
    152155                    <property name="visible">True</property>
    153156                    <property name="can_focus">True</property>
     
    177180                    <property name="visible">True</property>
    178181                    <property name="can_focus">True</property>
     182                    <property name="halign">start</property>
    179183                  </object>
    180184                  <packing>
     
    211215        </child>
    212216        <child>
    213           <object class="GtkLabel" id="label2">
    214             <property name="visible">True</property>
    215             <property name="can_focus">False</property>
    216             <property name="label" translatable="yes">&lt;i&gt;You can input several packages separated by commas.&lt;/i&gt;</property>
    217             <property name="use_markup">True</property>
    218             <property name="xalign">0</property>
    219           </object>
    220           <packing>
    221             <property name="expand">False</property>
    222             <property name="fill">True</property>
    223             <property name="position">1</property>
    224           </packing>
    225         </child>
    226         <child>
    227           <object class="GtkLabel" id="package_msg_label">
     217          <object class="GtkLabel" id="profile_msg">
    228218            <property name="visible">True</property>
    229219            <property name="can_focus">False</property>
     
    275265            <property name="pack_type">end</property>
    276266            <property name="position">3</property>
     267          </packing>
     268        </child>
     269        <child>
     270          <object class="GtkBox" id="box1">
     271            <property name="visible">True</property>
     272            <property name="can_focus">False</property>
     273            <property name="orientation">vertical</property>
     274            <child>
     275              <object class="GtkLabel" id="profile_pbar_label">
     276                <property name="visible">True</property>
     277                <property name="can_focus">False</property>
     278                <property name="margin_bottom">5</property>
     279                <property name="use_markup">True</property>
     280                <property name="xalign">0</property>
     281              </object>
     282              <packing>
     283                <property name="expand">False</property>
     284                <property name="fill">True</property>
     285                <property name="position">0</property>
     286              </packing>
     287            </child>
     288            <child>
     289              <object class="GtkProgressBar" id="profile_pbar">
     290                <property name="visible">True</property>
     291                <property name="can_focus">False</property>
     292                <property name="margin_top">5</property>
     293                <property name="margin_bottom">5</property>
     294              </object>
     295              <packing>
     296                <property name="expand">False</property>
     297                <property name="fill">True</property>
     298                <property name="position">1</property>
     299              </packing>
     300            </child>
     301          </object>
     302          <packing>
     303            <property name="expand">False</property>
     304            <property name="fill">True</property>
     305            <property name="position">4</property>
    277306          </packing>
    278307        </child>
Note: See TracChangeset for help on using the changeset viewer.